From c9f23ea0fa85802df5d092aa04535e8dca117363 Mon Sep 17 00:00:00 2001 From: Maxson Ramon Date: Thu, 22 Sep 2022 13:22:22 +0200 Subject: [PATCH 01/83] Local IP port managment --- examples/cs101-slave-unbalanced/Program.cs | 2 +- lib60870/CS104/Connection.cs | 76 ++++++++++++++++++---- 2 files changed, 66 insertions(+), 12 deletions(-) diff --git a/examples/cs101-slave-unbalanced/Program.cs b/examples/cs101-slave-unbalanced/Program.cs index 6ee304a..d9aed72 100644 --- a/examples/cs101-slave-unbalanced/Program.cs +++ b/examples/cs101-slave-unbalanced/Program.cs @@ -86,7 +86,7 @@ public static void Main (string[] args) running = false; }; - string portName = "COM12"; + string portName = "COM5"; if (args.Length > 0) portName = args [0]; diff --git a/lib60870/CS104/Connection.cs b/lib60870/CS104/Connection.cs index e14a12c..9b45a85 100644 --- a/lib60870/CS104/Connection.cs +++ b/lib60870/CS104/Connection.cs @@ -1513,14 +1513,22 @@ private void ConnectSocketWithTimeout() socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + LingerOption lingerOption = new LingerOption(true, 0); + socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, lingerOption); + //socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, false); + //socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 0); + //socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 0); + if (LocalIpAddress != null) { try { socket.Bind(new IPEndPoint(IPAddress.Parse(localIpAddress), localTcpPort)); } - catch (Exception) + catch (Exception ex) { + Console.WriteLine(ex.Message); throw new SocketException(87); // wrong argument } } @@ -1548,7 +1556,23 @@ private void ConnectSocketWithTimeout() } else { - socket.Close(); + if (socket.Connected) + { + try + { + //socket.Shutdown(SocketShutdown.Both); + socket.Shutdown(SocketShutdown.Receive); + } + catch (SocketException ex) + { + Console.WriteLine(ex.Message); + } + + socket.Disconnect(true); + } + + + socket.Close(0); socket = null; throw new SocketException(10060); // Connection timed out (WSAETiMEDOUT) @@ -1892,18 +1916,28 @@ private void HandleConnection() DebugLog("CLOSE CONNECTION!"); // Release the socket. - try - { - socket.Shutdown(SocketShutdown.Both); - } - catch (SocketException) - { - } + running = false; socketError = true; - socket.Close(); + if (socket.Connected) + { + try + { + //socket.Shutdown(SocketShutdown.Both); + socket.Shutdown(SocketShutdown.Receive); + } + catch (SocketException ex) + { + Console.WriteLine(ex.Message); + } + + socket.Disconnect(true); + } + + + socket.Close(0); netStream.Dispose(); @@ -1960,7 +1994,27 @@ public bool IsRunning public void Cancel() { if (socket != null) - socket.Close(); + { + if (socket.Connected) + { + try + { + //socket.Shutdown(SocketShutdown.Both); + socket.Shutdown(SocketShutdown.Receive); + } + catch (SocketException ex) + { + Console.WriteLine(ex.Message); + } + + socket.Disconnect(true); + + } + + + socket.Close(0); + } + } public void Close() From 4700fa6c8f2bd01793bd5a6aaef5960d3530470f Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Fri, 24 Nov 2023 15:30:53 +0100 Subject: [PATCH 02/83] Updating TLS --- lib60870/CS104/ClientConnection.cs | 2 +- lib60870/CS104/Connection.cs | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib60870/CS104/ClientConnection.cs b/lib60870/CS104/ClientConnection.cs index 12941fe..4703e42 100644 --- a/lib60870/CS104/ClientConnection.cs +++ b/lib60870/CS104/ClientConnection.cs @@ -1242,7 +1242,7 @@ private void HandleConnection() try { - sslStream.AuthenticateAsServer(tlsSecInfo.OwnCertificate, true, System.Security.Authentication.SslProtocols.Tls, false); + sslStream.AuthenticateAsServer(tlsSecInfo.OwnCertificate, true, System.Security.Authentication.SslProtocols.Tls12, false); if (sslStream.IsAuthenticated == true) { diff --git a/lib60870/CS104/Connection.cs b/lib60870/CS104/Connection.cs index d128b12..1d084e6 100644 --- a/lib60870/CS104/Connection.cs +++ b/lib60870/CS104/Connection.cs @@ -33,6 +33,7 @@ using System.Net.Security; using lib60870.CS101; +using System.Net.Http; namespace lib60870.CS104 { @@ -1733,6 +1734,8 @@ private void HandleConnection() { DebugLog("Setup TLS"); + System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; + RemoteCertificateValidationCallback validationCallback = CertificateValidationCallback; if (tlsSecInfo.CertificateValidationCallback != null) From 56c64dfeb10a97fbb40473becea65e85886e8614 Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Mon, 27 Nov 2023 15:37:33 +0100 Subject: [PATCH 03/83] Possibility of changing TLS version on server side --- examples/cs104-tls-client/Program.cs | 25 +++++++++++++++++-------- examples/cs104-tls-server/Program.cs | 11 +++++++---- lib60870/CS104/ClientConnection.cs | 11 +++++++++-- 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/examples/cs104-tls-client/Program.cs b/examples/cs104-tls-client/Program.cs index 792186c..6144ef3 100644 --- a/examples/cs104-tls-client/Program.cs +++ b/examples/cs104-tls-client/Program.cs @@ -126,8 +126,10 @@ public static void Main (string[] args) Console.WriteLine("Using hostname: " + hostname); } + - Console.WriteLine ("Using lib60870.NET version " + LibraryCommon.GetLibraryVersionString ()); + + Console.WriteLine ("Using lib60870.NET version " + LibraryCommon.GetLibraryVersionString ()); // Own certificate has to be a pfx file that contains the private key X509Certificate2 ownCertificate = new X509Certificate2 ("client1.pfx"); @@ -141,18 +143,24 @@ public static void Main (string[] args) // Add a CA certificate to check the certificate provided by the server - not required when ChainValidation == false secInfo.AddCA (new X509Certificate2 ("root.cer")); - // Check if the certificate is signed by a provided CA - secInfo.ChainValidation = true; + SslProtocols tlsVersion = SslProtocols.Tls12; + + // Check if the certificate is signed by a provided CA + secInfo.ChainValidation = true; + + secInfo.TlsVersion = tlsVersion; // Check that the shown server certificate is in the list of allowed certificates secInfo.AllowOnlySpecificCertificates = true; - Connection con = new Connection (hostname); - - // Set security information object, this will force the connection using TLS (using TCP port 19998) - con.SetTlsSecurity (secInfo); + Connection con = new Connection (hostname); + con.LocalIpAddress = "127.0.0.1"; + con.LocalTcpPort = 2404; + // Set security information object, this will force the connection using TLS (using TCP port 19998) + con.SetTlsSecurity (secInfo); con.DebugOutput = true; + con.SetASDUReceivedHandler (asduReceivedHandler, null); con.SetConnectionHandler (ConnectionHandler, null); @@ -178,7 +186,8 @@ public static void Main (string[] args) /* Synchronize clock of the controlled station */ con.SendClockSyncCommand (1 /* CA */, new CP56Time2a (DateTime.Now)); - + + Console.WriteLine ("CLOSE"); con.Close (); diff --git a/examples/cs104-tls-server/Program.cs b/examples/cs104-tls-server/Program.cs index 6584f47..44cf317 100644 --- a/examples/cs104-tls-server/Program.cs +++ b/examples/cs104-tls-server/Program.cs @@ -125,14 +125,17 @@ public static void Main (string[] args) secInfo.AddAllowedCertificate (new X509Certificate2 ("client1.cer")); secInfo.AddAllowedCertificate (new X509Certificate2 ("client2.cer")); - // Add a CA certificate to check the certificate provided by the server - not required when ChainValidation == false - secInfo.AddCA (new X509Certificate2 ("root.cer")); + SslProtocols tlsVersion = SslProtocols.Tls11; + // Add a CA certificate to check the certificate provided by the server - not required when ChainValidation == false + secInfo.AddCA (new X509Certificate2 ("root.cer")); // Check if the certificate is signed by a provided CA secInfo.ChainValidation = true; - // Check that the shown client certificate is in the list of allowed certificates - secInfo.AllowOnlySpecificCertificates = true; + secInfo.TlsVersion = tlsVersion; + + // Check that the shown client certificate is in the list of allowed certificates + secInfo.AllowOnlySpecificCertificates = true; // Use constructor with security information object, this will force the connection using TLS (using TCP port 19998) Server server = new Server (secInfo); diff --git a/lib60870/CS104/ClientConnection.cs b/lib60870/CS104/ClientConnection.cs index 4703e42..7a600e3 100644 --- a/lib60870/CS104/ClientConnection.cs +++ b/lib60870/CS104/ClientConnection.cs @@ -1239,10 +1239,17 @@ private void HandleConnection() SslStream sslStream = new SslStream(socketStream, true, validationCallback); bool authenticationSuccess = false; - + try { - sslStream.AuthenticateAsServer(tlsSecInfo.OwnCertificate, true, System.Security.Authentication.SslProtocols.Tls12, false); + System.Security.Authentication.SslProtocols tlsVersion = System.Security.Authentication.SslProtocols.None; + + if (tlsSecInfo != null) + tlsVersion = tlsSecInfo.TlsVersion; + + DebugLog("Using TLS version: " + tlsVersion.ToString()); + + sslStream.AuthenticateAsServer(tlsSecInfo.OwnCertificate, true, tlsVersion, false); if (sslStream.IsAuthenticated == true) { From 43bd90d37f4843b612671819786d0c1017832acb Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Tue, 4 Jun 2024 10:29:57 +0200 Subject: [PATCH 04/83] Adding function to get the number messages in the queue --- lib60870/CS104/Server.cs | 68 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 63 insertions(+), 5 deletions(-) diff --git a/lib60870/CS104/Server.cs b/lib60870/CS104/Server.cs index eb76c00..18e8a2a 100644 --- a/lib60870/CS104/Server.cs +++ b/lib60870/CS104/Server.cs @@ -18,9 +18,8 @@ * * See COPYING file for the complete license text. */ - +#define CONFIG_USE_SEMAPHORES using System; - using System.Net; using System.Net.Sockets; using System.Threading; @@ -28,21 +27,25 @@ using System.Collections.Concurrent; using lib60870.CS101; +using System.Runtime.InteropServices; +using System.Collections; namespace lib60870.CS104 { - + /// /// Connection request handler is called when a client tries to connect to the server. /// /// User provided parameter /// IP address of the connecting client /// true if the connection has to be accepted, false otherwise - public delegate bool ConnectionRequestHandler(object parameter,IPAddress ipAddress); + public delegate bool ConnectionRequestHandler(object parameter,IPAddress ipAddress); /// /// Connection events for the Server /// + /// + public enum ClientConnectionEvent { /// @@ -66,6 +69,7 @@ public enum ClientConnectionEvent CLOSED } + public delegate void ConnectionEventHandler(object parameter,ClientConnection connection,ClientConnectionEvent eventType); /// @@ -114,6 +118,7 @@ public enum EnqueueMode internal class ASDUQueue { + private enum QueueEntryState { NOT_USED, @@ -134,7 +139,9 @@ private struct ASDUQueueEntry private int latestQueueEntry = -1; private int numberOfAsduInQueue = 0; private int maxQueueSize; - + private int entryCounter; + private SemaphoreSlim queueLock; + internal ASDUQueue asduQueue = null; private EnqueueMode enqueueMode; private ApplicationLayerParameters parameters; @@ -160,6 +167,8 @@ public ASDUQueue(int maxQueueSize, EnqueueMode enqueueMode, ApplicationLayerPara this.DebugLog = DebugLog; } + + public void EnqueueAsdu(ASDU asdu) { lock (enqueuedASDUs) @@ -347,7 +356,54 @@ public void MarkASDUAsConfirmed(int index, long timestamp) } } } + + } + + public int GetEntryCount(ASDUQueue queue) + { + int count = 0; + #if CONFIG_USE_SEMAPHORES + queueLock.Wait(); + #endif + + try + { + count = entryCounter; + } + + finally + { + #if CONFIG_USE_SEMAPHORES + queueLock.Release(); + #endif + + } + return count; } + + public int GetNumberOfQueueEntries(RedundancyGroup redundancyGroup) + { + #if SINGLE_REDUNDANCY_GROUP + if (ServerMode.SINGLE_REDUNDANCY_GROUP.Equals(redundancyGroup)) + { + return GetEntryCount(asduQueue); + } + #endif + + #if MULTIPLE_REDUNDANCY_GROUPS + if (ServerMode.MULTIPLE_REDUNDANCY_GROUPS.Equals(redundancyGroup)) + { + return GetEntryCount(asduQueue); + + } + + Console.WriteLine("CS104_SLAVE: redundancy group not found\\n\""); + #endif + + return 0; + } + + } /// @@ -371,6 +427,7 @@ public RedundancyGroup() { } + /// /// Initializes a new instance of the class. /// @@ -434,6 +491,7 @@ internal void AddConnection(ClientConnection connection) connections.Add(connection); } + internal void RemoveConnection(ClientConnection connection) { connections.Remove(connection); From ab9c140b1bd8a7a960bd95d0f67810fe9f0ad2ae Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Wed, 5 Jun 2024 09:38:42 +0100 Subject: [PATCH 05/83] - some code format updates --- lib60870/CS104/Connection.cs | 3 --- lib60870/CS104/Server.cs | 14 ++------------ 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/lib60870/CS104/Connection.cs b/lib60870/CS104/Connection.cs index b3ef16f..42897f7 100644 --- a/lib60870/CS104/Connection.cs +++ b/lib60870/CS104/Connection.cs @@ -1660,15 +1660,12 @@ public X509Certificate LocalCertificateSelectionCallback(object sender, string t private void HandleConnection() { - byte[] bytes = new byte[300]; try { - try { - connecting = true; try diff --git a/lib60870/CS104/Server.cs b/lib60870/CS104/Server.cs index eb76c00..3d9d97e 100644 --- a/lib60870/CS104/Server.cs +++ b/lib60870/CS104/Server.cs @@ -66,7 +66,7 @@ public enum ClientConnectionEvent CLOSED } - public delegate void ConnectionEventHandler(object parameter,ClientConnection connection,ClientConnectionEvent eventType); + public delegate void ConnectionEventHandler(object parameter,ClientConnection connection, ClientConnectionEvent eventType); /// /// Server mode (redundancy group support) @@ -238,7 +238,6 @@ public BufferFrame GetNextWaitingASDU(out long timestamp, out int index) if (numberOfAsduInQueue > 0) { - int currentIndex = oldestQueueEntry; while (enqueuedASDUs[currentIndex].state != QueueEntryState.WAITING_FOR_TRANSMISSION) @@ -746,15 +745,12 @@ private void ServerAcceptThread() while (running) { - try { - Socket newSocket = listeningSocket.Accept(); if (newSocket != null) { - newSocket.NoDelay = true; DebugLog("New connection"); @@ -763,7 +759,6 @@ private void ServerAcceptThread() DebugLog(" from IP: " + ipEndPoint.Address.ToString()); - bool acceptConnection = true; if (OpenConnections >= maxOpenConnections) @@ -776,7 +771,6 @@ private void ServerAcceptThread() if (acceptConnection) { - ClientConnection connection = null; if ((serverMode == ServerMode.SINGLE_REDUNDANCY_GROUP) || (serverMode == ServerMode.MULTIPLE_REDUNDANCY_GROUPS)) @@ -803,7 +797,6 @@ private void ServerAcceptThread() if (matchingGroup != null) { - connection = new ClientConnection(newSocket, securityInfo, apciParameters, alParameters, this, matchingGroup.asduQueue, debugOutput); @@ -816,7 +809,6 @@ private void ServerAcceptThread() DebugLog("Found no matching redundancy group -> close connection"); newSocket.Close(); } - } else { @@ -841,7 +833,6 @@ private void ServerAcceptThread() { running = false; } - } } @@ -887,7 +878,7 @@ public void Start() IPAddress ipAddress = IPAddress.Parse(localHostname); IPEndPoint localEP = new IPEndPoint(ipAddress, localPort); - // Create a TCP/IP socket. + // Create a TCP/IP socket. listeningSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); @@ -975,7 +966,6 @@ public bool IsRunning() /// when the ASDU queue is full and mode is EnqueueMode.THROW_EXCEPTION. public void EnqueueASDU(ASDU asdu) { - if (serverMode == ServerMode.CONNECTION_IS_REDUNDANCY_GROUP) { foreach (ClientConnection connection in allOpenConnections) From 6668d2d4f3141284b2164fd5d5b7ef41b2650f12 Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Wed, 5 Jun 2024 18:22:14 +0200 Subject: [PATCH 06/83] Showing number of queues when increasing --- examples/cs104-server4/App.config | 6 + examples/cs104-server4/Program.cs | 90 +++++++++++++++ .../cs104-server4/Properties/AssemblyInfo.cs | 36 ++++++ .../cs104-server4/bin/Debug/cs104-server4.exe | Bin 0 -> 6144 bytes .../bin/Debug/cs104-server4.exe.config | 6 + .../cs104-server4/bin/Debug/cs104-server4.pdb | Bin 0 -> 24064 bytes examples/cs104-server4/bin/Debug/lib60870.dll | Bin 0 -> 203264 bytes examples/cs104-server4/bin/Debug/lib60870.pdb | Bin 0 -> 660992 bytes examples/cs104-server4/cs104-server4.csproj | 56 ++++++++++ ...ework,Version=v4.7.2.AssemblyAttributes.cs | 4 + .../DesignTimeResolveAssemblyReferences.cache | Bin 0 -> 205 bytes ...gnTimeResolveAssemblyReferencesInput.cache | Bin 0 -> 1969 bytes .../obj/Debug/cs104-se.4D486F49.Up2Date | 0 ...104-server4.csproj.AssemblyReference.cache | Bin 0 -> 4296 bytes ...104-server4.csproj.CoreCompileInputs.cache | 1 + .../cs104-server4.csproj.FileListAbsolute.txt | 10 ++ .../cs104-server4/obj/Debug/cs104-server4.exe | Bin 0 -> 6144 bytes .../cs104-server4/obj/Debug/cs104-server4.pdb | Bin 0 -> 24064 bytes lib60870.NET.sln | 14 ++- lib60870/CS104/Server.cs | 103 +++++++++--------- 20 files changed, 275 insertions(+), 51 deletions(-) create mode 100644 examples/cs104-server4/App.config create mode 100644 examples/cs104-server4/Program.cs create mode 100644 examples/cs104-server4/Properties/AssemblyInfo.cs create mode 100644 examples/cs104-server4/bin/Debug/cs104-server4.exe create mode 100644 examples/cs104-server4/bin/Debug/cs104-server4.exe.config create mode 100644 examples/cs104-server4/bin/Debug/cs104-server4.pdb create mode 100644 examples/cs104-server4/bin/Debug/lib60870.dll create mode 100644 examples/cs104-server4/bin/Debug/lib60870.pdb create mode 100644 examples/cs104-server4/cs104-server4.csproj create mode 100644 examples/cs104-server4/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs create mode 100644 examples/cs104-server4/obj/Debug/DesignTimeResolveAssemblyReferences.cache create mode 100644 examples/cs104-server4/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache create mode 100644 examples/cs104-server4/obj/Debug/cs104-se.4D486F49.Up2Date create mode 100644 examples/cs104-server4/obj/Debug/cs104-server4.csproj.AssemblyReference.cache create mode 100644 examples/cs104-server4/obj/Debug/cs104-server4.csproj.CoreCompileInputs.cache create mode 100644 examples/cs104-server4/obj/Debug/cs104-server4.csproj.FileListAbsolute.txt create mode 100644 examples/cs104-server4/obj/Debug/cs104-server4.exe create mode 100644 examples/cs104-server4/obj/Debug/cs104-server4.pdb diff --git a/examples/cs104-server4/App.config b/examples/cs104-server4/App.config new file mode 100644 index 0000000..56efbc7 --- /dev/null +++ b/examples/cs104-server4/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/examples/cs104-server4/Program.cs b/examples/cs104-server4/Program.cs new file mode 100644 index 0000000..b056051 --- /dev/null +++ b/examples/cs104-server4/Program.cs @@ -0,0 +1,90 @@ +using System; +using System.Net; +using System.Net.Sockets; +using System.Threading; + +using lib60870; +using lib60870.CS101; +using lib60870.CS104; + + +namespace cs104_server4 +{ + class MainProgram + { + public static void Main(string[] args) + { + bool running = true; + + Console.CancelKeyPress += delegate (object sender, ConsoleCancelEventArgs e) { + e.Cancel = true; + running = false; + }; + + // specify application layer parameters (CS 101 and CS 104) + var alParams = new ApplicationLayerParameters(); + alParams.SizeOfCA = 2; + alParams.SizeOfIOA = 3; + alParams.MaxAsduLength = 249; + + // specify APCI parameters (only CS 104) + var apciParameters = new APCIParameters(); + apciParameters.K = 12; + apciParameters.W = 8; + apciParameters.T0 = 10; + apciParameters.T1 = 15; + apciParameters.T2 = 10; + apciParameters.T3 = 20; + + Server server = new Server(apciParameters, alParams); + + server.DebugOutput = true; + + server.MaxQueueSize = 10; + server.EnqueueMode = EnqueueMode.REMOVE_OLDEST; + + server.Start(); + + ASDU newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.INITIALIZED, false, false, 0, 1, false); + EndOfInitialization eoi = new EndOfInitialization(0); + newAsdu.AddInformationObject(eoi); + server.EnqueueASDU(newAsdu); + + int waitTime = 1000; + + while (running && server.IsRunning()) + { + Thread.Sleep(100); + + if (waitTime > 0) + waitTime -= 100; + else + { + + newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + + newAsdu.AddInformationObject(new MeasuredValueScaled(110, -1, new QualityDescriptor())); + + server.EnqueueASDU(newAsdu); + + RedundancyGroup redundancyGroup = new RedundancyGroup(); + int count = server.GetNumberOfQueueEntries(redundancyGroup); + Console.WriteLine($"Number of queue entries: {count}"); + + waitTime = 1000; + } + } + + if (server.IsRunning()) + { + Console.WriteLine("Stop server"); + server.Stop(); + } + else + { + Console.WriteLine("Server stopped"); + } + + } + } +} diff --git a/examples/cs104-server4/Properties/AssemblyInfo.cs b/examples/cs104-server4/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..22e35ef --- /dev/null +++ b/examples/cs104-server4/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("cs104-server4")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("cs104-server4")] +[assembly: AssemblyCopyright("Copyright © 2024")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("7a8dd7fa-3248-4da4-8a6e-3bf673d2c6fe")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/examples/cs104-server4/bin/Debug/cs104-server4.exe b/examples/cs104-server4/bin/Debug/cs104-server4.exe new file mode 100644 index 0000000000000000000000000000000000000000..0f7175c1fd087e948d2896d75267446ccbd7157a GIT binary patch literal 6144 zcmeHLZ)_CD6@R;TKHnYK;m%+K0lYaUDFJ+({{$SciH&W@1sfaAfJiKvz1=ypu(x~c z>^Z)mw9u-gs8LI#whC=prBNkHrK(L8-ps!B_(K;cL_}dc*RK=3gkH2k2|pg30lT^Vr_J}ZywjZEaUqHD5rQ&arTs_My6qA?{z zPVwGnYu2t(ik2xECHz)10c^~7yHvxbr*IM-( zBiS^fV`-0j21e4iK_FtGSW3Ht{Y19HzKZR!Z(!~ zXiJLd`M8LkN=jW=rO+n;Ety8TjEVS5a3oeFPLa09FbYSmMUZ3>4(H<=69B}MfXfUv6T|2RceU)>h&hV?anH`5oCT3 zzzwSTCeT`^+nn0c{<|PeFCZZrjZZVKfyBKe9@t7!dlG(j)R&SjR3QKLZ>lBo1Hcwkl1? zh$(@mUr~cTLjP9&8j8>fRlqLgmC$XJ!1M?mRStr3Rl-*#JfI57dI`5lSd#QnbMFd|COu8llVK4WT#{!d(d1RQO@QXF>wLNP@B}B%ljQgrd@iKFCMtTu8uwl9>A? zRmi+UV%8=p{~c(H&};OZ8mAvh%A3#@p}mlg(0l3z5du0V09Gp2xPp?Qc^ZNO)929dH#{5BlK&)4E>JIhPTmq zNjXnnh2`@kd_GVAz-~S%=}*!RKzWjWE@524K?%ntoC3TE$$t6+y%1gn{29!>NPnUc zz#oSrfJXR1`YvQ9=rZ6m@Nb26!KGRH5V>3=MG;=b06lt6+Pz3x_%y9iz7{?UKd;f_ zkiVin0eAwEXQj-m)QB~vX&LmUsfB(5csr!i$lbR9H`BX-JreGea9Gm!(ceJNNy@_# z8h8_?=_K6?$Z5A?&}q7$tflaoT7F{_Wjg^VPD8C-per@Bt`E+FxZTlgE59w%w>?9g z`7=`)>fdF|%#2vPWb2h-TjxA81LC-DIlJ;RKx^{p;apdyE11rpmQ7#^w{WG8~rJ{omSm06h$3|R@A+d zi(001Za7=V00Kts)aPVJC0dmS4xs+4>w?nj>j8 z&*aXH>+=W1ri;X&T!s6rm<~1@ZxzaNXm$jK5>xh7k*dLTHDp2}coEf<4so+Q#++II zxTFm0j=^jasg4DU^0jJAl4w{jbL8cer#rl8aj^@?MsuQ&bu8b~ZR=4PzM6vvS;1z8 zh&SbI#!9g5mgpce%Z>>{mA#%@F2Sy2GOw18fd`{=%<&)49TVwDIeA_vZTPN72g)$x zS896+N_D9tmOksa+_wx~Bh^-qlgT`{B=lGYyNO-P`vrcG-w2jCD4g~(e}B1{XWm3X z?!l;oV*z^g1l4&wu;MIOVnR54U4*_I*WGp1LVSI5;&b0*NTk5wi; z#yRbAy`t{ZkZER}g2WNUiTnwK6H(MXUv8IlbfWB+%A%g2`}R|rij*ft9%(9 z{uft2{>K+SIJT3*nxaHQ8YvAx5(zPE7C>FqxIDQ$IhxES$CC$=hoWloXjD}jG*wx* zx`7lW$r^!!Jt}9O3Tu=cU9L4M$BkdX#i7AR)k3MKp4}aQ7r_JJaZPbX!2+S zsm;yn1g9BZsL>Z6oj$y#_v(2yq6#bPn640((*0k5`eJE7dPE;pE!_*93NRt9`)*oS9+Q8=Yt3 zA`9M*jHOLmROX^xzl*d%iQO8g^3zhoS2Vt}XfpVkt`iOFOne8QsUrdnf_(!~(go-E zN65d9YVyJ$QNOHYA&Ax=LI%-c)Ic+UqjV5h7GLQ5G0p<+3BK0p7vcA>1$G15H6QMm zT7pWb#;KA}_X(-Pq~j*ogS)`SY0lziDBuPV?M@Q)(-gQms2qG9=iUO>k$ghc_%xD8 zfltA0;-F5vS<}3f$>4?we!aMvkl?fyGZh+!z9N3Xog_buz)RKfO45D>tJS4k)j0fb zhE&bo2sCgq+67cBNtCopj*2Dh4sYzC))QO9A)<#lW9Lj9RpcnCI=kQY(% zrK|&=>^jdr+EyC!^LWJn7KDy5;IneJh(L)d((_qlhq%LUrfI01HT=5aPdC;=vdjHln2=bH!dR?$(X--X11;r!MK=|Jf`3_s=Til`ZVtTGCr4@C@DlqQXE^cWL$~0|3S=K~>gF0r3 zPvQlT(j4671F7*!UBQsnOQqD-K!fjPv}o~O3s6A&WtjO{YrHVipTIJfm+g> z^sG5l*0YR%LajYDts2^*9$dLbSrmL@Y>wHQE#N>(=UHdYJ;}V3R + + + + + \ No newline at end of file diff --git a/examples/cs104-server4/bin/Debug/cs104-server4.pdb b/examples/cs104-server4/bin/Debug/cs104-server4.pdb new file mode 100644 index 0000000000000000000000000000000000000000..ef9471983ac38c66315bb29eedb43820d552bb80 GIT binary patch literal 24064 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

1LzmTIhP=#GUT>T#L0@zt5$w)uwiM^ouoW!TDm{ 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 NseHeF{lDYDe*?)RdEo#6 literal 0 HcmV?d00001 diff --git a/examples/cs104-server4/bin/Debug/lib60870.pdb b/examples/cs104-server4/bin/Debug/lib60870.pdb new file mode 100644 index 0000000000000000000000000000000000000000..8235c24914c97e521e9053d8ce09f91374aaf8b3 GIT binary patch literal 660992 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

S?h}*%U*(?ro2SQ+i5CnRGn!{xqDvUp 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 literal 0 HcmV?d00001 diff --git a/examples/cs104-server4/cs104-server4.csproj b/examples/cs104-server4/cs104-server4.csproj new file mode 100644 index 0000000..f92438e --- /dev/null +++ b/examples/cs104-server4/cs104-server4.csproj @@ -0,0 +1,56 @@ + + + + + Debug + AnyCPU + {7A8DD7FA-3248-4DA4-8A6E-3BF673D2C6FE} + Exe + cs104_server4 + cs104-server4 + v4.7.2 + 512 + true + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\lib60870\bin\Debug\lib60870.dll + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/cs104-server4/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs b/examples/cs104-server4/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs new file mode 100644 index 0000000..3871b18 --- /dev/null +++ b/examples/cs104-server4/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] diff --git a/examples/cs104-server4/obj/Debug/DesignTimeResolveAssemblyReferences.cache b/examples/cs104-server4/obj/Debug/DesignTimeResolveAssemblyReferences.cache new file mode 100644 index 0000000000000000000000000000000000000000..c5634ba28c34795f55fe80d6277dfb5be1b4799f GIT binary patch literal 205 zcmZQ$WMp7qU`%wjiU}ynPcKT$RdCD9Ni9~;sIV~8j0s9jOD#&xOHNgAEG|yXP0Gnk zEspWcOfJeV&QB|eaRaJPEzd8?j?wdT4MFhAO!Un4jAC+&lk^E1^Sse$w8&b>G-{G4Nty&U&^W}m_q_{xYd{-%o#bG? z!h%JST58${v#=_oKa^gWjB%ien4Wgd&pJecrLbXXmVlw$9Cx}OF~SOTmtJNW;Y!X# zeD|M$|54~vNK9h7jCWwnTwvH6tzym6AQYHD@L_X)dPGMs0}YZxaA^#r(?noy-v!so zsF|f9u7@>Bp=3Ci?4DL#az;Mw7Lwk0&UEI!5%WSy4Obd9Izr@yFwTvIl=PGa2U+=q z^qFPE4P&r_jRk3hlE%BX5{ue?`P7E-=RV^P!ICR$%Ua_;LHB9mcEqa~$M`1XZwEqG zX&m5r>qV4{+zgi$#-XaCg_pNQkI6_x%)+Ayi`tWGq*hxezCnALr7?rH*&8a=x5YG4G&Z8LYl;(7bK9Tq_Allm8J>0O(0;J*0FJjnB4TWvzj=?cE-BP zxFE!tBNBfDH~x~{K!U#np0gxtX)jS7QmKs{=lOfz`~2CxNXnLF5n8Xgnx~{#kwtdz*n70@0hi)Lf zQ24BAw|t)voX0x;xqJ8XNy&;EcCq zDdSvKd#*b7;E_dkFpXCdgmjVb=}7OG2&Rhxs# z8g7$u9NUaKSyzVrVk7bt6|7 z8-1xDm@rNpaiG+MTpdze9R3oH()j=2MJ%#ch^9}|$y9Ns=<_(U*2cul=_t37Y3dmXnCD13y=s!I~yQ8>oXt_KRd0!P+kve>;Y5?H$JG zHbc(jV%HhnNeZws;C2Ep-B;?=+h@F!E9GH<8eBCq3Ai<`K=cHYfZN^y^B^CK!}vxQP@#vF z4N&$|rN-Hv(X*k6MP$hCMj7^sv?zTX9C0Yz^#7kp>K%9#Li|V8*wMp8eNCC9QBO;Q QHNcAmQ~e37XGC~^0U!)DJpcdz literal 0 HcmV?d00001 diff --git a/examples/cs104-server4/obj/Debug/cs104-server4.csproj.CoreCompileInputs.cache b/examples/cs104-server4/obj/Debug/cs104-server4.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..9ca4e1e --- /dev/null +++ b/examples/cs104-server4/obj/Debug/cs104-server4.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +d4146f978379a4f1621d42c638ddacf459559ada16a8554b8fb4e526a80509b1 diff --git a/examples/cs104-server4/obj/Debug/cs104-server4.csproj.FileListAbsolute.txt b/examples/cs104-server4/obj/Debug/cs104-server4.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..c5e4b7f --- /dev/null +++ b/examples/cs104-server4/obj/Debug/cs104-server4.csproj.FileListAbsolute.txt @@ -0,0 +1,10 @@ +C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server4\obj\Debug\cs104-server4.csproj.AssemblyReference.cache +C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server4\obj\Debug\cs104-server4.csproj.CoreCompileInputs.cache +C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server4\bin\Debug\cs104-server4.exe.config +C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server4\bin\Debug\cs104-server4.exe +C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server4\bin\Debug\cs104-server4.pdb +C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server4\bin\Debug\lib60870.dll +C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server4\bin\Debug\lib60870.pdb +C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server4\obj\Debug\cs104-se.4D486F49.Up2Date +C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server4\obj\Debug\cs104-server4.exe +C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server4\obj\Debug\cs104-server4.pdb diff --git a/examples/cs104-server4/obj/Debug/cs104-server4.exe b/examples/cs104-server4/obj/Debug/cs104-server4.exe new file mode 100644 index 0000000000000000000000000000000000000000..0f7175c1fd087e948d2896d75267446ccbd7157a GIT binary patch literal 6144 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 @@ -796,6 +758,47 @@ public int ReceiveTimeout } } + public int GetEntryCount(ASDUQueue queue) + { + int count = 0; + queueLock.Wait(); + + try + { + count = entryCounter; + } + + finally + { + queueLock.Release(); + } + return count; + } + + public int GetNumberOfQueueEntries(RedundancyGroup redundancyGroup) + { + if (serverMode == ServerMode.SINGLE_REDUNDANCY_GROUP) + { + return GetEntryCount(asduQueue); + } + + if (serverMode == ServerMode.MULTIPLE_REDUNDANCY_GROUPS) + { + if (redundancyGroup != null) + { + return GetEntryCount(redundancyGroup.asduQueue); + } + + + Console.WriteLine("CS104_SLAVE: redundancy group not found\\n\""); + + } + + + + return 0; + } + private void ServerAcceptThread() { running = true; @@ -1041,6 +1044,7 @@ public void EnqueueASDU(ASDU asdu) if (connection.IsActive) { connection.GetASDUQueue().EnqueueAsdu(asdu); + entryCounter++; } } } @@ -1049,6 +1053,7 @@ public void EnqueueASDU(ASDU asdu) foreach (RedundancyGroup redGroup in redGroups) { redGroup.EnqueueASDU(asdu); + entryCounter++; } } } From 7b8fec06205e543d6ee63a53b00a69ebdbbcd1c2 Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Fri, 7 Jun 2024 17:28:45 +0200 Subject: [PATCH 07/83] Latest update --- examples/cs104-server4/Program.cs | 4 +- .../cs104-server4/bin/Debug/cs104-server4.exe | Bin 6144 -> 6144 bytes .../cs104-server4/bin/Debug/cs104-server4.pdb | Bin 24064 -> 24064 bytes examples/cs104-server4/bin/Debug/lib60870.dll | Bin 203264 -> 203776 bytes examples/cs104-server4/bin/Debug/lib60870.pdb | Bin 660992 -> 663040 bytes ...104-server4.csproj.AssemblyReference.cache | Bin 4296 -> 3621 bytes .../cs104-server4/obj/Debug/cs104-server4.exe | Bin 6144 -> 6144 bytes .../cs104-server4/obj/Debug/cs104-server4.pdb | Bin 24064 -> 24064 bytes lib60870/CS104/Server.cs | 75 +++++++++++------- 9 files changed, 47 insertions(+), 32 deletions(-) diff --git a/examples/cs104-server4/Program.cs b/examples/cs104-server4/Program.cs index b056051..560a508 100644 --- a/examples/cs104-server4/Program.cs +++ b/examples/cs104-server4/Program.cs @@ -67,10 +67,8 @@ public static void Main(string[] args) server.EnqueueASDU(newAsdu); - RedundancyGroup redundancyGroup = new RedundancyGroup(); - int count = server.GetNumberOfQueueEntries(redundancyGroup); + int count = server.GetNumberOfQueueEntries(null); Console.WriteLine($"Number of queue entries: {count}"); - waitTime = 1000; } } diff --git a/examples/cs104-server4/bin/Debug/cs104-server4.exe b/examples/cs104-server4/bin/Debug/cs104-server4.exe index 0f7175c1fd087e948d2896d75267446ccbd7157a..3c20bc4a7a3638b9c1773aa8abb0bd81fffc540d 100644 GIT binary patch delta 887 zcmYL{T}TvB6vzMP&Yhjv&99x+&B%vY%@5pdT{0?K1gY!;Qxw@gl*rHsliX4RAxbS2 z2`iT?MM-7#AVOIo1xYX2i-HvP6wyN;&`S^HV+PupfokCX&N=_{ap&HdzF1#uWJrD; zyEd5`&Z7^h$%8bgh>G=v2(V3sL_{5?V)~@|sn?#_2>02`6wqPk0}p+G#t{J?wU`rA zbwbh|l@OmrxJSjcJZe;jv`u;5>|`n63z(f;dD?Fdb1#*ISt^OBDQ#^l&-R5W81VYN z+dEcQSG`F`3HbcJND!TIZYtqd^1+*oItJl%bT<4`QJODG%ACZ1XE)^9WX#b-@I3D- zOI4{Xs%X}Lf(yU`+d0X8Lw9Fe$B8cIXrm_3&9)%X0MiR(IsTr+zFll{IUZG4WSnAZ zUfxw5`VQTPq}HS!>+!8OP-k-yuA@-9#ka8>a-zZ93C+W|qw#6~M`>|6$kLznN$!uhQOdfTzIF2Q> zYVG*t&Lo=9PP1;y9;~BL*~{}+Fu=;JxXe7s`}Vt)FJNdnh++*Um;pSgWwRb{nFV;y z4C6bq+-2P5PFJty4Wnpql_r-h@KO}*C}(z|l3H*MSJgA4P`irRR4AZ+8tK!&jS9WD z?7)NTBaO}b@2}LZR42CdLE1#7W`lHg{C+3Qa3BK48Y|7Jvi4auR=t%lg(-w?3(CvY zL1Y~>*ym)G+jmOZu&UB*gRCn587?%1Geqa4u+BOqR=wo5EYq+xGEM8e$0pP28&LD< z#dJh1r7z{IJf%m@Hxs-r@{;^FO7$yaL*~H1$h$Yu-RjH3w%bE5Z>vaVhc(67zt5cG f+o@2HX4LD+Cbw|GhGmk!)2n;QC#$sx+a;6Ql1x`Q;0+ia(@0e)BAmE~cJ!BA3!;`9{d<6>yyry^Mo|&1MKbb(DnHLQq9j7vXwt7;FR0UM{k#78# zMfp5l7AsOKj&j60h{DujC3)zG>QfFmS1efFM$Lkrm73X;*D#6<*@L2x0(NIU{~Vf_PiF zh^=A+u91H;hKV~!Ulc8B744Wto7MrwR80>tjXO^L0obAkv)LJur7pj4lKf-5kGPMV zS;zATZY_vPPQD)BDc|U1njN+xk5ytns)$`! z!&=dUetF$pqV;1eR}_%1-TskDcU;db8?8Tab0V?nLHOkR`%^pP5H@3mW`pS@OjCvV z3OwlcSw5@AstM{LbBUrszN*Y#^eBdu-E%J^3TOr+_XSGA>TXGu5XoTqwhvkR-`2|yx zo!gU-6K4aL<3rO%MurPIt+BtqklOJ|X**XGV$bERg8GsCSwD6Db@hlD`oeNC_ixim Bv;F`8 diff --git a/examples/cs104-server4/bin/Debug/cs104-server4.pdb b/examples/cs104-server4/bin/Debug/cs104-server4.pdb index ef9471983ac38c66315bb29eedb43820d552bb80..0b57beb434a5fd4e17ab71d13467f359823d94bd 100644 GIT binary patch delta 583 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 B16BY4 diff --git a/examples/cs104-server4/bin/Debug/lib60870.pdb b/examples/cs104-server4/bin/Debug/lib60870.pdb index 8235c24914c97e521e9053d8ce09f91374aaf8b3..8eb3693732eea1b142b6f7e829551e0de916c359 100644 GIT binary patch delta 99081 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 hT)rT=s#|H7~qj`0r`e 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 KU!c%|`~DwbwxOy3 diff --git a/examples/cs104-server4/obj/Debug/cs104-server4.csproj.AssemblyReference.cache b/examples/cs104-server4/obj/Debug/cs104-server4.csproj.AssemblyReference.cache index 420cae0352c69cda2b88486a848d67648e190407..70c29f6c95af2028942f76d6fa8797ef7683e75a 100644 GIT binary patch delta 45 zcmX@1xKw6BITHiJ!~;dXP{?nU~Fi~002@b B3?cvk delta 148 zcmZ1~b3$=KxhEq75HPX=37)+CqTI}syhOdcoC0nTCoe4-iJbysgB9haWrHPP9I(v9 z$}G0_hqLEZwr+eW$u!xF$8T~bSJ33^%x;tUd4(qL=Z@W+&%B&#awoIjWP8q@$ueBN UK+M4roSIx(lvz?a*^t8r0CP7o@Bjb+ diff --git a/examples/cs104-server4/obj/Debug/cs104-server4.exe b/examples/cs104-server4/obj/Debug/cs104-server4.exe index 0f7175c1fd087e948d2896d75267446ccbd7157a..3c20bc4a7a3638b9c1773aa8abb0bd81fffc540d 100644 GIT binary patch delta 887 zcmYL{T}TvB6vzMP&Yhjv&99x+&B%vY%@5pdT{0?K1gY!;Qxw@gl*rHsliX4RAxbS2 z2`iT?MM-7#AVOIo1xYX2i-HvP6wyN;&`S^HV+PupfokCX&N=_{ap&HdzF1#uWJrD; zyEd5`&Z7^h$%8bgh>G=v2(V3sL_{5?V)~@|sn?#_2>02`6wqPk0}p+G#t{J?wU`rA zbwbh|l@OmrxJSjcJZe;jv`u;5>|`n63z(f;dD?Fdb1#*ISt^OBDQ#^l&-R5W81VYN z+dEcQSG`F`3HbcJND!TIZYtqd^1+*oItJl%bT<4`QJODG%ACZ1XE)^9WX#b-@I3D- zOI4{Xs%X}Lf(yU`+d0X8Lw9Fe$B8cIXrm_3&9)%X0MiR(IsTr+zFll{IUZG4WSnAZ zUfxw5`VQTPq}HS!>+!8OP-k-yuA@-9#ka8>a-zZ93C+W|qw#6~M`>|6$kLznN$!uhQOdfTzIF2Q> zYVG*t&Lo=9PP1;y9;~BL*~{}+Fu=;JxXe7s`}Vt)FJNdnh++*Um;pSgWwRb{nFV;y z4C6bq+-2P5PFJty4Wnpql_r-h@KO}*C}(z|l3H*MSJgA4P`irRR4AZ+8tK!&jS9WD z?7)NTBaO}b@2}LZR42CdLE1#7W`lHg{C+3Qa3BK48Y|7Jvi4auR=t%lg(-w?3(CvY zL1Y~>*ym)G+jmOZu&UB*gRCn587?%1Geqa4u+BOqR=wo5EYq+xGEM8e$0pP28&LD< z#dJh1r7z{IJf%m@Hxs-r@{;^FO7$yaL*~H1$h$Yu-RjH3w%bE5Z>vaVhc(67zt5cG f+o@2HX4LD+Cbw|GhGmk!)2n;QC#$sx+a;6Ql1x`Q;0+ia(@0e)BAmE~cJ!BA3!;`9{d<6>yyry^Mo|&1MKbb(DnHLQq9j7vXwt7;FR0UM{k#78# zMfp5l7AsOKj&j60h{DujC3)zG>QfFmS1efFM$Lkrm73X;*D#6<*@L2x0(NIU{~Vf_PiF zh^=A+u91H;hKV~!Ulc8B744Wto7MrwR80>tjXO^L0obAkv)LJur7pj4lKf-5kGPMV zS;zATZY_vPPQD)BDc|U1njN+xk5ytns)$`! z!&=dUetF$pqV;1eR}_%1-TskDcU;db8?8Tab0V?nLHOkR`%^pP5H@3mW`pS@OjCvV z3OwlcSw5@AstM{LbBUrszN*Y#^eBdu-E%J^3TOr+_XSGA>TXGu5XoTqwhvkR-`2|yx zo!gU-6K4aL<3rO%MurPIt+BtqklOJ|X**XGV$bERg8GsCSwD6Db@hlD`oeNC_ixim Bv;F`8 diff --git a/examples/cs104-server4/obj/Debug/cs104-server4.pdb b/examples/cs104-server4/obj/Debug/cs104-server4.pdb index ef9471983ac38c66315bb29eedb43820d552bb80..0b57beb434a5fd4e17ab71d13467f359823d94bd 100644 GIT binary patch delta 583 zcmZqJ!`QHgaf1h!Lh-jsbCU^KZykSr|MKto#^u+q%*f;5)0{HA+?=9tfRSuRiHDoN>nOgIiIwD!v z85jjXDuJM(k%@tcfsNr4kiP(GJR{JIc~A$L0mY|Go~d!U{tl33!NAaP7f4$I>8C*2 z8c4qZ((m5?Yxn@9ZGimmP(H{lc0m3wAngF8d4VQ60cj;5?E<8=fwUWtHUZM^K-wEf zdjRPmAnggHgMqXckPZRT<_rvR4e3Az$f7(T?E{o3gYv6@v@eif4W#{mbQ_TN2hzPj zIsi!b0cnuF2|zjs$e#$LgMsuMARPjv=K|@l$$?r^8QnI&))Hl$7+|tVCxweM1R5MW zHs_kn2E~M+fbirAIxIkzqJ=i&`pv!;-`N=@HoH1Vvw&l4af%BYvM#ULtXOqzXO{T4 mk#Q~1S_bRZ)(Mx+>A6jQv?grKiBV^=tcDEtWXATZOs)A$9a|VCJ7`Equ7TRb2sCab)NSTKgBMIL)VN%K zAIP#`U}$&%q%DE;3m|O`q~8PSckll-djZ%ALJ}MApb9rb^y`>KogySv?`Ex z0n&Ov+6_pX0%><3Z4ab9fOHs;_5#weK-wEf#{p>{28OhTcpwAloQ5JG4YIHjNc#c# zjZl6okoE`i+kkWcke&#n1A+7mARPpxX98)EzS%%J1jwHQq(g!9av&WBq*nmxh{=jt zQ(1i(L>U4%Z`TrK+@zDj#aROlmm`~V&1QpQM^Hd`@&p|gAWP9gn{n4>UyJYTj6R!P z9i&;nvA8(Jg$-Gk*KAg-y0$Y*aGiDs+0S78>1|$A=n DebugLog = null; + public int NumberOfAsduInQueue { get => numberOfAsduInQueue; set => numberOfAsduInQueue = value; } + public ASDUQueue(int maxQueueSize, EnqueueMode enqueueMode, ApplicationLayerParameters parameters, Action DebugLog) { enqueuedASDUs = new ASDUQueueEntry[maxQueueSize]; @@ -160,7 +162,7 @@ public ASDUQueue(int maxQueueSize, EnqueueMode enqueueMode, ApplicationLayerPara this.enqueueMode = enqueueMode; this.oldestQueueEntry = -1; this.latestQueueEntry = -1; - this.numberOfAsduInQueue = 0; + this.NumberOfAsduInQueue = 0; this.maxQueueSize = maxQueueSize; this.parameters = parameters; this.DebugLog = DebugLog; @@ -177,7 +179,7 @@ public void EnqueueAsdu(ASDU asdu) { oldestQueueEntry = 0; latestQueueEntry = 0; - numberOfAsduInQueue = 1; + NumberOfAsduInQueue = 1; enqueuedASDUs[0].asdu.ResetFrame(); asdu.Encode(enqueuedASDUs[0].asdu, parameters); @@ -189,7 +191,7 @@ public void EnqueueAsdu(ASDU asdu) { bool enqueue = true; - if (numberOfAsduInQueue == maxQueueSize) + if (NumberOfAsduInQueue == maxQueueSize) { if (enqueueMode == EnqueueMode.REMOVE_OLDEST) { @@ -212,18 +214,21 @@ public void EnqueueAsdu(ASDU asdu) if (latestQueueEntry == oldestQueueEntry) oldestQueueEntry = (oldestQueueEntry + 1) % maxQueueSize; else - numberOfAsduInQueue++; + NumberOfAsduInQueue++; enqueuedASDUs[latestQueueEntry].asdu.ResetFrame(); asdu.Encode(enqueuedASDUs[latestQueueEntry].asdu, parameters); - enqueuedASDUs[latestQueueEntry].entryTimestamp = SystemUtils.currentTimeMillis(); enqueuedASDUs[latestQueueEntry].state = QueueEntryState.WAITING_FOR_TRANSMISSION; + + } + } } - DebugLog("Queue contains " + numberOfAsduInQueue + " messages (oldest: " + oldestQueueEntry + " latest: " + latestQueueEntry + ")"); + + DebugLog("Queue contains " + NumberOfAsduInQueue + " messages (oldest: " + oldestQueueEntry + " latest: " + latestQueueEntry + ")"); } public void LockASDUQueue() @@ -244,9 +249,8 @@ internal BufferFrame GetNextWaitingASDU(out long timestamp, out int index) if (enqueuedASDUs == null) return null; - if (numberOfAsduInQueue > 0) + if (NumberOfAsduInQueue > 0) { - int currentIndex = oldestQueueEntry; while (enqueuedASDUs[currentIndex].state != QueueEntryState.WAITING_FOR_TRANSMISSION) @@ -280,7 +284,7 @@ public void UnmarkAllASDUs() { lock (enqueuedASDUs) { - if (numberOfAsduInQueue > 0) + if (NumberOfAsduInQueue > 0) { for (int i = 0; i < enqueuedASDUs.Length; i++) { @@ -302,7 +306,7 @@ public void MarkASDUAsConfirmed(int index, long timestamp) lock (enqueuedASDUs) { - if (numberOfAsduInQueue > 0) + if (NumberOfAsduInQueue > 0) { if (enqueuedASDUs[index].state == QueueEntryState.SENT_BUT_NOT_CONFIRMED) @@ -320,12 +324,13 @@ public void MarkASDUAsConfirmed(int index, long timestamp) enqueuedASDUs[currentIndex].state = QueueEntryState.NOT_USED; enqueuedASDUs[currentIndex].entryTimestamp = 0; - numberOfAsduInQueue -= 1; + NumberOfAsduInQueue -= 1; - if (numberOfAsduInQueue == 0) + if (NumberOfAsduInQueue == 0) { oldestQueueEntry = -1; latestQueueEntry = -1; + break; } @@ -333,7 +338,7 @@ public void MarkASDUAsConfirmed(int index, long timestamp) { oldestQueueEntry = (index + 1) % maxQueueSize; - if (numberOfAsduInQueue == 1) + if (NumberOfAsduInQueue == 1) latestQueueEntry = oldestQueueEntry; break; @@ -350,7 +355,7 @@ public void MarkASDUAsConfirmed(int index, long timestamp) } - DebugLog("queue state: noASDUs: " + numberOfAsduInQueue + " oldest: " + oldestQueueEntry + " latest: " + latestQueueEntry); + DebugLog("queue state: noASDUs: " + NumberOfAsduInQueue + " oldest: " + oldestQueueEntry + " latest: " + latestQueueEntry); } } } @@ -382,6 +387,11 @@ public RedundancyGroup() { } + public RedundancyGroup(ASDUQueue queue) + { + this.asduQueue = queue; + } + ///

/// Initializes a new instance of the class. @@ -547,6 +557,8 @@ public class Server : CS101.Slave private List redGroups = new List(); + + private ServerMode serverMode = ServerMode.SINGLE_REDUNDANCY_GROUP; /// @@ -649,6 +661,7 @@ public Server() { this.apciParameters = new APCIParameters(); this.alParameters = new ApplicationLayerParameters(); + } /// @@ -761,17 +774,20 @@ public int ReceiveTimeout public int GetEntryCount(ASDUQueue queue) { int count = 0; - queueLock.Wait(); - - try + if (queue != null) { - count = entryCounter; + try + { + queueLock.Wait(); + count = queue.NumberOfAsduInQueue; + queueLock.Release(); + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } } - finally - { - queueLock.Release(); - } return count; } @@ -782,20 +798,17 @@ public int GetNumberOfQueueEntries(RedundancyGroup redundancyGroup) return GetEntryCount(asduQueue); } - if (serverMode == ServerMode.MULTIPLE_REDUNDANCY_GROUPS) + else if (serverMode == ServerMode.MULTIPLE_REDUNDANCY_GROUPS) { if (redundancyGroup != null) { return GetEntryCount(redundancyGroup.asduQueue); } - Console.WriteLine("CS104_SLAVE: redundancy group not found\\n\""); } - - return 0; } @@ -1018,6 +1031,8 @@ public void Stop() } } + + /// /// Check if the server is running (listening to client connections and handling connections) or not /// @@ -1036,6 +1051,8 @@ public bool IsRunning() /// when the ASDU queue is full and mode is EnqueueMode.THROW_EXCEPTION. public void EnqueueASDU(ASDU asdu) { + ASDUQueue queue = new ASDUQueue(MaxQueueSize, enqueueMode, alParameters, DebugLog); + this.asduQueue = queue; if (serverMode == ServerMode.CONNECTION_IS_REDUNDANCY_GROUP) { @@ -1044,7 +1061,7 @@ public void EnqueueASDU(ASDU asdu) if (connection.IsActive) { connection.GetASDUQueue().EnqueueAsdu(asdu); - entryCounter++; + queue.NumberOfAsduInQueue++; } } } @@ -1053,7 +1070,7 @@ public void EnqueueASDU(ASDU asdu) foreach (RedundancyGroup redGroup in redGroups) { redGroup.EnqueueASDU(asdu); - entryCounter++; + queue.NumberOfAsduInQueue++; } } } From 089668ff223090ed53cb755fb93224e071c02f55 Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Tue, 11 Jun 2024 15:06:00 +0200 Subject: [PATCH 08/83] Adding redundancy group in server example --- examples/cs104-server4/Program.cs | 11 ++++++++++- .../cs104-server4/bin/Debug/cs104-server4.exe | Bin 6144 -> 0 bytes .../bin/Debug/cs104-server4.exe.config | 6 ------ .../cs104-server4/bin/Debug/cs104-server4.pdb | Bin 24064 -> 0 bytes examples/cs104-server4/bin/Debug/lib60870.dll | Bin 203776 -> 0 bytes examples/cs104-server4/bin/Debug/lib60870.pdb | Bin 663040 -> 0 bytes ...mework,Version=v4.7.2.AssemblyAttributes.cs | 4 ---- .../DesignTimeResolveAssemblyReferences.cache | Bin 205 -> 0 bytes ...ignTimeResolveAssemblyReferencesInput.cache | Bin 1969 -> 0 bytes .../obj/Debug/cs104-se.4D486F49.Up2Date | 0 ...s104-server4.csproj.AssemblyReference.cache | Bin 3621 -> 0 bytes ...s104-server4.csproj.CoreCompileInputs.cache | 1 - .../cs104-server4.csproj.FileListAbsolute.txt | 10 ---------- .../cs104-server4/obj/Debug/cs104-server4.exe | Bin 6144 -> 0 bytes .../cs104-server4/obj/Debug/cs104-server4.pdb | Bin 24064 -> 0 bytes lib60870/CS104/Server.cs | 17 +++++------------ 16 files changed, 15 insertions(+), 34 deletions(-) delete mode 100644 examples/cs104-server4/bin/Debug/cs104-server4.exe delete mode 100644 examples/cs104-server4/bin/Debug/cs104-server4.exe.config delete mode 100644 examples/cs104-server4/bin/Debug/cs104-server4.pdb delete mode 100644 examples/cs104-server4/bin/Debug/lib60870.dll delete mode 100644 examples/cs104-server4/bin/Debug/lib60870.pdb delete mode 100644 examples/cs104-server4/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs delete mode 100644 examples/cs104-server4/obj/Debug/DesignTimeResolveAssemblyReferences.cache delete mode 100644 examples/cs104-server4/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache delete mode 100644 examples/cs104-server4/obj/Debug/cs104-se.4D486F49.Up2Date delete mode 100644 examples/cs104-server4/obj/Debug/cs104-server4.csproj.AssemblyReference.cache delete mode 100644 examples/cs104-server4/obj/Debug/cs104-server4.csproj.CoreCompileInputs.cache delete mode 100644 examples/cs104-server4/obj/Debug/cs104-server4.csproj.FileListAbsolute.txt delete mode 100644 examples/cs104-server4/obj/Debug/cs104-server4.exe delete mode 100644 examples/cs104-server4/obj/Debug/cs104-server4.pdb diff --git a/examples/cs104-server4/Program.cs b/examples/cs104-server4/Program.cs index 560a508..7776957 100644 --- a/examples/cs104-server4/Program.cs +++ b/examples/cs104-server4/Program.cs @@ -40,13 +40,22 @@ public static void Main(string[] args) server.DebugOutput = true; + server.ServerMode = ServerMode.MULTIPLE_REDUNDANCY_GROUPS; server.MaxQueueSize = 10; + server.MaxOpenConnections = 6; + + RedundancyGroup redGroup1 = new RedundancyGroup("red-group-1"); + redGroup1.AddAllowedClient("127.0.0.1"); + + server.AddRedundancyGroup(redGroup1); + server.EnqueueMode = EnqueueMode.REMOVE_OLDEST; server.Start(); ASDU newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.INITIALIZED, false, false, 0, 1, false); EndOfInitialization eoi = new EndOfInitialization(0); + newAsdu.AddInformationObject(eoi); server.EnqueueASDU(newAsdu); @@ -67,7 +76,7 @@ public static void Main(string[] args) server.EnqueueASDU(newAsdu); - int count = server.GetNumberOfQueueEntries(null); + int count = server.GetNumberOfQueueEntries(redGroup1); Console.WriteLine($"Number of queue entries: {count}"); waitTime = 1000; } diff --git a/examples/cs104-server4/bin/Debug/cs104-server4.exe b/examples/cs104-server4/bin/Debug/cs104-server4.exe deleted file mode 100644 index 3c20bc4a7a3638b9c1773aa8abb0bd81fffc540d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6144 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 diff --git a/examples/cs104-server4/bin/Debug/cs104-server4.exe.config b/examples/cs104-server4/bin/Debug/cs104-server4.exe.config deleted file mode 100644 index 56efbc7..0000000 --- a/examples/cs104-server4/bin/Debug/cs104-server4.exe.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/examples/cs104-server4/bin/Debug/cs104-server4.pdb b/examples/cs104-server4/bin/Debug/cs104-server4.pdb deleted file mode 100644 index 0b57beb434a5fd4e17ab71d13467f359823d94bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24064 zcmeHO3v5%@89p}Q5m*AIkTGb%ydfdi?<8(hAaTe_OCXTI1hr(Y?VDiY*pcm!Wm6}2 zC55V@%QUu*t)NxgG)?O?RYMx!yw7pkVv$rbo$Sik1CBsVjlHd-)m|?-ofWeew{!@QRs9nVI7jFQ z)oNgV?*I$DW)b4bRgs79Kf zlD2@^{w3Xf1uOqSc;}{7h4`W@z$HK+J-l2{y8Tf-)HMOZ+o#? zh!19MeR1w@*B?D&yQ}%glLM7QPd`^>*ELALH(2i-KKORihwon=``h#1`{VDvo|sj+ z{`fcl9=`JX202u)qNadJu|TofKWsa(`wPSWu9Dxd{Q4VDyCSc&pZ>|4504z1H@Ew} z*s0OJNm1SuTCfF*)&3v38>T0>ef6a!-+!>_mt&W|Q|Al4@<^ollJCmAw|_d;Gg`2s zrhrMcz>jbaBpImr%B!BZEF`XUWpU)ba8lKmcc*y)UP$)21v({cM+V50s10-ONz z&wsbC_NHcqT418~uQJ=eP_vdy{$lO_%>94KH2FA1i`D+-{(qcVOU5%cIyTC!|1)^! z6M=h!yVFW49o!lpRMO2#j~tCA`%}RdCEb%r_60waO!cJuSlS#$G{TU_AN*1?{ zR3)mZ0vmVbRDo&pRgra7jz;fV1AfG0yfcwyU zY+|{}6{1pHM))i+)05~X-K~N7y$K7@_Ov5y%yCEJm@;W>Epj$Uqd-Q4T6)? zyEeu+{Nb(=(`?N58X}Ff%raZ7vhD5|OlOo{jLw`}+OA}fXPjT^NJe^;OnO{+=Yf!at>gps~cnsJMdTd#Eko8evyUIT6f-wl2O%y0*IJ$N~b09K+OtOTPKK?~VxAR9*dLgZN} zdciJmD|j1twHn8K73!{oGSK26O_m$+%T)KZFrVsYeJ&$VA3Kaz-CiL3)l?z=)@yOO zE_GHpz%b!f$ZztK@*DnHVqwRLm z%+%#pEU;LtR`(5M$Yjkw;K5%d*5}1J>zpJ^kn{8MScJAI%uj0(dRi==OGTwB1LF?M zePBmhO=wFZlNt=QCu8a+U&YW^n0Pz>YPaV}Bwt_68gTvye^( zPOc2DEgB%!$jW6mebXeqf%u zYUp*#kQz5eLZOyex-Tvd2I6>gaN=q+5b(C5Xq@CgH!ina1l3d%f2!?)WN%+AuB7-} zVy_krb*(cLv(_K&l5t(q<&yorjiSD_xuwb7g7d7XeL=cp*vdGg=L&#>aST@%aNTdj z^Q6ynD^nS5!ru;Zo*)@v#4@!e7UZxZH8WkS&0hH402lqm%6NJ#uHb?m2#c%A4PND7 zPvc!zZz6=~#0Jr5w%SOV+lV!Bido>eq|N>8Cq~CG@B{)K+hU0xPG7>&*%pu^2NdB* z;8{E^9O+cVaR3*#N-B(-)gCRN3)5ZN5t*##eznlaD5Id~_DR#~1`p!AH06aU8}3=$ zN|IK?Qvu`x&Un&v@N6(nU%X6JFS&5(DfpoNB`^>2q>DQ}6lK!XvcLjVcOAF_OET`T z#Y`Lqhz4Cm_yu_OgPHC?9y8nyUW7i@f^?g~S@_xYmV$9dFYvU$yL_1H+Ap-3hB@L3(0Key)7(Y$C-_1 zvWdvp8_Yta`TjGJg-SonxbrdZ|8MGln#}wE((m$S4e~6&`~R`$EkEQuaNp3-@Tfi0m`~SQiWjagA0=!=z0T=WB-wt`zU_LYP{-3|%=Gy^& zb3g9>e+B%!|L6Xa&s2P(;@iPQ_x~#q&bx-S;5A_L{vSpt0&OUQ3{!+@0n-AdX@UO$ D>rT0b diff --git a/examples/cs104-server4/bin/Debug/lib60870.dll b/examples/cs104-server4/bin/Debug/lib60870.dll deleted file mode 100644 index 7991dbf4b3beaca62e810f54afce8fd6e2e37f65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203776 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�PP>C?MR6uApY?rm^In#3;h~DV#z@%-tRag}mx4*o647_q`Fa*9G+l%+RoI?S zZT|m%Ipa!`FZzEjXC9I=73sfF&PM&Tlb*wz(%#zg9tYF@FbFLhY9a3O>v+1INo-w#rbf3K7(p;54w0KS z6FX_TeUvt~jmt}_qs}8nStMXypae~kLebrL)5q&*6`NR|_qDKDfqYseFKKD`P9F3} zyl;elaMnNTO@l;ip%P!y)4aad^azW+Bg0snHytPLd(2Pr#eeVc-`*(B?hs%beb0?-J9K$*ij=o%7Ai zx!M~*2R>^w$P|juYOjnvG%riF%2R#MxdqZm|Equ80 zLKeD%bJ^5+>{V@ysI4O<^0H*0mQfWn-y95i@6+-!ZNixaEkfe^#TY5_Ajlu*`^BhZoXLp2Tkn^79Ot|B zxCe=?TXhd*52e|K`^5hEI+qXdlwO>qUyaB*umtfoFdmdDy|ENV!h5M&HfZp8&EF{= zlb0>$dW@dCh+d=T(d+t*zL83C?}oto`M#Q#wEJF=O$Jxj>$=OiS`Ww#-O-jPw!@1J zQrQ2(wVR#p{f2OIWfcxAm}N6x;a=ol?ET-PaZQ6Xa9qGENApBEoY*~!q{{2+lBh?9 z77e5iCsp2CmjHN^Mz=&68lq8oXFU}D4HqUaIx`y+pIqDOV;zx0oA4M#EcU=oWz zp{T8Y9POE;f0Ff&PygUGb@8(pPL$%{xP_m-$yxx+6qp%wi83B2#;=*bGHs`zT}4uS zg%;T%yZZARNjcv47$qxwpGCc(%aj>PayBcnR?&~QO>*>Q6Iu5GC$vE9H{IW2 zKdxsd@zq6kZsFfpAh=b_v}O3fCzPhMuB3057O@u=n38gO??xb>TAex=2BaQDe{}+Q zVDnfmh4PpGZ!!PNaGn5-8w+68CFrf~c~p$PLltH3-3KB?@+p@sqH`&iEo)=dG!4hf zMKV>4MH$M*9WS1QD?nrxkX&lvt5T%2Ozft39co7%pQ~+L?ZKvHI4T7cj!JRGqauI> zUv^roD_wx_(QK^^w$DeFvKz%CiX^s#JFX^yEJDvq^jVFwNypBLSI2;hQpB? zShg`s*2|@0<2jPI+_ad8T%8Q3**T`bwX~}2OcY`RWpqky#w-S^H9e4CQjS!#=&Cc^ z8rV3wv9EDT1hZcVl%R8Oai)8uaFs^OYCwvG4N1YPKP_k}39RCFQy-(^Sq*S`u|6&= zXWk`B_u8W==i zF(PF)DDF!-nc#i==X+iIqOrhBD-|YBs_acTMm2W$qNp^l_|?s=)X|)@GRz{7HP$(4 zR!&kFDoczi+H~Yvsn)~ zQ*N3n`xi23L}t^}wE>aYGGPZ%*Q$6mgNO;nQ}(EkbK9?34at8n(TcP#a$9A~;(^zBv`GWcg;4DP&=gG;M<$60BKyf_a-l!hvBH zQi5cv_~eF&OsltXVO)znnkJFU!oH8aqSouA^BkM{C54u~%ig#hQnPqx@>^ zU2orXbA8fbGs7bst}Wgq&77tjmBE1-DjcuCC=k?}yU<+DqAX^AgVXX{k4;@(k2)xO2XKxDjwMo znWWyeIFn3*&Pm3uqN26xm90%3Iy@Cxs$YjVP^XVv)UQLHhHKE$FGv&#I!x?nOizlY z?`Jf+Cy|J$VSNAXu!dBT+ov8?%vRVuVjqXc%k$j3^UtInxGcpL=~5#+6*}Q%<*K54v}Cq&sOGU4K`)`+L!Sushu!9J+nQCu1O==XF1jnWnNP92w(NFBg&T zwvLP7{s6u{HCJL@Rem57tMu~xeG*gc6godSc`bgedJLg#OMFYZr>P;MzaN{X0^?o; zwF51Nl%}bFobvrxpBmPK6c$6yG<9pQ7ssTjuaOp?dh2+27+UNebaO{X;$$V~9 zM)&fr^f|jb-EU8%k2Uh;9%-swub1(u$0j0AMIq(+UH2i-$vYy|ey8RXpE`=KoB7nh zzV>9Fii}{K$BXG!iTpm%)rL~~v};Xw^B}r^6zz>~MQUfX6CdF+v^^zHAJ5zk?N0em znnL%tg>=t`>r;1(XMSI9!{>XYL~dP5pf`^EIT6 zq3UYuhfL3-08Yk#HwOexg`T%O;VyszVHxeOiZNFW~oz%^$ zlc4+o8g-GFZO zq&t=0>TLOO2cI-BXbS_Oi-loIu~de|VNp6GF>>Z=A= zCkr~ziRfY?&^)InIm|R@3}}9o?BS+FmDWT-%}->^+16A+zdD8Ja%;Mvs}a+0 z&9N@E=YwX|SaPqj=GZHN8dY%AInTOUV!k$vVe_m7g5Dp&bWv-epcBA7WL;(bR#0cq z3|YUiZWnYnsQ9gFYo#DN|4x-}&9@#A^fmO-*1FnyN>I;SqHC<@1=N zsa0d`5OfgyO09*~JAwvJV9Z6@4p z=??Yj7fmd+as-u$mTs|H3mPq9cUYYS%|SW%t-Gu;K_>{h#~LJPi=dU(XhA8W`TML% zf+h_i_f^&zf`$i(9<(kKREBgd)kD?-K`-_tdf57{paXg2x7u1Js4=uO&wA8aA?Qre z(qq;tL0gdb1=i!%8bPI^mp@s57W4t~u*6zxJuhfG%E50vX>ArX6*QMwPg&a>THQ*> z(pUZ2+9hG(0>)f#&>e`m!g|j7P{RBY_803jK~aRQvR<(MCTJDHR#_XZe+YUKVQYYn z3WxDU3AC>taEz5VNIv+nO!tbjjZV z>k2^=1$}N^CFrPV@C&O(&>NuQx4y8h7qnMm9<**1G*i%5)?I?u3HsXlgP@xPePcb6 zM9r%->g8MO$s{Wut!eq4=z+T1PbRT8Ekax zc2+X;u)iJiaH`!_P!KWus$UsYB$g5Exn=vsS}pk*0E*V(5D>RLgx#J)(-p>aev*;OLh*R9F#7JG3rwfiaZ zfPFfHT0%0SB@*-Efz;VO_A;T;zCCk$k9~VGx;1r@Sn~Zgb{l~1K)O!qQ6kV>41O(v zunB>%?>ds-Uu@hxMc6~oQcLv;5OdpK&|hsFi3bV~X4qEySqXaslJ&9o**I|pDzh+N zYN`Ha{|zhm=r^$mg8m4o5ynf)vz6MWQk@@?QRUR)A}npGMnDWZ3p0vss)<25W)@Ho zF;`E@zd}bpFww!pKe!iJE!q^K|0+VQ=f*Mmv^DG8I9?lGxj;S zyEC?>#w3~5Xai#QXiT@cxMkw=cX=L@M*nNW8=54kJ*AuAQUgA9%c#HNIc@Okp!Rf| z$KhT(_zk#c4t^W%f(&XYW5~8tydALrdw9+{=>xd^<++zUe>9r%OzQp-+=>aG!XD1~AH%_!@1D@|JdIavXh2-MzzA~r^!Z0~x=pjchR+v0 zN$1wV-@#qh{0F$-x!gJ=bu_K{w)$eI+@hI z6#6=qrm$jg2r&!B)F1l!;Cwf7y1UcyNglnnm z`Y`@>ar;l~4Ql;|(q~~d-CM;SHMAf61EZ*=3&#z@^UxALzdJ$V4`a-YlDmLBFBE%t zwiV;#iVm+79X9Pf25DayPybuSO~5mCm87(;bXn|>5@|11x2{)3WUt^+Q^^G31uNn-h@%JZIntPwv-oEJNi=A+V{ zbd`GAO5FU3&v`U|1vEb@o$d&6FHXH8GgdBHfhzbHiFa8)i;Q5Y`cfiPgEkPcc2=+IGDOHdSyncdu>-Nl6U`FP}Pj z;B#<$i_JR&HzK~a|EoK`jOT;Hx56zK_tzq4f(>qPv#&ESgT-72A&$C-l9$z2!gY(Acz^6wuKF^*& z|9eE*F3m`J;5fS9w4grMjA?C0zajr#oyXP_-!UVi!(GNB^rGHV;P&nim#RL0avxbZ)s64XMScEp zX;*e<-nE4KSxcp#%V39LH7k|whXK0B#C@p=Q|Xag%%x50XH9L#$g?1iS2JE8%_Y%? zHHGnGn;YSy;R(*#l2PBBB7Qp zZoatZiMvVYbd@-_i%)0qX(n!4aZeI=x41(j<|ui-QR0WiT_El-arcUQRNSY;?I-Rc zNi|iTpONQ6p=OKEtK#kwx4XCp#GNVbTyd|GRDXn=qf-yeiKh%d?)X z=pJ^DjJMglnS5a$cRB3jve1KYcQm3~;HSGhNLRsSeSZkEq02&#!sn$%biWq&*WxY| zcU30+w}@K?HJ#wK4AFfrNVi0u58*l1lFUk72mf`A=sqm&?U{UD1UDAvve0wz z8PkYvvsAiDo_{Cq>6y<#8&2tia0BhB!y{6&w9ot#SqJ}oBK?om@&B&(qi$Lq)9&*G ze6AV6R9*@{c+zSvDW!}v7j-$HCdjPW8-LqKhJM;S-us^!+z81xgy^P*>E?>NG==j?i<(Ot$HYC&L!!7FlZNCFXfj-S2{0;2EBvO;=X&~?kW8k?jvGXcZ%Ci#ys1kpL$f> zmnLyG`V3|wG1<;k4kOJIsjbE(0#H#fc;om zE6`Hu^?}aA7Q>07-Vn-7ddFwPvr-#pp>JwJ zcQl@T>Zac0UOt)B?ku8@uaG{oFu(Rv7?+PlH&v56U`PV~{S~eG zy~|Msbw!w8%`>Pk!u)EFK?{ltuv_>~gMM3V0p+&URL&n#fZf6#2F)B|0ZlaMaMuD{ zZMec9A9l?fsbvPe+ob@z?2jAtc^7_1V!J_`5tgC8GH5%(GE{my%`dG_foiNe8Wik< z6%IAdpyeHw+fCGLgC6d%(rKdB8q_v_xs4TEgG%#PI@pD6uW9zoTW$wbAA^SEt#krv zo<{1slCjBISS4W0&Fab0N3i2Lu>;YqYT1bPSy`&upoJrffL0sy#}TDjLG`wvrMW|f z^vnvWZw2Xc52;~=q(X$xZL0+?>Xn6Yn2YB5bJQV?)C)rkR5Mk`i%_aYO0$`&Fo>nu zOf5HvrP*9LJc>FrP)GVU=X#`Qr%<_wbW8=H)t}n)Jh#P=v-*2 zmFmue(W*wYl&3}s(pt(>Yjv1dd7erwk(fZ}tyQ6me5$pY?xF!%t<@@x{8z%V+Nd1{ z-GFp$)FF+8Ut5*li8M7oF&3iab?tpBjvgu=k`+h35fhWe1SIC16AF|Rte`9Uj!kZ_ zaPSj<3#3%qt1>~is=G=@X2rsEiRpBXl;27#hBjMwv>lrz#f2UG&DOHEQ?f)2f)=+u zC#zH~5t`SCUb?9Lf=KhitZu4|7m0;tNpiVb<|3c!rM7E?8eW;zOXc#~0W_c8VIgjV zlxZY3(OX?$5N)EjT5S+*qL12R5N)E5>QgFI{Im(|Wf(-8=&R-!#2VgD-C_`Hct5q) zAlA74YPUhGas5?p7fqA4G(hz+h_*C9%`=EKZlGFW5Nq5(wNE1{+mqB`LAq>DQuFW@ z5v`X@?CURd(U7c@)$J~tn>9!s(8&Ln>;g4Z`FT+Vb>*>+%k80xx9*9SjU^hV5%|r| z8k)disJcLhp;TU0!_;gS1+zw|WhUL=!fUfesqY1CRtnu?AXtG-J6vRkbka z#f+8CRMlQ1$ceGLn&_f?v(8XEHB#U7dpzqb^|3+i`#+v_jyfdh8ntXpfjUr^ydZ5iKK%-2|%yJ)2fXy~&c?Qw52E8@q^{k83PJ^zS zvODWib%(qSi@7|g0sNrQFR(Oy2B7+Gb|@_truky@t_G@psDXujy8m(^k>!r$iP z7xS^|sR7V^%~OImxahe_SdDa1PTS1j%`WOuh`F4L3ZRKQ657FdnB8u<9Y+^6yEZG1 zUQIwn&07ZJVfUhj-xcGKF%IQ^w~MBt++CEM)3$vOw+Q8Lb224+AVHP~)OI)T-GdLP z?n4-rHD_S(A+<~+{||))_`cm{ja1XIBT^nwyA5j8HkkF8DjUjl^VQCYV}g$>zUTtT zpWVs|KB=Y|)E?+5b&H@H#d7$wT4B)Swo`)Z)YK77NAA;u�F)QlGZGJoud2ZIE3w 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

J;1 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 ?@BeT1O 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%0D9J3E08C$ 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 Z-yZn42mbAWe|zBH9{9Hh{=eS?{|DTd{$l_D diff --git a/examples/cs104-server4/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs b/examples/cs104-server4/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs deleted file mode 100644 index 3871b18..0000000 --- a/examples/cs104-server4/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs +++ /dev/null @@ -1,4 +0,0 @@ -// -using System; -using System.Reflection; -[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] diff --git a/examples/cs104-server4/obj/Debug/DesignTimeResolveAssemblyReferences.cache b/examples/cs104-server4/obj/Debug/DesignTimeResolveAssemblyReferences.cache deleted file mode 100644 index c5634ba28c34795f55fe80d6277dfb5be1b4799f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 205 zcmZQ$WMp7qU`%wjiU}ynPcKT$RdCD9Ni9~;sIV~8j0s9jOD#&xOHNgAEG|yXP0Gnk zEspWcOfJeV&QB|eaRaJPEzd8?j?wdT4MFhAO!Un4jAC+&lk^E1^Sse$w8&b>G-{G4Nty&U&^W}m_q_{xYd{-%o#bG? z!h%JST58${v#=_oKa^gWjB%ien4Wgd&pJecrLbXXmVlw$9Cx}OF~SOTmtJNW;Y!X# zeD|M$|54~vNK9h7jCWwnTwvH6tzym6AQYHD@L_X)dPGMs0}YZxaA^#r(?noy-v!so zsF|f9u7@>Bp=3Ci?4DL#az;Mw7Lwk0&UEI!5%WSy4Obd9Izr@yFwTvIl=PGa2U+=q z^qFPE4P&r_jRk3hlE%BX5{ue?`P7E-=RV^P!ICR$%Ua_;LHB9mcEqa~$M`1XZwEqG zX&m5r>qV4{+zgi$#-XaCg_pNQkI6_x%)+Ayi`tWGq*hxezCnALr7?rH*&8a=x5YG4!0FK;jp zWckj~%FDQ5%M!<#^K9CNd_^Luo-XfB)g9bdYE z@L0oadLAJd$LN3CyZ!NGR);L%qKdgtS-AJWAiEgntH;HhDQBqX`W@=Wsy! z_%-zw|KKlq)xum^JP2qR48DTL#PDx=F3|lir_wl-cHZ~zRE*{(NrVyxWgppWJ*tud7>Ta z`O_Q_Eym|#XLoM#`-gNIb2VM>Nd!Bv|7Pke|$_6srN>2^|A z{LzXBMMi(=d*(C7Uysrt7cc?ZqL~HMD5ZF}81J72)Hqp9pfPU6T((25m=9(h1fw21 zrV5>&iQT0b*$xC`06ObYgB%v=fpw~=slV!=YDWsVu6Q}d5xRnNb3~FW9XLa-^07oh zCU@ajA;P5xo@v()sOT20RUTEBQ;G?>5*OKek5iwy6M5&;+J67qNvWzUEI#Z8&H{rp z3y~`!tm|y#=0PszSyg!`l~=F69`AccP%f#fyQ`c?t-)J>Zai0Gz|GLdmhEN(yAgxg z0dKK(C?@az!)7AnW{jAeD>iix7;jIs<+GT%Rn1&XuErIJu3!@I*gIq{OqRuAeo++- w6;Pp;Ij&vyOltUU9+9dS}{8tLU08EzG!vFvP diff --git a/examples/cs104-server4/obj/Debug/cs104-server4.csproj.CoreCompileInputs.cache b/examples/cs104-server4/obj/Debug/cs104-server4.csproj.CoreCompileInputs.cache deleted file mode 100644 index 9ca4e1e..0000000 --- a/examples/cs104-server4/obj/Debug/cs104-server4.csproj.CoreCompileInputs.cache +++ /dev/null @@ -1 +0,0 @@ -d4146f978379a4f1621d42c638ddacf459559ada16a8554b8fb4e526a80509b1 diff --git a/examples/cs104-server4/obj/Debug/cs104-server4.csproj.FileListAbsolute.txt b/examples/cs104-server4/obj/Debug/cs104-server4.csproj.FileListAbsolute.txt deleted file mode 100644 index c5e4b7f..0000000 --- a/examples/cs104-server4/obj/Debug/cs104-server4.csproj.FileListAbsolute.txt +++ /dev/null @@ -1,10 +0,0 @@ -C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server4\obj\Debug\cs104-server4.csproj.AssemblyReference.cache -C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server4\obj\Debug\cs104-server4.csproj.CoreCompileInputs.cache -C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server4\bin\Debug\cs104-server4.exe.config -C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server4\bin\Debug\cs104-server4.exe -C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server4\bin\Debug\cs104-server4.pdb -C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server4\bin\Debug\lib60870.dll -C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server4\bin\Debug\lib60870.pdb -C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server4\obj\Debug\cs104-se.4D486F49.Up2Date -C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server4\obj\Debug\cs104-server4.exe -C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server4\obj\Debug\cs104-server4.pdb diff --git a/examples/cs104-server4/obj/Debug/cs104-server4.exe b/examples/cs104-server4/obj/Debug/cs104-server4.exe deleted file mode 100644 index 3c20bc4a7a3638b9c1773aa8abb0bd81fffc540d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6144 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 diff --git a/examples/cs104-server4/obj/Debug/cs104-server4.pdb b/examples/cs104-server4/obj/Debug/cs104-server4.pdb deleted file mode 100644 index 0b57beb434a5fd4e17ab71d13467f359823d94bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24064 zcmeHO3v5%@89p}Q5m*AIkTGb%ydfdi?<8(hAaTe_OCXTI1hr(Y?VDiY*pcm!Wm6}2 zC55V@%QUu*t)NxgG)?O?RYMx!yw7pkVv$rbo$Sik1CBsVjlHd-)m|?-ofWeew{!@QRs9nVI7jFQ z)oNgV?*I$DW)b4bRgs79Kf zlD2@^{w3Xf1uOqSc;}{7h4`W@z$HK+J-l2{y8Tf-)HMOZ+o#? zh!19MeR1w@*B?D&yQ}%glLM7QPd`^>*ELALH(2i-KKORihwon=``h#1`{VDvo|sj+ z{`fcl9=`JX202u)qNadJu|TofKWsa(`wPSWu9Dxd{Q4VDyCSc&pZ>|4504z1H@Ew} z*s0OJNm1SuTCfF*)&3v38>T0>ef6a!-+!>_mt&W|Q|Al4@<^ollJCmAw|_d;Gg`2s zrhrMcz>jbaBpImr%B!BZEF`XUWpU)ba8lKmcc*y)UP$)21v({cM+V50s10-ONz z&wsbC_NHcqT418~uQJ=eP_vdy{$lO_%>94KH2FA1i`D+-{(qcVOU5%cIyTC!|1)^! z6M=h!yVFW49o!lpRMO2#j~tCA`%}RdCEb%r_60waO!cJuSlS#$G{TU_AN*1?{ zR3)mZ0vmVbRDo&pRgra7jz;fV1AfG0yfcwyU zY+|{}6{1pHM))i+)05~X-K~N7y$K7@_Ov5y%yCEJm@;W>Epj$Uqd-Q4T6)? zyEeu+{Nb(=(`?N58X}Ff%raZ7vhD5|OlOo{jLw`}+OA}fXPjT^NJe^;OnO{+=Yf!at>gps~cnsJMdTd#Eko8evyUIT6f-wl2O%y0*IJ$N~b09K+OtOTPKK?~VxAR9*dLgZN} zdciJmD|j1twHn8K73!{oGSK26O_m$+%T)KZFrVsYeJ&$VA3Kaz-CiL3)l?z=)@yOO zE_GHpz%b!f$ZztK@*DnHVqwRLm z%+%#pEU;LtR`(5M$Yjkw;K5%d*5}1J>zpJ^kn{8MScJAI%uj0(dRi==OGTwB1LF?M zePBmhO=wFZlNt=QCu8a+U&YW^n0Pz>YPaV}Bwt_68gTvye^( zPOc2DEgB%!$jW6mebXeqf%u zYUp*#kQz5eLZOyex-Tvd2I6>gaN=q+5b(C5Xq@CgH!ina1l3d%f2!?)WN%+AuB7-} zVy_krb*(cLv(_K&l5t(q<&yorjiSD_xuwb7g7d7XeL=cp*vdGg=L&#>aST@%aNTdj z^Q6ynD^nS5!ru;Zo*)@v#4@!e7UZxZH8WkS&0hH402lqm%6NJ#uHb?m2#c%A4PND7 zPvc!zZz6=~#0Jr5w%SOV+lV!Bido>eq|N>8Cq~CG@B{)K+hU0xPG7>&*%pu^2NdB* z;8{E^9O+cVaR3*#N-B(-)gCRN3)5ZN5t*##eznlaD5Id~_DR#~1`p!AH06aU8}3=$ zN|IK?Qvu`x&Un&v@N6(nU%X6JFS&5(DfpoNB`^>2q>DQ}6lK!XvcLjVcOAF_OET`T z#Y`Lqhz4Cm_yu_OgPHC?9y8nyUW7i@f^?g~S@_xYmV$9dFYvU$yL_1H+Ap-3hB@L3(0Key)7(Y$C-_1 zvWdvp8_Yta`TjGJg-SonxbrdZ|8MGln#}wE((m$S4e~6&`~R`$EkEQuaNp3-@Tfi0m`~SQiWjagA0=!=z0T=WB-wt`zU_LYP{-3|%=Gy^& zb3g9>e+B%!|L6Xa&s2P(;@iPQ_x~#q&bx-S;5A_L{vSpt0&OUQ3{!+@0n-AdX@UO$ D>rT0b diff --git a/lib60870/CS104/Server.cs b/lib60870/CS104/Server.cs index 6002ca7..89ad7c2 100644 --- a/lib60870/CS104/Server.cs +++ b/lib60870/CS104/Server.cs @@ -117,7 +117,7 @@ public enum EnqueueMode THROW_EXCEPTION } - public class ASDUQueue + internal class ASDUQueue { private enum QueueEntryState @@ -387,11 +387,6 @@ public RedundancyGroup() { } - public RedundancyGroup(ASDUQueue queue) - { - this.asduQueue = queue; - } - ///

/// Initializes a new instance of the class. @@ -771,7 +766,7 @@ public int ReceiveTimeout } } - public int GetEntryCount(ASDUQueue queue) + private int GetEntryCount(ASDUQueue queue) { int count = 0; if (queue != null) @@ -805,7 +800,7 @@ public int GetNumberOfQueueEntries(RedundancyGroup redundancyGroup) return GetEntryCount(redundancyGroup.asduQueue); } - Console.WriteLine("CS104_SLAVE: redundancy group not found\\n\""); + DebugLog("CS104_SLAVE: redundancy group not found\\n\""); } @@ -1051,8 +1046,8 @@ public bool IsRunning() /// when the ASDU queue is full and mode is EnqueueMode.THROW_EXCEPTION. public void EnqueueASDU(ASDU asdu) { - ASDUQueue queue = new ASDUQueue(MaxQueueSize, enqueueMode, alParameters, DebugLog); - this.asduQueue = queue; + /*ASDUQueue queue = new ASDUQueue(MaxQueueSize, enqueueMode, alParameters, DebugLog); + this.asduQueue = queue;*/ if (serverMode == ServerMode.CONNECTION_IS_REDUNDANCY_GROUP) { @@ -1061,7 +1056,6 @@ public void EnqueueASDU(ASDU asdu) if (connection.IsActive) { connection.GetASDUQueue().EnqueueAsdu(asdu); - queue.NumberOfAsduInQueue++; } } } @@ -1070,7 +1064,6 @@ public void EnqueueASDU(ASDU asdu) foreach (RedundancyGroup redGroup in redGroups) { redGroup.EnqueueASDU(asdu); - queue.NumberOfAsduInQueue++; } } } From 44c3c7806929ccb27769a82941eccea41498e9e3 Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Wed, 12 Jun 2024 15:05:16 +0200 Subject: [PATCH 09/83] Adding CONNECTION_IS_REDUNDANCY_GROUP --- examples/cs104-redundancy-server/Program.cs | 29 +----- examples/cs104-server4/Program.cs | 8 +- examples/cs104-server5/App.config | 6 ++ examples/cs104-server5/Program.cs | 92 ++++++++++++++++++ .../cs104-server5/Properties/AssemblyInfo.cs | 36 +++++++ .../cs104-server5/bin/Debug/cs104-server5.exe | Bin 0 -> 6656 bytes .../bin/Debug/cs104-server5.exe.config | 6 ++ .../cs104-server5/bin/Debug/cs104-server5.pdb | Bin 0 -> 24064 bytes examples/cs104-server5/bin/Debug/lib60870.dll | Bin 0 -> 203264 bytes examples/cs104-server5/bin/Debug/lib60870.pdb | Bin 0 -> 660992 bytes examples/cs104-server5/cs104-server5.csproj | 56 +++++++++++ ...ework,Version=v4.7.2.AssemblyAttributes.cs | 4 + ...gnTimeResolveAssemblyReferencesInput.cache | Bin 0 -> 1969 bytes .../obj/Debug/cs104-se.4D486F68.Up2Date | 0 ...104-server5.csproj.AssemblyReference.cache | Bin 0 -> 1732 bytes ...104-server5.csproj.CoreCompileInputs.cache | 1 + .../cs104-server5.csproj.FileListAbsolute.txt | 10 ++ .../cs104-server5/obj/Debug/cs104-server5.exe | Bin 0 -> 6656 bytes .../cs104-server5/obj/Debug/cs104-server5.pdb | Bin 0 -> 24064 bytes lib60870.NET.sln | 10 ++ lib60870/CS104/Server.cs | 13 ++- 21 files changed, 239 insertions(+), 32 deletions(-) create mode 100644 examples/cs104-server5/App.config create mode 100644 examples/cs104-server5/Program.cs create mode 100644 examples/cs104-server5/Properties/AssemblyInfo.cs create mode 100644 examples/cs104-server5/bin/Debug/cs104-server5.exe create mode 100644 examples/cs104-server5/bin/Debug/cs104-server5.exe.config create mode 100644 examples/cs104-server5/bin/Debug/cs104-server5.pdb create mode 100644 examples/cs104-server5/bin/Debug/lib60870.dll create mode 100644 examples/cs104-server5/bin/Debug/lib60870.pdb create mode 100644 examples/cs104-server5/cs104-server5.csproj create mode 100644 examples/cs104-server5/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs create mode 100644 examples/cs104-server5/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache create mode 100644 examples/cs104-server5/obj/Debug/cs104-se.4D486F68.Up2Date create mode 100644 examples/cs104-server5/obj/Debug/cs104-server5.csproj.AssemblyReference.cache create mode 100644 examples/cs104-server5/obj/Debug/cs104-server5.csproj.CoreCompileInputs.cache create mode 100644 examples/cs104-server5/obj/Debug/cs104-server5.csproj.FileListAbsolute.txt create mode 100644 examples/cs104-server5/obj/Debug/cs104-server5.exe create mode 100644 examples/cs104-server5/obj/Debug/cs104-server5.pdb diff --git a/examples/cs104-redundancy-server/Program.cs b/examples/cs104-redundancy-server/Program.cs index e2820b6..3a86b28 100644 --- a/examples/cs104-redundancy-server/Program.cs +++ b/examples/cs104-redundancy-server/Program.cs @@ -1,32 +1,11 @@ -// /* -// * Copyright 2016, 2017 MZ Automation GmbH -// * -// * This file is part of lib60870.NET -// * -// * lib60870.NET is free software: you can redistribute it and/or modify -// * it under the terms of the GNU General Public License as published by -// * the Free Software Foundation, either version 3 of the License, or -// * (at your option) any later version. -// * -// * lib60870.NET is distributed in the hope that it will be useful, -// * but WITHOUT ANY WARRANTY; without even the implied warranty of -// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// * GNU General Public License for more details. -// * -// * You should have received a copy of the GNU General Public License -// * along with lib60870.NET. If not, see . -// * -// * See COPYING file for the complete license text. -// */ -// -// -using System; +using System; +using System.Net; +using System.Net.Sockets; +using System.Threading; using lib60870; using lib60870.CS101; using lib60870.CS104; -using System.Net; -using System.Threading; namespace cs104_redundancy_server { diff --git a/examples/cs104-server4/Program.cs b/examples/cs104-server4/Program.cs index 7776957..cd088e7 100644 --- a/examples/cs104-server4/Program.cs +++ b/examples/cs104-server4/Program.cs @@ -44,10 +44,10 @@ public static void Main(string[] args) server.MaxQueueSize = 10; server.MaxOpenConnections = 6; - RedundancyGroup redGroup1 = new RedundancyGroup("red-group-1"); - redGroup1.AddAllowedClient("127.0.0.1"); + RedundancyGroup redGroup = new RedundancyGroup("red-group"); + redGroup.AddAllowedClient("127.0.0.1"); - server.AddRedundancyGroup(redGroup1); + server.AddRedundancyGroup(redGroup); server.EnqueueMode = EnqueueMode.REMOVE_OLDEST; @@ -76,7 +76,7 @@ public static void Main(string[] args) server.EnqueueASDU(newAsdu); - int count = server.GetNumberOfQueueEntries(redGroup1); + int count = server.GetNumberOfQueueEntries(redGroup); Console.WriteLine($"Number of queue entries: {count}"); waitTime = 1000; } diff --git a/examples/cs104-server5/App.config b/examples/cs104-server5/App.config new file mode 100644 index 0000000..56efbc7 --- /dev/null +++ b/examples/cs104-server5/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/examples/cs104-server5/Program.cs b/examples/cs104-server5/Program.cs new file mode 100644 index 0000000..98b97a8 --- /dev/null +++ b/examples/cs104-server5/Program.cs @@ -0,0 +1,92 @@ +using System; +using System.Net; +using System.Net.Sockets; +using System.Threading; + +using lib60870; +using lib60870.CS101; +using lib60870.CS104; + + +namespace cs104_server5 +{ + class MainProgram + { + public static void Main(string[] args) + { + bool running = true; + + Console.CancelKeyPress += delegate (object sender, ConsoleCancelEventArgs e) { + e.Cancel = true; + running = false; + }; + + // specify application layer parameters (CS 101 and CS 104) + var alParams = new ApplicationLayerParameters(); + alParams.SizeOfCA = 2; + alParams.SizeOfIOA = 3; + alParams.MaxAsduLength = 249; + + // specify APCI parameters (only CS 104) + var apciParameters = new APCIParameters(); + apciParameters.K = 12; + apciParameters.W = 8; + apciParameters.T0 = 10; + apciParameters.T1 = 15; + apciParameters.T2 = 10; + apciParameters.T3 = 20; + + Server server = new Server(apciParameters, alParams); + + server.DebugOutput = true; + + server.ServerMode = ServerMode.CONNECTION_IS_REDUNDANCY_GROUP; + server.MaxQueueSize = 10; + server.MaxOpenConnections = 6; + + server.EnqueueMode = EnqueueMode.REMOVE_OLDEST; + + server.Start(); + + ASDU newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.INITIALIZED, false, false, 0, 1, false); + EndOfInitialization eoi = new EndOfInitialization(0); + + newAsdu.AddInformationObject(eoi); + server.EnqueueASDU(newAsdu); + + int waitTime = 1000; + + while (running && server.IsRunning()) + { + Thread.Sleep(100); + + if (waitTime > 0) + waitTime -= 100; + else + { + + newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + + newAsdu.AddInformationObject(new MeasuredValueScaled(110, -1, new QualityDescriptor())); + + server.EnqueueASDU(newAsdu); + + int count = server.GetNumberOfQueueEntries(null); + Console.WriteLine($"Number of queue entries: {count}"); + waitTime = 1000; + } + } + + if (server.IsRunning()) + { + Console.WriteLine("Stop server"); + server.Stop(); + } + else + { + Console.WriteLine("Server stopped"); + } + + } + } +} diff --git a/examples/cs104-server5/Properties/AssemblyInfo.cs b/examples/cs104-server5/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..b1cd430 --- /dev/null +++ b/examples/cs104-server5/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("cs104-server5")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("cs104-server5")] +[assembly: AssemblyCopyright("Copyright © 2024")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("e510d4ea-5c1a-4343-8ba7-4e4c941b2cb8")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/examples/cs104-server5/bin/Debug/cs104-server5.exe b/examples/cs104-server5/bin/Debug/cs104-server5.exe new file mode 100644 index 0000000000000000000000000000000000000000..9f09d2b9a583dfac39842dd7999d839a2d216c1a GIT binary patch literal 6656 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 literal 0 HcmV?d00001 diff --git a/examples/cs104-server5/bin/Debug/cs104-server5.exe.config b/examples/cs104-server5/bin/Debug/cs104-server5.exe.config new file mode 100644 index 0000000..56efbc7 --- /dev/null +++ b/examples/cs104-server5/bin/Debug/cs104-server5.exe.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/examples/cs104-server5/bin/Debug/cs104-server5.pdb b/examples/cs104-server5/bin/Debug/cs104-server5.pdb new file mode 100644 index 0000000000000000000000000000000000000000..ebe808c5093f59b37133da6146b1842c4a09952f GIT binary patch literal 24064 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 kj3v3&QGZzfnU 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 z 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 literal 0 HcmV?d00001 diff --git a/examples/cs104-server5/bin/Debug/lib60870.pdb b/examples/cs104-server5/bin/Debug/lib60870.pdb new file mode 100644 index 0000000000000000000000000000000000000000..1e59670ee933e570f34a407b3ae8bf214155effe GIT binary patch literal 660992 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 +~~iN;BCO!+vyMu7~2GNVD`S$fu>t%qeZ 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 L|EB+4J@Eek7N5UN literal 0 HcmV?d00001 diff --git a/examples/cs104-server5/cs104-server5.csproj b/examples/cs104-server5/cs104-server5.csproj new file mode 100644 index 0000000..2d37186 --- /dev/null +++ b/examples/cs104-server5/cs104-server5.csproj @@ -0,0 +1,56 @@ + + + + + Debug + AnyCPU + {E510D4EA-5C1A-4343-8BA7-4E4C941B2CB8} + Exe + cs104_server5 + cs104-server5 + v4.7.2 + 512 + true + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\lib60870\bin\Debug\lib60870.dll + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/cs104-server5/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs b/examples/cs104-server5/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs new file mode 100644 index 0000000..3871b18 --- /dev/null +++ b/examples/cs104-server5/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] diff --git a/examples/cs104-server5/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/examples/cs104-server5/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 0000000000000000000000000000000000000000..1365f1333833be1bc3ea5906a802d6e6e909bf90 GIT binary patch literal 1969 zcmcJQ&u`N(6vsQLdH``jNFc8O2)%k^RzxDr{qJkko2burZe}Am={uNxYDT65h5>yX<;m+q^~qM$l51l zz$_zfn1UVV7NikM8t>Y6Sk(5@r#6hg@ELy$mRwr9t2OQubeAS>N4$!0jIToeb|7?> z)&ZV3UPQUb?a`{jI8=3X@bYTgXEG8Ivv6+$#m*wi=i5sm?KQKDkyhyy{vPG)?TqOd zY;6Stp@Cbai*m4?KrD>a#rYJyW5YBw2Jz58dX<0lYMe?U^wMEoKHE;%#?i-UJmsEU zwz0;Y_`M|j=K!~BkDWk;zwYfDJBf(pOr$UYqmp&KIkjgS!Wmz{BUIz3XnuGp#S!By w!Z!2fK~L%3Vg;ZLey(ccg`4cwW!Bv_oK7{@PK`*O;C(=jf}_JvRVm~67q73i%m4rY literal 0 HcmV?d00001 diff --git a/examples/cs104-server5/obj/Debug/cs104-se.4D486F68.Up2Date b/examples/cs104-server5/obj/Debug/cs104-se.4D486F68.Up2Date new file mode 100644 index 0000000..e69de29 diff --git a/examples/cs104-server5/obj/Debug/cs104-server5.csproj.AssemblyReference.cache b/examples/cs104-server5/obj/Debug/cs104-server5.csproj.AssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..2ace2488a1f593b3cdf92d9e940fae5463459887 GIT binary patch literal 1732 zcmcJPQBM>x5XZNM;Dy8w-~-9>V4}&{u0jAWxe#3-5|t1R4jvlG-rgK+uG^k%7dc+= zRbTxuehFWB!{|4`>B3b=Bx_=}o9ymPrZd0(XVPgh69fTC;uhc1>QEkZz^B*ylNL+|oMpU!@t`}yUfK?rF~HkU9C=;peI206pm)F=GGFL^&e zEn1ARxW!65b{mgf<1vrNCKVi>HyGk!EaG{W!z+sfWM#6a8Fo>EOv!eH(%{n!<3iX% zLt8>&bt0PKR)I}O-@tfB4MDbLfoU9S36Ce7Xilb_`!B0Jq4Qs9KwLAvo$~I(g{nRuh|0_v(OMJFy_$(3xtetQIJLpU}8-l;}}4N52-1>j^2vsl2gj9g|J4^tHAB VphQ}y5^h>6g{ZX`vC>e9@EZy)_^to| literal 0 HcmV?d00001 diff --git a/examples/cs104-server5/obj/Debug/cs104-server5.csproj.CoreCompileInputs.cache b/examples/cs104-server5/obj/Debug/cs104-server5.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..9ca4e1e --- /dev/null +++ b/examples/cs104-server5/obj/Debug/cs104-server5.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +d4146f978379a4f1621d42c638ddacf459559ada16a8554b8fb4e526a80509b1 diff --git a/examples/cs104-server5/obj/Debug/cs104-server5.csproj.FileListAbsolute.txt b/examples/cs104-server5/obj/Debug/cs104-server5.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..9e6fe35 --- /dev/null +++ b/examples/cs104-server5/obj/Debug/cs104-server5.csproj.FileListAbsolute.txt @@ -0,0 +1,10 @@ +C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server5\bin\Debug\cs104-server5.exe.config +C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server5\bin\Debug\cs104-server5.exe +C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server5\bin\Debug\cs104-server5.pdb +C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server5\bin\Debug\lib60870.dll +C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server5\bin\Debug\lib60870.pdb +C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server5\obj\Debug\cs104-server5.csproj.AssemblyReference.cache +C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server5\obj\Debug\cs104-server5.csproj.CoreCompileInputs.cache +C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server5\obj\Debug\cs104-se.4D486F68.Up2Date +C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server5\obj\Debug\cs104-server5.exe +C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server5\obj\Debug\cs104-server5.pdb diff --git a/examples/cs104-server5/obj/Debug/cs104-server5.exe b/examples/cs104-server5/obj/Debug/cs104-server5.exe new file mode 100644 index 0000000000000000000000000000000000000000..9f09d2b9a583dfac39842dd7999d839a2d216c1a GIT binary patch literal 6656 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 literal 0 HcmV?d00001 diff --git a/examples/cs104-server5/obj/Debug/cs104-server5.pdb b/examples/cs104-server5/obj/Debug/cs104-server5.pdb new file mode 100644 index 0000000000000000000000000000000000000000..ebe808c5093f59b37133da6146b1842c4a09952f GIT binary patch literal 24064 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 k Date: Wed, 12 Jun 2024 15:07:02 +0200 Subject: [PATCH 10/83] Removing bin and obj folders --- .../cs104-server5/bin/Debug/cs104-server5.exe | Bin 6656 -> 0 bytes .../bin/Debug/cs104-server5.exe.config | 6 ------ .../cs104-server5/bin/Debug/cs104-server5.pdb | Bin 24064 -> 0 bytes examples/cs104-server5/bin/Debug/lib60870.dll | Bin 203264 -> 0 bytes examples/cs104-server5/bin/Debug/lib60870.pdb | Bin 660992 -> 0 bytes ...mework,Version=v4.7.2.AssemblyAttributes.cs | 4 ---- ...ignTimeResolveAssemblyReferencesInput.cache | Bin 1969 -> 0 bytes .../obj/Debug/cs104-se.4D486F68.Up2Date | 0 ...s104-server5.csproj.AssemblyReference.cache | Bin 1732 -> 0 bytes ...s104-server5.csproj.CoreCompileInputs.cache | 1 - .../cs104-server5.csproj.FileListAbsolute.txt | 10 ---------- .../cs104-server5/obj/Debug/cs104-server5.exe | Bin 6656 -> 0 bytes .../cs104-server5/obj/Debug/cs104-server5.pdb | Bin 24064 -> 0 bytes 13 files changed, 21 deletions(-) delete mode 100644 examples/cs104-server5/bin/Debug/cs104-server5.exe delete mode 100644 examples/cs104-server5/bin/Debug/cs104-server5.exe.config delete mode 100644 examples/cs104-server5/bin/Debug/cs104-server5.pdb delete mode 100644 examples/cs104-server5/bin/Debug/lib60870.dll delete mode 100644 examples/cs104-server5/bin/Debug/lib60870.pdb delete mode 100644 examples/cs104-server5/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs delete mode 100644 examples/cs104-server5/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache delete mode 100644 examples/cs104-server5/obj/Debug/cs104-se.4D486F68.Up2Date delete mode 100644 examples/cs104-server5/obj/Debug/cs104-server5.csproj.AssemblyReference.cache delete mode 100644 examples/cs104-server5/obj/Debug/cs104-server5.csproj.CoreCompileInputs.cache delete mode 100644 examples/cs104-server5/obj/Debug/cs104-server5.csproj.FileListAbsolute.txt delete mode 100644 examples/cs104-server5/obj/Debug/cs104-server5.exe delete mode 100644 examples/cs104-server5/obj/Debug/cs104-server5.pdb diff --git a/examples/cs104-server5/bin/Debug/cs104-server5.exe b/examples/cs104-server5/bin/Debug/cs104-server5.exe deleted file mode 100644 index 9f09d2b9a583dfac39842dd7999d839a2d216c1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6656 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 diff --git a/examples/cs104-server5/bin/Debug/cs104-server5.exe.config b/examples/cs104-server5/bin/Debug/cs104-server5.exe.config deleted file mode 100644 index 56efbc7..0000000 --- a/examples/cs104-server5/bin/Debug/cs104-server5.exe.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/examples/cs104-server5/bin/Debug/cs104-server5.pdb b/examples/cs104-server5/bin/Debug/cs104-server5.pdb deleted file mode 100644 index ebe808c5093f59b37133da6146b1842c4a09952f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24064 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 kj3v3&QGZzfnU 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 z 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 diff --git a/examples/cs104-server5/bin/Debug/lib60870.pdb b/examples/cs104-server5/bin/Debug/lib60870.pdb deleted file mode 100644 index 1e59670ee933e570f34a407b3ae8bf214155effe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 660992 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 +~~iN;BCO!+vyMu7~2GNVD`S$fu>t%qeZ zdPXkhF~;+#1ZCqfe(^ktdsLJ@w$_zZ+?D&ue#*BiK~1+#Px#v! zvhsc;Wb0h%>2rqx~*Gf^&XpZn(kTce_!i)%mGzCt^@mlN+;H~ z-TQZ%ud3s^(pT3{1Lxw`c(MT`4c&Wqlfg#(wO}(iAB23moy{JMBe)XM?pXI*-=0<) zs%+T#hDRm3D{pQ6E1Rr~#d-Tqcq=zayb2>)R4 zR`7W6Hqi1`DG>CNUO`8DuQD$CwoaB__LsmHCcLc^>zJ-FQ~k&R<6{Yr%7n)P zc-vZ1HdDcGIpsTL)44Bu9$x|D@~|Gi%EMPdOe6QrLzTp@<3AGI09yQ2N<#kYY#u9@ zA>T(axoGQ3*-Th(8p8AJKXdLV`0UFsS_qeC)F1b5$RMx}*O_Z~b?Z1#CF>E8b~v*N zR3G*zcsBSrcrN%E@KW##;8h@Xxlj#$6TBXL8dTgjf;WK5U+P`vTlnAO{foeFlK02f0*Z3aDo0#%22pB#Ea-$gQ79l0jna))~!M}VF1AL)5j zB)qh@_>_d7!r9tvdjHkW^Xm_)Rt!k^sBYRGyBS=!b=NF4*<2o&>VFUNJdOeP=bG|c zypF}MmU=LF9C$ov_1d^}XU0)|SdgQ#ZELJWIcle8KypI~uk}8Uf9Q=`ew=M1)hU{5Xd%$g0&}u z;BReEPpoTQQ(H0vvUSsJvaT4*IhXK~!xD2z+*mSmec^ea>|UnMyqqEUbS}jZ=)4j+ zwnm!G^m9*?+8R>`FF8}eI1Mkse;C&<1J%M#11;^$w(8CsmGL)yR8DO@v>2bboL)(I z$>BUqXRlrb9*zI%gzuT~8=d5X_L|zdW7e%f@+k4bZV(e(mFG9p^Sc&2lmB-V1)7>-T|Q0OPjM%G)UNW&||e#hJ$(+8LJz zQ4Y_CMnc1Q<{;g6F3vN_vh~TV#{JIi$N$Ct_ZN|?^mqzXySWZjdVLvG`y@TpE_?<5 za1eXI+1R>%j=w(!{5sc7f1Bq}*^$$DUSreX^o-hD>1FGdSx0F!QTO4R`W?9}@4F~{bD+|% zBRCjjgSad6`+^p~8_;b+iGJd3>vrk9_am%$?+=Q%-gy)6uAu6Z-eW8Bp7aLZw!W67 z7MY9nKA5oL-2)WwUf^+{-fKGv)O&5l`!4vZKQE@M^tLsybiL#E+Qj=vcuDWRpmaGZ z;k^{T7r%kGtyN{+x)qOSV!idAoAf>!6mPw|raG*5)`o${fu^^3Ydl!0x2+?k>pg_9 z;(Y=r-Y0_6`y^0$>m9cu?>Fjg>pbbaPbI8)>m4`o*1K)uJrWe}Gr=Nnwb`Y5+Zs$d zZ{|cC@6n)m>)kf-9t(>1xnPmEY`s$6wpLO+i!DxXy$2_~&jZDKBB(a~LQrkyMWFG1 zCww)A*L*LlQruyI0J&&uvxL>~-zv4OrJQb`0jd!r|R4+8AQ5;Lz8brFBYQjrb zy*n4nnT=m^^bVcm6yKo>a&)$a=2G@c&dt3~0~4GW_F0|DjDn^?^PnZrN@yMQ9P~2O z@sm6Uje@2@b(U^r=jy0vZKPgBC*%K^vj1&i9ngr+us#6IgO)(6p$*VB zXeZSBvxI}DLUqs*XeIP4v<>R?1Uf?Fp&8IJXf^aKv<>R`Ino0f2~C9x&df%kFq3%~B)|I~i! zF&9nH?bfVG(&xPC`)ymjtj>{4+OqtTAXEFtz0B6EHA^Oc%rx14rKxJPaI$5Cqpi%} z8|1Lo9G`97Uh%^&cdk0aL6F8B z!OcY8jv%j$^Djc2UW1|HVf8HCMmWa0Nk&d)BOC|X7+LSc7tedOdXv6Ze7xr|1XOuE zA>mOxn?QP4ok&0b0=rt>bq1TPARCKumbWKL&*8B0oqi6->7EB;vVv?FWcs*hj8u$^ zmDhAV&hb1LdpkWU6CTBLIL5=<%3N`MRqb6UGu(ISK!Zjcun)m*;Q3%zcAuG@Wbbn; zj}|~yzOo4qrDGi=cM;+C2Pc7QLoWt37M=pi3evb!BVcScXXi7&=fdNpWq(K)C6otz!qm+s9y_=g(> z4aN?rgr-By&{Aj(v=Q10?SOi(#b$vjq3O^(XbH3udfWZ;rGUy$=p$9W<>G#0Vuwur z(x3VMzYTpP-!pns8(_PMb>-3j)OUvRR|UCc_K|5aLm$b!yK`||`Ib?>CYIU8J~B;y zu(h^%`LV6VHqvHUW=udpkbQ+>Z2%jCWI{DN5K#gi^j!nCH}Op_V<&2?U8Z%c0X z|6*h=4l>KI1tgEImz5>6?FM;UU`ix|?@#3)Y9XWCIJL9|!Z#d7Me_K*RsP?DJZ}qV zKPTTK)3am8o#1(Yw{edpEnTp(+@lx}^BE<{c292ku;e?BtwVR~L_9TUZ@V z?@M3w{RZm0zVzowe^J_}TYXIL)3L>{8P2k5W-gv{ z$}tbC{83y}-%fA>f|5)%SQ2O-;rQZOsXs3)q_9hvTsph{>u)C?_!Rzd5bP0%aQ>rjs`V)sD*S6xRU-m?E!xee|)+O=n> zn6A5e3;X}?Blr0r_buxGpGW3TVwroP{|{-+8kTc$U;G2)|00&J7fG6$tLDyYzy3JP z4IC6Q7~F*1-v_zv&>x3BUu{irKSajgTgYgy{y5A991(N?-0=1u|wQgEAX)LoX#U&ZxWBIL zp*5s2U?td<6;sQTmg8&nakefI;%4P0n+fG9j@vkRDX*zVP8Y2yY3*5OEEfAN+t;## z>z$yxkK`Y21XM|1Qw=SImP2cxP0%Y)$ETRDhlWDqq3KXFv=rJ~PH_uuQrh@$RmV(z zGPTInqc*hv;X7Dr@323deH+F?+kNDeR>6G&xt9mIWw!rmGIurpdlZ>fvCKBM|7r3= zoVU3I#dZr31|LKIoLK(FlbK3tUE9AanW61h-3o3sGMj@;&9!@(t(j|=%y>MOHvjuc zo_SZ0Q$`=tQbuU=M~8@jpF+m_TF7Wk9}}lt%Q0Wt{O{w)`$3RbMjsR66#56NXX$Ob z_9v;xXn&I0_Ae#2a_Jb&>P&hc^EJ;ydzIA3Yyi{7XjTW(_0WDJ>G5q)dT8HKS|4NO zIK7Y2o+0tjULm#XKS_9$p0jJ^GJP&v`-;TlMNsX=&k`QRxoq`QR_4;@f3>ejVSfdx zPHY1;M*B5b{1#YoT&DKX%2zfsn%{B?U*~?=z9jWe+Lxqyt$j(oKf%Xg#zUdIidSiFsk@ZTHWY0_y+6JX*C^KiEC;et~yV z|8$)1|I28%<1^l8z|VLUZ7a1yQz5xdd{?pxo?{)^}0XCn8V zLGD{*|II??t+C9#VE=`*P8D$lX>~f?#(Uh)f3E>$E_EztKmD-wCKht@9 z-t%C|*zs5krrDZS-_m(}+4J~{=dnKFQ97Stbtc``+~|3H3zV(-Ov0o1?!V?Oto*0j zn$LP3-vQO1d^h1?@AWE8Wt&;K&SpY+SKAuqM4l&%Y{DP7u#EXZ^=Ur@yRwVI(zkT2 z-^y?{Dcdo>&4iOKFMz7cKLHN~f9m)h?)lj~g!Fp|vhteMJ_YAwBQEp5e?~az_jB+7 za4UE)D4SJ!{sMmm_$!e8BksE9TDIX=9A5%u6aNOh5d1B;`)^9fRzJ<@8q(0pc+ozH zzXLo`cpZzUqUrYOctDosS{@e5Thv$)D z4kE4pxB8ae|7)#W?Y-8@WruW1c$D`4R%g=t|8AZ~cToMm*1}DX(*EDde|rDV`)N*( zo}k)B>XheE+W%X*PVfJ4$>- z9KZDb-^y!x|9>>$q~AbL`V9i({{I;K6l#5K#U9iJ`#l&sVU=ps7$Dv=~|qZGg5yJD_gsi90kBnhMQ<3ea+B z4YU#Z-{jKz|9Biem37n;e%|)+f7%|guoi+H=Ui-eT!P$Fg4{Cu|1_DqTK~BenP>YtzQ#R$tQlFYLE5KjHcm7wxQXM(72z8dTghIN~3@DIa36C4H30{3*? z#>!**y3K6(D1Wa7rAIB;8`N1L#eS`SM!&;2*~(rzzjFwuJRSooK9%4>;8@2`bLKkJ zW(0IbGG89=rQ1p$_d3+$tL%+~Dxo=00a^h)0d0h~La#!dzLv>UKqH_@(A(~xCk5jE zf0b7|?*G+J_1==+|7(AO*qYjG@(sQ)ehvL*Z&egrY%7dF z$0LJ|d%;#%;bq3@avCxR#xnPUtq{iSoRQ#M+;5+b{2{S?KEmZ+7ihD+5acfOa=V&% z_x}v!o*m?Bt{{?IPX8C|vDdwJZg7$2G_g`#Ua( z=G+;0svn_j@9=g;Y!jY^4qpp8C=J^A{fudFXQk?#wcX`u^nX$mSKbo`{ng}G&1&o(YIYb9_?j!F7xt^lOXTTLEhCt zUK{MrU=vzgx1cb>v6p2!J2^6 zxCbSi@V;4hm<2;WEpsvey)O^Z$_x>eKu(iR4%4Ma#s;X{qEJE?Cxto#i(6 zkBgtx{cI+*393%A`{k}ByyVOQC8rkDK9K7`$+;dZ^4EDSMc&FEtMlpa&eRiDHg*H3 zc6J`9{AdLGgTdBs!aofEeDG}WMv!umxfz@c-U7b4?LQKoO5dGPoULuha^jx3IL_~a zpYrG3p!6&7r?j~hJQlnSERF@vf`9*v{5!a(vzw+P;FclpiXhL~R1@25M+O^i zotO8HAPl@0d9|^;DK&L9vzps1Gkj}=_br@@?Z*3%d25h4E;-wz-R$Pqkf`?B%0~KG zz(>$#Y0Pvas5YtsR6g`|ZP^*F{ff_Qt>d1RgKQ?04~3rr$2^!{6Rjr2GZRR4VzX#GK77njfvJVT<( zkp`Jf8`zT!y$*Hz2G^ib&@`wSS_-X!-gf_YQy^~tH~M6l5GBWXY`3kaz-4vKkDC z(f^j9KYbEkY^~827d;?-wKruwq%h&RL%qHSM*7y*+~k5uUitc#e%G^E4K^-G6nBV>~ zUqK;s^+M@2#geLAnJwp>w|SWw_XWp1Q+`a4sdVx(l|FrVekG*m!!sd$uxH+oKDsB} zOYSxCrL$&>dl~U?ZDqE1c6OY0Q#F{!B?|C+D)D$A#KX#3{ru*da_Ut{`40KD-pll6 ziIaZ`G9L{xt&BOD<+RB`&QKYOxHxW?B4=ZeqqvQ4nBT}VWu#|n+*Wv*aojFL<_kfl z;^t+R6SvToc9ZdplkFHB^EmlG2RW|H&!0QDrqQ*FZH-@$yTr>K7KDP#8|C-I5O#IV zmHW2K&GoQy9^_)sIv2HkBlq?o*YbB}Q*&)Ib+cXK9AwYKW|52Id=;`k6l7Z-w~OqS@!sxbQ;ZXL zHL{-zvd6V;+&TbW*ovujSN4$H0t5H|8lK-0WKV6F(%i^*?YYy|`t%w+)lW)FTm`(P z`*EOj9}H5ZCBe1h^Dm@F>30Rq-cJ9nUgSiH=-T`H-6czbtqjsC*#Kh10+boE*jX7N|I|$ywA)AjpwPv<8-Jp;jK7UkXd@uHQ1JM9On^MX?6qH z7i>&;=`4EFua4_x?`56shgUXTW`=&?=6fDDf*O-iejTq{K>EOA z-^9agt#mye^gKQUN{Ulf{_Jqgk zghz2MPWfmyPB!Tm<9vMF^H>9lx9YLX+)v~0W!~(CY+^^masRdF@e)X#ci*El9zS*M;tsBLf_fw- zUWGb-leIW#C^R0L4mCr|pw-YuXe;zO)Z=O1UxOw>bD#qB5VRKB1ib=vBt!c^!=Z^# zHM9_V2wDqmhPFeUzLm*TKqH~4P&2d?S_5r_UWQ(WdOYLQe*51)aSC)q_b_)#{c;Zb zAaMh*iE}h=SzU?d92IUUq-VqZc;BDqL56dW{s(&!ThQ~^-CXcFyW2yZqa4Gp8^lki z*RJM+mpjF6Zj{HJJDND1pAsk94Sjde&7+3GR_Kg)IPA*|r~J#Vr8;VeMe zvB3>O|If70znuAzFovz`V4UHbxMPs<^B{w9WHgQ0q=%F)nrqhiyb2ed-PJr@o93H) z*?e=*`4z8ozeHoc|AfvRFf_<6Ho-905Gk!oWt6Fsv2T$5kSY+4aZuv0Kl4Wi*&6e= zkgfF6xdhV*t8n4jkX~F)>cQTa_wBZisT!x(V06AJ=t{2PszQ#Fz-8&dLWl5z;DLn`5%RNSXpb=dEd2O zrtIM0PC(|r1esRG%AWTPb9RH_Cuf$m{T_;(Y^SImwZoiUSQ7|xS9!VWn!SN!FIt*zg~kUJ^Jb@gDr&DSwi*w!{9$X)K`#_>G~xivwqs|#(H8{!+< zs&1VXLtFc`U)Zn6eK5!!xA*1<7kk;$gJ6)pHUEhqdoRopnk|(+M@U_A^GOw;#!`L3 z9^g@+Y%Gm~xaZ~$HJ>nm>*{xPow~=a7kgJ%*GKvLWBvW{;6Se1Jku#|eA3!ELbI9D z=fZ;S^vh0n`Z}jOdX~(E(WbjO5nV@5H>b$6E)I$db{F(ub~J(%$2F6hO5d zixM8Cb7|I(7SABS1We|A-|KlS1r_&u5+0>0dL8QVZTemO!hZ_0U#m2h`&`$b}|C)zCudZP)%Op!Pq^ zHEi_kCq!asWAoY0-j;4L|5M;OJsa+83^W`+?U9@F8SKODZqBDQ@6cfr?9u)|wH?9H zSLV-a5r=Z-8$vq0;_C)BL*nR%^VhbJq4eP0{mg1e&xZTD&O7FrRgl`vcSh+XhPh~{ zR_pxjJEyc70dm+BiNk)#KaisTc66M>^LjSim;QaYRt;5f{gZEz{^4ECL2A%&aUP$J z{@)GyYYa5Du4-OWO|>?}OsK!0Nzb=+EEMEF`X^M7V+ZQ-Wvxk^|E_Jvd=_z&mg;Pg%k=VcdxIL&3FJ# zHsN&|^KPe=*rrxz(`~#7p5J*O)yusnnr7o!-OFZFcI4uCUFdme+;tH5CV|Go(rpLV zIzd}p!+~wb@8#d2pMo|(o1yKH4m#}(4TdVAIZy#w1+9m+LOY-?-{aZ0-9Kdts4NG& zrrO6~K@^kbj+uO?*Ax4%)#n_==MKLNU*lC=FISz};^onwYpCt!WDW!w_qn|e6`Q$j1NIi7##PZv<5B)*f1~=bD9d`3v=Yj*degR0EQkV)J16~Op3(f@9=GKC0bLW9J zx1>E^dqT(ZTsnpN6~3*Yy4IgMGV*_5J&E&wGkVHRFmV5ABJ%p-nu-?o|5C1pXLWy9 z>%XM6*_qEZ$T#h(N?>J7avCRlq@;=Z`FGDtdaJ0wyr}4xxWH)PE zy$;f|;l8fdacwQ6@xV`gIHeUo+hsfeYd3C^t<`dkIjqsf;{nP={!d&DtGovG~8upY9?%XAs!t*j6GoShJDLH z?nYHu++7ClKW%3I`bcie_o`N-D`(=mFyXl)eBO{wNfc&QHPu{RQ`IP@VQn(LKewU2 zc@Fm!mZZwW_o}OIzG(IZ_JG1FdE)zQ)}LR)HKpN&t%I}@H&-br1GOOk};uII-(w|tLlo7Xu` zul>>anxM1B@MXNm70XoNPeg_bb%^@C2y9;Vty`I0Tv|B7A2FLg{aoA}2 z-vpUf##+6eFPU*3?eucuxUt5O=UYIqie2*YgaVz6Jt`N7- zc5m@=H0BMCc;<%%Im)+6HKdo-)Lh?weMTjXft+mU;20O?#|OEJUnI92TPVbFy_Xf| zAM+gf>L4qLqjeT-ZGVH@K{Ot6aUS+S?))G(iKEFaCyt>VdC1F(1tN3p4a^v{Y_T(=Ma+RO$AUDJ}*g+%dDCDS% ziDOP7e^-!e`CIn8jA?NWve$Xpahz$3@(%~uit`k|KdOv(IAhr@<2_u16r8U{?l*HM z`AtFgxVEhg#IoODQ+e5}D<`f3*;|9`GS>#uWWI)kwO)$e)0*Iat9q^Wze)3g(xC#> z{CZ!Ie&Bz^9;t`WLpn?MTR=H=CCl6|*LOMHkMX)|o=UnO2Ob3u28V*jgQG#_5DE-S z-JYeZK<*W;2TufV1}Tfo`)Vzr<$H|%u@@_#e$X4=X?&Wn(h>g7sY_q%e~0uP4sWF| z^8jx;mrvTex%>ehiBGb|zC=HTX{gt3dL~of$a_RQO7;n(L&2^N#~-@sk#AU)4O2@?B^G>%eAkE;t{o2j2}g zfQ!Hzz&pT3(9%z5P@cdQrJ=qvtUA!g`w!!{&hzT){S^*vE$9xe9|+kwqTQ)W=07we zzDhHtyUj18r#t$&biWZ)y5E%ORC*4X%@w5YRU=N0$E~2WybUz{O83&)I6i$Z9qHkC z+zEDr$6a6rcsFrthV*v3a_F4-hsBj}L&-?}G`i(!F#xj!xf8_aV>Y!=UCt zKjL|P6r>Gw`?RRnnUCYY7<>dYeRsW=&c?;*dGl#_Nbk>p%A3z7JWKb|**G_SFWu)o zk1v3#rE3!&rF-dY44baU*F2A}gVJL|!lP6V8dd2IGPUI5i5{3PKq-PN5?XKYNEo*vsgk6(jI zkCzf2rRibgyY%$+v6+$6rC| zu`}UOs)voS()Gw?t(Qd#c|?hEb@_5-^l zyav!Vmg;0P46@Ae+zdGrQVhSU$_!FS+S>nuMu zhx=~UiC~{ZhDw%fef2JeY70Wy8b!p_52|mHi_0hdwbNVQx{}_55}u`c+ju2i@8diV z`pXi%kH;VDeFA>zJruOIYS(((SS5Ym>gn)Mdh0tZ2ZO97d7h>FR&C6YuJ_rV$0#sP z@6q_x=7xTJ41Vcd3GRvBHr7br(=Z+$(t83Zo9#T%`eZx1GUShdMq-d4h&Rlb|`!V(1}g z9kdC073%bT$_O+HnhrHX%b?ZJMrbRv6YBOn&q1T0Y0x}qDYOdO0BwPGLfvR&heG3_ z8PEb~8MGSO0BwO@g*wp)4}wNPGoS^~a%c_oEVK<$1Kk@M0ZoGDK}(>O(4IK84=vaK zherXoFqT_-f=^e!{@a>47}Rj{yJ1dZtLNP%lJO$XYzQ(mMju^W-B{Dqq(@pa$0S)T z&-)2-DTB_*_73i6JpWvftMPdxx12bJxw`dU)|o*N_;X~v5M+&+Q#0%ObH^|yC?|ey zobT2oGsX4D^{Om5zUP%V(mH?8P@i|>tLm%kYAzsItFEoF_g^=lr}}Y)3D0R=NbA`; zfAVNJy~l??DpTRU^>R$K?ol;s7VIi(=E7P+HIE;{uO|EwuHAm3$=BM5`ka#RP1W-i zPP|ojOYZH0cSrOU?|#FIy!USzKH{yiwx_%+;XQ!of8%*ex9)ooUU9E)#k!_1tJzWT z&W+90_b+@WSNKkL(Fb$4-ITli8`&lMWS3l+Tk`STU5{p$X0l5s3Cv*2zy7Uh7PlHvF#mm6`{{{Jf-AO+GC(o~+(#(OI7gWufQ(I37P`%&HdN}0( zJHwSX>8m)ZtzHaSn~*-{rN4IeMSt)>o~0bQes&-zn{yB-JBU0f@QmA!GZ;J$KkB-9 z4x6*k{+i`(oMq=f>AaMqA$vb9^c&W8r1w1(U)T2t)%OUybK=#(NE?jp5O`QSkpBHo zim>A$R5=wI4{;dccr4?()$gq47@UjeCrSw!yr{X^d90B$N856s4Gd$d0 z$g@D6aeEWb07v7ueorZv&M(0O>1RY65=QH|K%M!-*hsjqZM5kJG_PT%QYG4Az5_!FPgF!TZ2V z!27{V!4=@;;3vT=z)yi!f}aDg0-pvY|J&fz_z$S1ecq7;Z-UK#- z3&2I-E#UjWh2R6A^nMV07yi$A{};gb;9mKZw43P-{$=AbC|-0e%R45d1LsF!(U|Sx{s3FM^WyWpE|_uYex|f8ekG82mVXjmuYo zzXl%#{|Y_^?gUqZe*-BKg};Mqz%Cu^jHQD?@jnFo4A=Dy$j^euflq+i4@B813<1}I ze9y?e=fpQfGhf7i8MqF#deoCr66(=l_q!*fTGgck+-@v)iE+jmP%o}r3O(q4_vEef zp6uw~#I(LH>)JHc4*C)~od(b2Of?&jH1(X$rr9n995%ws)oQXKaVR*(+YY#6Su zS_g;syX(@&bZZYDig!pC#h;phGx=Ab!=e^4PjB&jeH5p${C+QVm}}EtgU?XN`Y7%H zHz(}xe}9F1qPShmkM_4iY!j}wn|Kg?vFgIsfYG@&}0(t`41ikGn z1v&!fWsdDGUqSzH-3;9S+vxQF^J#BGU>{Fvti2H{VnY3FeT%KRwxRx_nb+|#i>Wuy zYqd>r6TD?p1iM-7uv~8g_kS@D?6=X&XC3R@Ds4f&+1Z(kd1AYNK0G5kQvq*}?9|yl zjAXTDJR$uUPdNK0dz78u62?k8b6xIW1NZ-SoWFyI*JdnTvPqim!!`PJ=N|GrJ_3rj+U|qEkAc0wkAv1m zYHnO}48?c9`*YvonoZI``h>hwf6|$@Vh7hcLH}XRth@gT^{+Rb_)usfR1GbF-ga+& z3UowdsDI5~yz(nJ&Zo~Wp^~}cuCckV=&h+or^2Jlbs+@-?e>(46bc{{{ZH z=5wWs=5u8>jrIJ-f&K8yo<17XT&^O(A)0KQ$YC=>Tk7wtT}r86Z>THg~PRyq6gjUU#*%q>PL9BNnsv# ztLLq<9o(Zlvm?lGeGKhw!+fVkYuYBsYT3^OxoPvikMVrw2p>1i|Eit$a$7Su7UCHC z(H$ejP&DwJ?UjAkEBK%u3=VljS@+^iuUMzHu7I_4CS{6zq38} z9oBhRc39YN7s~Oos<1fLaufGB@%~YWxALn+Ug`axg@jX>@Z8Zpuf7n+d46LfS?ohk z;XB(F_icn0nlQDos=jGQ}(ge!nnyTuXx#iL&gzv~8Oy&NPqb$7QrwGR3XOk!)u)-}v zrUu&=0-uV)sXd9q&8n)avyx;oW4)URkKLL%w!g_$`p7nm!#B;c^4p1L=Rs;$Ci>^4 z=aDU*mpoqOQe0geV|i-`{~XVMbAZWH`VMFj-nT0y=`$VU_TP~E0>(bz+M8oqgsXGi zmdRE6Jb|nV!ac%s`wc9H8{8tCmp7VXkjPZnX@tFjXZx^lAeqv2Sc|aA69rTp<9PO_ z%weWxPB_NGsyv+9B5Zxl0vcbZuWNjz^9*F_y`gD5dvz4{v=(9CtSl*f4`ff^`E@?L z@`!b&l01#mD(D{YkF9T`a~t5F?U{Y-tNlmhM&uS{vWwo6TlBTutrz8P{X_1yJ9CSV z%q_kzd;9p@ok!&EoRwR$Ja^Z&?A;@BcfT`t_rGS}dsXh9gLChjlzV?g?)_iNE$f`g z-Fs~AzE5QD?~uFyob3I7Bx63XBKLvqxfLg6S1if>Kla`Pz=|5(->y?Y3yKQJ)(8j) z2#D+;vdJc!$l3xbNLlN7QOfWKLhFKB$d2xl1e41R8n>2HQ`mygv;y3mY)_be z$Tsh$*a7?E{ss<)|AHgoPN@9SC!2Ru{2PwP{U2Becfm^BYuk1FT9>YS{+3vMTSw2w z55wx4NaE30trgcigVs2YH*V#x8`j=qrJu9Vx`W!P)Pyy;0chx}q1d{9O?EO;u z=j0hq2K|9~c3d$bLus)xlvjI?ll;cB`qKeenaWPa{!rsLp4pmt2|8(0u3B?w^SBt9 zhhsAndCVicy%&j@`x431IUA=Rm>R@Y9=XQn9tP{+<~lHI3wuLuLF1Dl!#1;~yaBYj z^e$DcJy1UM4%Fnl%WA^g`-oWLUPRS?6;|d@WJo97qnTr;yNWZEHgi-Jq2^s^o{d}e zO2;*yPxoY=yVKQ}dZuuh?zs9_nxA-MsC9@ojrulL^`Nm%#8POax6JNH;VYuGa9N)Pk=g; zC&Bjc53oB_+4qDe<30|KgDTr>X!XxTuj*=dtj>xC#O?UqAd!}F_}Q_2axH%}&l8cQ zwB$ey&!tl}=oH*a+a%ZsPKH*e*K;I#l50BKP*8S!9y4QgqUc-)ja7h{Q;9D<%)y&$ zBOmHokiN=}8ebLS-v`csL!AEzI1{(p(9_{4I2)?%RQyxm8Mt$uo1t8AChpUn`%E|o z_u0-JhiBndeN_Bq@NC={LlPOk*7@H6i*err=fMYI30&ijKjz%)o%Su5m3|7iFy%z>=Wj8BK?ju*qVa1ne8E{4*3u5&Miq|K~-k^j}W z*WuRs#y>-?dHD;}ywbDqUZ`;QJNIh%9RAP14RE77uC*^O;C>Ij1h>MC@Dunq_$ic} zFP!_|&i$Qpe-B?JTt+$G7XRXa@TV1gPprBd;|Z+&cB&+H-~THp9SB7S|cMl zqn%rGUT@={3*UiLAm=8oeHRKh8*awE0KN|wI{(Gay##)M|3z>M)LskDY5WTKDZCYK zgR7zBJ>uMt%8mbXa65d>9e>BU--Tb|e-xeR*YHHhylZ?i{3k4gtYeM82>%UVh5vzC zW4;T10KbDjK9jNf{ zIrsZ86aPvy@O9w6kaxGn>%;o+5UB7Com=mNk-Lp^w}q@Hi??(B9h|!(Y=D1v*bw%B zhr&Lv8PvC?TR?p;N%Br{?n$sE{xcxgY`oYVU*z12VH^A}asF33_j1?)|2v)kz0Q3f z?1=v>uoL_c(gwsog3_zGn4@ri0=vNd7!cAn#Op%ZhIl>L10D{0!cMR^><;_D9#C?6 zI(IMF7yp6q7&r*_gU3RJ8|K_&oqL>fXTyPn%X9wI;UL^+!NITu9tY>U<4c_TGUvX= zxvzyo33sdWztg$zg2V9N2wBe;e-~!KPv9u{Z#V{4V9=>_R)Qzst_e?q_25`o-yLt@ z+zsK$_z!^Npx&#V4Tr<=a0HwHM?%`x_!yWAbK$9QCY%b3q4esT(sD0`tT&9`?ELR^ z?z`Z0{2y}uYn}T^$hyS%ORxxTfivM}P;$R;?(L9uG;zI0W)}P&o&lRO*g6w-fM>y@ z;W@A$jKls=at1oL-r+hI|I^?+cn+Kom%xSaLbwQC1ed^zq2lX3sB&Kh=|kezK>CpQ zweWm+9aOmMo%;rO0seZ2@-lcEyb#_F74A;wUgO-4I`?DnBEr4t{NHu%zr#!L|J3>a z!@0kJm*W3#=l>nN4EKHvxUPWJ;8pM-D7|{WsN6LneO|mCTn_8QYvCbK;Tk%3BX}MD z&EX2z0$vXfhd06_;4QEu7~ACeuARuM=cDcXz_Ja=*1kv$>HWkJ@e)$@ zdaPR4vDCcu!cQY?tyLYt@6!3|VvcpCY-^B~WPUXYryXLIcWQpemXbftxRZI+`SfL` zGU#XARoSIy@6`qvxdYvK_VHSi=S)^)XR?|(lNIy!yi9>AU!Ai)rSu+W+(})@d?fvT z>>P9@Jv~iYdIi0aH5fYwtNhyYX47;LZmqS|J*Ust59x~LbpYXYS4W@5+YD-OuUbPZ z)GuN+tx7!w)Jlaeo5Ub zBYUoOKdyW6enxJ8@>|1wt>O=?@Yi~0nbFL8*JICqy&wnM(fD;jcSBPaUEq1xp4j2o z{)DmR(wO>#${^J-4+|?$5ce4($ALOzYu|smtH7_{-cwd#RuI!RY-t_Z((!Vl~uUk=kd) zlUs8Xe}awS1MqP8AZ!WOz$4%zP|qY3Pqp|_++E>gP&GjQ%K78CHRtdI%z;nB>F&7Z zcb>vs4A;Tv{q!@qufhK>a3x$1Z-URlo8j}&_5(_VUz4wt>G^DH>PR!Jz1B3R<=^L^ z-&JXiWK_o##$Ttl{q}9G+Ed#PD2{Y}MVw_=J3k(CJwxidMP4LbD({yd!--%c)D*^F zVNLilRLy$@O4Dml<+cf`hQA3lSMwIM`O|mpwZ}kKYiskdTBD{p8@ukwr_0WR#}e~V zbeGx-V$8e9Q@Z{Rm9EWD>3R<;UGGDsYYXfEKZ3pBRyY`b3Uxj|gXz;XF_JF(o{=4d zm#&Wv;}1sXea$P}+hVt1gIDPfu^q63u@kX#u*RN9#q{fc>03;DcrE01-|T0weM9Q{Ut71*um7b#GBW6o;uVlV z{~Nb5QrG|5`jP%w+TBjZJy7lSy$Knq>woRJPQU*5PsFKA+y_it`f6AMH}lN2@f}Rx z6@3n+KEa;X^y_~gA)eCmDBKS|=HxvA55=v%y(wIaThDHuf}P+xsJokI;GV4iwdXwf zOhxTXH>}KhWT`!Q7Ah^zLyb>1K-&-f`1;@F^Z~1}8?f846*uur0ox5b3_BS+2YU(j z4(#vdhf6@`rMKJvr8*>YjD`8zmwn&5r#J0?|D2-1x#J763uceXDJWz)&&Z;J+7^`Ra8tWS)P!$f@oMrOBC7LO7UiTPxeJ}->F#XYeyVq^rRhp`MPu9o!afm;^8=SsqUU~0G#%ixm=Xdxp z-6H+sJo>Rn8#Nr5+7{;TKy^14_thg+Dx z$D;4>H{JEQ7sgliT2DVVT1o)xujeBh)<3gx0+C?zk z7|mXX>CaJK1X@{dy;j5mg=< zBdYCMm5`x%?4%4^&(o(vV?@c&7*XlCFCoLegFt1Pg|+oI{XSle5vBh@sB3x+tO6f~ zwV=j+2L_GIIkIb0lKXf$AAzl}vB1}3rK1EZ^Eh!eM$_|o)X1(T87J#X&f64wYzu$M0ldbyc%_Hcj z(8lQ)$sT{dzSFL)El{{U>3?{(o{_S4)+9c4k1yXo$*AFVn(;+)@7JER*V5(hhyA$5 zkEd8?VobE3eT?u8z23dB=gjL`;RZ5`Gy&+$k~)yC>kfaMpyA#5{Ku9!P$iSA`%bvDe)L} zq}`jqS`PCPNBW%LmbSL8G(xZ1y{O*O>)@3(m47shbVTQokL zTcUAG??q6$?jauST+qF}jVGNt4bgbf_4U%%jW~B;^9eUL5>JI5jpy={*o&Zg?bF+s zLT`fpdL5E_HAfJQUs|u$*)$;D)r33R#Zx|AKan`+I)A12F(|LKX@tikWE%bN}o@obne35K=`Y>Cd;BrsrWxsmWtnv z{M}0UobJi^J@+8K_GB#}{6Rfze5Jovsrb>l=+iIOiT%WT=x8^}Q=S@sxc0W(Hh#xy zH0}^~2;=X>itC5P-^J#=#%_|>!jjmcC&F{<#?C!G2$%K_&p#t}{`=ttonjZ<8D98x zc+q9y#W%$+sTE#wYV4A~hnGDXUjBA?MLYyRBdB_Cv$l9|-@nHugZP@PUHxf!AUWUK~ESBlgg7;lnk< z$Da$II4ykQy>M;N>kIz$K94_r%Ei_OeZS(@z%Kk5beR6E;LqSi{5kGPjt-g3pAnsL zj@rqela5w*V$QMeJ7=jO!_1&Oym^8){=TDanMd}bn2m;0a|<;|W7>}T0^!>3~ zXRbMJ`<@8pPvdJlwoAUpNcE>1R)%LDan*C4OPG5Yo)>VR!1G0;U-Fw_rO)0MD4rd+ zrN5v0!pYkX_a!Xvl8M{<%hY`=b_|yOzK-{>m^AHxs%yN%#K}nRW4WZdA2Y?w_=#Xz ze;h2rU*=mU!J`*bbSivc~uJ`%N z-5#C{2g7kNAC8A}-~_0(**Q>auP4FlU@lw%CFcg`zRS7qbME_L9^q&sOt`1uRNODY zX;5pkr^DCX@i(0NO;~{cTW|(^+a2fmu5oX3Zmu`u=6VZGCmeM@m<_3;Mqdr*rcMTD z;@=vc1&70P;2&WePJweFVS*C404iTg;C$Sd!-eo#$a~h~cSDZFH4as{`{22_A9wDj zocn2bKK?H{|Ciwfxc?3>gdf3+pw^B{&L__ODZChet@*wL)`FKpjiE_PydJz7wt}Q7 z-UTYY)_z}yyEnWZ9_ReE_WK6h$HSFyJiHlBhpXTmsQB~Xt+-3z?eJ1~CtTr?Y9=-%~;YK(GN{_yS z%DIV8g@1!*!&l*a_!?XQH^GHa;g`ZUa9`ov*TFY&uYhkutucQWKI)FIg`D&FlW;R! z58s0?!4II;n15J4C_a<{%vRiO;b*Wj+y;+=(%V(U-3@*LkAq*rEcg{X9`1mnpu(R7 zzrj7px%1&aaZiIg;Tg`q7=DX;F8nvV5bh#9x5Mvo-v?tAg7^kl4*m^F{_C(j?oF@) z)S7YjEtKfydVk!t;Q=rcD*VB)3T}Oel$RmIkAMfkj<80Bpm-Xjj+?dLnecSn2gCW0 zIv-yK4}q7%2Ji|fxmUqPxUYtc^W%CqKofXBYzkMy!{DD_Gxz{hyfu)06lTqMOZXh_ zBjEF}HQeCBy$IXl)*AA5a1(3~KZG6NN3bK*n)0LIF4z@nEGs<+!fv=Vj_v{LL$1|$ z3wOLNeGxQm>7 z7CasIY&aV(foH-?-SI0SZCv~+cs9Jr`QHl9!F?Ny!v|n7d<@QokHZr93|s*J45fcP zT!i~sxEQ_(m%z8+QusDhxcA_BxIcI99q@eI-@s)sgGr)`peBnHzBarVcP6CmjUVa! zyTZ$GcY~M1)^TYdUz4M0bU7jg!jOk;Ct{E z_yy!$PVs+3-VqevkAdf%uo}Dz9t7`!)uHs%g!kdD1@DK=;A+?$J_uVtg=-Dh;O^?& zz2QT+`@l!wZ1@-~amUYv%tgkR!nN===YJP`68GKkDYzEW2gTRJb?~q78Tc;zGyFT0 z{w;7l?hoO!@N?(C!@0kK&*NWyfBFr$AAAuuhZ|uBC^=o7yBmB3|Ks6nFb{5m*FgHh z`0em*_yBwtz703S58(T73zWQ1ocmMwA^zpKVcSYO+8zD__pxw091FjKli&`R55Ixa z;J@H>D0wsBPTVu$xA0Qv*#iU{PJq81fZX2ea`JF72(I(Cqz6N0TM4V#WlX#1NW>A7vdHVey z+WTSdpm}n5EWee8E(zIn^yYs|E;}lc;k3sgRexqMK9L5y9$$M@`k1(OE%_kxTjiA* z^u_kU+9##<9q7H$Z_{n}V+>(klJ+Ewz;?tA=eTCb{eF${_zgCGey>h_^L8KYVbVL@ zwZ|eVZz$m<@8`-o$>_4OPD0j+5#8D|Avu>~@5c7QO5abVFDf%CuQTx{VkK8HyBb{$ znFDIV{7@5Sd77YKZW-%;I(~z&_hU~sel{K2!_o0a)8el+doJvG^mWIcD_t|KBXwBU za`aqk|Bk&jtc)QhUAC;cp*s(2uM>MNCy=JDrP8E5C*33YQ686JkH;Q`J;~%LHNVFj zKb=R(_2=E{?PuIRZ*|;02AjTa9E+w=D>8jOvUNi8v==8;=AcqC2b*|SW+#qmX35t# z``hNX6Y11BO_%Rw`0G5&{t^2GR`o~cP5W&0Er8N_)Af?vca)m9xg4|g+?K=7O-DzQ zcI^YQ^{WRw1KZR1Yrj@=-iF>hn1p=}I~aQcb{2L#;hLIo`f^Ki-k#o^c+F`)nsZIt za3`BEzRorc4#PdOl>Fg@m7Wtz$&>#etYk`O--N8)%cg&#YAw0|hMrlU6VD0YrNmUvds6DgWclHq6FkECw}(gK?f{R1Jz-aP0%R|EJQphdba*sw%`LMxyyS8?5clnH5WEi_ z2Q?4QeSZ8SI2?WnN5Y-(c=#=pyzk&>+~30!-~nWWd4YHxsN?nFSlmtF$&jTB!MKcI z-T;`B5zNhnx%g}S->Gn_V-Zw*%|*&zbCJv^#5EVmd_sHy%!do1!kq^d?ov1%-Utie zU9bo~4rjtjA@?+}Hk=LFiyxc;>%cSN!H{{1cv~pB9i6)qJO}^&uo#YT$45E$XgC-D z32+{q0!!ejka>=H0c4&dUI-UMt%+R%?U<)GrRVoo^*6t5owIG9Z6|c?F2)Wp$L%$$ zeSh7tZLwpqY8$opRQ;-+O87Qq9Dc_bcSERsscKj2F^_Ne^EGDVq^A;$%NYCEwnxWo zKh)NQ^Rl(Cbq01o%Jt&+dkv%g(YPgbe4{a!-OK04NO}gKyzf9KxAlqrOL}Iq@lBpT zV0U2~yv2SaY!)^Ty9m1iyB50%8@!GEf5?fboI%bHsREfv-2lR zE|`{|dqzqzmqoXKPTtM+bJ2XhgYIu4y3H$qhZRhlz!waENq&8OTAfBGbH^DKLU-*@ zpZezHWzX(4;j|gKg}Hhe>Mzmj&uIf)z?f)WnWN6A5z*UgWZ&a|i7sERJj2*c7xUm5 zO(MGb{lc|-{(AB4LKU7Z$VA&D=G-$ndY%1qih9lDt;E^m^KzuTaL?9||5%$e%;{!2 zJYn8PcQ3D7?V)r=-Wwln)0VmT>TkT^IYGt%A75=+n)rS_CUZl^%=3}q7UB={@yoD= z-IwoI$kMZP+qS2Fmd+T?j1#$&H_xt5h4xu`>V7)gMyG$4KGn&{hbo6@2^q;X(i&md zb~pVRfn`p{g-*srkSQGV?K(T2(KoP@`=%w&wx{XkUG3y8ck-@r@~(wep7x*hG2;c5 zljPYpGQGT;oxEF|yj4!#tqFOlYZxTYwu9;A-RtBrHa2B;zmvB*A#eBe*|sgcya%1U zHBR0`PTs=_d0LO%H6_2c-AXU-F(>bFC+`U-Z*4+e2jtmzk^1tp?NNGp&pLU}IeE`J zc^eY)b}v8M=A@VRij()MllPjF_xcaW({*6mll0fYW+(4GxG!PfPslkmQD%+tx9vi5 z&w{%8+E|&b#A(48SmmLxwhc(`ktiLuHDh3f-Ga5(J1^1Xw@g*6?w4c=kgN8IX3wk- zngMIzo(b#1S@2NEI!m)I{!G{w_Z-+6o((k;KL=`Nq!=Ct=fW&l0#AbT;dr++@#O}gYf0uh#>|pG4>>}(c>{{$*>`rX$ zzas^I+n2L@BlnZ_Wv<&l93(N`3v{|rPJ^8?C%4j{$vY`C;!&MLr{@$f`p=)Ffz&V0udmPgwz*7H zcU^QZjp{DryB*S%vmdwJ;q*4M>doJJ=)J=0EyK7?`ZTumI;!Zx#f-Etf9n%w?OxOo zcRJ_`66O$e97G4J{>twMDntD==OnBWGA)(N6JuLr)bDuH0DYHweP!6+=*vxgX*aBG z%aZ-BPE{MHOyf)C>mrx|FE)Lf)}Yp+k4mmTwe3=R8CN(NS2`J2!E|G0+s-7%3ej|| za5Aokx&^o)AwzrQlKTp6TakXua+{OEJgXVA+>wxxT*IpJu-ATi8LOR)KRFo>{D2I5 zEvJ|9xRddOld(1-L+@@+=EYu<>1C{UGBi%q_)FtNTc&z1yOoiLzrDUv-c^BywP-n|c{`vZ6o)ZB7SxCM6u$UJ*ov%T`yc<^J~st=#Qq3|;}9)1qFXAAxT zi{O{A7;-(4R(sE-y_+&snbl4GE}+kY)`+X_CchD=va{E9^4(U^vik=4F~a;4?gw{5 zY56y74R^s_@H;pXeh-uPZn__oRoU4z?jVfL|DZbj!HmI^kgLY_OSe zA+`;60CpTUj=ciA8oL3z8M_l(`8~$-*v{Bt*vZ)cOGZtu@2gk2gsc8|(}4#1-lkB z`Ot_CT3DFBJlo0W^oT1{%>hNyI)-$v!z#QFQ{Sca?9yrNJ-aBU(9fg){5>lv={-2) zHNeSv__#~2DIAyPBMC6hr&nb=Qs0`%pO7&q;9ehYI>b1AlaJ5`OM$4|-2ou{M_=c<>4LYL=ocvgO zwbL2RXIFH->2)ffy(UhXL5rZa;+NJLub1_{#zgbl4ZUA@y~^ue&|5mcE1lkht$Opf zJ9-;F>aJ_$cVIqEO0KfI*Yc}1^D@!=_CRkpuUGlq3wnKi{r$#fr`Oz&+9U)=qc`8{ zb@w#79vcvLIaXo)arqC!PiyVfk6-EH)ue6Hb%;$gIk~tI{qy?`BCGH5?V9?Kuu6Cs3-h-Z0XCG11vD2{xTA8Wow(WTO zbf4#BoDZYvz5sV!(y8*V4==>6bYBF2D&4CIXWQtQX|Hi|E;#S{fjJZzmEomO<$W2{ zHFG&sJ1(6K;1#$JhgU(JRr%{a?P}a=SLEN*@ffJ%s^`n`x6cB4nl?n=u9DIBx~jR7 ztV(Opm{zBryGs0AjN;q2J6TsW43Rz=pZ06fp|oEImG%`0olT8SFHd>4?Qks7ek<>! z(HJl91}E=ECvPRJNeJbsHoOV9>e0HQ0^VtyoP2)W&whW?^Sxmtj|7*J3wew__`RzM!H7iFA7X7&SjsDtM? z#tgMEf48G!dMO=yGA?%IX2!*(pG}w!7cJ^vz4;P-Pk4Q0csAk7?JEST&$8E9`ey=j zXx>$2G$yG4&o+IAo=v2_d(mDq>7Px^b23Vx#%c4R?PF5c^Vn-3eLBu{GL}N6Lt_#v zBRL*dUTi&1e;=W-gz}=Xgzh6WmasCC^Z5htw{knkKYUhHJbM=yE>tAww7L|8B@znm@04u>8VI8>A$g|%}-QTQpu+M?e8`!!QW0iw7 zO2;zyTYbK+?Nw0Ysav7ar#@d}h1+m9fOo)F&R=7;J8>(Icf(%rJ~#y44}W^TJ#~&< zdA9X4{d>3{K&H;agHUOI2x?6CFig&+r_P_htpN_EC${ev=6$hqu$N%(z;48D#g_k& zJ#pAJ*a6tF*dpvA>-{r|tvQGGA!NZ0@GL`UmVI)2Um|6BB( z?e*=2{@-3_>HF>{U0eMWRNwt{qK!^nn_#b*^fJ~v8P7Ty&%t#4zr6<1_x~H6jK9JP zq~qm;jMV<$*5ma3|C>(6TTp%Y+X)$|{lBe~>HGi9F7A6!eb@U?{p$zthx&h8|I+vW z9}!RO-p5e=|5m8}{}UrGegALkTKfKf8}Zcte-73E{{u$*|1WSi!2e6wO2-)&sQ+gy zX!?Kd?@j;zFE|AMovZDE1ZXR;&uQI<_UYFZOryKVJgs|NV2r)h;>FdmP?(mT}NOBhR!(X5}lG zo>M5U=A9JYhlxJ-ua;Z`&?+luRuRE?ev!e~Fn`9gRl-)mmQy5R{m|S&T~%OABMb9) zAZc#v(`=p@+cfXVa~z^m;T#>C@Mg&7Sl*((^-k)4OM7qIo-( z@TYm5<~gp_S(d!DaC_1whE`7t3-g!v*JWJn^^DBgqvw|{Pwqb2u7~it{Cd!S5na3^ zFXOSjqAMJvbLMsVePGdi4MA5q8dX!YefsXTe66w-)xBN7W^O3Dj@T=@Y`**)PGwzq zm>L%5?=W-~dR=80!}C;>Wwycs9Toz{T5}&y;;#R$HWJ$`6O}dsWB$nyGtS9@N)+Gm<>0!!~s+dC%ll z`Rv(RfFElgHe^_hOT1#3h3?8;chsH_y7`4mI_E*x*$civqT z3?Tdw_%(Dgec49C=W<+SA{~k|hd8P?Cr0Av@<!X73tGNd6_hkMw2GSf@#xa+y3-v>fmH_gi2E< zs5Bj!kd>OIaU8R4eDb+Dr!L6C%5-(|NPGMM+!~`wZg<>`p`M$Q@1Q5N<3&mZQ>=G^!+j>FIP3+c;Z2r`w%p)i`pVYpQmBcRG+B#i1#R~EKU zNM9DCh%Y^(VN}l;+$xI`V6-ew#2qb*vA9(he}F2BlVLPHKc_5I_ibO2{<&%)GIcGE zgSw~5hDsC72D-Gb%fA0PTDG>|h?#bQpj@fRdgkR#bn-P7QkLJyVdQbe{^9?mVdeL-nfxoQnH!I1Q@plfT-t>9}x$W~bqA(>KVaPqB49O#jJe*^+DfjP&=+Gm))&aXQ==&N8}G2FbNI+wr&Udd#%( zIMHkO5bF1tPR1M)*FHng7$VMpU02G7o?92=rVTOvM>%q>o8!IVJPvU^nCA!7f8$U6 z4;J8`@B9lKXS?HP!9^Tj2p2O=8SNlkMeKKt z6vNb!VC=`-gJPFrS7IN1$p0PI+75q1%F1$H%d19mfZC${n@JQv4y z#ty?y$1cLI!2Z8r%9DxG^S}E|l}?*r(4 z#q0fz=6@eV=i5=8zw!L<8uWh<)&CpK|2~A?FTCC|+&lQ^nEu|uKmS$R>dnLGDEF+Z zM|(j>m2y_H?bYq?N6=AgFY55meChKO=23LCE2U#k?)Tkw;O>n}?SFH5iq0`ShQ4C2 zZ!gR-+iUsf&+XcFI`tW|y)M(wF~3gRu6}A0R3HBav}2CcXUz6GOP`LvI~ki{1!TOJ zkdZpaY_FB{{pBZ4#-~vIQsdLP>-lv~qrav`tzl8fC<146f!`JYK=9q0APcM%t z4kPbhPTo!@@7o`dXX|tNIqO}-t4MnO3oF6zpysSKe|sRks6BVuo1Ywq+q#>6&N__Q zaa}pMKXS@LN>- z?zetq?zhjhyu6$VdgD=HtNuCpIR&{B7}q8Cho#I7xBIEN01_hI(rcT`a^}9@=b@QN zs69>)W7?93#ijDFC-bE$1DfGPIqAD3GST_Bc7(ZdFX|vu#%TQQO?!0Q<#il$+KlYH z!k;&nPI`5}rhI6wS!EYiVP2MwP5DZU|D4Wfzukd2AA6n5WevzKoZM&HL~hacY#z($ zjwv1fo8SJNZFPFpc6rkgz5nrgHU8^Aa*yU}oj%*oR=0D|Uf&qk&mQiT!A|I_LBnoN zt>)Fsrq7IT{oWZrzTM#TMe}zg`g(eO%HPPrYD#}`9=*<dQl zY4hp#fJO6p6gua7oi?BCl&(D)Go?G1KA+7rK)^)v*#(`~d7U<&W!0HBpUa)jXg<55 z^Et26=Ci%hwYTzFMT03!G@tDA%h=*|+I*H(XWD$0IGxckc6W3h$W6DoPE0-r9;0;a zt$gluI$KJpGdr9)^EDaVh(R}to=QUoZ@;Ty|k!pzcRzBA|ozZ;uM&}x@Q~4~r&b0aLrok{K zdLPvXom;$4mrpecdn=#!IGxda_C;s-O{7mDpJmjUl28BaspY;Vo2HMmzxd7!I$L?2 z%BQ_&oai4ul_9@Iw|~CkbuV|iUAB$-e(3Jvb?dyA(p{D@mv86C?q_qj(PtF)M_(VW zuhg@y6{N2`aTMN%@z1)hD)p>OW1tZ~HST1L!u?Qm92IMf>{$J9U>Khp#vcpgJHz7k zVR3#~d}~UlB(49d?YI{(W`GiK{ti0(H4Gg$KgJV5Ok0yN^r0Yfkd)cs9Mf z=1yJh^PLeBUE#*`$!${gj@HWouT?x`D(yjQ&#hm{#Y ze5G|HR34Qpp=4~o&1_pieWTwb8$!W#&u)zHXr_+yxH+)`n+9$4C!2EWF_-< zA#UaEVyL`bVvhg#d9!28^m)6S_|kI)jOOi1+|j&Uja%n!Is7?!vt!KUyjS#kyBQhM zc?&!M>N=#KeBSK1G8XuLJ9@p{MSSVG8%FbX4{pteNw3QAKHRji zW{<|t$(tQlrqA1BPUqt=nztu#D{oIiQ+cyv$@F=9hWN_cpJ6m_f59Ei+q1Zp zx98x`$(tQZrqA0(WJu>X#yuFQE zd3y)`oV?lbV{%?HS|>k1hIDR$s*9={y3Rhttvd2CtP8iopURsZGp5hmXT+DDZ7`a* z&vC2lq*vqnFK{bw+u={;tsCL&m@)la`ah8&o&SRS!kr13$$msK?AR|xziExqXRkc_ z-Y&`b4{~!oR>_+TXtQNf2#dSt!Y;$E!mh<`!fwY_{6`Qpz;?zC!%oJ=u~%U4!LG+{#_q&c zp+Yyq_Qa0C&cZIk-h*9_-HiR+?0E^4CyM`ufyV7Jl`YKQjOX5H}gTe>n}^5eOVWU zwydLhJ_?GXui9UhKfC0om0MlAPv7H@6**e zVWN5G`}P@CyNL)1bWnKpM)DcmJGcoG$uO zdGC(ire3e|-fKqDw8En7f}&r3uD#w3PH!~7Js5XuddreWKVQ_dg3aR*7Uu8K z=<4cqnQsXVo;HaiWv$D4kft`o&xt+ibZQLXO;2=A_Bzc+XZlRb&$mxQ6{ZZj%`>!c zZbzfrmo49DGbUP}d!f4=10B<}=$sDAF36sm!>5G`%c3`B9?doKY=snQu zHEpKrEjX%Y$NJ9u3asMzaDHyCorWyVOf8&b^7ym%3z13X-M6tC7shG@VKJRrw4K+t z$7L>Z?T&u;A-$LS^rmTR6vnJ=C(Tueued(E{G08AZv0Qe{{bhb5$o!8dAE<`NAI7U zHn5PXSo==E7KG6y5e+lJe*0QF>*^~5CBt5U=Zqv)2f4vV=WfF})K~4L>{E0cUY#FJXWY5@xxlmW$n(N}3a`{2! z2F2nVW5q$NxJy_(IV^r5ocmTd@1(HgiEzO=;lliI;paSzU9>iK-kNan=i!o(;gV0o zbBBdXYli1n3KtKJUQfeZLva+cz3I!jI;^*=(*p~sT}8cToN`J|LBAP!c?8n=xP-jx zo9&9{!}|Auc8Hvh{G8KW?rr{i?|HtfHw9vkQ6*E3aZQ=En@Z=PJU%le)3YCFNGx6w7Ox89Z^>CA}a1HTA_1$nuraXpG7Td9s;p3@1uE1{__B8xwIC&}$<@LxPDG#6DGPI{=y-oQl<*LMv3Hj7y za@?$Mr_0=7VgB;1&5Rw{dL+ol8-`_O5wyA zKHeQ z_jEK+=Z^9Fq4j$xIzAor%XRqvY^l>h_mnWh(2+6N=@^+)l$A%HOhcSoG`mdo%j+ud zdO9xigc**m1HG>PIYlFj_-IUFQSOAoGL55C#OKc^rY>gS}qz=tl5boj*-q zK`qO5h5=a;qI-x4nAo2ypBTmFofg- z^aHbfrcIrioj;M#>KliV-t}0;_i_9snQ+yY64JaAtFrdtf9-Vpvfk#>-QE{8Jc)ESJTB2M z-sTknU#4P<$Wf*G{`H`(}Dj ziHWBDWYYe4H0`B7mRu_Rd8B=-OTUlzYp37W_bo2{t!*~U-#?Q6ucPUw-z+MamgkeL zYqTZtR$>*;ht++X1Vr2P38_)d*uKndJLg&Bc0VsV*ezhvt+qGgNPD9pk!#i6q?M)r z^XK>#r>C-40<+Q6((7UT)@%Coyxa-qv)_ZWXXg||rYHB>{N&1mZ30$D(lMTNboS{` zKg>X~pr~(_g6KSLBJE>|r#L>G{Hx$M2CLhWY!_eimKxUcT-lA}SQ9nNmbuEk40B56 z39#NZvXSY_Yr?r_N6%l8ZU8Y`EzI8uJr9DTpR1U;dJRes1T8;lMm#_au^7U(;quZGXQ=a_2OYQnfWon*s$kU=> zk!x&ZkPY zkNWq1BmUT{kF9rgiL(N$^W(!QKUw%K$0|QLF8;5bpIgJZi=+8ja|p^Y(KKzdWq+lQ|-J9sOGMP3Onw$G7Qi8lW6Q_meQJrO8<7(i6CQ zI2|m*++R7}_J^%QvxX&Fj>{WJVh}Vif9;=K^nU5}n(;?gdw(ximi{DhO*ORgOCq|a zpsVUgR|j1ldlk;kpFo&0=d(&!%oMX}qrC2ljjYn^bW)u;72TJ5-39hJv7gCTy{Joi zS78;$hcopbzm?cY$hkhtrd@NM>W_Ow+T8+fO$O)WPb!*h)1q=e@u%kNXuPBIb*!;4 z>l(wO!l}$w7WW8?mxjeV!nvcud4s}vcZVfgWAmGZ^B0E;CrQ4)4_V~$+sbDa^1bAY z4#&H)HV=*{@KbUNruvghm@GpG!VEQm*b9fl_U*>vhE2btvoeIZv~kd_9+=DD{4$s$Rc&-eSfIsfz&=wp_Zf z%q7e$wQxY^e;4}Jp>G0lCXce^sd203V50i`eZ9tqsvFT`Q|;QD0n8TU>0@d-cV6~R zWb;3G!O2$JsKL(Rk+hWhCyBJ+F`9SmHCEJ~B49 zQEYB;7+)C{pH1DI_gq-AA~yf&*n(=|f?nZ*N5X~s#uly%7o8Vd^ijC@+;H*EaLMUG zc<#<{>5Jice+$q5dw9X>a9Njd*;nC(GgGhE4NXvjQGUG1r~WKC!PVc~Lf2ZDPtlpO z+d%$Hh^II{oXWI3euJ?Lmx6O$e3hx>_KehzqN&pp<*7JvEZuc*b0m)HR5VTwZhs!i zFiwnBCw{DJ%~&k{NErXZ%JTPz+naI_^Rk8cJB>2f>C3>Cz{qJ6PR%LO-EHzhR=ziq z{*}m3d>_YOPrV}f&Yj+C;=}?fB;jR9272@@n)WmJZ-r+G#fs}t)Uo7*rpH#eO7F!CkKx9jTW%S&MuAWRb zSC}gp`%G>JWipX?isQria_Jo@muNd9ohR@4wNkDPX^Pbf{}9Gk)MPi&ytZM<{$a_; zaQ^+_{LjlT_`ckN@56;{!i5x{$(J8fFK=cuLpdkRX{!HRd?u^C3Uc)6&|U=v*|Q7H zMsj-%kgqJ_DxMFkx=<0nVc6#QU*TlJ2~$9xp7(j`lT%QXdx~x+bIgheb6eRbJ1=j1_JmVyAF+ZwY$6kq;o~WPTk*dF z|2vWVsgtL3s=C@Yl0Vi9^qHKUYnm0U$54HZ9-oj*f*wuG&^00XD!5Cqb#Wj42YU|G z=2s{kKU#%nw4X0t=g!Uk_08 z?tKu+^HYYgL)vE=Ep^dgma1@_DIzTmeOhd<=~_QtNkJHu^Lp|yv9*oo!}|H8evvvb z-hOh|#3_F`bMzD#W20c2ldpQAdJ~N^Qwx4d)kmE})t_j%!oob>*O`+&75`QoFJJ2T zguGmygh$FT`C<)|p3bDFvC>1lS6zBEe#j^#huIFEv*A%`PVV7bD<37fPSDEftD!d!dB-#$IYaMZ$ z686G~F4eIVU6HvK#nU<2MLdQ-!T52>G*&AWuaHFgd?`+|R@}#M;{M{|s7z{mbs4L4Hs8B znXXI8pQ&$*CGj@#iioon`#A0|$JzWzXD04wx!A5NIY#zvg4f-EbT=eU|MAH(Qdvi3 z=sfy((Xtv#+$J3RG!mC4DkW}qeojjHE+bBT!W>9W$TE3pP*u%FRA1?Hvd+ahA`*vF z^`miix;V#1;!qt@;`n^|`qGl?UTMpV#G!~&;*?I?IO1shwImV;)hThj9+llwd*1(t zmmn{e85XaN&CQF=J3CfVKAihRtmH4T`HzP4YlaKz#}=-LE&Nxw=+M}b6T@?F3(p%K zgy+8yyPzaoc4c_sh}eaf#V$HHcF||y#cg7jbPF$;9bVcuy!4jv@{I7xqr)rj3$JPw zUUhePb+hp5tHY~zh0AY>UGr9W;rj6U)v+7Sh~3yfcH=v-m1o9oIyiRIt+p=svC~S| z&Q>Ok-prt#z0;LPpl7)Q3;pF%mV3jL_T8^-sovIV(|FvQndp7U>+O@xhspEGtk19M z_4-PjK3yx`oQ}R%68iF{scw|D|ML3$z4uP1uZmX&XQA&KuaETynx1!$swdj+te{M5 z5WLR3c2-$bC-=h{6=kId67)dAyJ?bI{w->m68_Rgj%uI5jtQO=}tIR?57J zpC`=fVAXa`XlHLT`iFY`Jd^2{o2O>$7uRR6bA1|}XQOkW*Qq%br?d?DG;M^xhJ4$! zqNB~A+GB6dLFW@*C;9A~TfoBVX$7+hpnhNj=^RTu#qr@ZmQ(!xk?|kRS|Vz4O`^T; zjfTseX4}iM&O^p(#Nv0NTYZObi^_LWYM6(xFn{CZ>vNy4Ruhz^GPMO?A*~zM?)6H) z540Tn71bUv$7uF}R)BVIY4V%al4191rQZjtJ(!YF5mtni5;9W10d4nPrB8?UO-hFL zO=|2}Ga;i5dmWSCzqWg)(x-#9ct%DhR66P;WTfWB?uAO9js{LfL#T8#O2|mfi`~nV zJ{^snj3!X&Xqu4GDkU#=UsC#Xv~@DtL8YU8LPq-(8FpV$`gE|*&y+_esC2OR&7Ip0 zDKhLHq4eqK?PTjO05vRX^;0pY-YI=VY)}+N6WE#4a7p66wf7hTX>#Gv6k_ z8C1Xy&<_mjH%(qxV`*e)zwdtdvmP?8u^?*}OT9njkBN7E?BclHuM^Yv3XD03zuVn! z)~gxWqnvEkbeVUnus$lTaX)K}H1!vp2&Id4FmW~etj&mbg{%{Z_lD!(KsX*U-4yT) zH=Yf-ABazeJTHu^ZQ{99JPwtId64Hi@$(_iKH^tFofzFZLHh*REiy7#ivrc?E`hrLIv48RW+~Lz|2(L2yZ{b{7ea1Bf{S4uR5{V~ z2AANT4ljiz@G>|bUJmWMW3=!5;E1iw@19tdo!S7suU2P}{ob@GRr$(*=-+X}yPez~ zpjcur(Fug*9ec)Hg&wt0S3~7b={f*%uW0JaHLxM>YhfdJJ!}kbfK0;$H^LV1CaCUA z@sENxB@RkHBj1F<1jW4r{_EA?=ol z*AYI2yPI?Ofa`E`O$C33Tr(yd*GTXe+*}*MdUy(a4r=~I`kA{8p2vL}+yEKd1TR49 zTCfpPM@%@*P4HLToSWcPsQdTVA!TlkQ?|h-+>~kX27KE2qdRyLH?o7bAhLsZ;4AJp zae{Yo;}>j(JDvY7_#W>6!Yy$B(CX1d(TBKeJ9i!UG49sz6WA7RgZ*?Ij)vRe1i8sC z5AA|4aZiR{!D;YocpCgCEO0yn{tNe+kTk_vP-5aQa^&H7@GbsJ;D6u+kTfT*6Hc?c z1{!i5R10dbf~f}AiKQK7)nF8rX?A32Sw>rqsWsHQhU7oa{LbVFK)pbwdDJ<)PI(^2;Xxqs5%-9ntse&YdB-LCAA!E1S>$bSURp!V8e##dn!VeQYGly zKAfaU@6A%1r&w~=Gk!i@OHn$GqKfgar%3?cs3x3E40|4tCvWPrNyh=O0q!bLZCEv^ zlCKWc2iAgWyE36_0rfpT7S@INupT@c9s+$^wFq|u+-kEL!YkmR@DA7*s_kkD)m9w_ zUxv-$J5c5D9&Ca8eRw$hCu|A-1zW)w8Q?mLhp-*oA1Yo|*dBK?*b#PzM?zbEeJC^a zt*sqZj_O-gmg+xrygODsm%n!OO`QJNBe3nTEwOFPaeGaT!d(q}IPuiqsJBx+J^?!} zQCBoRv3uiU%qdwD9iMa|jU+Yb3J-wFOLf={xBAoWur53rYR;<{R6o-fO5-tMP^_{Z zfcs*o_?N+fxK;MY!W-dnaHXT}QxtABWCLe>EgS})gu`L9&e^=RCx3@xRSs%Tx?=5J zX{Nbe`WgR&Tp1`_wC`;|2JL=0`d)O%sI{rCjAOFUsh`I~mCY!qGNAp8E8GdN0aTg~ zg(u=}4B5YH%3v&Phx=rxdaH2igU8|S1hb)9gYl4izF;C`iaN-FGa&79d=AWo^B^1M z;tQbU=vo&qgs0+f%SPYr);VvA)!ERssB%%;(aii#`VBDdszG0vg>8-1yJB>DZ^ZY9N?#R7|6$%GB)96!4BYkLOsMwdbf_Av z<0>!u8B<lJLO)^cey2fSJ z&@C$s&p@T&FHmWC7V4UP5$f9C2-VL273!LO1?s-yHP{or3zfFbP}k~vP}l1Fa4g&c zb&Y-mbuE4dPlMZ_%4I~%ws}+G`MC3;uCZBg1)L3UfoDS1;W_Y6@ND=fWS-8v8><*T zhkGt0t-;3fL3|VZEBrfr8Ip$JZ}4;Y3j78>Nty0~Pr?7fr(qS!Xq_qRmO&-zi?w$NSe*y&H-z7)hHst+Ak%JDaOd_#sC&tm{@0w_LU(S5r<_~6mzej@ z{(f$M@VedP&g~oS+`b79qP*VvUvqBb?%ZZ2&h2K>XZLW&g4*ufs%O&mEc1JtY}@1y z+_~N2&h3X#ZSqG@?cK-Fw!Qz;ZL_`4QroO?pW11)&pOX`AAKybzyA00ynFlnCFfCn z?^jTL@7GY*@D6w|{09E-IL|B0x!s@pr|5a^Mw;!r4AMWF*hTuuM(|&#vDSAcKkCah zMzD27GVD7F($Ae&C}(A4z^lU~ zr=zx$kqMQKI?&#Cq&`El?*d4lj=D}pJ*aflPsm7phGzHor%%UWPDV4RbTm)MNKJ>` zr=LC@hdUW9q0(_gLPjzjS@_$1^f6`~t*HP8xZjdinX*~dc3J`PIu5SWxbY&Y3EicWSMxx;spZTED? z0;NMHn(i}+E7^0PWS6UEGsimgd?zc{#?sJJN*-N2hpAVJpWl-t9 z5GG~so^HDzI=$?xi7VO5p=4hRC3^*w?CW7t_JG~eZTBjtmwg9uCHqb&*>^+9z86aN zeK09|$ZoRjp5o*;mZRmpp16|z9F*)0P<_~ouoZj>TG`W(tLK5qdr!4#jkp=qJg}}& z8O;}I?nmY|;!5`GMh4GL60#ZxlBqsaGVI>p^zFb~PR83%I^IdhXqb@E86|cTT zou?RX<|gzGXY1B{pXQHk$y>h@%rQTIVcT%!V)wb@D<~(s2RN44Kiq(Dn&+1($33)u zmWRIl4!~Ujx8@Y~fmL8dsM###Q*#TIaH~#LhAPhkpi+1sR5`McIo<0%Wn|r zQ28ATqvbakx7vpxQ0>D|sPe| zeK--SeK-k5+lN2kR{5O_qviKU+$z6psPdZt)0f}guYY#0cKY%=g>nX1NQcVrCg{s=U)-y3?+0&%)!=RLAb1OG26bJk-0r~L&bd3nJ8=(& zcR`!Ky10D*tNC|5kLl(7)YIuX(D8x7e#LK%Y3yG2SkQpqGUc#-Ty!sTmEQZ{A@Kf$ zo+$|#oA9@L*kgg7H^``u-C%yPe#Xgo6ly+SdC@50G2H5dABPR$TBy7}1=Yu{gU7;W zpz^4A4B>*m;2sLs!%@!v1o$lOeE2+6U3d}NGU<-Xmx-R)Ho|tt+V6HGkJ<965$Ksp zP9lF>L%;t$X7<7>yvpru{AFH8kILu`sB@@vYRvH_ZjCwKf|4x%2Jmg%%I`by2>34S z05?OO)AwOtsPKc}2e?%ZA3~pBwb38p)-|#f>iLDj>)QAP_Z;{cT;%+h!fm+EgP%h^ z&-enafL}q4LB58o;5Sg$jO0BC|A~7I+zDTF{x8FCalZlo19`R*?1KM*|ApVc@8K@U zO_P~R31LMFN^&d1a=5itp*%bcX2ACD_>piQ-0BZ2!lPj&*dOi-c}5fL4@bfS;COf- zJPlTX1(3~&@j`eI@*s%VABZab+!dCCr4^z&g;@p9ac>xt6NB^)zV-qwv?5uM>8d`EB*6#`&~OG`ejYQ8Q8B$8p@gCn3filr zrbdftY8ac_bB;7-^dW{|-_a36Rq z)Lim$unrswn?S{H4u|2^^)LeJdXRq~I1+bXcsyi%u<_S*F$(u2I0ovu`w5V>w!w*z zXPd!EkY}60ShxWG0iF-XLDr@kIhVj}+}Aqy4RAbetuveeSHm30TD@QrEEn2%`@qS# z4}`gp^;AY)4LAii>!XaDbx*;mxDSI;W@b9gK_vdEQZW| z26JI$I1la*6}}oQ!Oa|`ao30QaUTK~z{BAp*cUE=%yk9l!bwo^nV-^r-*_H850=35 z;e2=jTmThr5nP6w`5)uH6kdq?GI$ZZ0bT-`e=*0IcL^@Vy$)UupK<i;uKMqjot^dnvG+c3T8;Vt|9#(?A&Mpq zm4=1}(a=yd6pb1hDh-8bm{CJR)BmBY>^&*l&``Dz+AU3q`_xqej@1FC%&ULQ$x&FPc>s;s04bM&3-_Q4J z#FVd9+(AfpME-anqUS8-q2!m(4|M%){xVm8^2ExpKsTSM=aY1-r5&zQv?U#FwqB7( zoU0K#KKxBg?Qa@S>mc$@p%2z`9y%Y%g-*=|!t)tHSmU#ohxvKi`REuOe_C*UI;QD< zl~p04c!_Biq5rEib)<$ zUxWkTDmWUhhGXCwXzfwYubqJCc{M%HX7fY6TcFL#`~vbGK0~bfYP`p$H7NVeNHqB7 zh>p>mImi@z89U0~Yf$-H4-bZ~!z18tq4M(v)NysNGyEOYxcYWVq*D3Yh@KDs2rq+- zm%%(x`M(N%6M8Xx50=2qa4g&czX#ukv*Dki)}Xe+IdB`C3;zP|gN)DdN8m^B3HUL5 z63WgmM0AaVpTZa6XYkkXb65wzfQ{vPI^}nE&{rCt57V=!`n|aR$S|Y>M}_@K{Y^eV z&qJLVlzn3#*1TyDV(;}d9@Ck4MF968bpU9WL_lM_>;65_k&ay^sjM5fuL^>{fL9?oHIM`jrOvGd%K{lnccZ=?%5+pz>=C`=HAgoekxa72X#1ML!hgLHQ(w zs~?<$uH5v48qIW^u5Lu-O!4G{^U-y6G60?p3!wRg?r2sPhXr0T%&Ud#od@N!2jg3& zm-C+251r`S_6?k9@I4%*r*qI;Q`v|sBtE6@kPT3865g<8*f9+tuv;CQ$SY8_`a z)H=>f@D8{J-UDBTiPxpCpzFGH9n=`{D*PFgU5yp5q5mANhZ-~9fEqJ?2Va42!8f4d z>-o10=)7AOc^iHL-+`$y=3h|Pw||5O!*`*sYd1mpr1zk%XO+&0a5MT@@O_vE{|x)V zt*}4b21mdT;7Ir(>m`$X_Av9|Y-D!jIAC!R?Ue8HxelBc{ejYpoo)6o=3m_kIiVuW`!ckD^ zkB05g%V0X33=fAqgAr*Dr^Al03LXJ(hZ(RM9tnAVB1nhlCn86o-|IThLPR>F^9)4f z7`W8Kb^Y80{YiK%e9psPgvX)(26lx!HxQ)z2Y3QH_xvN>Aou5ka9uxVqjMiVax&z8 zdJxWi^GJ8}Z(t78^|bP->*rI@4}zz{R<{zcdGH)K0QQ3gus<9K^C9;WBj-ZyCq}-YT?~af-z(q% z!mot`;b=Gra^EX57*2r~!l`fwBdlMx$t zGb2~=cNH=f(fgtoBN`d?{>2&meFtJ=au!dMW%9mWW+WcO&0y|j$D9+y&t$%w#TtsJ z&Gg)Wnb^zZeV+{0X6%>=u4@LUH5J)DJz%4L4(G1-VwDfgB(?6KJPb#2ec$m=?;mwT zG^F=;U^7%WgD}~$ji^aFKCOhBo9M2}s(THZQItP0{IfL@G@(=aiuAfibFsxUTI94y+ zf^<~wR$gI!=^lgXO%j%SSWivsNbR-pJxSfiI6s)%>-|t`%l%vr*V*)rsofK?{ifUX zQTT4D-cQx_Qs;nLvuV73>fA7QQ_0ngw7Hw+{@QT44fDU-=vxf!ksm-^56yx~$9{9( zzQdwgwr_Jqc^BF?x@E(2m$N;MYN$D+{G#T4ccOQMcR}mFozZli(|CTG&%Nd6XDyU* zl&~?1$ac4<{X?j5r7aut(3PM0@KAUU)HTe#urs_5n$5&D6|Gxk1?3dZZ3ht7zRML2 z?%AS7aE;#Lm`jq5%4ac@{fFQo@ZpB^RUdlq$mYsQFJ+XKcN_lJmYCk-o?eZo_j6D0 ziH7v_%?iEG)Rr?tM&ArZAee=H1}$fUeRMYWVxECHr>D2x(+lhGbx-#V*q-=x(CRBoNl;HmA}2PnbD`TY&(PG) zTO6-?+5i*V;M?fO68;WUuiOaDP8T%U(et!=|I5m|n6Mvwhn-CvFFSvNiFV#Ymz^z8 zcHW0g?VN=jy;s&~=S8=367jVqmfJRtmz}>rweJt1u9-f9Dxr^IHrx))&MeZOgq)7( zeKoVAeze`~+`-@4_D72K2isDXXLU{XGuRE*K#g=yz{?3f^FX0UI&tS{Q6{Ih@ zd=EJ#@&$3!Pfn5pU@MNXw#dR;XAbOz6eClRMaT+dGx9aknG5+|NHH=6S%j=WHX~mn z?LKE-i3~uBktxU=VYW5^ohUE~|29Vgiz8G*!+`;ZmL z8^~7V8>G!n*6xtr$WUZ7qMQ2jkjIf#$UDf_NSiM?H>5u@3b`3sgsec`MZQ4Ve}&IQ zh9YB-dC23)yT}(vyRS(D8G?*PW+97^*O0A9t6j{;ks-)vWH#~$@;veu68SqekRHfD zWHb^-79lH;caYDJHvb@B$N;1mnS#tgo@*wgQ@(QvUIpACB9_f#aKxQF}kXMk+$bJ#t z*Fkz91Cde4&B%SolgKN`|KGR$D1h+0c~iVF)Ca@u1wKIcV-`SylH$90`C~_p8&x_g z_zmg3`Ci{`q_ZDCIiPV@>uLI~UHFZ_kKI_J-4}`Qlh7_7-Meb&)bXXn+gF?6w;0EG z)ytoS+bV26k!bVcit*#eO`Oaxnog)F<+Gwh+*kWyS#NdwDvxkmjs2$+?d!|)lO~t& z(*pZ!H~fYm-}MN#cA-(o`bFwXq1|Tu-mU7Ee?0GE-)h(M1KJX8{E7%~{}*kv(L|K( z2t)Ay8f<*@U$hZ-8(L2cx3$tz6DSSqm&wy$ zO*2U2SWn|PXx9Xqn>K!%(fV056868u^WdIXkOud};wjiWxgibR6K_nz`bzTmNmz>y z(%_k&xUNld8`5a}7NO?b*6w*Xo4>WmA1aU9_~uV=>{(FrHJ%#^=2Ly)A$Ttg5B$sYtUWhgJ0+f90msQ_o)25X3t&e$Fi6k78=~h| z!@7Hreb#oP+_AGw`I_T@^ZZkAT{Hx04W9Mo;QTc2J`A08=6Gi~6l&h7@EkY{U1fGD z%!8N1!H|2F?WHb_dEGkIxfBt_e+t6>1^6Z?QkS(5jO6|c7FO_+u8DqmS94{Xij`gp3 z+J_|A;908FNudpXPKF;4pR6Aq*c(3=+6nWbdvMwk$5)=wN}V3sVJ_1zZ|}xc+1PUq z6WV(`i9MbLOT9C}UcrTVdo_+Hvlq@Ey7(BIn7;?GcYlIC{kp@2*VxCE_hyXxF1rsV zvCFe=sgEYumBs%24vWhFzh!r}kBxnmsBb(|m->r6>;@B4_UoI@i#XQ-9M=~;jCW+D zbD9o+LaxZSYdGJ;Qc{^46mh9EHo;i2gQm}3mZI_x8 z&EY3jNF%J@{nRnpPA~-j^Xy>i=Lz}sezMndaj##WgEY1Kh1IiE+Tic5lW)_s@95FHc7Q+X+gClks!EHBkfU*bQ4WD@66Px~;AA*jhQW$0n~ z?$vKVdHJ^I_-Opr;3wwd%cGTt$11t)*!cUSqcp)_Q{9H!B96T!%x~~T_G?Nf@JbR`YBVVc~VxL@v8ErcH(#Z*PJc+r9@i7TyfA;566`-U3gB z--jAedW&LBQ_Aa)8noqTLUGum_ zgm-rRM5z5|z=sG|eLoDXjx{fC$I6|}aB`bB>oC z{Auv4pz@|XKZ&lk{tKu)KLvY0?LQqZM?Vuj162kJ?+aI;U*O?|&dZ?okATmzzZgCT z?Yz%NlXFtp>G?6GZhBk4s!SvNB%c4xpe(f|J}ahNn~&g^*@C_1LsUlEUcip>_oCaA z%`eaoK>lLY!kZ-b`R|~ zbNwfo&F@@p*;SP8-5e^J&9Hv;{)e_! zhT#8$uz7x>&B6+Pt!(mC?cAHWTQa-h-1vF7+djc=E9_np+HJ;lh3t_;!?jCiIaD_5 zsrGkkB8>en+R*ba+VEKonqs-rt3j`S0dPMYOu!hKG-X`-}_@T)`P-w z`y8<`>;%yLfoU>m$hcr7y5anVf{3D8o0W^4>D#1X>^6j)`P6yB~RmI zPXnJDq>^6@*@(>McaF2We%=V9N@4b!l`kUWiko<@I9BflXHyDzLX zh9cIkS!3XDZ7RC~!CySX%P|@Q7=0LrShIm`;6Qjd90U*HNE@Scf4)mYSu1U8&(Vf< zo|rb{33+1O2I|`7BG?gL3^kT=JZal~QTu&^{taobV!yTHXhZu}8c!kGF6CJH4aU^K z#&D>4fyP(ORWC>H3>j#y6BYL+cc=uo&ycT@| zoC+sGs}tGPe4#I*@AK*$?4I@)#FMRGr12k{>ij;&1GvU7N=L&`(nb!Pdhm+>M_-kirYjpc#I;Y7amCil?nPT)6#^ zIA{GAY=mQLZ!a#j*Kp%q%+#r&4b3O)r!V(vj8k6roWq1;tKQ|*7WR4lJ)ih96Kxhu z>Q^#(2zm@M&Jr6KsA=X+BZhIUy`!(Q;)u))uV5@T=1 zr^Gymzq1wE*84%)ytxN|-;3=v-(g$V{yjMEF+|6Oal>_)feFba{lhPE!^2eNM{O*BV;{Lk<2 zg!aO=&vzn%4S(CP-H*M$h4u!i1(r_IPSwRLoZonkQT#AYxOT%>)KInMewdEYbGKtS zrW3~;isMw%Kbo~0Wi|1b@HdIWcBeX!?9Dokx4#zZSNv{#&(sOg39IH62N zjvG7HmjHuvQQr1u4bbxzToALgeW>BicmUK+hL7Jn*Msmq#% zzQ^8S~2hjE;N5E_u4B;^&6Mk-`qYQ`l@hFU}IS0Hxv`+1UGW&yg#<4 zz=PpUumijWc7{wCg89>QcnbQh@KiVh+Bd!R{ZGBidOC73V(V<-9C-$DZG4Lcb%08o z#&y5{)IRTT1omgU{c3my>D>7*&qLoc*P7jt0aX^7uiH47e2&Z5L3Vj25^A0->N(Ow zdC#mf`BECih>dHFb6i#HP(<59p2ovab1cmfRj!Yqw}p>F%^80J?OLE4n%+UmMD#ml zc8|B1FdN6B4dYv)ohLY6=lUc}w6hFd_4iA7EM#nsTR9w$rUtJ$T;ubBny1+~6m4*L zxPYLn6#qGnm!0RK+RY14bM_Y-($#Z-jqg0EjBPAQzP9?3r}rzUa#_=mPSZ4Oj7Xja z@7x6Ew9eCbwIL0wbJbHjPTG8WH1O{PQNGMkl^M46p2q7?zMJ=Vs1K_z<*yE11HkW~ z>P=L?Reg4LT_yS^;a%Zd@D!;1r$OHT3D)f1hMHUd9?A!8geoJYC*Q01m%u-ubDa@+ z7mk3Npw*k&gw>t3m-fuK`w@fpR#>02=bU9h`P1|4dX`%6GPmWvqs?Y@oYuj^KKUAP z&F4o0|F2^;A6TV7*fwKZ#k2*=Pl~E5ovX@5y2hmUq1xJ?VOTbq=v&c`hTEXp;0N$H zsN=#i%0sV5&xapD%WFIG)|U{C&-VS=rr$iU?@~49t7Ai+dU3+$_oEGChR(5@GQzeU z8~T&?v9M)%X$3z;SH16m%A?4XDadOl*So;a3D1ImgW0~nJNyDY2Yv}v3o4^N@GJDQ zAZrfsfp8a;kN7*3bN>fay?+B$@3MO})bSJGKhY<`Z=scqtY{rp&zQI8se%51-jNcs zHqa~3tqoXQd+z>v)^P282<=nc@I6YU6}E{n9Bt!JR!deN2#oowxlqsBC^gsQk&>Ds;ADWGL5qqY-`FW*+i5vIcn< z`37mXKVuj&5E+BaKo%h@kav*JkOS!8osr(iP-F};16hRZxyjFk^WrJKQ+W=zv$+@c zS=+{Yf6aaVFWEiiaGvwA8&g??TVL#c720j)`foCu-?jdmhs|#jZSLdxZ!-H~p7Afi zrv4Xh=U_keP%rD?8uh|+wQq0cK;LC^fE*c{`hK|e!)Dvi<|JJgo6Wts29Zt8@fxmq z+)iTN`V;4f&`x;$ec?6XqaOR5$I!OkmDHA)N8U3_Jub8zn!dA+z_q0Z^QRgZd~QCngj&%cZ*BE-Y@;*dy!~F{HPuM(U9N~q2oUWym*kcLT9%IK{<99pkx^8c;rM%roH8w}% z-|ErI;F>JV3;rb7Ivaxj3&_i=J@T?I<@Jc$7@T0^d~9qEZ8T%OKI~hclcwfO=8KcB zli$p+A-6IO>Qr?7V&i7h^?LKG$)DfUwT;rywM{CV32oeJ`uwK($>isu>lCG->lB@b zu2U?Hrq6GhuS|MI>Jj}l&Kaa;ejipdy9PihAc{DzYs=76wk^DS# z4Wsi|4s{++H>APqIZRSFxr%mlSyhhcvipoIODDtDaMv?E(HHy}K-hoF!U8@`t zT-)n9TF=qwcPSdLBXrKzzoS|k3bw>KqpoFCZ@QMzHR^kw?q;Yp1YJM$g%N$uAh z#SQl#80nHW?Bc1DCYP26WA7>d$vQU2tKZo)O3%`ya#zjXBcVA5oA!qr&;O*Z4A1A{ z(#ZqM#$G?LWNPWeizl-X+HZ8p*lSBi5qWRMapf^_{yM|$CeG=eCeHfM?s3q-geo5x&&k%oOXj^l;hD>vFXJYB3Nf%BYZ3Pf4Z8t0Lq5U~Y=I$%7|9)s+ z^Vxr6e{bfw$;u+U9zCFi)w;%waI589J_*l-`X5|+V^H(j-weCqa~ES&|DoN@Zdc!t z3AbmldqNlQ2LnpRjv7-sh>|b4w$$#UwBneX5gil83+K6=6X&@J=PR36{<}Uxdi&8H z)fT<1T6E{{=&`ZEUHIZmd|j6rDKY)~V{GQG*lm+yvxda(SQVQyEH>w5;wAQ{%hYMv z60aMcBVY4apbDD&#ie6MHPr1;UOhXvVyr!i->fzjUX$rN9ola2a@F6@V|QU__o9li zK_w0<89BOaEG24XI)d{(fMa!B7&k1_%zsg)y5`Vz$bK9bTyq?6dF#kEhsOKF<4Put zs*o*}Q8VizYIV_NaBOgFdY{hiGn9foLA2 zZ+mt_n!fvFemVKK5a`3fJcxC{VBW>LV6bM!dB!bGrKkHRjn5XFzfC?LKF8DR2Q?q= z-;hq@dZ_${`OW0>;Q~+Ne5kf@0krEB`<`Gpw>RIH{5&YnAYT_koyU-dH1r!vb{}I7 z;pVegljCn~iaR6tE0~i8X;3FYeQPeQ3uNZU!MZzZqrn>UaHx9Me%e6r%#H5`NR*3?1zv`{K!0bB$U0Q;e7OC;5{%4-V3wgeUNt> zBMacEa3Smoe+2u$MerQ>2<#7+z=7~5undaf zTj}U3I6SVL<7OiRkW-PybQ^O`gVkP-CCkhUoXEHE zpRfhj^W3%x?CVmRxm@tA;1qbQho1n66F(7h`zC%0QfJ+xx%YpEkF_&aSH&%=#xm!|$Kw9|~| z$oI6-3E!tJ&k+3oJ#0L`hmE~i6G|+**hRK35aucF_BtfkyBT}CLwn7*w-@G#xkzwb zX#FhtJvF>!Tur72)Ksb`G{4{U-k$ZD-Jx9i=e_x7w0BtMUHJdJ)( z=g}Wp8cpx*SvyXC%{2<11ZE3VdFbEjrV%wAFX{g{yuO8K4?IH7TZ!5Z|)FntS9EaxU#Mt^G$1{cuK#Gwm$Q7674tR{on7hIn>AH#5u>a*c_Z_v+%-;)r$9K+)QRO95?l? zd~NbW;l}siQ!fu~He)Uzdx`Un<9%$#e>ZH;6KCQcHkzBKJ?8@9w`jUISmXCtvG;0d zuNiZJFi+uJ!1`SBF?bM{27 zlxJ&`TtD)+w!}QoCOx&IYN+$O3ueH%@ML&5w05O=Lx1GVAnkDOaQjh2V(W`M#rXdg z@-edCA$)fg>5E*3j7Mf6i;xw_YsgmQYorYeRmUU$yZt{?0vi8AUp>lCVPe9mOk-*C zIyyp7L(TBjlQ~|#`doj$VY8>Lz7=k_5a->{2KV$YDjiu`c0=i?i%M?vd+c_@UFWqo z*QKHD@OhHUyqP81{yw%pPO!}_@X7xzyWw2pUANmO%rJ~&_nXiz^Qv`GOj6TF zk(%9}!gqqhypHjOZd>KI6PS(dmUOJZC(8E4Wn-@$qX!H3tsjN9!*;dVZQGp|vt5nt z{)x8FEt^t0>fDLEt>VqPd2P92{L=)NEz#zk*t|Ts&4y;JW13UP;TSN_8&kKSP?cKn z3`OertHS?Zo5C(B5F3DkHvo(i+>QSJR(+kQ*8Qv(doaAOs*4lEse?c~u-8cgs!92sfD1Yc={$0>g#t8W}Ml%>i`Wh_&P;b9qv zWtq6IVp8eE;6tDsb2P`c*yGr6znz-ZlZKGQG{&GSZMoXSaK2N~q@FgDk9WARI+l1v zjQ2WE&YS~)g4eOYw+=IE`J z(HTQx@!MnZt+C4XvC690^h2Y!X2fo77rXV1=!_d;GshU^K6^X4HHol2nNZhr ziyOGfd8cR0@&Humb0F(v#U#i+o4O`$-hkU^yp z9;doda@;3qsPC}u!n#o$m1(j#JdZmOzZLW^P2m&cj6|28&?z?wpJYdApZa*yeFbAj zl}-tcQ$J7KS7J}G2R=a4fy8}flNzp!f^*TZnYjNNPDX88LtE4E@j-fY|0dy0+gRr` zticeEs05slv!<%hjzej1&XADvYZz5Rpe?5t?@LDA~mSbS|P{*T!74Y6C_ zjm`LR?6&T)+kP7R!I`li{5Cf0;n=LVVpV^R-qAXC$9}Opies~f#O~~B?eZeOP9M+s zqK$i$4ciZCmmND=-uRwQ!ZYyacyr7fJIZG&2~9L8pEk7f*BI}WUYJJMMoIGDw$Ws9 z_H3hxaT42Tlkh#-Xw!X7+i2pxu#Kv%sf{M?3)_s^W@5P7ruu@~W@32Rq`Z;W6Q*`E zigI~{a=D96R?8$MRz&S>r5~qrV~A^VT-e@ZOUDer))&Od z?9|vsX|7F<3ER5bZsIvyGg586a~ffLgpUt=T4-YpHnPb`M-~&6A04B0#l*Bml}!x7 z^)yYBa0*TFwX~QRUNTa?u5()FJ;JXUIVrHM{v`R)-uJ2Kc+zBEmK(h?dP6imFUkXM zm62#=Mzk_FR(WZxvO0F_wXqq+u^GRP%{(VIb7$wV619v z?DiiNXe)|Ol$x1@AT`onXOzOHwHGZ4MUq3`OPis;>o zV}mf|ZvbNJvB}@%cpW>c&)-7%wl|>4zAmt@boJdDy-U*g+=8vKCQt7zPj7>#_qM0^ z`-b$I{to4X*s`_LC{O#@b`Y53fB(VL`y*7n=>CfQ>AUD^N1LG9^Ly|_-+vO^jD9lQ z0#z?t;hAt74DW-Wk~e*SrW5OLX1($Gm&Rvtiiu}ytBv1k)wrR0)V7^8RfeCy#B=-< zJ(KVq@B~PG#4UZ*ik@H8vz(3ZjgKMB)>0e4=dQL_jA;9U<7H)yboo^jUvDivCqO`q?vbI7xnF*L&-rO`bU@-Tf2-lIL*W~+IbqH z+PIi34O@duo)INsCH^V`acp5L}K8r!7WxUJtc{%)1#{MLe5OY$^M zhU&L!gYuKz(HZk2Inc^SJwSt5)89U|^|{7x=_U579-cPu(=2>N#<< zp&l9x1ZgRUjHWbVQXv2(>TY|&@<*rqklsh z`3-4&j1gP^!jH%xoAR;Q|JHNo`f~u(`RRFc4gLe6eBNNFv{lCK;f3g$a}`4Mdxakh z_1w8iVkkV-!{r0@e1N>%r7+LKHAZnSE%?2K%i(3{dKO@`@0U-~GXdrBN>~Yt;auN8 zAC{m$0k4Kn!cp)SP|pJ_hdQrkpq>j@c zMaIJu;RI;)u4e=E-R=&EN=R)$&usrEf6EuDbi%QqH^*wEke@uCefrkiQFxjof-rr* ztt(?}Mo@D)M$cQycG&jxUS8wxBF~D2>vYkEb-x~@r1uxJRged=5q_)Icq{A=6|TNI1AQ>ma|oBhS#UVK9ctd8 zc&g(&(8t2ra5}sb-tGIDhXv0SsE+3lz6|QQf?CKsYVp-@K2#kmJ?1*WHz%0`1mW*G z|LprefcFvqpYVRj_z)b|8a{yD7A}PN%gB!){)*pqv$}r>;(LPl_?pPW==9s*dzJZ4 z`c1HZ2wcK`+Hdfk$}w;$I%OT~r;LN|xXgo(6aEue1Fdc8`4`DiNMd_Bd=EWwpW2?< zd2Ci}weZ*QMyPn-gD<1s3}1nB;Hz*E)c!}{Z_r+ogxTlia8 z2RB3BfehXc)p4JqzlF{`EBJ=kRCT8ue~GSnz}N5?4?hm>LO&k<9jXNX0d+0+ zPdEgA3$KLHSR`HyV^D201x|!Y{|3lIGC^DA_jZE!6M0`YUQIaf$p+(QD;WCJd4%iR zk_-L##gN}2i9ZDSeUSL0unl|+@}qUZILdpr@fGN@$8~6g_iY>Ajn=rDj{X~XID7+k zgc@g$fbYXj@B?@h{0Q<+o_-=cNKd|)ck|+E`(0ovZR}Wh7?iz^@Hq4%An)!4w$D!HLIp;_*)-%!zYS!Y^6=tJc3H3qfCd*mXW`1=y%JR}1- z1JRX27)S3wD~>(0sqnVJU7RpI?bC62*wNL(p8GY{>AL(XM1SiW6^UbMH^MdB3GL|} zX^lo&pVz*&!QXbi>d}qi;e4(&?=vc&+RRqJ;BPxd?^iaSyX{Z3H?(2Djm4RMY!|Lq zPo)G;3iR-uK|B65&x`!?k-lGf9G(!aeSMH_o}NZJ5j?LEGqYdl%8W$JI z;jxudmo%x!SV+}I#zE~G5BG-?U`sd=wt|!3A#gHOsZ~Jv$Qz;NpHrc7r#7RKya`=v z3(Q~Rr+K)p!KR_Bgm@n}Snv8iEJU9UN5Wg-1UM5;g15mbunNwEO1}!;j($7513my} z!$t5esBwKRdWB3d7MQ}M}P8@j#KI;1) zgFM3@yz{N_6~14-O~*6Wiabj=bE81t0G~sD8$J&|fGgq0a5a=KdkKC6*FY9>gX8vx zYtiM?ehu5gmtiNk4&Ovtk=M{y!Pnt$pzQw^B0Nc9dOfT||2upW{=>r~H0%xNQTR60 z&CB1zBj7twKJ5?KSqph@JH8IS2j7CS^A6mMz7f6;w|e-8@XzSqx*lbIu?@XF{0r;= zb^HtWM1Dr$@?z@X%*#j$-$9q7Coej0=(?uT{&|pZx5XcF{SkN|`f_*>d>Zn-v|wJU__gQph;0oeKdNk4t8G_7079nepcahJK0}kU{k^eVt3@6mMeQ#59 zD{ZQWaHHN*<8S-@+w+?L{fA7_*^gWFnm?*2bpJMdZvJC8mS~rDk~%B28$8cGb-eu1 z-aJd5%w~Acc#Kzv=C|QSn@pXPXmcOm|4e2-%=2cqukr}Dld*qq6Z=E*wQpbZ9NHWz z$HkUtvpY5)PPAFrKX9n~YBPMs`i&$u`JPSc6NxtS$CQkpR61%XuPo^N_SJUSo(Hs0 zYEAQd3bvn1v@N5PCYO|t-*>y=a}bZaUHSiTI~BVxhjyFs9+lcs;k;D5eBlzPtZ-5+>9no(c&t`HyTPt4O+w`ZfZ89fbqYeIX?c&|1r zx6esVW0d)_5uVSXn0 zd$kXF8V|!1(s-mH4bAWEeOBegd`0qmy^nhuHSj><{=6X#TcZfe!}@;mG@kY}p7Aue zcJ{n9O~d+f@-$X?8mm2xmm1P&S{~LXlc&MFFqk{AJ{jcYwT3hr?>UblkJi5!tNB}- ze0#C}U}HYPd?S2D#l9uj2K`OK4~K6-%`P{<;~?FLH4gozo1SM;ekD!6c`BRM-=h5L zn{A0UH$NQeeERuDB)ki zgW%UtD{ri~1ox@Gfhs%Jo`YwkzJ*p-y|ANuWRkNGJI61GtNL$s1pl#JhV*A5G77mF znTI@%yn%d(=mUA}k?zOo(UO_e^Um&g8M=BrVJ^ya)S_B--aif|5ob+kOZ7T<+{E&dF=aQE@)pyWioKryCCh7A$3t6~;Xw)Z7hwN`(7y7T z#QxsAckT9DXe^2Ki3RuW60dDu@pF(*4!8R`haNcSpb4l9{>$H7(Hf(+Qw_oY4`8!z zXtNpf&#-R8Iqn>{A)g#>4`O4|f6+!nlOHzu>Tp|#jX8VRXl~z#G3X}FKS#Mejm_cq zBkX+`+H1!AGb}fa-5OubmnNV0afc@u^Oz$9^S;gvV_M^LrAov6V)FTCmZxzn)cljV zOg!2A)BIfW^T_rzm>&e^adJZ%O~316zAE{1lc#$cy`X#zt4w|#wq_ibhxwi4Yer{! z8ss^cKe6KHY3Mh28t1|0Poj}yu%oR764qfqPoqD~Bs{+%4OG4llDS_)4`bfv+Ib7?4I4eO)gd?t_LCJJ4w+uyjHHCX9W?=`)ezolol zF&3>iwx+Qtyduw-LM2Hr?`CXCLz14;%F;{8GCkkZS^c`{Q)z69mrLUnx6C$XQt{IJ z9AL+n-)VZmex_HkPOJT8JiH>#z1{Zbtu_v7Yn=av>)$gLY&O+`1pwe(og)=d+szuk%W0fkDi@!Pxaj#`2eqwfh1xZ#7o@#aQ%_ac0!Yx036y;Cw!`@Wsxh zPny2-D`U$6#th$I;Oyz=vD43^(&KG<#p3tGu_*mAx3l-wUx z@DtrMP7gFyuIaYw*4JE|J%L&mHo=X7k_E2@ODzS z-1NM~#%Vt>_E~FO|Ftpm1>^3Aj3wS5hd*d~+24)%PZ<}UZ=B}!RmecBe5QN3X1G7v z(aXYze`Bol{?+Gs)6+H?*Vh>bwKp#D_?s>_eH-_Plz!&7rbqv2TzQ|daGr5$Ym2wK z()3+kZLmj29`KiZhOzphy8;a?kvPcW`N$T-Z?DfDz!dpZ;P z*#3{mT#?CJh)g8RGj^DTU-`@1ancXNkY`1Wgz z6a4rr@822USop$|jQMe6^moQg_jg+kFnzcCfeP=Ru)~|Szux^~CUq4>>fBE+aer9l z^||p5+rOlr)9YjEN2X8UMF1V2vCQ|-ex_!w>DniuSqH51<4e8WF7SS~-piq7y2ab+{XZky^t6+W z9lXAloN9VbPh+1mjSG7ltMiNSU1sF z|CdOzQ}!1O*|&N~*Fp6~VAa*65H zzcki9<@=vDE_udSRBOz5&baA$W7!MFl#Rxs_l)^ljdk0Mwe`j=)RyXPfzK0bef;X` zerWl@wm;wNzl`f;#oy_ECB^-~@LyPZOLiG^yq`~a#q@<<&g*h+u6*}@CFKIVIS%JX);$>Z(*gT)*4C#N5mv&i)N&y6d+J!N^h z<$Y@5={^oGYh^msW9{3yfx=LEL}SKm=Mr!KOH(X-gEN|HdXclrx!k$M+1mYRuJ@m` z)^=PU=gLD&uXlFvewFWB9I~y&Tkq_8sOiI;+nni#S$Lka_2H)HhV=2RGSk9qoEx1f zM_c&1cCLl@ac(-#^yvAec zeVk>^yag6s?p)w3eZa!!I#)V7JZRzhA%AT81n1gCe%wRGmCkzSutzMs(plr|^Aig% zbFOvnaJK%L?ay`QJY{;3bLDc=>zx_Tm|oyqy2A7g&YW7)%Y6Pn-?`e^^?BPr%vtGN zw$j2kIWtz7Uf`^7);V`O*RHmBJDeFW`EkzdUz%o#}tI@CnX^&UMb+U)cVxJB`Df zmChPxt*?J>bEf(FMIYw^=VHG;S?}EC9OmmGmCkCPKh!$Yd7&v9VZGkxRl}XNejT&T zndj?1%YDAI#o5~DUm1SAQsAs`Zu5LjyUy~t@hM}Gm*d(crtgRwSC@FaZ;a_){=?Hu z&*fZozCHO*Y?)$Qc%ZS)=OZ<3Oi%H7Mqaw<*~b}&Wg81lHWvDLzUfrc%X%6s&NOc5 zZCsmYEbM3OlW*KO$hh!gtjjQi4Zgc;=(Eaq>yDdETK4bR%#)^f;u8WP+9yaEAJ*@qu={vlhraf)?Cih?S z-CqrR&cf5(|15sN^to>u7yjPZXQOex_tR2jgx}w_>;HT^AT@<{A6^##mNqtoqit z_#WeGFPE7In_h9AvE^K2#!%P08VfcV%RJqsC8n=F!MO8mJ1l&I`;oNYn!e;CW1jonjjx+t?W`YV z`bPIxt*cGnG11u4`^|zoO)qjkJS^YzH1A(aeSK)#R106}{-nzLRsMArUh;-L%U(6+ z{n=RbqA~LmV_lB1;uhm@A9p%U|AE$ONH$82!ap$AP z>Q2Vo6O1k0FIBjoEPTPj>)cNk9%Ooo$FI4>^lY!kmAg#ulkLZyZ!C2Gw9frg`u;X= z8RT5q%i`@i$++D8RNC{VZ}`43&)a>Lucv0F`2K5*WoH;m<{NX}KMh-8`ZV`X1wJn2 zx_`zxyBtA8wYuPE_S^T))pb^-a?kx}VxM*!1#4j9p(hZgD@AKil-&e#WK6#^v5l zwtIhE>i%uRMYezAB4fSB%k=)W$>U{szUThd;+5TGOgYs!zuGvrzp>~jW5!*^D)(zy z?$;)GeeTG%{TuEx?z-Pt;Qe{yPfYLW?IzFtaIO2j^y_T@ggWC&_j|3kn4a!_ufqn@ z%l~L>`BUSzw~VGG$NL_>!nn}OZHM=l6t|b<>7;qO`CnN4u6_LYjm9mX7?-#otX^*V z_7{yE{$Q+JXX_x4cpOWU7*zA^tHV`k_dzh`>ZLSuo?Gs?Xl$}h0+np)$6 zR<7S{ zS6g__iN;}ljSCJn&Ub%V;{B=gcnja=?YDZgALssZ(3_^ObAMSo*z_gtFPDuny|rIo zr@Ox_>u2E;ydSOe@~l~8;j7*6^$E+>{a$Ic?O*ABZ|7mA@3_-g>wZrk5RXRqc8L4E zazEc}Z{Owa-_q}}cssqn*O!^T$?Lnmhv{238}la{=a#zu17qD%<9u%q3%nf{wy^M> z?$?&xZ~Ed2W1+W?o_>C7$9g(`o+US$zUxQEyy3>4ZH-x-jB9d)r5Kr zpZ}<_dY5t2FOBsD#;NXKb{uGWT|49Ovy9O}#<}-;xSxM{SJO+qy<{G4dfGpXOS6r+ z7Z~enjis%OQTG#t?uRnn&eG>>e}(&@`JVnV?H!h%8sb6ip$Ml8nkLp{SzVlLJrTe3*KbgM$ zH^wFIe@eXmw)M5}Qg1JVt~9-?`=8xYOix>FEOP%-IM?(H?>G6!nZDEgP__G^od;X^ zj*-SCGmUH48>hN|>f`bWA-c~-{}aB z>+1DC=mFC+DvYfUF>ZL-7#(L^_akG0@84bM@p>7T9c>)6&Y07!K5&eUOSAJs5cfV2E(e$Mrf0#etlI`g&^L*s` zaYZj#{Q2&03a&SOx3Bk3UEz9n;}$=@%#Sbd{W)$o>ULL8wfJ?vGIsdNxWxU@f|Z`0 z`?FH_M}^)lQ@lOZthIQB?x#9DW%}~aFKse?t=D_)gQjo%yEEH)fie4GV~+cq;kl-- z{>E5+pE1|{%uY|YwYQgzf3*E`4=|Sh)40j~L)CoK%iP~CiJRWR&u5s=V@lm`)V8+$ z8Lt_qx<9D(b(iIRExga6#*{0K_2F|%Ue1}fTX?mH=U;C6Hea_$cYlz%zl9eKHs*MH z-nHKJJnzpHvrXUOet)Ic%LK2N)}H=4Z?`4CwfIX*jn$_br+I%b_5PmuQwwkTxUtgj zCuALE`k=dveSDs>*8Bf%@Bb6-u>D2e|L1!D&-MO4&Fd?7i^Z#-WZd$kG5c#{p3g@% z#!MgX_1obA(+k`mtoHM4`HF?}TRVaONV(DUD&L<~VEWRlj9Z>CF7xMIr@3F~fO)e`?$Nz>wUQUiQ%0r{z`BEg~yn_@Q22tiN@Bwj2#vkH@clHFYlZz3*Y^bahI=G zul9Dl)6-w;exrl8gWNkU{sQms!@a*|r&@SfYh!vFPq(eH{4nF7ASt1mJBt0&?Ux|*BG;}GuB>jTsp>>H^I2r z%P)Jf$Ez^bxqqp>#q^Zv9>2;s{0`%^YGcp4jG1$dTfBbOE-=0R0pr3S8`FIp-1vy; z^M7Kj^6@qOY11p7F-E<;Z-3VG8gF+kUod^~Dr41K#`*7f_#cdg?vEF5Gd=qQW8Pnl zWq!Su<$ivf`-hp{ZqvM7=eplq?ANt5$J+7h{eIvuueZFV7QTImv5)7o)bo}3GYhXO zH!kt=+2M8;47BjB-hZ~c-x=oZbm|+nfB2t`>pgyv$IoHGMYHqG>@-X7O_{jB$L-{|dYb*9Cu^Y+u#)1N=f!k4}6`*#~R z`2HfdztHU$y8Y7j7B9uqt@?!@=ly$|k1Iu9-<7Z0{;ZkC>I~x!um5~M-=0@kc)rKq z;r(^lSr)!@n6a?PxO=>D$4X>i!8hFd1Q3Vi<3 zx|4;^-)dYs)Hrvzahtb?EWZzs?&n>3ob9jL-xxi^iwOPgnOF>wO%l@^PeQgvIOWb~^md^woa-ywm-Dz2|fNG~2)IMW>H5yQ@v#;QG45 zO|SBKX@&cpUG8_f_O|^g?ssb3kInV;D?I%QPcM6b#V>QeRN?is^QRVG@BOs4-1MoT zfAVs#@%pcO(Do1a_Bz4Kd4rE@d3|jE%6`U{bByyB8;h13YquEtc>N9ca@}!(g;(BV ztX^yE;PqD)F}*Zu%=PxU{y@{C2OBrF@px^G6Vi=E-ack#n?ChqW92Ev);)|1JU>g$ zG(E-hwKLD-d;ZGvO>gPr^7@NSpE=Cf)yL&>PMlMYti8@SXuNTwkIT7}eE(!);SI*^ zH@p6QV~y8S?(L@UxWkx!r*Xaauhn;(UUr|c=zimpg~s8FjWrJ&CoD1U{G~C|>#62x z(_61FuJv(w=5wa!uQb;AxU%|9)7SsrSiaG?*4uxL_vhTdSa{|~#sY8GQEv~Ketj_4 z?_*|o`>64C**YJWw|KkkP-W@t{)MsJ?GN&K>0)oE+r8d$y8$JKiKEAaL= z%-i3VH*Eh>A4h9Fzgs+i)4aWHIMU*+_5NCLqUl-Q9@4}5^W(FAWBZr+dCot|^!#bY zK|b#8e8%*ebYs2O+fuh*kZIx7Zf~mB|89?8=XR&QZSm61GUoijxWm`uhtD*jBJpRjcgW2g!X&SkqgS~Kqx=|vpg%dO_O``-)a0gGLG+GPwND0ou8I<4&N>B&SLOs$7 z>fjzZ!80hG{hhtPd(XS?zAAav${$&2mOo$BclJK#p6}N=_rCk?(1*1wyy{=K)1_;nk3e03U+Kh(T;X#M)pe@XqX{%;&KYxzLw}*JV=l|gG72$q$JO7@4fXBPF zZaw!9|9){Wp*B z__IIf@s%???&#%lhVH{mQ{4Yz5%sTqmdBNU!sCbXLrLr1(}$_wr2C<7X}x<+=lg>4 zZkNvc*Z)HO{yvY>N<9ATk9d4RarC2~^6z)9@;LEVJie^sfX@HNI{v(m?N6(p4eR;$ zcGZOszrw$NBs;yOdCidi{nc!ruekiF;^Eht&w$#uZy;{v5+0w^{NMO*`S*=AJihX4 z9$&hS$6fmS*Rsny(%;$3_BZ9X-wHSFzo&k_^A_;$W%B#`f5^Wd(R}WdUk83m{TqtA z=6U@4C9MOuui)Q{Pw?3MOCIn2J071E?`hSOS5yyfzl-g^P(7HYdikvC!7GZ_AMPb? z=BIi5{yRLrqq_cr;$X)X>IanPkE#xAx<|a5c>KBAcWvh1FYEJyWva(BeoXxjU*qwO zH+a1F=RCeDJ8pQBe?Ox-z2QCn{o~hpyj5|w_f!1)MvZs7>~YW2(raIIqxMC2euMgT zxAFMXf5+o{U+3{o?dxWA>2KAgM^%?@*Z%fV_1~uc+thzaaX8KWsk+qs*X(b{OdePM zJ&!+Ey;%1>{{74yJnq%H{%hs;JE}kT|CH@N67Oxz`(DN4#9X$oQ60JWoBaFN%DZKX z-=D~Tk1S>TFXX3tb_)M*d7Pnr(+@w(zjvsvytadXuTefdtA1|M`dw7sys7nm+6Ch8 zIm_d7zt7`d)sKPe`1gz>JiaA8-ph>0#&1Zh;_>az@%V!3#Lra^w!bXB^8Vfp{Cnn$ zJg(C^@}ctn7wUJ%|G@T_bi98V|Grmo_^T`Y`&V;#{7~!lFO{Efw^3g_!Q(XL=c~&5 z9rDZj%FFlX6ZgVD;_*G@<1hUAt&dT^{o_2o^Ccc%{R19v`p9)GF4fBXO9-!K0Q9v}HH zczjg(v|aaC-ctLrjck9mg~wgW_mcE4e3|-n%G(Y4JmAM_-=Owa_4hgiBmP%d{1-ef zQ(XV*DF6PE`uVxy<&QRVzqIhak zo|i7M{Z{$q=gO0Nbieoh1#F+GJe(nWFaAFDn>5Z$<<(;4)jR(S+wcDjk3YGa#|{6K z$M-ePFW2+$XLMiU)n@*^LwP(yeEi;du-h+{pYJF?fBhoyZSvzwU*O+wdYmlc-Jcb|v+1E6;!P6aIa>?C{e+-)<=@XJKiZTZcdIV$ zQvWxuA@1c3JkIzF9-mfR{%Do{p2g#|ojh(=KHT|_q;Kc(ZsDKN=P*CqPkr$sk8R>_ zQa)@_K0LdF?eCr7agD}%?O*Zlr@zVLBbvvL^*Qic?^A!T?Dxp0`S*K&!{ZxuJU%D> zfc*5V`u&OY-&eoCP`@+(mb_i^-%oVjdzA+(m1ldEN6p$VJ-3CtWr~*x`LFpJ^>1k% z+)>NFU->eR>pae<^Y2~Tczj0rca!Y#{a)(tSADo&d3bL>^}oHq za!Kjv}oCwaVGc53^V{CnbG^Y{yWepUJ-{{6o4?9spB z-!Giw@eSqEO!eC=|Gl8N_~|XgZTK3GKU3Vjp}1>S+}(Yd?XPHG{zp3>Z$+bezoAMe$;+doD8h66nQ)mdHSC6bG!2Mt@qge{ZZkRpL1_{p2v>#fA3XXJgxp-(Ek0GPq4kHeEp5$@t%K7{d+w;{#f>0tbBe){(XNQ+kd7! zerW~&er6Sq8y@EIt-E-9=Z|^Z^hq8|`*@uBFL`|FU-S5a^7gGS@b4f05s$Abf1mvu z{=Gx_`=Rppms%&EQ+&RE4{^(se{U-eZhe&co4&~7+nV=J{)~TrIFrYh7wXu;<2}F6 z3S$ChBfh#jCs7e*2v~E>@ns)y==}d4$KdKj-n*yJr?Y_Jf*zHJ_Sx*R1K&YW}2n?keoN>p)>fbM19M_(IL}Zsg~YyZ-Qo&Mmv=&4aB@9avQRy#;j#X53m^_`wfq zS{J-9{c!E~<`?Q(cNgx$9KT-o;_2P<>ZaX&XW`i!P@@-2yQ?q@zUutD!nfufD73cL zb=2%e4!p6qw(#*E;CC#h?XKDP$A#L1@6 z&V4UDKYc~VjJE66-rSE@`LDd|<{Rb}T6fK^DNH|D*wEU#d*12qT|aBu%4xHvuf{L< z)YMI{{Z}L3y|Zq1q4mJ-+gn=;^DvVc)2=Jrjx&FKUSZk~W)<#gZGfpTLS5(X!ooi) z)YNRKowk2^0dpzLpMFQ-R4Z2A-QSy5TlZS+yyJg$*Yw#lr(Ji?UA1W5Q<(m7jDLIG zU3K%GnOEO>s&IJs^yxM8=U-QQ*PKFIp{8&{?Y!Dk2M*j^J8gGic5CbWyAVbEw;G2* z$WF)+2*S;N3#D)cf-PzRm%oKh$T;K}81X&9?2zebcuLi#x4e5kzfs8}; zL!O76gVfBx>>zU?3n5LA5y(@JeUO8YvycmrcOeDj*mB5f$N|VH$Qj7&-^1@;L$*Nr zA-f^_AumFXK`ukCLKea}t&q)-!;lM*cOeT<8&*RGAv+-lAjcu6AlD%C5LYdb4#0c0y=5ON4|1aby)333H;4bp*H)DIbl z?1mhJoP#X%%z2ULJlDaurg8T3H8K z2x)?BhV(&3AV(o5AV(J9ydYN~wRgj=3(*&(6Y@OdB;*{V?jH03Sqtfdd;nSg1^5ZF z2XY8<1acg53UVGY`-|uc(h2E@j6>|D?581DAvKH8C!`ND0@(*S2ssOxbuapc?1UVE z9D$sI%)Sr)hwO$t4|x%C5i<8n=nJwL(gzuV9EF^Kybd`FnN<(pK1PRJ?98AvVmtn(l(kPgUx$Vtdm zNE6oKR>)e&LCEWnvyfTXS1pHhL$*Q&Ax9vmAXgyQAhYj>eIYH74#gggb=2e|;5 zwE{MPEP&KQRztcWhajgQ*C319(H~?S@;u~4$T7%iNL>f!57`Gf3^@up0XYjPtVI8i zIgonDa!5C1E93~|6yyrz8l-a-Vgj-s@;u~4$W_SP2N1uIeUO8Y!;lM*S*vl*kmZn_ zkVBADkZX`dYhX{vZpePfF~~{CWyr#>!={kUkP*l}$YID)$h(jaAcb$>oFNM!TOosx zosd0{1CT?IQ;;)|^N@LKF(zaSq#tq;avE|DQnL;=f-HnIL0TdEASWPaA@4%$ha_e} z=0FA^hag8Fry%DcS2kdbjj$1AwZ0_lKkfs8};L!O7c2ss8h2{{cp2dR4qV?q`}njo!^wUB*~!;lk@ z*CB<6aSo8xkgbrNkOPo2kn@n*%@`lj0_lW|L-s?Shr9^62&s7lV?bIVn<4uk_&Mi7 zJ!JKxm>Xm(WDn#N+|h4#;lENys_KMaX4HQxE!w^g%`-`yhuQMTR$M zWG7?~i8?qmA4ssE488WvYV?fqI`XD2aqmUDjcOiuV%m*?D zQV&@U*$FuUIR!ZbIS;u6xdy5IF6IN-4|yJP6;ks!;t4VrvJlb)*#|iYISjb~c^C2l zWX>SQfOJE)LiRuoKn_7pLC!-iL9Rerwqst9-H_9etB{%@%mp$6c?z-*au9MB@-Ae~ zF!CKz4_OXb4e5sLfgFGwf*gljf?R=IgLI4_b|K@C-H`o|=OO1H7a?^!FeaoAasu)? z3#1=14%rVm4Y>$e`1^=q$U(^KkPDE)e*n8f zc0vw8jzCU9&Ol~Ag*iYvA^nhX$Vtd)NX^qYf5<|}2;?y21mtzd1;_^w`>~egkU_{E z$RWrP$Z^OS$R)_^KfoA}Es$}@ZpdlKIY`ZJ_!P1b(gfKI8G$?n*#|icISTmzQvVF> z1KA20gzSWzf}Dq3g8aYz@6(05Z?Z9JAX^KWANYgrlZAVt_WC9D_4Q3H&88<0CIv73 zfj-AmFZ>exp1JT>5`5*4>p7PgahDbfH;X$m&Bo%7mpPU?VOvt{xg0EY!Y(Tm;<-0Y zG55wo;5GEsm(RVi%G?wD;_|r@Kl$7fZUcTtKAOA6N`A07wn4&aOl|NkY|xmo7j>FT z6XF#9sP@l)8>m|QKj{CzZvoFOyWf$G73vf#$a%*e%fV77Eb`s!!@TRPU;S_%%;hml zz3@?vTOImjVPgqD&6r@R3)saCh;OeYPa(cP8S<~IG&H_$?6LOYiJ|clR>*W5V#Gzf zJJ;^_e6nCa09l<&jJTM;bNexWj=Qn9ddHJlyKRXRA2reW=L6rzuFfY;eAG$j+x@TX`0c|(72^{pelg|Sy)xR| z?8fo)_{53dlg8cJ8OATK|I`WFTVB(frl{#nUejSCk5^l_nyS?F1P_~dEZAB_{Nyz~ z;ldtqP1jhtH9g@(Hn95Ll(7MI!3GU|uz}~PJ~}Xj>p~xgdg1%h zam@c83+LC?*Ed=k8(Ui%dThKu;jumN>X*XjZtvFv&(1HO$9D1Hf9Ey9ryQ>vxi&m8 zzG`^1t^FIxcx)FBvEaO8foJ38^Vlw46c_X0-?H&GmPSg&bWLNsc!&!h?@-`H<7Iek z7cZ(qvk)H~Z_`+*3oaNewf7gp6q7j;BQ9daYuNt4wK1!6i4hm^;<;iM4j;?pHg&=x zMtpAO)1fF=y6~&dP$lQb_P}dyj$+?x@=%qUJj5E_+#JovYBKSY*W`qY`FI?Uz~AIP zxPDc1Zq)1CqPV{l@MgPmJoUo&r8cnotNx4IOY66Fm3qeqhKCXxuw6V@$8C2y@WME` zJhqF6+UvX)_?F|f^*+8~0>8AqZNPR&o}X+dZwan#oOe9%Y`lCP+r`5*j<0D8;6#qM za&&Zfw0*d*l#InTaiVLRLxE#sRdU!S4%P|xQ!VO^=Cx`=StRS zo_gV<_2N>%m+v*G6E<2ej$Lnkmt(0D7IneT!#?91%2_+97e1;7mJ=gWV>@{*h<&$(?Vz(f!H)L!}ov_iGb}C?P|JOBM98YT`^}@sXejYZr z-^=t(UBKf1(l|1G&lEMIhc%;VS>$i489h06r9O<)vBtdtC9CvEOo-du0Ds80b6;0f_mY5(!R~MU77Qs zj@WwC0zVJ?_#=y@PFUo=pU0ViUAY4*^cem#u_g7wBjbXEnILF3fG&fsU#qBK)mV9bS%&=WN%*}0hIpJ+s-xb-Mdf}s3-wGc+ zkcoBbgzZgZ-JX-mVyP3hFFlVY_~wC}b%lE2qxIi>G7xOrQRI0>6X&o^oTx5a z&dm+>-B{W_JYHHk)HgCb5VkuBml$!Qx;zeF&du10I$;sFU(o%_4osBu85tQI=q=iX z&)VXy(r9OK6dN?$xgAT!BUXJNhTW%ULLcG&aCf6F$zj%n$9D00QeF%8J#!1~{iWW= zb9rnR4{_~zdLr;Rp51WWh#QtZtlO0sar;v4BJ78J%xYX>#D#y|k9Pe)pR5_fJ>G#Q zBHy!3oNXy*A@)&oLyfHDu#KEjeQFnbws3A?wA5R|5bF>##m6vGYEQO{hure>J6LNx z+&k~y0sY^}u8O7=L(lV0>4gCw$_>M;`h)_kY~&^Kfxs9QSZC`O9|kkb};S9yLiY)Uk_gYgpXH#e$)$(+;ji6)Ft@#?(ej(e=xEq+r&ZMIp@VPPWQ@<>r&sb zO&sK$bLwugaaI?H`egWM9JYxQ<=W<3j1%&^tF&XHG}K#qaAJE;_%O)hk{EHLT&uk` z9nS;PIcyULx#l*v=R@Zf`olS@9-z{ub7MPs+mLS_Ul#+fZM3vv*LbOIbhNl@ENuE> zE-~UF=e&L%pA+U-8Xd?!s>p2Qfj>H|6G=iPZnI#-mkA>DpT zcx)FBdALNid)}QXkE=xcM>-Gk)L*n0JreqB9~>S_uYIT!7CGtXJnPdow#DeiQn7Cr zZZac1BU`gwyl79lFYqd_E2$Sg%0DbEh{148RvLYxG`h}iUPa@uojm(}EYv-T;NsiKd2WziWR$N zqCIdyANC)-qWAM-yLeH}wtXMZFQ3PD@emVUKW+b)jJJNIgijVdK+AHAIPnoD&OaXb zw%^0JlkkZXAMxV(wGa-zBkZ@P-k%VwKB5>pmh{otz9wg1!*=naebk~EHg@^78Fj*< zZu|c9Kn|8VVNtUkTfjad+b?y(qEMu#Ux z;(Q@S+`iP#9oTc+fxQDhxpx0A&;$tfs!Sa&y_gwk&}MDJFy=!Us*kD z>+LO#jCc2sq6)`;CPrN3qt}~L*bm)-XF0YH+wL_Ti+bUae_luTV;>XZV(l=lYxVhF z#ACa7$T{CHTr1;s;^WSAEVhXgu@#W=R)rwLRR{E^Lw zRUh!0pXcCg>myuQU?Y*8gRj zQko=g6SkAr8?A2(K51iF9na^nUA$<0I~aJC>pk_tBcJ^IP^t@GoZ?>37kRIzp#^d3 zwmTAdHm~koBd}32pP&!pG}w1cJcs6D-Tfl>6%!*P2v1ziz~9)Srd(pgMV$IrhZ63J z_KlHWsTV$q)jF)bU(Bo{)Cn7{4dXdj>V%EfhVwaC>V!pn`Z=%0I{d|)`#aPNk683| z$NX?-=A5Yu*u~qTygeAO*f$QP`$p=7g)Neph3)R7-SJ8D`fcs&yAxk64{hSWCeAq? z^cH)z*D2?)O&r+9=WCzkbDZ^UIK5;H>V=Q&WA{Yw4Dnr#r(Ss2$It15q<@_gM)8bOv+I>-uQORMOILKEY=X~IV{co828l0Yw!?wU_uix;hVhXSv%22n3OYDpaXAJ2*XkF)O77ZIC|J%`xJVyO%L))x_ziLDUF9}ls= zqBzmF(LQ2IZ57(cv3UK5fB#^Cf3U#+KP^ziy5u$ESf~rQE{kqxc}-@U>P)mY+2?^D z5BGun&RJS#*d`9@kMD=}1&-azv72CH4-bs@C!0ebj~H>WMmhH=)~JscaBX1Q{EpJl zK&j6!`I7oZ47okges3PuosZ*sq!{k)R-P~0#f#Pu&TTIu(!#P;$gzZUv zQ3oe}K4(u#z3|8dw~zV!@hN=%IDOvSi2YFP^T(_BJi$lz1I*{dPww-Ci+J|2%(vv0 zKSxD(v2J#sm*a~B8^=2Ao5h+h5-egp z_C*$JzDTf$bI)nB`MfH=NbuN)#J>2(6u$TdebLw(t<&aB|_{ll-@Y4-eKk)TYeyWXK(ndOmDp|9#QAI}5hDDeNaJIcyUrx|Z4*IQ9X)JtsOb zwtm~%fg!xN!{@?w@eq3+*S1F7#OFI!wXaC=)C-UJ^Z9InPj1pPBz~pmW3Wve#G&Wh z<-oxwH{lW1b;aKP0o-Ly$6~v9nRWT=Q>+DF*ILjM`P0^duUAl3m~FqFi682M4H|n93y!rlIE$rD*yuXsWWZLg2h-@9L| z9({HS`+k=8ZD@+FkIcTGtzzEaO}J5fntjQwTx%126rZ-P5+A;lWv@I* za)52Y4h>CFowT_9Y{nnd35%F?f1Jv}QYUP*_ANkN$@WW~u&BRD9tLcs@7@i1;fv+I zYY9Fe#~)VqTr}Ud$amW!-l?Fs^)H{tc8<5LC!Kda?AnsC5p}}$rr3iySn7mDz4m!q z?QbcBN43UqYKgC?7aqCo`8Ejqw^+>PJfF`taiV&CDR9cK`KSxnM*G~w{cE44W#>tq zu*hRSce@`(A3V?=pF8!!M|m?BPH72sy&O-y@KHYR4|v<-w6DdmiEXGCKFXEC4DY`j zPrdNbo_Rdr**{J*>7RPxktaUicccDeJoUmy`{XUxyM5Z%Vp>W6)C(V7Pn`{Ti_LO8 z^}L#82*vgxi;nWxgP{a_vd*s7)Rxw!U+zZcod*-YULM@bFihcf?Qb>x2v6xi8GuGIP(K zZJd|Y1?O0f_42-N1&3|qSZ#3sb;EzX8J|!mY~;TaIaun1h5y`E3*o=s9G_4xeB?vR zzdBySwQs_I$NPpl`l7xUc(?7vfL}9)mmlES!olPLey9^JF=4Fw-pK#) zERKyW4&T7_G1)F2YKreqJ2C%qUPBp=?c$-fxL;~vi@NaH8J^?XHZZz9dJcJ|+pZrJgZy)UeGoX+ zuk+Y09!|oar5vxdvFzH_u35u3m%>YoCWgx2;Xs`D$V2B}7JodUhsj!~J_gq(@kt!{ z_P#mKNw@}YJ%6Ze?V64ROI^S=Hp4ESXX638=0T#i)|70&)DdgnTlRCd`-g2gdu-~3kMeUH9xwLncw4B| z>+wYEw!z^iQ`@jj9Mlx&*gm-})Xz!|+r&XFagM#~g5#_h9PWMG+?)7}ZQ`JgIOkB{ z*uJuo!!~iE{mE?P9LMRJ=ouRy7@x4GIn%M&E*|QL=fHu$v$67dY!?r;#CfxjryTD= zd=YMV1m8o!H;vNq*e)LGit{XgX~TRT+r>joahqIA##=M=MEI6@Iu_f+K`n94IP#lg zRdU!S4)Vp%&)%)idF5YkvRynF*m?cPX^xf8W4n0BA&>R*fmivyB`AB>9=Yu{GGBZu*c7FE zUz^EoW(M;nHIx`}qy0-Q49~e$=Mp1sF{cT!}}kMvzd;?)o8gZFbh^b_v)e58JeS3k&Kp9jLDuzrdfzMeI_v4lMH zI%ze0eU%!X;E`*dKUTwupS*@A+~``tYW4a|PE!}=(^x{TCBDzWUJN>6ky}0oy9QdH zQ)8(Y9=YWB;{k8ExWO*_k~pMZc;t@b?S8f9T=qU4>V-$X_#WZ;6ki&|=fv?CY!e50 z;$zH$1I;$s_Y_ete6${#zc=Rije6qk-nIK}XM(TpH)6!a{Cz%G6RzD97#lBcA4zP+ zHgRAB_n-N7V~(#kDh9V`V zyRQGJ{rMN)y-#x0CvwpHTnHQd4t<6%#(SUSs?Qet*$=*J-D3YE^!Wf@7*hQUtgy9@ z!~Qf5@_M7j*@E1N#u>!L?x4M<^ZtCJHUOo`&wLrE}@Pdi%TDE4;m=9bcXgFZoEn>&Lz{26ElksSm;!R(qo_Fh_P~yLiZZ z=M7?=?hkw0d>-4$vv(qR{+|y#8?R%{#%LVsg~xut@oTXjbDVNK^}=Hx;OAxQaet`8 z$&HurO?!_`wu^^#-+A@;zAeYe=doQptn*$gj|N`(_eH4_7PZXp3Dx2Ix&8RQDBip} zY7xM|PBX~QkvQ>DyL`=fKJdFr=k(bWhg6}M6;y8Km z#(hPMxX4ZCUI<*>V!q!dRH#7FM>o^8vmHXc?pkN=3nHgTeyJs&tz--9MjeB`X#qw|wCChmPlV^Jq; zl%w^x1#H>7q1F!Dx8T#c5hE^g)NAMQz_ps5{~d0&i-+8FUi};!(_$o_$9D0MlkPh# z%Z1rh_K>r=hpgWQyxV?fz}xw0#~6L~!nQC*{Wj#TpWBs$lm9+Bwu=|7r-RsE&JJ_R z=doQp;pKO^CEl}dPAG0APViGw_Idv3;_CgCLC zZcBM=7Y{k-W1Wq8oKi9t+r&YxIcGKYHyle}ZjR26ZQ>x$oO3MUbPkWi*lw0`x=gw&ttoI$Qif$c;MN1!Fb7l zJ|5f2v*#6@cO@AwpT~CbkT)KCTd@a1{D+|MF{l$Z$`$)9-PwgzgA-%v?;KDkEON!` zSrhg+*6(=c`|8vSk9_g-M`{(;O>u8&ov!QqqH*lr(z={`6x4@t8v8Jg?<1_n5nuft z1u^1Ad206?)@9ah>V!p}x?Sx)QWi^{u*grhmEA*Hmvg^?df}0qj<@Sx&Y|+&Qeq?I zq~q-#(z;N;%kk8!f8?X%_XWJgVEB9&dOmYbz3|9I$6rhOFUM0ae3XYHaJGCV=Q&bTRF}s~!LC{ZlVI?BxA-BZky}8J>FKVI$9>lL7yLy4TpQ=1k{QJWU9HZ|C9qq_gB1}&&kn-V$MKiotsE@b?|F=++ywz6F7no6!QQJkKh!Q# zVmq>p9D4_VbLL<#S&hRsagaaGX~o{K8i#G-AaC4$9kY#7`3wp5!XtOwewOEVPf>^O zRvm7Ra?a}T-AO*AHlv>7G$ZHS-d1CYpS%tyV@0`VwN_*0*5QN`?G>%&-kqsw)al%i zcX1ugVyzA*{UYZaYc)5ErB3}udqk_Zcjwe4>V=PT&3v(X3SX?&e!Ylzbf25eS6A_c z(|Y!ij3R*?o16FA^-`%I#}*&tj_VF`zCnAUL5PhPj26Y8{Jnh`)aIQ`zD+yCe6N^ za_pO65tDA;&9GS(OI@&6)8b-^H9Kap)Ct>@+Q?#hQ;sjF7any!_QgX}_~Ie=1?qk5 zi-)TCBEd&>-eR5j$$gP#hNb?Y?MQ0_biq= z+SYyp*KK4rf2fKtlD?5gu`eE;!WR$A7Y&)bc({r$5_~2vh@adS2{+msnJ>g`?|@Hz zzec@m5bcdF1$?-+EyGhUd{nEg#<2el9bHlX)C*rsZEWA0e3;k&Wq9g^?@4`a*JBT7 z;(|J1ksBTt_N+-3OP#RD2glm|fGn0eVUY_S7j`Z7a86uMFFfMk?;itRm=pZ#dn9{V z;+moGsaRwq;sSqh3vBBA!|=hJV57V}i_?tG zk8R?>&dxar+s!H9#lnx{!fWJ9&0rz}KP8*Bfu0u|R1X!zTgy zMoBs*G2%wG$$WZi#`e?^YwM%?>0rQ?zkh)`VWWN7a>T@~A*RybS*1?cXkT_TU@eDJ zEOo+0YhWGx&wd|H>`9%l(HgirV6ER2OP#QYLC={>Nx$8&Y-%^^h3`r6-H54MdH<>m zPrdMnLGS-Wz=!KfSU>Hbdg1$0yv3LLFT+zWe3bM113vVR)gz(2Q!hNu)bVEn-fUlvr(SrB?6Hs2!Dq$Dn=1F;*dBNd#pt|j z&vsvxwdp>tWer7~m*>ir1V8!OlyGs5UPo*V;#eDtPx9-Nm@n^hvQ6g)3pvO33HOCK zspPOt9IVrRj@^hwj`N_s&}I-1bof{2lktcV7dh(ObAfAiug)b#+$d)^BS!Db)B@^+ zjdIrNW)@4Guu;y=gY&Xj>V%DQc25qLI$@)n{UBf&FmP*P8|sBe&c-n|JVlHRGiI9Y zy)z!m7GuLzVl2Vqyxa#CW5iD$V+l8^D;7uOmcOTu`Y@;FB~e|mea2;re65I z)CRWCVgLTFJo~IYwH@2VgWhd-I`Ay6@_B3*FRC*wh!feO?EI)Ferc4?M+4r*=_c^Ob#JmQT@nXu69;+h{@j;v)~@P^@YD;B9Cp0bM2@j){l*ASz3|9i z$B&@)3Evi<5B0)F>*~dTFTV#$ov=}k9>rQeoXJt@gpG2v4)^A=Sn7n0_R$vuwlbHf z7e2}fn51w^m1iz)VGh-oqWbV$>;{T*WVZ1OGkd8;0wzz5>hf0HC&)d&3I=V{jip^qxRU%__q;3JP;d*4&w zb@z_&*DKQaWt%wgmDiW&#hL7PIfxNAs;`&fIE+{J+ZWUcTTE?u4smJN_?ZprgzZVO z_B`n=nP)br6SgalCkIkru$?@6e$~f181pjEY_Lt7sAkQ=ePxbS`OF5}#EJGE;|Zto`3ts* z6YV`N29DLzN)Fq^LEg9>*5dv(&n^Gi3$}}g9CF_2z_YRPd2AOi%9|G4`{sE0&t9-y zJmig!cRcWHynG(p#f$bL3-D}(<(oao<9j#igpG1#U%-|>vq7D($Q7^oSJiL!nGNcN zN51&^Tm76~=$#lH#b*%~Z|epI2M5yUcG*r|Llip&)V1lj?;lZ;d9Y2KD0X%R&Z^Pj z?HUAQ``pIs z_EyACzPC!as0%)ptrg^Ul<=j7#0J!dIW@)i+iee3(%KW_sVCm|ov`qqpSRuTE9KnJp0bZyiU*~fgbsERKVJZfg_3*smD zg>&tmh1X59xyH)9=bCULo7wf!qKtj13pQw22AjEk&F)z&b;814jy1byvD670?JH)( z7g;QI!lEX+-}VG-<(`Uq;iFn;ep@z$-AtYs)>sw3V4FC_GzTq@@6FhZI$?WKtmSbQOP#QY^*Fb)Sj+8X&WLTtS{`Sy)T!Sn zt}Tb}&8f-M3m?U``K@^hzctHm_8ZNy-cf0tNtPKbB+$?Jhro}<*M|LEG-K4)pp#1M7D zM%TvnEL;{#ov_ih@wI@h%u(uv&s-ZnY1fl{q!ac^pM`vqK5n*a2%qC=`0UBdc~ckq zZr%p}`e!YRVDl&OoiV-FR-Z5=KZ~1;MV$EXvHQU8t3O%gok?sHC)!UOfDfLu?~R1{ zRK6RR?c!zjgkPE>=D(zv&+ZAoR3+vUJn}YCz=F7(}K_v_pi{W)0bgpKBRCI?HMuu(0lhmBX{ybp?c;W0<|rS91I*@=Vm!<69;w4b9NT&&v90!zqgaVo+ufU zIPp=doNsk$MX0lr^NAB5^~=wB7M#cNE8i`}HgTdg-0rz^%t{X1#3`oNw01v~#vy+@(>O7AZ zwuysU;kMs`dr`DwC5LU~*t?PZ{LTfA&5LV}fB55Lv0Xgmm-9MneXM*Q+r>k!IS+0t zES#cFFI1gg0z3NpZ+psxRqAwthyCI@P5k6_I^n{OK9<#Daw~u1%JEj0d``9p5kAd1 zoUhxE?ZFleOJPIz*H+}W=2WqFWt%urEw<+l7G~-tb;6=fdA(eYT+U*t6E>>DhjXyh z2^(E&*1?Gjb80;G!e_2EzcPi-ze1lk+WjZ@gY8SclH+sg!#Ir%u#NkCIs8C;b)OR> zZnSQlOu3yaBi~UkJnZG?Ru4aLtnzD3>V=Q4rCv<%QC*G3VY_&+oyW*L_(e9Th!M7l z6YV$ce*9N5F+!cN(LGArS7x!)2^-y`+zP*EvD67$Ozm?vU@P~r)C=E}#wy^2+RQmq z7qIn9qP5-D{4AC_VWYMELcm&mEB{Uv^}cgCx8!)FhkG>oB8|8S*qojYtw%6L{gWmj^|Jg9xH4ft3dA48WIQcxb zix*vA*?yMuSylEMY}5-M#r@S}oN_$%!XxfIzb${*KR-9IZ$fy?u}z%bG*`|CPWg2z zb;9QGp&lar?ecW(?|ukLu;IfZtf!KKw*Ul;phFCJtiCW6(Z} zPv$X}o)h)LM>W$vTOZHZlsaJ%KOT2xi*HVmv)^RSHZ@1{J`#8q=jFfYNqrcnsTuS3 zoSloj`zGtwq`&>1j1|rQP{J+0w?e(f!u;J{b;!YQ=G=>+UU=BR{k|vQ!(2v-Lt_K@ z6e{rv+r&X0IpY!fHSrHg@6o*&c++n452C!G1sjNhpf z7P;hmuj4sb>V%E*=qbe0H*@lidgAT<#c@nEOc7HJ+C%q7etrru)sV9eP#?x=u-|F( zn7WeStFHsZh#SSd?V&kV7v9`k`Aiwx#f$uYIpJ0MkZt0??{4cp#7aZPFVqPe`P-fy z%3`S#Hu851Vk3*CPS~h+9tzmX{SNiQ!{@ONw@=~2?OMyT-&NgS#fJ$V^NoE-{Nz4N zxR}4^x%r6P^0k@zFsJ6G$Od+uvpr`mr(XET26k^s{pbFEE8EGl@2$G+%wHNOm&bPT zqU#Cs9miYSwE?m1>n!!cM|;Pk0dMzT%JI|-AMG9O88G(WzPc;wpL*e=YY1CkIFE8X z^}=IK@HoE`@a46NI$^OMIQArJ%Jxi7P$z6u7v^1W*vi`bFkD28`T@@;|V<16J8&uo6gzy01?A;vfmx^SY3eFdm`jT`McVv7e0!G=L6n+ zTaKq*_~^PD4=C8VmA%i1I$;q99-kutyA5wy8(cX$Iy}lZH;pFo#&+=#51y+R0}p$h zNq%#j7;&T6=titQk$KjNI$@*OI4x}atQB>_!hb%O78sm%#e0sEH+e<56WYatFP(QR z=*_Ouu&Aw`NA^DX zES5T9QCEHM^lrey7WVP<@PvK+IGH=!$gy`O`+eW;TFu?Q*5NixESK_$6F( zDx7c<+0J9Tc*ry79S=O)%jWagE*^5udG&aP?1=(iz*bI6{K9tekbnM8(W8Nvyn}Wy zeMf5N=m5UFvn#PfdvS2Er`Y@W*nMriy`{0Sj?(tx5TY&h9sAN4$kkPPH);o-Cwn4& z&+SJVBYKrwG6(jf{*luw)c+p5$MARUU!j}y%|6sO^4{$_2k$w2qR=@!IM{{9HwJ0m zXwGaG54rBVgMnB5H+a}C9&+4yb$Gww6Id(D-X|H2$9C~xedjHxGhXIBlo5~Z;vw&S zO?WZz()V_zZ=X#4N{qNs9awmijfq+sIm_dlZRC`qI&dLym`9VnYmhkcQ3t$^T)WxE zocg_i#EFl(;QaAhoWEuWuUQ@)w%0=p548_(XEgiy6DNLDAL?g2zkPVZddTl4i7VpO zPgEa1Ncyp7Oq1ag9^1u3eQL$2 zJo4DjcRb*c8`&U_UMcMUB36AMr+v(8-bd!%6!pR*mmNRyDL+RNynpJ2NB%m#2KC`{ zVNct>K7Rg<`hag}j%=_q;BC)Uj;CJusFqy}c-TN6;bre9vt7Js-kY&^=6RLho1$L$ zsD_EN1~2cyD#F{V>wvrgpKwq_Swnj@~(M;UifIgVmANU z6xZutWPov7quDo{aVHs)Cmjwx-U-VV5t)pwsjjVg3Z5{;|uDAM~(Nj)O@ja z3SX?1FM2b+SX;#x2|nWs;wSe-!bQyc9^7oMu_`{dV;kqy8^yXk*RwWbU+RdBf1}NE zAd96=*eKS`?rU@GOTF-!Snr#{zJ0WBQxR*X`_W>(uZn#We6&_t91}meeG@L$N*~K? zNbZJ>ol)#kALi6l#2V>%i|M|w-!I2gFFe*mk6*K8U&a^I35&JQu~uWUSn7l=rsrXG zr!U7B)C=E}_HD5~mN^gV0=Bs)lNaBb!f)S_-|X{Lw~hJjTUGp);1M5jjUs+>za?Cp zW1JTnD>p9^4&ur=mIL1kzN>uRnr*b(62zAKq#Hi@R>p4B35!^A?1>yKb;2T!96J~O z%l1p1u!teI>;8bPyst*R@Q9J|0P`1Q1^x9 zm&VHVU&28hb&mOH%Ow6wIH;d)XYwPG2+4oo)`A{D!G;KYhar=u!D1E!*2J7T&m=- zO&r+5&vAF)*gdQ2?`a@LT;#iR3$Q!KtIj1xT;#p`*q)K#{L1&2)C(Ww{MCRj|9pcw zVWXVif<^HDOk7e&Y*T$&OHSorsS`HJ`T7~wZ)MGV22OhYmwgV2?c!zT ze0|QGuV+5hHz8hq&ZlwiSuAy--+KFO)3J+iK3Obv!Xhpmdmsl(ov?jr&U7OFueVx& zAHFHs79z4I+r&YG=b6QHH4fXvfzRBYI|Ijj#_zs{AF+zYVmo>9=b0Y_o?W-+^VlvP z{O9L*1c7$FeBO)S%fe7eoUlzC_|7@@`N{R6e(*Q8Vh-EHiS}%l0*CV&!tegZ9JYxQ z?b+-dP#kC7K$gQcaj>p=y*L#(HqPqdiP3Z})C(W2Wli{;gJYEAsTUr#-TiYY;I03z ziS64>ihn{v+*jQ$7Y*2$QSod4L;xCoGLkN69;+Y z=l4|La9(-8&CGW3kVDS9nv9kIEIixALv%UMe%m1AhVC0>>jvA!L$tVm?Y9lC&v}n5 z^}-{cJjW5kyxF0SDUiG@ccJUA|9%F}LM2=Tk1K1`G zV#PVLQ3I~4Qa9Kp4&uZ)7XruPva$xSO&r9Cb2?E2I8G&pZQ>wKoO2>@^7D*sE%4Oix*wbKOcCArz&~I zcJZR?iP^~O>vHmpdf}tov7D;O$+H@*=Z#VBoX){gr+%Z{v9&wfFLlBqcRYVD=U}N5 z7Wv|P(xb?;nvgHiv-E3**2TF-jJU`d=Pp9d)Py*$&Lu`%@6*WUqCo5BR2~@VDE}^wV^4<`5umX;Zf@y ze=QlK98W#*@w*!OPzyPaj^eKM+a9);@%VboHgTeT^@YGO-&AtgCQel2S7UDzjk69P zVD=-`lCjt>UR2{x1zs{%1&{6GMLDzx&xOc8VJM#y^}%##b;;jr%z3|cAx)#rb zu>VI&#b_^1z3|8#_sdfOZ~d3!sTV%Vn@dUm`Fm=%ix=h17CcL$SkB$Uvt7I>Z_Wjt z#aZQg&o*(QyjhE9L^xI@hi&2@Z+wk-J#cKC{5>_>#Y65muNBXg_`LG=@N5?k`QyBk zfrr{yWsksi@uECxsk8Aaf75|_;^TLa+ZuCo&Kh&G)|fu{)@z3a{>`B#CXZDmdB8UI z-v_@s=VIVk{8Vz-CJub+F}D_L&dr7P{!;JbtJ+tjxkkP4kv~rbJfCgRvw_KZu}z%F zpQo^n+&szq2-q$j{OQlBnZ3SX-&?_BT2J7%L&eY4@T2o&eBwht4K1h-ZkIiwANY4w z(Y6D-@Mpqdn>f*apdR!5LdI9r2^-Y~8@Ds~s{FHj>I1&f-XG!nr=1DD`u$E~#Et6e z)r4F5IS$*ziS{5Pm`i77F4PGd?Lp4vV5t)}s-GRxt>4P~eAEk{*&~l;&ckdp%J^?C zM*9_u@lo0oH=FPPCjR#N%(l>fb1~YlTnrqGf3rp{T4*m0_D&2UltaReO>9r*#CGwDY3$lQ zYcxCyRyh{i#6gaFJv#%Vj^Y_`SRy?5+daIdFMek%+r^9WbUF4@qlLDf;nDDIwD6^& zZKd>?YqpEmmyUNW@a%bka6B<&kDx1fcVL4LBh?{0*zJiIil5qgp;WS4`y=EYC(d{)PgM5YC(d{ z)Pe`A)Pe+${Pt(%%uX}xdSvZD&nOjo1O{ine zyBv5{$MSh>*LYDa+kzUy@yb6dqF#8^GQZwD8}Q}#2B{Mk^~F) z7_gP=0`Hw!zWIB#EU;i+lqV%=aGHvH>VF`)kn0Jp71{G(cK&#+r>l7cs?ya zP=v83$tPmSwYAIbZoiB2nAPCqfqLsCeJ3v4#lyPgJiFJ;I5m7_Ua?&~tX-4yi`KD&fmdGVs1r7`u6%ilb>+*d*^8rVeOo`iTxDHJ@W?s0yX6G&ldmfY7kTGv zn5`@1mcP@J`Y@-)#mF|LlQ-mc?44grTB z)4fObvpcp2UPEKFM>-mKw*HhqTTH$1*gyDrZHC|O3Tsa}o_gUCgC0}0u>V~l2D@yJ zJJeg^?>k{w^vQP`5+iODk9z{wa;rL*7;&R`+zh{P-1g!qF0Xwo>V=Qu@l3$mSmk)? zg-1MkT(!cW?7yw=yAxyM@wElp#ED|@MBvyMl^nK-)0>WC&!=#l%6nC86Q?ib90?p7 zr;@`qaiZ9qcfE~MUXQ2~7P0AZZ18|9U)-;Wf+Pc|m~QYUPb zSGGsZVyP20%B!ORTb{4f5gUJZrVdVcBoj~635%TaxsB&wsS`HZSGJ&rKN96%c0Fgi zc+tIt#7TdzFtiS_}O=k-LmIWs@%0=CJXiSctjor9%L*eFI9!EV`psS`G;^#=lW<&KHs;24HT za*%rA5u5JE8rW{L#ahni{cIB_+MhlZIJQ51per7Odf}tEyd3aWo67Oj3m;u0ZGqi4 zv$n2<8In0rFFaz={d6|qLv1a?Q!ji}i#y;H?;oa1`lnv_s21Bka5F#CUmN487asBG z=d%d;?)}5mN&nOfkC=4);ehA)$9U?6kK)qaiJ|`2tc?1nUiiMW|9t@;`Y*#%FMKJ* zUrYPn*b((lz3`~be*PoaPs%=JcEoC$dKAN0JYp3^6e|O-Ac%76_ocPFZAOC}7{P6Kv`3a1r^CwPx z*X+2_{52i`rtMF za^TzeZ4=|eW97dI7uv)@jc`sMf`MaJa@ZzLR42{`PUSmzs23h}!sEXKb?!EP-kAO( zUsPY%PM*~Z=bZ{Xn@{w@fQZL-@lZE>PA#ZoxA8Mke*_`1J=?@V&il2`yMdGA_h>v~ z#6=zP^E`;Ua~poc0Z~7`VqzOU5?wVhIGDy8+r>jY@$>9PJ>hw-sW?xzi4)Zl`@Oc? z3V7gQ2p=vF^>Mi99N8`&ax=M?jn6jA$7&nu+ceUL&zkMD?XEB~Bt7TOfLA}rQMXeI zKJR2dl|P8>b&wcwk)Lj-Ry-d>t_>GH6c{Q-c4E7D(Vp;(c;gczi65yG7CGqqt9m>e zbX#UGMxC(8H^#b}*@3`&fS>jcjExWUruX34CJu7QeN}st#!|-mU3m8~ z+r^9WXlLMA&Sr>FY!M?a^2lTBgTS@=U!6;gxX2~v_T6mfYvZbR`Uywl5+g2h%DEQ< z*T${RB}Uw6&Fj2{b{gs{`;aSntBTu;IPsBBo|m&`J3sG3uB4kJ?ul1FQEr`0`pJKn z4%@{;Zu#8z+?tHgO;x$NAY0)hhcSR(&9M-FAy^_dXD>RoPuhO_xjpRg~Pn`JC`uV}U#H*huFHeVl_~E~-7@iz)yRlt7hVDW4} zE_AF|;?E?G*d`A0+Ry!L;2`$e+Y&5w!Xl477FuEJ9Tr1t*0;rdQ!jimJ)dKae=xib zJtTw2HQU5Np86aX!tP-VL)-V=qB*cloMPoyL<%XaaiYlJ4)|91P1Q57EB#f$2fea01d=^i5)i*4dW z*9rDK)a|%Vu;0~*XbF$);zcogI`Gz+HSlz0Y76Rxk7D)|9CtgOKlaVHl~>PQwu#e| z`pKS$#C%YT?VDEV7}N{jo7TSm>kY4WIP(%W8G~)&Ab#CP7Egmy)Q3UVhvr7arpJ)g zhrufK!SQxqIbPR^pS(UKT&&SPmem1rD}S#e!DF3vyw!lg@R>q6p88;eX8Znu+rZXv z^`HB@8*CRZ%8S#1XZNtUK>4!ier3CO(Hh=@*pV&TH$<^Rz3|8fpN~Cz!TEHR;i(rM zdEj-!o~azn)D7x{jn?mrIaun1jbh$DGZ@U-dr&VtV&2cgV(Sx`^PnzZ>w92J-=7~0 zSnTnW_r8a(N$LIfW($6uSop-x!=9`Ac20g$FMP%qYo_qU8v3HKC#py0 zi#1hzk>Fv^*cZf4?u&#Q+16}MZsp!E!ACX9Y)<@!^<7c!P#*Y4gjhkZ1Wkwu=|-2hIkbjaUAgNYo1-?TMo)~eXT%3b7 zJj4z*D|oeD{6j0r`4S^8a?$O-KX7fH$(pflxG%kT$ae9Nlg_KfzLfUN=doQp(-6h%$e$T|DHh$Fw~|#qm}R>@4-I8pUof4lml$!8-(L4SW*fKsH`1sR7CG(XoD5jh!byJXj2Ll|*B%2%>%#IW*5l<`j~fuT zzSh`!yu8YKoZw+~KS#S)L;U3Hal%EM`dGFei(B@4;?##ZH8vnV9dGL{@s;0m^ZxBw zUAKYNaN?u)m__lzc8=4Cxbr>mxrApm7|&sCPoG<1n>g|PT-5F5nKgH9&MZE88!1!bbbrJpo&JPl$TqGcmGqiWpg`7+DsrX%-_ZtHelx#~k7qA%5~0 zNw}Dk`@&*@+{$-3vyJmwhIu*1?zyiFYkMV!ZQ?|0SvP#najL(=nHX`gmihcFCOBSo zE-~UpdrZ40#Bs~_nA8hjOk?Lvz?XlYf;wS)QfxiqVPz&JsS~z0#U9MTQYUO*nuj%5 zyI1DyN2wPcdHxUoem4vJJ^np8bMZ8UZ{eR8KK&oPUbyn)8~E=7$fa}tX`!$P|9uqC zfcU>p;y-Q=fBfw!*Zuw9^S`Vw`!D~S+J90winY-GEt+NTwkrRZ{DNNen^}^Z@=l$jPzqfDzxnTe1q4TQ!ckRNLJhyKeAHa7Vmb5jmTDo{i8)?b;=J)@ng?-qg z*uUqoFRR*rduKzFm2Ui|*NVmMjf zjSaHT%B4$|wXa&*PS#ZR=`QpOIO+M@{bJj;;X#9yJ9|qbVQC%h;S(7? zPrt0aaoNgxd$TkDO+MaV6lyj9gI}L=Ug>y+r7ex^D_7Oy+QI%!KF03C7Sta5cL3iR znaXxparrf|WeqFaT9$P9L?$2OFAEptpQHazd*>Y(MYT5Wi6BiB5m0Ox1Ochp^e76c z0@8~GgA$Sj0wD=0C{{$gf}&zUv4Z6)_TC#R_TC#R*9LmAAgI`X&zYTfH@tYx#_w+K zAK&jAeVAmQea|`XnKN}~C$4oN(r;tKW%XR;t1O*+NKF-AxOa4Z}9Dl22ULIQq%GZva|DxBJFh7 zH_+Du_M80Sc zJ-|;d$js#%+Oo5A*ID`>)fxRm!5N{Vf~=x~g2-Ztv;2<~dApmSbUM*{G>QE6eLR>I@!e=cVPax6H_n3>$ZT z$9Q$YGQ2$gGAx|KZO)^n^5?GWBKLA~^L%-=|6JVs{EW=Z>`-1~@;fInb*k?fg|aeI zax(IRqo8O=^zmJZs5{!lp@Pix z9QxTGSaHYJOm9nY4zW1id0wdhsQS9<`nvq`n$r4m|ESFiRzU|d+USo^FOaIvS6c~o1U4LouAXlbLexu^uL=g z*Bxr={KKl+zdo*FFPvGJn%by+;p2Zl|9JK5?nnvcNEPJ*_Y;CoMg*k>^~Ocx!{> zp3nY9eMS87gt|z2seD3_npY6nbhyX&a&KNxm-%ch&M`+cx8P2Hb5lxYc2Ra=MrvdB z_toC;;5y1e*L81mJt)*aID#n%*Ou0lSM!Hgyn^hU!qn{OiKIKPv%OWpd29Cnpsvwg z0T*5~a?^tyxx21W-p*|I%(No@m~1#K^7B%&*^@<1FWhxp1rc+-P*&0N#|dv(UvI4?CXJH&?uQmMPnis*jq^7!LX zp$FE7OW4AI8IXa2S;UWT~kvy+h|lDpXix;p3P+LtNwd^ z9H~#`nwe1$%F9U2_sewW`j}_F`)8*AL9YJM5tlr&LmY2MN{M$2TK=Ep8aqOY?ntv! z(z6Rw^CPLo*@l;Sdj+{JjNi`wck*gbhsvrjB`YhfAbJCYdtEpz zde6)F_{%IZPW(exFFij!tuQY$&tKl|I%avBgK=TDXYu;ZAM@K>Gfv4)59PAF{OaP2 z{ga~msK#tJWA#P)G5Xm;Ze~_4AJzmP*Tt#xW78gbrY)_18-4b%dzs%58{ zzhP`9caB&7XLUvgYJMmsEw8AcQP)lX8NF}pH`*7cU!w=Z<`WK14Qr~VMZP$ho}Q7D zo0(GJCmA=-N2BXwBR)^rsv_BNbEz<+AU{hkd&KG2*?*@#*Tdp6)AD%)eem(Hds!YD zJ?Ch|KB?h@<+3^2&dbhj%(nZu=r+b2cgI7`|4rx)g>6#7HNT}P$2I9T@@F+O;(QR&QaJi)8MUyzbvl9rZLl$#S=9dp-t z+20u>fAwIz{G!6bP*HAUjwSx_cj~e|M6W0-HB`vwL5=9osa{GjI2!SJm-(FAzh5PG ze_mcjMt)`}6zqlE{dk+VB{+s|%=vsp$(*oPP?VaQ6UvEdYEH` zIOUrs+?egdT(2M_tspDJ6L=z%dpVSN$-#AHa~&d19o$D}c9oH8iVCv}Q}R;tgKFYz zTOan!-`X*gxra7RJti0PY_?H+U#ueXv29^WVW!+k6mQut^%eyEW{#~IQP=R;ABr_q zMvgiPvoni|isZ~UUY%pSwui~B5jn-4 z{*|3ll%FG4D&yrb*1J5&?sd3B7xeEd6dt4nIQgTZtg zpQPvJW~60Du5`Kk>_)G7aIfaT-5S+r!6Rw7ketWILWPm>>aOGR=yB0;ygklx@wYRT z+$rg2!jV@l-)#ssmvPpg^Sw8N^~a2}IQ5v~YomYikNZsXxH~AbQTL7A>YW%|KVGnV zqv{Fn^-Igl;NFVh6gf^V7ki&^zqy%Ku#JwBi{EF##dgS-Dyv(nkdW<-X1oLpOb#eQr5`k&s(9D-D{v}(-hM{;kEZB9mN zN><~pp-h&Kwms97V3QZEXkbAJSDrXCE~qN4H~0F~_D)Sr<4^5QDeG5~osrWoJyep` zFDIomrC(0j)Dk`qm>Md{$vD`{D#|O!P4z!J>-S*)jk0`(MoW(UV4QjV_}EL)pNxAF z`bS@h{b1Zikn7bk6IoV0ctdcS*--goWg@QqRy}woQ!$xKE=s$&@PGNvtYO8X}1?nwrARn#>rUHF6@ZA1Sexj$Ndv0 z`yK6)TE~_xt4(w=%XS!!M}Yg2cGGaO+_hVZljW}6^Nupt;r6xE*P3gSlAkWK6Rx8r zZhu^1;8>-ilgY0VH#B&K;UArhyAL-cctyKEaU(2lIM-68Uv%8@xC1S5_uyol>A0tH z-7Ilm;$+P0xMVua7MG8cF|Xs6;%sfX4ku$?$E|k6z2%78gp=*AF0&2C?6SSqZXnJU zH_j1vI!@LxUFM~ZIP*77XsSQyxOZ{pnBPp=jo!)g7&89ErY$;|aW)ahA*nyHIf+ij z&A{aauV{BOPL`2&k2u`RI1c6gNyn|jNq*XG!buKnPNI`(=kGX%p+9NYiod5KLrObPA{O?aX?ioj!uR7d&I9oeEcf@^zlQFN` z(wYQhzoK0MPLAueo9J-WIP+Ke|nTGTTcHX+oJ-9AAA=p7{ zSH%Y8g-BDjY0Ci|&@QyNCvdES{-n!%4JTt=mWO$xY5E5^dB1jF;12Uk^gK5C(aFRO zO!mAn!7JLGjq71?cj06`(s57X3M_FgyL#S37WV{B^3!F$h?DQKXg8Sy2EL)_PqO_r zznJ_U!AU!{dkH6frQLftS^u>A#1Z!mZlK?i*uFs8(z`qR$KYUAmw6!_ZL9AJ+?-~S zLUmjRHZHPnlyM{V^~LeOKWTRuLe@>~X5&&UaaZATE$$Osjm3@c6Wed<`mV9f6Xwm$2IlWnW+&x0Lt=DxDzpuP^l+|0}{ z3FD-l+Rb*jlW>x|j{67h@Sq;;KE!=taZhrwz9tyEIxgdY*!a}09CwAK%oYc-kF&TF zaWZywnK$EPIcRs6!#(J5k2~D64)=<~z3p%x;%v+IOPp=_eea0-11Dow_e(1dP;7nH z4!5UeIrMhKg>b>gNzv^i${%SE{MmUdo$2-kis?olq> zceJ?IhjP!6#eFr5&ps`##c=yLYlpLqvppSg-5qf$j<_60T%jXwBre0U98Pn%`*9p% z`;%Tq8ys<6M|fVEC2l;<)|N#M_o%~d!f}f9m+jnlWNaU$caSJ&)vblj{?Cv{A0>q^XxG*X?IJh zeY`w?lVd&|_a?4uq{wZ``~fHD#X4^LGP~>KaQiu2298Uv{-o<0g_Gk??apwx$8h~E zWqyr2%i@j;$Bvw= zQr|h{o;TOxTF&5J9ZOr59zqKaP2H{pE=wn+%cB8v9mmn-MByL`YyrMT3lN;AYCl3H?D2qb`R!e zW^&KO$+?AggB)>(I^xFTl1&9ny39I9ne!ZFE^@>zb;Moih`Z6@?!`S6Nnx8DW>1*un z;>O^H25r%0UW&`JxHXRY);sFk=!pB>5!d2)d%x`Ba9wb+577DbbGU(yGKb)7%VCTo zZjvKzDlRMNYdID(znbNKMT0W6y8*Yz5|?^Htj~1Z!MJyV^-sG_C)wk=;*u@(<>E$L z+&-1)Z7I)OCvFj7M zz6)_bTH?-}AG;=?<1RbR^VV77<}ZkCmvr1GxG9#ng41Ki>^d%t+rtuf3QpcHbMscy zjhEuCY90yH?m#-z{5=6PX}8?EFZVITshU#C>!DWm@Vx z_2SrPin`3xaI#Kow;0zUlEOCmEyo>Waev?r4xEgA^Q&q4z-6(|r?tBRCu3f_8*tK2 z?e28MJ?e;i#u4|1BW{f&ZoMOJqa*HjhiiR_ySXZzz?2FqygU~Xn+ z8KpQ}mct#4ljWz&9OiI`;W`Ix&~cTxz7}^W?ly}XdTH#tExODnagw{7o0wuu?$0~i zYYz7=PIA{}eunE9v{Sn+I9czs>u_1@b8YRW;N&%#OAhmJavm z15>j9Z{#2I(&<-n{%&!rmb3q}xSvo99Fy8xP2{UUV!UlaVv4D7Wcj*?psG(*N0>4 zpKj+soUOh}+)ztf?!(z~coCOniEH*qZ2KbpW8RtsZ5*z>!*#~VvejjFceoUs>~nP7 z5M19N2kq)`Q!MUn9JlTHla5PzG?sg};5}w$a&P5u?Hq1boaC;{+!rV7n0A@CJ%cuA zHwGu$WbIbqx>({K#mT;-d+;7JGxs#rUF1n)63lV8VGv36>=7f$lit{YDJOuGRNcc8-^f=l)ylP+@_F3;j_z*SjX z=f~}F6LGSPdIs@kmIPBAZU#>JMaRv?Nxx`!lEW=>xTUyc(=aAo<~=y+7wvw+Nxx_} z^$C02O59+-w%GSS&96zY9(Rnz9r9$XoxOthn3;*2hLh{b+8v9NKGW_roUDJ^Eyi)l z+@G}jr9plB2k$X6)0Q@?WBUi~_QlD0v341_mO)v)gSnZRG6&*X1+QsW;D|dEC%Nmm z!*Q}L&~7>|*;3y^+%SuK9VgpCUFLT<$xrrmrWljoPdLd>yFVRqEuM8BTK7 z?nj*Du3h`5W7oR0>w}ZrwL2asxofu!Cpq*}xi7~_zi4;8Bkoq5j9ne~7_MDVk9IHP zx>?*t+z5+1_?g&uq;;7`;gT(JC*b6>bscvePSzvsKEO$TYWFj)Wl&%LU~Xn+EP2ny z`cu1BI9pshTw4>*q~rF)$ym~^pTiBp$vD$-6LAwF)ooMXZ8*tY$GwD;90mmOW@d7K z6W1zuO}jOYxKDACyN>%7C&!A~HG9tPcEd^TIxZDA%F@nLagw`^TaJ_bQi6ChGr3>y zaJS*4&ve|qILTeRCvcLxc5ge}S2)RC$8G<7EO+h3<0NT!~v zc1v)QpLQSPWbA79J5Jh}uJUXCQY?4v+Tv_+9dK=fvUJ=&xYice%Mq83lj|C~%;C7c zmNJjS$(Yx1@8b$Bar?X+%P%8%kC~b6Sr43y3GMnj;xcg3FFGz4*DZ}Gc);p?r>k@WV!3O%{a+VJMWcPe%f`!Nq*W5z)61Eos5(G zw7VQ9ZISDClHW?4j6v=0!0l|_$fVulxK0tZje8rHV{z?XjU5l_GLvz(`ciPcEoDx0 zlsOaE#}apuBkp=f-0P0GPaSbPy=KpSADpe7!*JD>93I5U7|agdV`gUTK8}-dt=)5u zxL0v9UUb|VhgeP5w{#C`RTZuaB@7M-QAA3Rk+SU z`*hs9I2mW!^?5&*yLN}+B=>`ZvdzroJ_#qeYZrFJRp2Cd9e13=Ex<{BI_`3uO@5g;$xpk39dU&?$xp|P!O420-4tAI&<5?U!R>Bw4?Emj zxE+GH!NJ_jOnz%|or2c}2Xiws?g!k?!E1wqxtSTa{Th4R9ynWEZ(L4L*5F`nW~R(i zob=0J^I|X=SBKjp_n6}*Ph-@uFQFZm1WT@`AaUCBY+W zW6NE;*KvFE9y4k8?OMBQ`>)u2K{~EKPIA!h09=M&+qU&p;cPkFkCWpGUFI6xewH$m zKC$P}1t;6V{2<=UlAu3MmXUT7adIrBT{%wn0ou*SNxx`!4o>#r1*$Deak7uo?g~fT zwK!RCb=*BT$w9l-xNbokv|ERh<3a7xKaJ(5-C$grrOaBKj6of@1b2ibZapr=;yQm8 z>od9DXWnX-ZL-7l!pU;baRYF&{Ioj|*D+{|cB34w6jxx0yB^oY;-11uJBxz%n3>7% zMVyQm?cQ|6eSnkvblf_J+k}&2J{`Bi=dtCdT`5kMpLQ4EB!@#(ewR7iH8|-P9d{#6 z^3(2KoGd@>p2rmgZP0F~FJj9`yS})VLEI3PLmE!<)9ye=Tpmtx&~YOjZX!;Wk&dgu z$vURp^Eg>X+WmrS733w`ZS$)cgWIjMyEZuK7ai9gC;4f&H%^w3b|IWBBkk&OvL0!7 z0j_0`!?0j(W+sPAagv{QS3BZvz)21|?jD?MleK#qcYe?Y?T%OG$~H5TLm94B@S1iN zj<{N!v_;3=hs(8;xdkWta2?nFtJw0>ZeLt)OPRwRag%U;EO85Qwzgb_>uZU72^X@s zKXB5YvM)DpHGSRU-?8PO-Hy1nL7Cd^j@#AZ2H<2l=(t*(tee`Mhm$ceGAP^3Ogoq1 zBnRzQIO49y^HTWjgz)$cP>u)TD!||tu1Z2))9BRBkloQS4)}i<764hHAM4P zGnW44aO)lJTb$&l%ls85`DxeuTYKEjxNwkzj;qJXF_?B|<9b@+?#2zUxKDA?FXMyv zn3?I9uN-cp!)?JyzvwcXe;4~~Ub}HP8E4u}!^ybTZaz-Npmr;8lHUZC-}N|Ir?tDy z5qB?6^3!oo;6?@YXxDyYEI;k`!%2SH4aP}++8vFP{0>w3g>jOfcC#FDbvVgS$IZjZ zxYllwBW|f9?n>O0pzXR$@B7%8*RC@zWQiM!OR>1QxSa!ccrZ6JGv*gL+$Fe9!TWXG ztvI>ITtA#Gt`^tHQszS30E@d1H`L<1EwSaG z`=u@JOiSEFIN5$48NA2LOkZE&aMwEAO*k17y3G4k4#LU)_Nbs^Pz2eTmNuOzVt|RUuob-#1 zyBa6`qTNln_CXu8dl;8%alhksx42z@kL4%ph2*z4PV&=kKSx|&oaCqDvT>51cDXpo zPrI==$xpiraFU;PH{)da9TW6{SlyOxb3d?Ef42 z$JBQSZf5Y>+Aa~bjT?)T{wxjNV`e75Bl%bI)2_r3HytPW>9{(a~O;z?l9cmmbTR5WPQ-}Ex;99;?_Fq+klhpi!SpA zM|~}tCq?fo(Q%z{wtne~+tt#}ES#+^gK-C1;!eQHdZgQO7EZQx+FgsQvy|C+`=sdi z$8_8zoUJX(aJKsHz}f2CuZ6w788};i&cWIG>=Z}bS-5VN+;7EwXmMw?O!D5gxRO@( zb!;ZCrgp1fV zWLjJ5YmKwTb#laYam4j@#HBgn207w};AESn^DDtUX2~ykm!#-*DIGTvcabITJDe;d zIZrZgHS5t&I9W#8{ppBn(IM8?I&K%7EFS zd(q)O#>sv~$8EtqYAN$x{(xF9i~9&yV{xN*Pm2BxJYC&+@K(?I+&Z8Sw^+EcEM}f&Bw_)rrkLXcd5f&=Wuu823y+lJx;bg zx-EO{ofN&EsNKo9?JQ-^!^wH$?BG3SX8L6_PIA}I>k=D-+O@{@4a(9k12@OwZo>7n zxYu!<9{Q6m^Symy*W|SO2{*w~=J4d$xtflv!sWF2>-tvqPV%m|lsSr%#*r3x1#Y~> zZN$lSMcD?Kx0;mO^-YTY4a(XeUfd(Nr-FXbZhrry==Y?wyAM|%l%-wY0ZGyC=V&(< z*TE9E7&kX?GNz=R+o!~?qiEL&C*w@Jt~lA&Y1bRKFj#T5yK@lv1%qC@o_Voj2I&K7 z=Wty6AP4Ox;bc3ZT?H=F5_dIDa?o)%Im&zxC+muiOUX})K4VV1qj9zzs&KX(PR7Z$ zRhM}WZf8q=PdVIMxMWM*54iV&v8(HQxiHCl+Tt!e#NL)`9qw+NE%zsJ{VeVL&f)eR zlH~1gi7Ud%_DttD3n$l!v|HkcyALPlzB+CMe=Jh2HETBw7qYZ-nZrGYyTB4xJS=uy zQP+1BPOf8Ww+6SDrOYk3#TK{V(Af1lUFP|?3`^WI4)+@_-4d5F++JoFmu87u=7@XA z;kFxLuP+NXz*65-T(GN(ZqvRY8+lVCZPbTw@SB~U(JJ{~aYi2&z zI|*x!gPM8Gz3sgg94WS9tK5bo_qN<=uoGK`o!M&c!rrYTR~2{V&Y8}fVeG*tG<$K? zwhMpZE!peJeRtjX4)K26L*JA0i2XSp>%*~5KeojKxYsnqb;UHsQwIBjEc!NwYgh;J z{PBZ$9>pMz>vH+tNIv)U7xFp%A>I(~WEJ4XaJCZwYMtfttu{_;kJVz{td580T zx+A@bToEYtCULLTG2Udagk!u?K9dZ4Q@JWV-7EKIa5q4OH;ZRFS8+{xHs>$39M9FW z-#C{4lK#K?k8d7%MIHIh-Ac za2M`N;eCczd9PtLvBGP_G^CWegkkKkg!3r#OWI}Fj$90vPObein-z1yztDDva+iBn&N_R?aaEW>f*zzYG&3}mz0K! zE6S&2retTO^sfxpMSm&I9~Vjq6_1-+TNj=+v~p@y&8(8T@~X=Gs#&v2D$8p7m)0hz ziV@+G+WMMs*aeq`4yE{ghx%8K^G)&iH$3-oK_JIMnWRmnmevw!swEkTFNavt~6Yo;N|5v zw{T9lvMv#g4OWbBU3FD?WnB}j4<)Q}H3?~Hbnqv^Yh;9x{kCc~GjISxF ztSt?f(>X=sL#YWFA$|w>tH!9Qqid?_BHPNs+4besvl6<#`Zp&Q|hM`_a9j}-f#M` z?A7}o#sH*$51NzSKdXOg|J>Tz@T@5nb93wJYRae7*M$=@IvFk1;hMVgaBZ=qN(-fijvCG#2s*j ziVLdhr&NSTn_XjrzD`^(kE*Y$uCL24uPLoB_iIR8(UHTNrf7O}%`YBZQ$DNVreH$l zl!PyWG4&-C<#ls8&@Zhiudb^~%&`P}iuB^~6}98SrS&xw-y}=dU-J{TBE`CWd}(#$ zc;&G2nmW2CvO^tRRg=IYLURzCsKJsx3EXt_j{U##Sr6^GMu6_LCTq zxD(IFX+>q(sHsCM=@YY!@z0VH*W&25ajW$zAxE~s65aX)Kd~cmbXw~8@>${3l7w`~ z=+yK?mKMrPWN8@*EG@Pwa1^3WsuFu7HN1RE4aaHb>P{jr9p;r+`lZ%$Nup+KxTK8J zn}iGje}!WsT~}Y5TUi$QA%A*F<+N}C*CP^r0W`WZNJQIX3srC58lIhae|-DLw_GCU zvm5y*xWsNg$cjwE{13b$KL;|gvkUu&k~&^iKGn40*SpSsr`d=PM_jw^)AU!KerCag z+;}&@2GrJ+4w%jY57$hos4ATqd0{I1qS^ta2NZK{ zge&#s=1TpP=#~1i;7YwYr*~bcFRjkVtcz|<{F)L|aIJswzg`Zs5?FF+b!vK(G`X}o z)HHp;ha_f$P#WDJB(yiuQk$eVN@~mMt0ULd!ws*iC$jCe=3^pr<-USVvj5r8Y;*o8 z2W^S0DtbA)sgjxEUwN4-S6&j>_6jx(75;}j(Vxt=vq@^Gj$C7C`ij_SacEZ;yDUAm zE^=A=zmitN3n%}T3hTGJR?{R^*2-Z`bm295mfKeOU&ynrw3@-g2N`oB*JC0hsX90* zZj!F0%2NL$tER59lr3UQjwO|Rq&BS zB6TF{s;6;JHSH4;mWeAspZ>T(`T#sB$PIxs{{-f1Es2bX%A`usI=s=Re&O|$s7Iv;PEKJ(A`{Z*(5%m1(J!DAbPrpd&= zDr@eU^?xY!ugaD+yegaU^^zM1tE+=gqZ;hUnXC|TA zCM$kc^ux7;x7=LpjU1yjO`rQ0lN)?un(zetu5ZE)DmC{WR!#LUR5iHwFyVRBaT{W} zfAe|*i*DMhk=tJVN$^HO?o%v_+^5J_4E%)r`xLqU)9^mUlHfkYlCADjOkh`X?j*M? zN?meHTfiqeCj(zV@z(v>{qmO2FaPw)`yXn%>V{qi^OAQA->xv6NkbICmqENad`qM|^LczLr9bm)_@;*W*5mH{ZoW}DmT#k^Fu#Lu zx%6ee1BLctKAumJhBAMJZ-nrL8-Jo`?-k11kGc8wN)Gc&sfVh)_EcsXIF)aMWH9GT zJ^r`--{AL5eqI1n?RB6$LcQzx#>u|SU!wjH^E`g<%6vZx%VmBkZ!+J0n@PFm$pDi` z>JaAF(3pdmAHugw%(oOb@DUhAcsYDCC6#$=-dDu@S>{8SKgj#cQ@ygOya)4l=&xkv zh2-0Zc^2{f=p9eq`!g@%k<10mNzjjIPcAy zx-d6on%H{sG=1b6 z%4bn{S>!#Cc_H8Yp$IQb`~l3@((c~OSMoYd^rtmr(rD%XP5*m);Av9p1^coJn6>1l zb&^P@xS#i$a(l6wo4F}V>N4L^ zG+Pdn$6B_Wiz#D0n~68c!<3m#dGmPP%vbQ5lZh>3jHn<(`fIHzXxEt<)d*ME~A0B`Q;URb! z9)U;UF<1qU!xQi%tcIuHX?O;nh3DXTcmZC7m*8c11zv^M;B|Nd-h{W{ZFmRXh49U%)z84`0Gp@NY2V`)l|H_@8fbGyY%%jD%4z8pgm_ z7zg8l)t&Emdwjz?@;6hDWIhp&f?}8iN5e5N8A@OZltLLW6#4#lOVW!yNe~ zLs!@rxh zE{0`r30w-7!R2rTTnWoz1zZJJ!!>X%{1dK&>tQ9_05`%-a5LNjx5903JKO3&<0Zj%&Shu+W!`a(bG4?LF1<55Xo2vWfuyQf12WP&+E z$%Y&_01kwKa1a~}JW9zM47rd8`A`5nqQ@%&9*^VkSQ>9A@c0&wN2+){=EUPMAs&zQ z@J7LC7z1O0$9Z_;VFDZmhr~>!!o!8E``hBa<~GngypaTu7a!K8n_nz3D?2( zuo7;78{sCn8E%1F;WoG(?tnYtF1Q=+fqUUTxE~&X2jL-j7#@K~;W1bRkHZu2B&>#~ z;AwaUo`vV&d3XU{gqPrDcm-aC*Wh({1KxzU;B9yZ-i7zzefR*@z=!Y=d<<*hU+@Wh z3ZKE}@CB@c_3$Np1^;|1-ci02=guP&I=mPsd zGIWJ~p&N9E{h$Z*1amI1KlFw^&=>kae;5EM5Q0=lgLKG%Ovr+4$bkdkKo|%I!ND*H z21737K|U0Kxk69`hrkdR3d7(~7!D&~B#eU5Fb2lLI2aET;4nBGj({U!A{+(9FbR%^ zV_-6rz!WHjG6=&|m~wsDN2e2~|)Hv!MoRp$_U{4jc=|!CW{VPJk2PBsdvP zfq8H$%!kup0h|v1fHPnrEP^xPELaR@!#Qv+EP?aje7FEEgr#s1Tnx+L61WsDgUjIx zxDuAb3b+cchHKzj_$OQk*TYJ<0d9nw;AXf5ZiU<6cDMuXguCEwxCicq``~_f03L*g z;9+}~Vo`R?08F&_+gXiG|coANLm*Ew76<&ka;SG2b-h#K`9e5Ys zgZJSBSOXuzNANMMg@3^(@F{!-pTifh4%Wk$@D=>Vzre5X8~hG`z@K1F){z;duRbIp%t`-Hn0PF30As6x>9}1ulir^3!0z+XK916o>1dN1HFdD|dSQrQ6 zVFDZmhr(pcp2>(Qph*h7y)?7=2{*uva1-1Nx4^A%8{7_e zz@2ax+zt1@y>K7g4-deD@DMxM>9G&}>(!gKIEyZ|r4OYkzh z0|W z8oq&V;XBv}-@_)@3_rk+@Dpr-pWzqy6@G)?;Scx|yymR;&>Xgh7SIw}L2GCOJ3w35 z5q5%hursuWU7!PWgif$4>;|1-ci02=guP&I=mPsdGIWJ~p&N9E{h$Z*gkG>e^oBmr z7y3be7yu~{f>cO@bjW~A$bxLhfdk+`7zhW!!7vC0LoVb&J`_M96u}`d1ct&eI24A% z2p9>YU^I+@u`mwC!vr`C4u>P)NSFvmK`~5%qv05s3?(oHN}&wGFcqf3bSQ@zFcT_Z z7F0qNRKskjfm*18dYA*p!f`Mcj)(u7w(WsG=$AiD-)ztR54MA5&>Xgh7SIyRr&F!r L|EB+4J@Eek7N5UN diff --git a/examples/cs104-server5/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs b/examples/cs104-server5/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs deleted file mode 100644 index 3871b18..0000000 --- a/examples/cs104-server5/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs +++ /dev/null @@ -1,4 +0,0 @@ -// -using System; -using System.Reflection; -[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] diff --git a/examples/cs104-server5/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/examples/cs104-server5/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache deleted file mode 100644 index 1365f1333833be1bc3ea5906a802d6e6e909bf90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1969 zcmcJQ&u`N(6vsQLdH``jNFc8O2)%k^RzxDr{qJkko2burZe}Am={uNxYDT65h5>yX<;m+q^~qM$l51l zz$_zfn1UVV7NikM8t>Y6Sk(5@r#6hg@ELy$mRwr9t2OQubeAS>N4$!0jIToeb|7?> z)&ZV3UPQUb?a`{jI8=3X@bYTgXEG8Ivv6+$#m*wi=i5sm?KQKDkyhyy{vPG)?TqOd zY;6Stp@Cbai*m4?KrD>a#rYJyW5YBw2Jz58dX<0lYMe?U^wMEoKHE;%#?i-UJmsEU zwz0;Y_`M|j=K!~BkDWk;zwYfDJBf(pOr$UYqmp&KIkjgS!Wmz{BUIz3XnuGp#S!By w!Z!2fK~L%3Vg;ZLey(ccg`4cwW!Bv_oK7{@PK`*O;C(=jf}_JvRVm~67q73i%m4rY diff --git a/examples/cs104-server5/obj/Debug/cs104-se.4D486F68.Up2Date b/examples/cs104-server5/obj/Debug/cs104-se.4D486F68.Up2Date deleted file mode 100644 index e69de29..0000000 diff --git a/examples/cs104-server5/obj/Debug/cs104-server5.csproj.AssemblyReference.cache b/examples/cs104-server5/obj/Debug/cs104-server5.csproj.AssemblyReference.cache deleted file mode 100644 index 2ace2488a1f593b3cdf92d9e940fae5463459887..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1732 zcmcJPQBM>x5XZNM;Dy8w-~-9>V4}&{u0jAWxe#3-5|t1R4jvlG-rgK+uG^k%7dc+= zRbTxuehFWB!{|4`>B3b=Bx_=}o9ymPrZd0(XVPgh69fTC;uhc1>QEkZz^B*ylNL+|oMpU!@t`}yUfK?rF~HkU9C=;peI206pm)F=GGFL^&e zEn1ARxW!65b{mgf<1vrNCKVi>HyGk!EaG{W!z+sfWM#6a8Fo>EOv!eH(%{n!<3iX% zLt8>&bt0PKR)I}O-@tfB4MDbLfoU9S36Ce7Xilb_`!B0Jq4Qs9KwLAvo$~I(g{nRuh|0_v(OMJFy_$(3xtetQIJLpU}8-l;}}4N52-1>j^2vsl2gj9g|J4^tHAB VphQ}y5^h>6g{ZX`vC>e9@EZy)_^to| diff --git a/examples/cs104-server5/obj/Debug/cs104-server5.csproj.CoreCompileInputs.cache b/examples/cs104-server5/obj/Debug/cs104-server5.csproj.CoreCompileInputs.cache deleted file mode 100644 index 9ca4e1e..0000000 --- a/examples/cs104-server5/obj/Debug/cs104-server5.csproj.CoreCompileInputs.cache +++ /dev/null @@ -1 +0,0 @@ -d4146f978379a4f1621d42c638ddacf459559ada16a8554b8fb4e526a80509b1 diff --git a/examples/cs104-server5/obj/Debug/cs104-server5.csproj.FileListAbsolute.txt b/examples/cs104-server5/obj/Debug/cs104-server5.csproj.FileListAbsolute.txt deleted file mode 100644 index 9e6fe35..0000000 --- a/examples/cs104-server5/obj/Debug/cs104-server5.csproj.FileListAbsolute.txt +++ /dev/null @@ -1,10 +0,0 @@ -C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server5\bin\Debug\cs104-server5.exe.config -C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server5\bin\Debug\cs104-server5.exe -C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server5\bin\Debug\cs104-server5.pdb -C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server5\bin\Debug\lib60870.dll -C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server5\bin\Debug\lib60870.pdb -C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server5\obj\Debug\cs104-server5.csproj.AssemblyReference.cache -C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server5\obj\Debug\cs104-server5.csproj.CoreCompileInputs.cache -C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server5\obj\Debug\cs104-se.4D486F68.Up2Date -C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server5\obj\Debug\cs104-server5.exe -C:\Users\IlyesBekaddour\Desktop\Workspace\lib60870.net\examples\cs104-server5\obj\Debug\cs104-server5.pdb diff --git a/examples/cs104-server5/obj/Debug/cs104-server5.exe b/examples/cs104-server5/obj/Debug/cs104-server5.exe deleted file mode 100644 index 9f09d2b9a583dfac39842dd7999d839a2d216c1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6656 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 diff --git a/examples/cs104-server5/obj/Debug/cs104-server5.pdb b/examples/cs104-server5/obj/Debug/cs104-server5.pdb deleted file mode 100644 index ebe808c5093f59b37133da6146b1842c4a09952f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24064 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 k Date: Fri, 14 Jun 2024 17:36:34 +0200 Subject: [PATCH 11/83] Latest update with test cases --- examples/cs104-server4/App.config | 6 - examples/cs104-server4/Program.cs | 97 ------- .../cs104-server4/Properties/AssemblyInfo.cs | 36 --- examples/cs104-server4/cs104-server4.csproj | 56 ---- examples/cs104-server5/App.config | 6 - examples/cs104-server5/Program.cs | 92 ------- .../cs104-server5/Properties/AssemblyInfo.cs | 36 --- examples/cs104-server5/cs104-server5.csproj | 56 ---- lib60870/CS104/Server.cs | 24 +- tests/Test.cs | 240 ++++++++++++++++++ 10 files changed, 257 insertions(+), 392 deletions(-) delete mode 100644 examples/cs104-server4/App.config delete mode 100644 examples/cs104-server4/Program.cs delete mode 100644 examples/cs104-server4/Properties/AssemblyInfo.cs delete mode 100644 examples/cs104-server4/cs104-server4.csproj delete mode 100644 examples/cs104-server5/App.config delete mode 100644 examples/cs104-server5/Program.cs delete mode 100644 examples/cs104-server5/Properties/AssemblyInfo.cs delete mode 100644 examples/cs104-server5/cs104-server5.csproj diff --git a/examples/cs104-server4/App.config b/examples/cs104-server4/App.config deleted file mode 100644 index 56efbc7..0000000 --- a/examples/cs104-server4/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/examples/cs104-server4/Program.cs b/examples/cs104-server4/Program.cs deleted file mode 100644 index cd088e7..0000000 --- a/examples/cs104-server4/Program.cs +++ /dev/null @@ -1,97 +0,0 @@ -using System; -using System.Net; -using System.Net.Sockets; -using System.Threading; - -using lib60870; -using lib60870.CS101; -using lib60870.CS104; - - -namespace cs104_server4 -{ - class MainProgram - { - public static void Main(string[] args) - { - bool running = true; - - Console.CancelKeyPress += delegate (object sender, ConsoleCancelEventArgs e) { - e.Cancel = true; - running = false; - }; - - // specify application layer parameters (CS 101 and CS 104) - var alParams = new ApplicationLayerParameters(); - alParams.SizeOfCA = 2; - alParams.SizeOfIOA = 3; - alParams.MaxAsduLength = 249; - - // specify APCI parameters (only CS 104) - var apciParameters = new APCIParameters(); - apciParameters.K = 12; - apciParameters.W = 8; - apciParameters.T0 = 10; - apciParameters.T1 = 15; - apciParameters.T2 = 10; - apciParameters.T3 = 20; - - Server server = new Server(apciParameters, alParams); - - server.DebugOutput = true; - - server.ServerMode = ServerMode.MULTIPLE_REDUNDANCY_GROUPS; - server.MaxQueueSize = 10; - server.MaxOpenConnections = 6; - - RedundancyGroup redGroup = new RedundancyGroup("red-group"); - redGroup.AddAllowedClient("127.0.0.1"); - - server.AddRedundancyGroup(redGroup); - - server.EnqueueMode = EnqueueMode.REMOVE_OLDEST; - - server.Start(); - - ASDU newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.INITIALIZED, false, false, 0, 1, false); - EndOfInitialization eoi = new EndOfInitialization(0); - - newAsdu.AddInformationObject(eoi); - server.EnqueueASDU(newAsdu); - - int waitTime = 1000; - - while (running && server.IsRunning()) - { - Thread.Sleep(100); - - if (waitTime > 0) - waitTime -= 100; - else - { - - newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.PERIODIC, false, false, 0, 1, false); - - newAsdu.AddInformationObject(new MeasuredValueScaled(110, -1, new QualityDescriptor())); - - server.EnqueueASDU(newAsdu); - - int count = server.GetNumberOfQueueEntries(redGroup); - Console.WriteLine($"Number of queue entries: {count}"); - waitTime = 1000; - } - } - - if (server.IsRunning()) - { - Console.WriteLine("Stop server"); - server.Stop(); - } - else - { - Console.WriteLine("Server stopped"); - } - - } - } -} diff --git a/examples/cs104-server4/Properties/AssemblyInfo.cs b/examples/cs104-server4/Properties/AssemblyInfo.cs deleted file mode 100644 index 22e35ef..0000000 --- a/examples/cs104-server4/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("cs104-server4")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("cs104-server4")] -[assembly: AssemblyCopyright("Copyright © 2024")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("7a8dd7fa-3248-4da4-8a6e-3bf673d2c6fe")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/examples/cs104-server4/cs104-server4.csproj b/examples/cs104-server4/cs104-server4.csproj deleted file mode 100644 index f92438e..0000000 --- a/examples/cs104-server4/cs104-server4.csproj +++ /dev/null @@ -1,56 +0,0 @@ - - - - - Debug - AnyCPU - {7A8DD7FA-3248-4DA4-8A6E-3BF673D2C6FE} - Exe - cs104_server4 - cs104-server4 - v4.7.2 - 512 - true - true - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - ..\..\lib60870\bin\Debug\lib60870.dll - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/cs104-server5/App.config b/examples/cs104-server5/App.config deleted file mode 100644 index 56efbc7..0000000 --- a/examples/cs104-server5/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/examples/cs104-server5/Program.cs b/examples/cs104-server5/Program.cs deleted file mode 100644 index 98b97a8..0000000 --- a/examples/cs104-server5/Program.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System; -using System.Net; -using System.Net.Sockets; -using System.Threading; - -using lib60870; -using lib60870.CS101; -using lib60870.CS104; - - -namespace cs104_server5 -{ - class MainProgram - { - public static void Main(string[] args) - { - bool running = true; - - Console.CancelKeyPress += delegate (object sender, ConsoleCancelEventArgs e) { - e.Cancel = true; - running = false; - }; - - // specify application layer parameters (CS 101 and CS 104) - var alParams = new ApplicationLayerParameters(); - alParams.SizeOfCA = 2; - alParams.SizeOfIOA = 3; - alParams.MaxAsduLength = 249; - - // specify APCI parameters (only CS 104) - var apciParameters = new APCIParameters(); - apciParameters.K = 12; - apciParameters.W = 8; - apciParameters.T0 = 10; - apciParameters.T1 = 15; - apciParameters.T2 = 10; - apciParameters.T3 = 20; - - Server server = new Server(apciParameters, alParams); - - server.DebugOutput = true; - - server.ServerMode = ServerMode.CONNECTION_IS_REDUNDANCY_GROUP; - server.MaxQueueSize = 10; - server.MaxOpenConnections = 6; - - server.EnqueueMode = EnqueueMode.REMOVE_OLDEST; - - server.Start(); - - ASDU newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.INITIALIZED, false, false, 0, 1, false); - EndOfInitialization eoi = new EndOfInitialization(0); - - newAsdu.AddInformationObject(eoi); - server.EnqueueASDU(newAsdu); - - int waitTime = 1000; - - while (running && server.IsRunning()) - { - Thread.Sleep(100); - - if (waitTime > 0) - waitTime -= 100; - else - { - - newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.PERIODIC, false, false, 0, 1, false); - - newAsdu.AddInformationObject(new MeasuredValueScaled(110, -1, new QualityDescriptor())); - - server.EnqueueASDU(newAsdu); - - int count = server.GetNumberOfQueueEntries(null); - Console.WriteLine($"Number of queue entries: {count}"); - waitTime = 1000; - } - } - - if (server.IsRunning()) - { - Console.WriteLine("Stop server"); - server.Stop(); - } - else - { - Console.WriteLine("Server stopped"); - } - - } - } -} diff --git a/examples/cs104-server5/Properties/AssemblyInfo.cs b/examples/cs104-server5/Properties/AssemblyInfo.cs deleted file mode 100644 index b1cd430..0000000 --- a/examples/cs104-server5/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("cs104-server5")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("cs104-server5")] -[assembly: AssemblyCopyright("Copyright © 2024")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("e510d4ea-5c1a-4343-8ba7-4e4c941b2cb8")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/examples/cs104-server5/cs104-server5.csproj b/examples/cs104-server5/cs104-server5.csproj deleted file mode 100644 index 2d37186..0000000 --- a/examples/cs104-server5/cs104-server5.csproj +++ /dev/null @@ -1,56 +0,0 @@ - - - - - Debug - AnyCPU - {E510D4EA-5C1A-4343-8BA7-4E4C941B2CB8} - Exe - cs104_server5 - cs104-server5 - v4.7.2 - 512 - true - true - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - ..\..\lib60870\bin\Debug\lib60870.dll - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/lib60870/CS104/Server.cs b/lib60870/CS104/Server.cs index 79ab30a..7699a71 100644 --- a/lib60870/CS104/Server.cs +++ b/lib60870/CS104/Server.cs @@ -30,6 +30,7 @@ using System.Runtime.InteropServices; using System.Collections; using System.Security.Cryptography; +using System.Collections.ObjectModel; namespace lib60870.CS104 { @@ -139,6 +140,7 @@ private struct ASDUQueueEntry private int oldestQueueEntry = -1; private int latestQueueEntry = -1; private int numberOfAsduInQueue = 0; + public SemaphoreSlim queueLock = new SemaphoreSlim(1, 1); private int maxQueueSize; private EnqueueMode enqueueMode; @@ -225,10 +227,12 @@ public void EnqueueAsdu(ASDU asdu) } } + } DebugLog("Queue contains " + NumberOfAsduInQueue + " messages (oldest: " + oldestQueueEntry + " latest: " + latestQueueEntry + ")"); + } public void LockASDUQueue() @@ -542,9 +546,6 @@ public class Server : CS101.Slave private int maxOpenConnections = 10; private static readonly SemaphoreSlim queueLock = new SemaphoreSlim(1, 1); - internal ASDUQueue asduQueue = null; - private int entryCounter = 0; - internal int? fileTimeout = null; @@ -774,7 +775,7 @@ private int GetEntryCount(ASDUQueue queue) try { queueLock.Wait(); - count = queue.NumberOfAsduInQueue; + count = queue.NumberOfAsduInQueue; queueLock.Release(); } catch (Exception ex) @@ -786,7 +787,7 @@ private int GetEntryCount(ASDUQueue queue) return count; } - public int GetNumberOfQueueEntries(RedundancyGroup redundancyGroup) + public int GetNumberOfQueueEntries(RedundancyGroup redundancyGroup = null) { if (serverMode == ServerMode.CONNECTION_IS_REDUNDANCY_GROUP) { @@ -800,17 +801,26 @@ public int GetNumberOfQueueEntries(RedundancyGroup redundancyGroup) } } - else + else if (serverMode == ServerMode.MULTIPLE_REDUNDANCY_GROUPS) { if (redundancyGroup != null) { return GetEntryCount(redundancyGroup.asduQueue); } - DebugLog("CS104_SLAVE: redundancy group not found\\n\""); + else + { + return -1; + } + } + else + { + RedundancyGroup singleGroup = redGroups[0]; + return GetEntryCount(singleGroup.asduQueue); } + return 0; } diff --git a/tests/Test.cs b/tests/Test.cs index 5142edb..a7db361 100644 --- a/tests/Test.cs +++ b/tests/Test.cs @@ -5,6 +5,7 @@ using lib60870; using lib60870.CS101; using lib60870.CS104; +using System.Security.Cryptography; namespace tests { @@ -2090,6 +2091,245 @@ public void TestInformationObjectCopyConstructors() Assert.AreEqual(integratedTotalsOriginal.BCR.SequenceNumber, integratedTotalsWithCP56Copy.BCR.SequenceNumber); } + [Test()] + public void TestSingleRedundancyGroup() + { + bool running = true; + + Console.CancelKeyPress += delegate (object sender, ConsoleCancelEventArgs e) { + e.Cancel = true; + running = false; + }; + + // specify application layer parameters (CS 101 and CS 104) + var alParams = new ApplicationLayerParameters(); + + // specify APCI parameters (only CS 104) + var apciParameters = new APCIParameters(); + + Server server = new Server(apciParameters, alParams); + + server.DebugOutput = true; + + server.ServerMode = ServerMode.SINGLE_REDUNDANCY_GROUP; + + server.MaxQueueSize = 10; + server.MaxOpenConnections = 6; + + server.EnqueueMode = EnqueueMode.REMOVE_OLDEST; + + server.Start(); + + int waitTime = 1000; + + int enqueuedMessage = 0; + int maxLoop = server.MaxQueueSize + 3; + int loopCount = 0; + while (running && server.IsRunning()) + { + Thread.Sleep(100); + + if (waitTime > 0) + waitTime -= 100; + else + { + ASDU newAsdu = new ASDU + (server.GetApplicationLayerParameters(), CauseOfTransmission.INITIALIZED, false, false, 0, 1, false); + + newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + + newAsdu.AddInformationObject(new MeasuredValueScaled(110, -1, new QualityDescriptor())); + server.EnqueueASDU(newAsdu); + enqueuedMessage++; + + int numberOfQueueEntries = server.GetNumberOfQueueEntries(); + Console.WriteLine($"Number of queue entries: {numberOfQueueEntries}"); + waitTime = 1000; + + if(enqueuedMessage == server.MaxQueueSize) + Assert.AreEqual(server.MaxQueueSize, numberOfQueueEntries); + else + Assert.AreEqual(enqueuedMessage, numberOfQueueEntries); + + maxLoop++; + } + + if (loopCount == maxLoop) + break; + + loopCount++; + } + + if (server.IsRunning()) + { + Console.WriteLine("Stop server"); + server.Stop(); + } + else + { + Console.WriteLine("Server stopped"); + } + } + + [Test()] + public void TestMultipleRedundancyGroup() + { + bool running = true; + + Console.CancelKeyPress += delegate (object sender, ConsoleCancelEventArgs e) { + e.Cancel = true; + running = false; + }; + + // specify application layer parameters (CS 101 and CS 104) + var alParams = new ApplicationLayerParameters(); + + // specify APCI parameters (only CS 104) + var apciParameters = new APCIParameters(); + + Server server = new Server(apciParameters, alParams); + + server.DebugOutput = true; + + server.ServerMode = ServerMode.MULTIPLE_REDUNDANCY_GROUPS; + + server.MaxQueueSize = 10; + server.MaxOpenConnections = 6; + + RedundancyGroup redGroup = new RedundancyGroup("red-group"); + redGroup.AddAllowedClient("127.0.0.1"); + + server.AddRedundancyGroup(redGroup); + + server.EnqueueMode = EnqueueMode.REMOVE_OLDEST; + + server.Start(); + + int waitTime = 1000; + int enqueuedMessage = 0; + int maxLoop = server.MaxQueueSize + 3; + int loopCount = 0; + while (running && server.IsRunning()) + { + Thread.Sleep(100); + + if (waitTime > 0) + waitTime -= 100; + else + { + ASDU newAsdu = new ASDU + (server.GetApplicationLayerParameters(), CauseOfTransmission.INITIALIZED, false, false, 0, 1, false); + + newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + + newAsdu.AddInformationObject(new MeasuredValueScaled(110, -1, new QualityDescriptor())); + + server.EnqueueASDU(newAsdu); + enqueuedMessage++; + + int numberOfQueueEntries = server.GetNumberOfQueueEntries(redGroup); + Console.WriteLine($"Number of queue entries: {numberOfQueueEntries}"); + waitTime = 1000; + if (enqueuedMessage == server.MaxQueueSize) + Assert.AreEqual(server.MaxQueueSize, numberOfQueueEntries); + else + Assert.AreEqual(enqueuedMessage, numberOfQueueEntries); + + maxLoop++; + } + } + + if (server.IsRunning()) + { + Console.WriteLine("Stop server"); + server.Stop(); + } + else + { + Console.WriteLine("Server stopped"); + } + } + + [Test()] + public void TestConnectionIsRedundancyGroup() + { + bool running = true; + + Console.CancelKeyPress += delegate (object sender, ConsoleCancelEventArgs e) { + e.Cancel = true; + running = false; + }; + + // specify application layer parameters (CS 101 and CS 104) + var alParams = new ApplicationLayerParameters(); + + // specify APCI parameters (only CS 104) + var apciParameters = new APCIParameters(); + + Server server = new Server(apciParameters, alParams); + + server.DebugOutput = true; + + server.ServerMode = ServerMode.CONNECTION_IS_REDUNDANCY_GROUP; + + server.MaxQueueSize = 10; + server.MaxOpenConnections = 6; + + server.EnqueueMode = EnqueueMode.REMOVE_OLDEST; + + server.Start(); + + int waitTime = 1000; + + int enqueuedMessage = 0; + int maxLoop = server.MaxQueueSize + 3; + int loopCount = 0; + while (running && server.IsRunning()) + { + Thread.Sleep(100); + + if (waitTime > 0) + waitTime -= 100; + else + { + ASDU newAsdu = new ASDU + (server.GetApplicationLayerParameters(), CauseOfTransmission.INITIALIZED, false, false, 0, 1, false); + + newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + + newAsdu.AddInformationObject(new MeasuredValueScaled(110, -1, new QualityDescriptor())); + server.EnqueueASDU(newAsdu); + enqueuedMessage++; + + int numberOfQueueEntries = server.GetNumberOfQueueEntries(); + Console.WriteLine($"Number of queue entries: {numberOfQueueEntries}"); + waitTime = 1000; + + if (enqueuedMessage == server.MaxQueueSize) + Assert.AreEqual(server.MaxQueueSize, numberOfQueueEntries); + else + Assert.AreEqual(enqueuedMessage, numberOfQueueEntries); + + maxLoop++; + } + + if (loopCount == maxLoop) + break; + + loopCount++; + } + + if (server.IsRunning()) + { + Console.WriteLine("Stop server"); + server.Stop(); + } + else + { + Console.WriteLine("Server stopped"); + } + } + } } From 6872d89f1004f0136b9afeebf5715071c7efd018 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Sat, 15 Jun 2024 07:51:01 +0100 Subject: [PATCH 12/83] - CS104 Slave: Add function to get number of ASDU in queue --- examples/cs104-redundancy-server/Program.cs | 29 +-- lib60870.NET.sln | 24 +- lib60870/CS101/ASDU.cs | 3 - lib60870/CS104/Server.cs | 123 ++++++---- tests/Test.cs | 239 ++++++++++++++++++++ 5 files changed, 350 insertions(+), 68 deletions(-) diff --git a/examples/cs104-redundancy-server/Program.cs b/examples/cs104-redundancy-server/Program.cs index e2820b6..3a86b28 100644 --- a/examples/cs104-redundancy-server/Program.cs +++ b/examples/cs104-redundancy-server/Program.cs @@ -1,32 +1,11 @@ -// /* -// * Copyright 2016, 2017 MZ Automation GmbH -// * -// * This file is part of lib60870.NET -// * -// * lib60870.NET is free software: you can redistribute it and/or modify -// * it under the terms of the GNU General Public License as published by -// * the Free Software Foundation, either version 3 of the License, or -// * (at your option) any later version. -// * -// * lib60870.NET is distributed in the hope that it will be useful, -// * but WITHOUT ANY WARRANTY; without even the implied warranty of -// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// * GNU General Public License for more details. -// * -// * You should have received a copy of the GNU General Public License -// * along with lib60870.NET. If not, see . -// * -// * See COPYING file for the complete license text. -// */ -// -// -using System; +using System; +using System.Net; +using System.Net.Sockets; +using System.Threading; using lib60870; using lib60870.CS101; using lib60870.CS104; -using System.Net; -using System.Threading; namespace cs104_redundancy_server { diff --git a/lib60870.NET.sln b/lib60870.NET.sln index bb2a430..fe42449 100644 --- a/lib60870.NET.sln +++ b/lib60870.NET.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.757 +# Visual Studio Version 17 +VisualStudioVersion = 17.9.34714.143 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "lib60870", "lib60870\lib60870.csproj", "{F604286A-1AFC-4355-8C2C-A998CFCEE979}" EndProject @@ -43,6 +43,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cs104-redundancy-server", " EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cs104-client-file-upload", "examples\cs104-client-file-upload\cs104-client-file-upload.csproj", "{8DAC3BE2-E1C9-4E12-BF11-70FFBAE4C888}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cs104-server4", "examples\cs104-server4\cs104-server4.csproj", "{7A8DD7FA-3248-4DA4-8A6E-3BF673D2C6FE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cs104-server5", "examples\cs104-server5\cs104-server5.csproj", "{E510D4EA-5C1A-4343-8BA7-4E4C941B2CB8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -173,6 +177,22 @@ Global {8DAC3BE2-E1C9-4E12-BF11-70FFBAE4C888}.Release|Any CPU.ActiveCfg = Release|x86 {8DAC3BE2-E1C9-4E12-BF11-70FFBAE4C888}.Release|x86.ActiveCfg = Release|x86 {8DAC3BE2-E1C9-4E12-BF11-70FFBAE4C888}.Release|x86.Build.0 = Release|x86 + {7A8DD7FA-3248-4DA4-8A6E-3BF673D2C6FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7A8DD7FA-3248-4DA4-8A6E-3BF673D2C6FE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7A8DD7FA-3248-4DA4-8A6E-3BF673D2C6FE}.Debug|x86.ActiveCfg = Debug|Any CPU + {7A8DD7FA-3248-4DA4-8A6E-3BF673D2C6FE}.Debug|x86.Build.0 = Debug|Any CPU + {7A8DD7FA-3248-4DA4-8A6E-3BF673D2C6FE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7A8DD7FA-3248-4DA4-8A6E-3BF673D2C6FE}.Release|Any CPU.Build.0 = Release|Any CPU + {7A8DD7FA-3248-4DA4-8A6E-3BF673D2C6FE}.Release|x86.ActiveCfg = Release|Any CPU + {7A8DD7FA-3248-4DA4-8A6E-3BF673D2C6FE}.Release|x86.Build.0 = Release|Any CPU + {E510D4EA-5C1A-4343-8BA7-4E4C941B2CB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E510D4EA-5C1A-4343-8BA7-4E4C941B2CB8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E510D4EA-5C1A-4343-8BA7-4E4C941B2CB8}.Debug|x86.ActiveCfg = Debug|Any CPU + {E510D4EA-5C1A-4343-8BA7-4E4C941B2CB8}.Debug|x86.Build.0 = Debug|Any CPU + {E510D4EA-5C1A-4343-8BA7-4E4C941B2CB8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E510D4EA-5C1A-4343-8BA7-4E4C941B2CB8}.Release|Any CPU.Build.0 = Release|Any CPU + {E510D4EA-5C1A-4343-8BA7-4E4C941B2CB8}.Release|x86.ActiveCfg = Release|Any CPU + {E510D4EA-5C1A-4343-8BA7-4E4C941B2CB8}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/lib60870/CS101/ASDU.cs b/lib60870/CS101/ASDU.cs index a74b1a3..7de4f77 100644 --- a/lib60870/CS101/ASDU.cs +++ b/lib60870/CS101/ASDU.cs @@ -227,12 +227,10 @@ internal void Encode(Frame frame, ApplicationLayerParameters parameters) frame.AppendBytes(payload); else { - bool isFirst = true; foreach (InformationObject io in informationObjects) { - if (isFirst) { io.Encode(frame, parameters, false); @@ -245,7 +243,6 @@ internal void Encode(Frame frame, ApplicationLayerParameters parameters) else io.Encode(frame, parameters, false); } - } } } diff --git a/lib60870/CS104/Server.cs b/lib60870/CS104/Server.cs index 3d9d97e..117024e 100644 --- a/lib60870/CS104/Server.cs +++ b/lib60870/CS104/Server.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2019 MZ Automation GmbH + * Copyright 2016-2024 MZ Automation GmbH * * This file is part of lib60870.NET * @@ -20,29 +20,28 @@ */ using System; - using System.Net; using System.Net.Sockets; using System.Threading; using System.Collections.Generic; -using System.Collections.Concurrent; - using lib60870.CS101; namespace lib60870.CS104 { - + /// /// Connection request handler is called when a client tries to connect to the server. /// /// User provided parameter /// IP address of the connecting client /// true if the connection has to be accepted, false otherwise - public delegate bool ConnectionRequestHandler(object parameter,IPAddress ipAddress); + public delegate bool ConnectionRequestHandler(object parameter,IPAddress ipAddress); /// /// Connection events for the Server /// + /// + public enum ClientConnectionEvent { /// @@ -114,6 +113,7 @@ public enum EnqueueMode internal class ASDUQueue { + private enum QueueEntryState { NOT_USED, @@ -141,6 +141,8 @@ private struct ASDUQueueEntry private Action DebugLog = null; + public int NumberOfAsduInQueue { get => numberOfAsduInQueue; set => numberOfAsduInQueue = value; } + public ASDUQueue(int maxQueueSize, EnqueueMode enqueueMode, ApplicationLayerParameters parameters, Action DebugLog) { enqueuedASDUs = new ASDUQueueEntry[maxQueueSize]; @@ -154,7 +156,7 @@ public ASDUQueue(int maxQueueSize, EnqueueMode enqueueMode, ApplicationLayerPara this.enqueueMode = enqueueMode; this.oldestQueueEntry = -1; this.latestQueueEntry = -1; - this.numberOfAsduInQueue = 0; + this.NumberOfAsduInQueue = 0; this.maxQueueSize = maxQueueSize; this.parameters = parameters; this.DebugLog = DebugLog; @@ -164,12 +166,11 @@ public void EnqueueAsdu(ASDU asdu) { lock (enqueuedASDUs) { - if (oldestQueueEntry == -1) { oldestQueueEntry = 0; latestQueueEntry = 0; - numberOfAsduInQueue = 1; + NumberOfAsduInQueue = 1; enqueuedASDUs[0].asdu.ResetFrame(); asdu.Encode(enqueuedASDUs[0].asdu, parameters); @@ -181,7 +182,7 @@ public void EnqueueAsdu(ASDU asdu) { bool enqueue = true; - if (numberOfAsduInQueue == maxQueueSize) + if (NumberOfAsduInQueue == maxQueueSize) { if (enqueueMode == EnqueueMode.REMOVE_OLDEST) { @@ -204,18 +205,17 @@ public void EnqueueAsdu(ASDU asdu) if (latestQueueEntry == oldestQueueEntry) oldestQueueEntry = (oldestQueueEntry + 1) % maxQueueSize; else - numberOfAsduInQueue++; + NumberOfAsduInQueue++; enqueuedASDUs[latestQueueEntry].asdu.ResetFrame(); asdu.Encode(enqueuedASDUs[latestQueueEntry].asdu, parameters); - enqueuedASDUs[latestQueueEntry].entryTimestamp = SystemUtils.currentTimeMillis(); enqueuedASDUs[latestQueueEntry].state = QueueEntryState.WAITING_FOR_TRANSMISSION; } } } - DebugLog("Queue contains " + numberOfAsduInQueue + " messages (oldest: " + oldestQueueEntry + " latest: " + latestQueueEntry + ")"); + DebugLog("Queue contains " + NumberOfAsduInQueue + " messages (oldest: " + oldestQueueEntry + " latest: " + latestQueueEntry + ")"); } public void LockASDUQueue() @@ -228,7 +228,7 @@ public void UnlockASDUQueue() Monitor.Exit(enqueuedASDUs); } - public BufferFrame GetNextWaitingASDU(out long timestamp, out int index) + internal BufferFrame GetNextWaitingASDU(out long timestamp, out int index) { timestamp = 0; index = -1; @@ -236,7 +236,7 @@ public BufferFrame GetNextWaitingASDU(out long timestamp, out int index) if (enqueuedASDUs == null) return null; - if (numberOfAsduInQueue > 0) + if (NumberOfAsduInQueue > 0) { int currentIndex = oldestQueueEntry; @@ -271,7 +271,7 @@ public void UnmarkAllASDUs() { lock (enqueuedASDUs) { - if (numberOfAsduInQueue > 0) + if (NumberOfAsduInQueue > 0) { for (int i = 0; i < enqueuedASDUs.Length; i++) { @@ -292,31 +292,27 @@ public void MarkASDUAsConfirmed(int index, long timestamp) lock (enqueuedASDUs) { - - if (numberOfAsduInQueue > 0) + if (NumberOfAsduInQueue > 0) { - if (enqueuedASDUs[index].state == QueueEntryState.SENT_BUT_NOT_CONFIRMED) { - if (enqueuedASDUs[index].entryTimestamp == timestamp) { - int currentIndex = index; while (enqueuedASDUs[currentIndex].state == QueueEntryState.SENT_BUT_NOT_CONFIRMED) { - DebugLog("Remove from queue with index " + currentIndex); enqueuedASDUs[currentIndex].state = QueueEntryState.NOT_USED; enqueuedASDUs[currentIndex].entryTimestamp = 0; - numberOfAsduInQueue -= 1; + NumberOfAsduInQueue -= 1; - if (numberOfAsduInQueue == 0) + if (NumberOfAsduInQueue == 0) { oldestQueueEntry = -1; latestQueueEntry = -1; + break; } @@ -324,7 +320,7 @@ public void MarkASDUAsConfirmed(int index, long timestamp) { oldestQueueEntry = (index + 1) % maxQueueSize; - if (numberOfAsduInQueue == 1) + if (NumberOfAsduInQueue == 1) latestQueueEntry = oldestQueueEntry; break; @@ -338,10 +334,9 @@ public void MarkASDUAsConfirmed(int index, long timestamp) // break if we reached the first deleted entry again if (currentIndex == index) break; - } - DebugLog("queue state: noASDUs: " + numberOfAsduInQueue + " oldest: " + oldestQueueEntry + " latest: " + latestQueueEntry); + DebugLog("queue state: noASDUs: " + NumberOfAsduInQueue + " oldest: " + oldestQueueEntry + " latest: " + latestQueueEntry); } } } @@ -453,7 +448,7 @@ internal bool Matches(IPAddress ipAddress) } } } - + return matches; } @@ -474,12 +469,10 @@ internal void Activate(ClientConnection activeConnection) { if (HasConnection(activeConnection)) { - foreach (ClientConnection connection in connections) { if (connection != activeConnection) { - if (connection.IsActive) { server.CallConnectionEventHandler(connection, ClientConnectionEvent.INACTIVE); @@ -487,7 +480,6 @@ internal void Activate(ClientConnection activeConnection) } } } - } } @@ -737,6 +729,62 @@ public int ReceiveTimeout } } + private int GetEntryCount(ASDUQueue queue) + { + int count = 0; + + if (queue != null) + { + try + { + count = queue.NumberOfAsduInQueue; + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + } + + return count; + } + + /// + /// Returns the number of elements in the low priority queue + /// + /// the redundancy group object (only required for ServerMode.MULTIPLE_REDUNDANCY_GROUPS + /// The number of ASDUs in the queue, or 0 when the queue is empty + public int GetNumberOfQueueEntries(RedundancyGroup redundancyGroup = null) + { + if (serverMode == ServerMode.CONNECTION_IS_REDUNDANCY_GROUP) + { + foreach (ClientConnection connection in allOpenConnections) + { + if (connection.IsActive) + { + return GetEntryCount(connection.GetASDUQueue()); + } + } + } + else if (serverMode == ServerMode.MULTIPLE_REDUNDANCY_GROUPS) + { + if (redundancyGroup != null) + { + return GetEntryCount(redundancyGroup.asduQueue); + } + else + { + return 0; + } + } + else + { + RedundancyGroup singleGroup = redGroups[0]; + return GetEntryCount(singleGroup.asduQueue); + } + + return 0; + } + private void ServerAcceptThread() { running = true; @@ -822,12 +870,10 @@ private void ServerAcceptThread() CallConnectionEventHandler(connection, ClientConnectionEvent.OPENED); } - } else newSocket.Close(); } - } catch (Exception) { @@ -940,7 +986,6 @@ public void Stop() { connection.Close(); } - } catch (Exception e) { @@ -1010,18 +1055,20 @@ internal void Deactivated(ClientConnection activeConnection) CallConnectionEventHandler(activeConnection, ClientConnectionEvent.INACTIVE); } - public override int FileTimeout { - get { + public override int FileTimeout + { + get + { if (fileTimeout != null) return FileTimeout; else return -1; } - set { + set + { fileTimeout = value; } } } - } diff --git a/tests/Test.cs b/tests/Test.cs index 5142edb..b4389f6 100644 --- a/tests/Test.cs +++ b/tests/Test.cs @@ -2090,6 +2090,245 @@ public void TestInformationObjectCopyConstructors() Assert.AreEqual(integratedTotalsOriginal.BCR.SequenceNumber, integratedTotalsWithCP56Copy.BCR.SequenceNumber); } + [Test()] + public void TestSingleRedundancyGroup() + { + bool running = true; + + Console.CancelKeyPress += delegate (object sender, ConsoleCancelEventArgs e) { + e.Cancel = true; + running = false; + }; + + // specify application layer parameters (CS 101 and CS 104) + var alParams = new ApplicationLayerParameters(); + + // specify APCI parameters (only CS 104) + var apciParameters = new APCIParameters(); + + Server server = new Server(apciParameters, alParams); + + server.DebugOutput = true; + + server.ServerMode = ServerMode.SINGLE_REDUNDANCY_GROUP; + + server.MaxQueueSize = 10; + server.MaxOpenConnections = 6; + + server.EnqueueMode = EnqueueMode.REMOVE_OLDEST; + + server.Start(); + + int waitTime = 1000; + + int enqueuedMessage = 0; + int maxLoop = server.MaxQueueSize + 3; + int loopCount = 0; + while (running && server.IsRunning()) + { + Thread.Sleep(100); + + if (waitTime > 0) + waitTime -= 100; + else + { + ASDU newAsdu = new ASDU + (server.GetApplicationLayerParameters(), CauseOfTransmission.INITIALIZED, false, false, 0, 1, false); + + newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + + newAsdu.AddInformationObject(new MeasuredValueScaled(110, -1, new QualityDescriptor())); + server.EnqueueASDU(newAsdu); + enqueuedMessage++; + + int numberOfQueueEntries = server.GetNumberOfQueueEntries(); + Console.WriteLine($"Number of queue entries: {numberOfQueueEntries}"); + waitTime = 1000; + + if(enqueuedMessage == server.MaxQueueSize) + Assert.AreEqual(server.MaxQueueSize, numberOfQueueEntries); + else + Assert.AreEqual(enqueuedMessage, numberOfQueueEntries); + + maxLoop++; + } + + if (loopCount == maxLoop) + break; + + loopCount++; + } + + if (server.IsRunning()) + { + Console.WriteLine("Stop server"); + server.Stop(); + } + else + { + Console.WriteLine("Server stopped"); + } + } + + [Test()] + public void TestMultipleRedundancyGroup() + { + bool running = true; + + Console.CancelKeyPress += delegate (object sender, ConsoleCancelEventArgs e) { + e.Cancel = true; + running = false; + }; + + // specify application layer parameters (CS 101 and CS 104) + var alParams = new ApplicationLayerParameters(); + + // specify APCI parameters (only CS 104) + var apciParameters = new APCIParameters(); + + Server server = new Server(apciParameters, alParams); + + server.DebugOutput = true; + + server.ServerMode = ServerMode.MULTIPLE_REDUNDANCY_GROUPS; + + server.MaxQueueSize = 10; + server.MaxOpenConnections = 6; + + RedundancyGroup redGroup = new RedundancyGroup("red-group"); + redGroup.AddAllowedClient("127.0.0.1"); + + server.AddRedundancyGroup(redGroup); + + server.EnqueueMode = EnqueueMode.REMOVE_OLDEST; + + server.Start(); + + int waitTime = 1000; + int enqueuedMessage = 0; + int maxLoop = server.MaxQueueSize + 3; + int loopCount = 0; + while (running && server.IsRunning()) + { + Thread.Sleep(100); + + if (waitTime > 0) + waitTime -= 100; + else + { + ASDU newAsdu = new ASDU + (server.GetApplicationLayerParameters(), CauseOfTransmission.INITIALIZED, false, false, 0, 1, false); + + newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + + newAsdu.AddInformationObject(new MeasuredValueScaled(110, -1, new QualityDescriptor())); + + server.EnqueueASDU(newAsdu); + enqueuedMessage++; + + int numberOfQueueEntries = server.GetNumberOfQueueEntries(redGroup); + Console.WriteLine($"Number of queue entries: {numberOfQueueEntries}"); + waitTime = 1000; + if (enqueuedMessage == server.MaxQueueSize) + Assert.AreEqual(server.MaxQueueSize, numberOfQueueEntries); + else + Assert.AreEqual(enqueuedMessage, numberOfQueueEntries); + + maxLoop++; + } + } + + if (server.IsRunning()) + { + Console.WriteLine("Stop server"); + server.Stop(); + } + else + { + Console.WriteLine("Server stopped"); + } + } + + [Test()] + public void TestConnectionIsRedundancyGroup() + { + bool running = true; + + Console.CancelKeyPress += delegate (object sender, ConsoleCancelEventArgs e) { + e.Cancel = true; + running = false; + }; + + // specify application layer parameters (CS 101 and CS 104) + var alParams = new ApplicationLayerParameters(); + + // specify APCI parameters (only CS 104) + var apciParameters = new APCIParameters(); + + Server server = new Server(apciParameters, alParams); + + server.DebugOutput = true; + + server.ServerMode = ServerMode.CONNECTION_IS_REDUNDANCY_GROUP; + + server.MaxQueueSize = 10; + server.MaxOpenConnections = 6; + + server.EnqueueMode = EnqueueMode.REMOVE_OLDEST; + + server.Start(); + + int waitTime = 1000; + + int enqueuedMessage = 0; + int maxLoop = server.MaxQueueSize + 3; + int loopCount = 0; + while (running && server.IsRunning()) + { + Thread.Sleep(100); + + if (waitTime > 0) + waitTime -= 100; + else + { + ASDU newAsdu = new ASDU + (server.GetApplicationLayerParameters(), CauseOfTransmission.INITIALIZED, false, false, 0, 1, false); + + newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + + newAsdu.AddInformationObject(new MeasuredValueScaled(110, -1, new QualityDescriptor())); + server.EnqueueASDU(newAsdu); + enqueuedMessage++; + + int numberOfQueueEntries = server.GetNumberOfQueueEntries(); + Console.WriteLine($"Number of queue entries: {numberOfQueueEntries}"); + waitTime = 1000; + + if (enqueuedMessage == server.MaxQueueSize) + Assert.AreEqual(server.MaxQueueSize, numberOfQueueEntries); + else + Assert.AreEqual(enqueuedMessage, numberOfQueueEntries); + + maxLoop++; + } + + if (loopCount == maxLoop) + break; + + loopCount++; + } + + if (server.IsRunning()) + { + Console.WriteLine("Stop server"); + server.Stop(); + } + else + { + Console.WriteLine("Server stopped"); + } + } + } } From 80584f45ccea990726d8909b52fa1eed5638fe5e Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Sat, 15 Jun 2024 18:07:55 +0100 Subject: [PATCH 13/83] - added log message when STARTDT received while connection is already active --- lib60870/CS104/ClientConnection.cs | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/lib60870/CS104/ClientConnection.cs b/lib60870/CS104/ClientConnection.cs index a5eb9fc..4eb2f6b 100644 --- a/lib60870/CS104/ClientConnection.cs +++ b/lib60870/CS104/ClientConnection.cs @@ -512,7 +512,6 @@ private void sendNextAvailableASDU() { oldestSentASDU = 0; newestSentASDU = 0; - } else { @@ -1011,36 +1010,33 @@ private bool HandleMessage(byte[] buffer, int msgSize) return false; } } - // Check for TESTFR_ACT message else if ((buffer[2] & 0x43) == 0x43) { - DebugLog("Send TESTFR_CON"); socketStream.Write(TESTFR_CON_MSG, 0, TESTFR_CON_MSG.Length); } - // Check for STARTDT_ACT message else if ((buffer[2] & 0x07) == 0x07) { - DebugLog("Send STARTDT_CON"); + socketStream.Write(STARTDT_CON_MSG, 0, TESTFR_CON_MSG.Length); + if (this.isActive == false) { this.isActive = true; this.server.Activated(this); } - - socketStream.Write(STARTDT_CON_MSG, 0, TESTFR_CON_MSG.Length); + else { + DebugLog("STARTDT-ACT received while connection is already active"); + } } - // Check for STOPDT_ACT message else if ((buffer[2] & 0x13) == 0x13) { - DebugLog("Send STOPDT_CON"); if (this.isActive == true) @@ -1052,7 +1048,6 @@ private bool HandleMessage(byte[] buffer, int msgSize) socketStream.Write(STOPDT_CON_MSG, 0, TESTFR_CON_MSG.Length); } - // Check for TESTFR_CON message else if ((buffer[2] & 0x83) == 0x83) { @@ -1062,7 +1057,6 @@ private bool HandleMessage(byte[] buffer, int msgSize) ResetT3Timeout(currentTime); } - // S-message else if (buffer[2] == 0x01) { @@ -1080,7 +1074,6 @@ private bool HandleMessage(byte[] buffer, int msgSize) if (CheckSequenceNumber(seqNo) == false) return false; - } else { @@ -1129,7 +1122,6 @@ private bool handleTimeouts() if (unconfirmedReceivedIMessages > 0) { - if ((currentTime - lastConfirmationTime) >= (UInt64)(apciParameters.T2 * 1000)) { @@ -1147,7 +1139,6 @@ private bool handleTimeouts() { if (((long)currentTime - sentASDUs[oldestSentASDU].sentTime) >= (apciParameters.T1 * 1000)) { - PrintSendBuffer(); DebugLog("I message timeout for " + oldestSentASDU + " seqNo: " + sentASDUs[oldestSentASDU].seqNo); return false; @@ -1162,7 +1153,6 @@ private bool AreByteArraysEqual(byte[] array1, byte[] array2) { if (array1.Length == array2.Length) { - for (int i = 0; i < array1.Length; i++) { if (array1[i] != array2[i]) @@ -1284,7 +1274,6 @@ private void HandleConnection() while (running) { - try { // Receive the response from the remote device. @@ -1292,7 +1281,6 @@ private void HandleConnection() if (bytesRec > 0) { - DebugLog("RCVD: " + BitConverter.ToString(bytes, 0, bytesRec)); if (HandleMessage(bytes, bytesRec) == false) From f8ffd2e9c27bcc524f149f73bf3b79e99abb2271 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Mon, 28 Oct 2024 18:08:32 +0000 Subject: [PATCH 14/83] - added new certificates for TLS examples --- examples/tls-certs/new/client_CA1_1.key | 27 ++++++++++++++++++++++++ examples/tls-certs/new/client_CA1_1.pem | 20 ++++++++++++++++++ examples/tls-certs/new/client_CA1_2.pem | 20 ++++++++++++++++++ examples/tls-certs/new/root_CA1.pem | 22 +++++++++++++++++++ examples/tls-certs/new/server_CA1_1.key | 27 ++++++++++++++++++++++++ examples/tls-certs/new/server_CA1_1.pem | 20 ++++++++++++++++++ examples/tls-certs/new/server_CA1_1.pfx | Bin 0 -> 2461 bytes 7 files changed, 136 insertions(+) create mode 100644 examples/tls-certs/new/client_CA1_1.key create mode 100644 examples/tls-certs/new/client_CA1_1.pem create mode 100644 examples/tls-certs/new/client_CA1_2.pem create mode 100644 examples/tls-certs/new/root_CA1.pem create mode 100644 examples/tls-certs/new/server_CA1_1.key create mode 100644 examples/tls-certs/new/server_CA1_1.pem create mode 100644 examples/tls-certs/new/server_CA1_1.pfx diff --git a/examples/tls-certs/new/client_CA1_1.key b/examples/tls-certs/new/client_CA1_1.key new file mode 100644 index 0000000..23e672f --- /dev/null +++ b/examples/tls-certs/new/client_CA1_1.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpQIBAAKCAQEA2PuXMNUYO43NbEvBmEAru/uL1JdU6gFuhMKLuZOPaOGjGhth +JiDO9AsnUGzKAk3m9QZ/YhAzY9CiEeYsnGaPeI0OBdkgWmpz5k9Fw+bqaqlxYQTy +Bw69/kYbwNyMmGsb8XqXKZvhPXdLoaxkVmS+AMlxVcN/7c2ldZGTTDrhBtJnfuPK +rGmH9cFg+XVvUskPQsUIwJtn1sN+niZ++hkuiCzmoZ4A+m73QACltdcr7aNtHJmh +aU/p1bmLIhYfbxGmyvm2faJ8htYuaRBj6DcZq44IyDGz2LThmdWzpIcYbovCzB2X +Pn26b0BXsXBpN+ptf2xpAEDWDdzaR6Xp4BgJwQIDAQABAoIBAQDQGLJOlgBQlVWv +CBSaNOj8t2nKsHwylL7uujoQ95DxUH0BO8L3Mz3n1Y6V1lAC172pvtqKLOlsUBov +OmYMdVwhjH4nY65gqHmRJvPMxviI5Qqktn58AEp8w7Y4SAza3NaGyECTGjlxnqi9 +XD06khGbZZa5Xu6hHboSwFPZJxrLU1jaopJUgFG+p9oUgiSp5cfGDwAsU9JELmkP +MVF0GWedpypBBKi9JsniOulr1USpNZN2rzEkkxwY0QQttw3E9dgheIsut7dUYWLz +9NLKcRWIK/Y29NzS6Urye8lUTHHBrXgk5pUcdN3vuY7mkleqIn5tYY6xf93/5/VA +jF+HcgolAoGBAPDhS986xppbfLmrresIUUZKxk2s/Vg+vHPLX0SJFF7Uhy8nMYoJ +JqfG2mS+/tiM/wPBglVhsrlsfnDIag7Brqx7sjH2OHO6VX8jQPYgOuCbNwp7uL1w +bG82R5rujcxxFAtMVAM3zYz9sNGSu8u7M/U3kfTBwtntFJ6iPC60REbjAoGBAOaa +SdtX0bOQAYDM4moEDVnRPMHp8lZAjqKphGqTDrGOqU4usNW8+ZNBhn3vF1+n2Gq5 +KY2IWSF0j71jqpOXahW0EBoXpcTLs5JBWet8J5vKzbpN8Uq8TvTABn67G1F/DZub +FOiCDy/Kku4yWT2aUqNwS07va7gzFhyyjMl/JWoLAoGAATpEtriH9pVsx012r3H1 +aBRNemvdRqvbLgPlUmYYcntGzRi4CeoOBmDfEBBhIB1n108PKPw8evFwm4aJ89VM +3JgsylBk7UIP2XwGgrqbUjW4TBdhU6XVB6QRLVr14grZfU1ASFvqckOAuTC0QE+N +7jwARG0QXyf0KPLOt7Y3et0CgYEAhJcd9EJQTsB0PMyROofN7WDDYHPVZQaFfL2f +Z2/auPjgHBX4k0yu6553aB17AQMPCn4giEJnjTbqFukhgO9EjeoUgAwswjSlsWhl +/WJLm+ZF1+NM473WYB+xHFkU4gz9lATdRrrRZJdDWDYW3bbH4TWF94LuGuE0y5dW +H909c/UCgYEAiYY/TTZvfEsQvCo4Rv6qg7cI2/OdGwGhMmtziYy4SIAAm0Ga2s3R +L7Kq72In+nbaDIUD2zTSGQmwTm3B0C73vIUAXvupcl28nE5px0YNV6NZJaaFSV66 +hP1CgPBYe6KjnVufOiqhcnDdJQ6XdqK0tblj+cavkZgW+UdeqVBXCFQ= +-----END RSA PRIVATE KEY----- diff --git a/examples/tls-certs/new/client_CA1_1.pem b/examples/tls-certs/new/client_CA1_1.pem new file mode 100644 index 0000000..580cff4 --- /dev/null +++ b/examples/tls-certs/new/client_CA1_1.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDWzCCAkMCFFTJkICEIidmnrisIFxZ99KKLhDFMA0GCSqGSIb3DQEBCwUAMGox +CzAJBgNVBAYTAkRFMQswCQYDVQQIDAJCVzERMA8GA1UEBwwIRnJlaWJ1cmcxGzAZ +BgNVBAoMEk1aIEF1dG9tYXRpb24gR21iSDEMMAoGA1UECwwDUiZEMRAwDgYDVQQD +DAdyb290X0NBMB4XDTIyMDMxODA5MzMxOFoXDTIyMDQxNzA5MzMxOFowajELMAkG +A1UEBhMCREUxCzAJBgNVBAgMAkJXMREwDwYDVQQHDAhGcmVpYnVyZzEbMBkGA1UE +CgwSTVogQXV0b21hdGlvbiBHbWJIMQwwCgYDVQQLDANSJkQxEDAOBgNVBAMMB2Ns +aWVudDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDY+5cw1Rg7jc1s +S8GYQCu7+4vUl1TqAW6Ewou5k49o4aMaG2EmIM70CydQbMoCTeb1Bn9iEDNj0KIR +5iycZo94jQ4F2SBaanPmT0XD5upqqXFhBPIHDr3+RhvA3IyYaxvxepcpm+E9d0uh +rGRWZL4AyXFVw3/tzaV1kZNMOuEG0md+48qsaYf1wWD5dW9SyQ9CxQjAm2fWw36e +Jn76GS6ILOahngD6bvdAAKW11yvto20cmaFpT+nVuYsiFh9vEabK+bZ9onyG1i5p +EGPoNxmrjgjIMbPYtOGZ1bOkhxhui8LMHZc+fbpvQFexcGk36m1/bGkAQNYN3NpH +pengGAnBAgMBAAEwDQYJKoZIhvcNAQELBQADggEBADSnrKdPqeUr3F1MIk6P8SKo +yR1VrPmNCljaC1i3realDlG+7jlPHfTCkwZwlEfKGa/yANJAw4hv+2tR5m4CsgMB +x6FkKG9p6NTXyv4gXZeLa3ivqFqz7awTVMBf1C1VVeTi/H2kvHSBRmbj6Z5p7/MN +9E1t5NsgbKKfbj4hQD+f7r6zgFdgTK8C5OYT2ijYryFl1Qqrl5CYPpswm3vL0KkM +e3RMOBqamkFqr4OCZw5juNpGrp3bK3dLF+N6Ceb+PGnS0YU29NpUXo64lzIxdwxs +NDqbFMYXEXGKqUDVQAuj1374M85Cvqlso0Jenc+hWN2/kfAgHGE1Ne3sD9oJg5w= +-----END CERTIFICATE----- diff --git a/examples/tls-certs/new/client_CA1_2.pem b/examples/tls-certs/new/client_CA1_2.pem new file mode 100644 index 0000000..156b3ee --- /dev/null +++ b/examples/tls-certs/new/client_CA1_2.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDWzCCAkMCFFTJkICEIidmnrisIFxZ99KKLhDGMA0GCSqGSIb3DQEBCwUAMGox +CzAJBgNVBAYTAkRFMQswCQYDVQQIDAJCVzERMA8GA1UEBwwIRnJlaWJ1cmcxGzAZ +BgNVBAoMEk1aIEF1dG9tYXRpb24gR21iSDEMMAoGA1UECwwDUiZEMRAwDgYDVQQD +DAdyb290X0NBMB4XDTIyMDMxODA5MzY0OVoXDTIyMDQxNzA5MzY0OVowajELMAkG +A1UEBhMCREUxCzAJBgNVBAgMAkJXMREwDwYDVQQHDAhGcmVpYnVyZzEbMBkGA1UE +CgwSTVogQXV0b21hdGlvbiBHbWJIMQwwCgYDVQQLDANSJkQxEDAOBgNVBAMMB2Ns +aWVudDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC8hnd/sd/nLJrN +wfei5lphgS71fpP567xgkrGaEy0/lyISeuYK8nkrHI3T5cz0IHsVRGai0cQPdrP5 +0Vdn7kj2rM/WzD7RzSRZIBydd4tnCZBz/bktTRtYNVve7+HaP9t4FxQdkMF4K3Jm +E/j/gYSYimR49DFjXI2om9kXWZ6pdQUyaKUr+zxgmovtQjtc7wdTdKmsKFQxQQhd +zWQajEpaNTL+JTJyrCZctryaILgYv4cvQbpF54zbcRsdoPRkP6azsR9GDhCYydwz +UGMr2CZ2C4BRwB8ChswDsU6iww5enF2vWIUY36VvjmSDDrsH1w4V9UCkSjYMg0VQ +Mmwc8kerAgMBAAEwDQYJKoZIhvcNAQELBQADggEBALYG8KSPm82uvgmeto76kL+N +nUgV1ojxj+X9yBrbrkgo4rnsXFU1NUqncdCfpvA7u9mqAjZ4KN+ORZIUp1SXUl3Z +TIpBClO5ML7wz1Iy6QrExeFwb2783Gl1jeq0lSQwWffNMwkPEqG1QYr/2IK9eSRJ +hDrure/Ys3s5F7grQ6vTWBQrEXynd81YqqZuBFFs7FuLhg0GK/OdpJ5i2BsLS+B3 +nEOxmgxZ1qLSqbYDjhawsjiSItvO8XxZjA99n3MpBVharqqwp0Xpkm+X30rWolUp +wur154X0dMZh8jF98KVrB/3Te9aidtyuO9EiGU2Qbkre7jK+Ol3nITR50Gy8yYU= +-----END CERTIFICATE----- diff --git a/examples/tls-certs/new/root_CA1.pem b/examples/tls-certs/new/root_CA1.pem new file mode 100644 index 0000000..0e7045a --- /dev/null +++ b/examples/tls-certs/new/root_CA1.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIUJysTAOCqE3IaNO1QgtOPxMq6M8EwDQYJKoZIhvcNAQEL +BQAwajELMAkGA1UEBhMCREUxCzAJBgNVBAgMAkJXMREwDwYDVQQHDAhGcmVpYnVy +ZzEbMBkGA1UECgwSTVogQXV0b21hdGlvbiBHbWJIMQwwCgYDVQQLDANSJkQxEDAO +BgNVBAMMB3Jvb3RfQ0EwHhcNMjIwMzE4MDkyNzEwWhcNMzIwMzE1MDkyNzEwWjBq +MQswCQYDVQQGEwJERTELMAkGA1UECAwCQlcxETAPBgNVBAcMCEZyZWlidXJnMRsw +GQYDVQQKDBJNWiBBdXRvbWF0aW9uIEdtYkgxDDAKBgNVBAsMA1ImRDEQMA4GA1UE +AwwHcm9vdF9DQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOMyaDaT ++a4DT0s2NCrjUN8coLPfFrLRdN0Gx0hRViuLUFxd001jXruRgXKt2g8lR+YnzUeA +PQHbcIfRQhL+jy/ZMXpmz4Nrl7vyOWFdu8nBKU6c7y9LmSGbnOJZjDXwlX6ERwui +qFzAvRA6YXbPN8gY0B3Ou+T/mjkWN9L1x+V+7bGs9rVIoM78fVyM2FERBfsBtT76 +QVQv3KZ+a9EOLxqcZ/nGqsFFysFOSkiRC6Cy4mC5CSik9S5D7X9lz/bdga7O+hqd +SKfir6YMlQGV37JPqmz69N6vvb9UOX/G989T4qdVB/zQOvMdcIWXkqb3vSAXYi/c +ClVS1Pymsy/MXQ0CAwEAAaNTMFEwHQYDVR0OBBYEFGYgIECdrhTsmgCKpVM0RHeC +kFUmMB8GA1UdIwQYMBaAFGYgIECdrhTsmgCKpVM0RHeCkFUmMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQELBQADggEBACsiuHFQjqOglenp/fcNbU034m/vvkyV +SZXau9amXBWdeTEpc1HaPOYO7jFFnu/QoH6AbGZkpL0yWZJA2rf102AkOdAe6E0g +2H77/hHoHVCfxOiOl3+icsLXJ4VXqV2vmUOEVnWfHRtej4My6avT9uCNMO2bw9hm +56RAZrs82T9Mpg/1XQ9YUO1q4/JfP/+dCzPXAdwJ/h2cJ/q6Q9g1gRns8IzVlGOZ +0ZBQCLqLl8vUei+t6YgjyBbeNCz4CEcmXKIJeqMB1jhpsgr6BBMTNTU2Q60b9fzU +OCGLw94EnKYtHWGy2WHMFNbwkNCR0/jwhxKkU0HXy1aNMUBWp99M7P8= +-----END CERTIFICATE----- diff --git a/examples/tls-certs/new/server_CA1_1.key b/examples/tls-certs/new/server_CA1_1.key new file mode 100644 index 0000000..e0402b2 --- /dev/null +++ b/examples/tls-certs/new/server_CA1_1.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEA2FFfpxEqImd01A9Q+ccTRDroVpz840ektXr45V0RQkpz8zSu +Iv5GXPqBXwSgKXsojoLkCYK+VmlX4GQ6xXblAKAd/flUS+WVsUq9kL9cud30dwYK +h2V4/Tm/NvUiZsYV3b5/8RfUpYwVNBW/eScbNXrVHNkiBrcIJtixruKsyH+drckP +7K4j+AZh43LGsK6NY+ppf5wHBctGWFOCFdJSrabck4oem807COKX9PhTfD87OnjB +QcqdHkus8WZP/SGnZV+6c1k0SN4O0E4MahpWkr8D2ZjsbhGFIW8AU4NdobsohClW +AZ0MDR1N4oo0sj4HgY2hGR2AbR/5Y2LH4kRcpQIDAQABAoIBAEK2tf1cedYqegl8 +v8iI8RQ15rnvqL6ftdiSmHiEf3ImbCQxtxLrwN+kEoovbwXcCeIJ1DJqtDEKRCPc +RZPo2y+aMiXF442UvNn05wnhOsPIBEFBB7ZCQVI3oRVd/MIdjVjaC7NbWiXEUjXC +D09aFDYmL9u5y5iukkEIy6PYHNmokN0MlHwhFqqp72hGe6UvHfZ6yu46z1eF6zLN +S4b2ULUzJ6Ov0Y7kmN7vP058yfZYHoj4TPeRBDm3Qx8g9c5d6da22vfkt61UzXEN +ih8fIejq6BGila2wMuZKyCM/Oxv5WX0RTzVQO13+42f29BM47Mdk/a8ijBZCzXnC +oAnHcwECgYEA7Isah3VNc4KkSNRrnV1UrInQ8BAlNLTN4cJTbyOkogCUECvfzAS+ +K/l8YZOzZ7YoJkK7RzDeUqRfrZhyJut6x7J/3Vl6qLXpnx3iEPJdxaD5L1iftnIP +NOytbphClO+VAjSO3frhlCwZ00Z6o6meTV+CNmRT2LDFEzxAMc3GtrECgYEA6hxh +m3S5KX7Ze/m5v9l4vi2iGDNBJkk48Cc+qfgVLGa0TSd7cY+8bjYNufr6vqThKlVu +RByZ3Wo5C5PfrkU69YbJ9LnQ+RTZPu+IxPIsUM3xlyTin7bufyOcWhPr1820MKqP +A/mRJ/SKel7ubrURai7KDETR0mI9XajhtwF/qjUCgYEAvW1sclwTCVTuwVAzWhM6 +0u2PACC92uaMFaYscM1nc0DpUcYA8/48WTTzUaUZwA1VO8am+Yz+DcqKwJdbmyVq +7u9YjGey3dbIX19sAcxGIhUWWL8tL8tJuEVtYirW7zSp7NkwLD5UVfe3OsWvQs97 +8VRyD6LqrpZpTE0sz3WOFBECgYAxgOLa3mmw7pPKdVnjyXaQsFGQUHY8REt37LSB +eGXxx53kmq6tqrkrjN6GLx4KZg7+xqXUXT/j4+xAGHq5/QWkmWXnC8u2f8QYXMpM +6vCX/ZRSY4hQQXxZAgyzt3atYV/y0n3/VyxsiHcnvR8p5bvS+iXbRkof9IoJXgas +jfKS6QKBgQC6ZFuvYIeqkfZ0Yyxxum3qlGxpR41wcuIpb4hBQ0gr1haTL0aaoUiQ +qqUfzVRst/oPxf6vqeCxtWh1/3lGa1QXP9KJDA5twFMqTg5jv92vjMIgPTEZ2Oif ++YyTs72V197KHctx2/T4RxAGhxCLJwDzk2shvLS+1voU/w40YRy9yA== +-----END RSA PRIVATE KEY----- diff --git a/examples/tls-certs/new/server_CA1_1.pem b/examples/tls-certs/new/server_CA1_1.pem new file mode 100644 index 0000000..1a55213 --- /dev/null +++ b/examples/tls-certs/new/server_CA1_1.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDWzCCAkMCFFTJkICEIidmnrisIFxZ99KKLhDIMA0GCSqGSIb3DQEBCwUAMGox +CzAJBgNVBAYTAkRFMQswCQYDVQQIDAJCVzERMA8GA1UEBwwIRnJlaWJ1cmcxGzAZ +BgNVBAoMEk1aIEF1dG9tYXRpb24gR21iSDEMMAoGA1UECwwDUiZEMRAwDgYDVQQD +DAdyb290X0NBMB4XDTIyMDUyNjEwNDc0NFoXDTMwMDgxMjEwNDc0NFowajELMAkG +A1UEBhMCREUxCzAJBgNVBAgMAkJXMREwDwYDVQQHDAhGcmVpYnVyZzEbMBkGA1UE +CgwSTVogQXV0b21hdGlvbiBHbWJIMQwwCgYDVQQLDANSJkQxEDAOBgNVBAMMB3Nl +cnZlcjEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDYUV+nESoiZ3TU +D1D5xxNEOuhWnPzjR6S1evjlXRFCSnPzNK4i/kZc+oFfBKApeyiOguQJgr5WaVfg +ZDrFduUAoB39+VRL5ZWxSr2Qv1y53fR3BgqHZXj9Ob829SJmxhXdvn/xF9SljBU0 +Fb95Jxs1etUc2SIGtwgm2LGu4qzIf52tyQ/sriP4BmHjcsawro1j6ml/nAcFy0ZY +U4IV0lKtptyTih6bzTsI4pf0+FN8Pzs6eMFByp0eS6zxZk/9IadlX7pzWTRI3g7Q +TgxqGlaSvwPZmOxuEYUhbwBTg12huyiEKVYBnQwNHU3iijSyPgeBjaEZHYBtH/lj +YsfiRFylAgMBAAEwDQYJKoZIhvcNAQELBQADggEBANPRnvfByVoKwfMcQYUnYT6l +5OhYt8f2tQfoa0EXirP0O2xG052ZBl3Z5ZzBCcsq1zveaPoeqXFl6HjqIqURB5NS +imJIi7kB7o6C2z19yxOndPm3urKGyfvxtSy2iyzTMZ8eL8RFMJC5DVV+n5Y+1EgC +pYIu//I0ojnFOemEJXVjfxQhiUbx6Nw8HalHOhW1i017XcOWMKji/lwHfWF2PFmn +pIWZCFPCUtHzBUkXCRzn9ESeMDcMXN6qLb2wGJkRUDw+Ls1RGJd6dnB811vOuOd+ +QQc8lyyBZ1byARcxQ8lAtof6Mv7Yzebv1OxRr7NcrV/+ujnSFyJWKrJdcMx7+10= +-----END CERTIFICATE----- diff --git a/examples/tls-certs/new/server_CA1_1.pfx b/examples/tls-certs/new/server_CA1_1.pfx new file mode 100644 index 0000000000000000000000000000000000000000..2fb59ec8c59d124319533dc8baa51070d687cd60 GIT binary patch literal 2461 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 Date: Mon, 28 Oct 2024 18:35:02 +0000 Subject: [PATCH 15/83] - updated TLS examples --- examples/cs104-client1/Program.cs | 6 +-- examples/cs104-tls-client/Program.cs | 26 +++++-------- .../cs104-tls-client/cs104-tls-client.csproj | 27 ++++++-------- examples/cs104-tls-server/Program.cs | 24 +++++------- .../cs104-tls-server/cs104-tls-server.csproj | 35 ++++++++---------- examples/tls-certs/new/client_CA1_1.pfx | Bin 0 -> 2461 bytes lib60870/CS104/Connection.cs | 5 +-- lib60870/CS104/Server.cs | 7 +--- 8 files changed, 53 insertions(+), 77 deletions(-) create mode 100644 examples/tls-certs/new/client_CA1_1.pfx diff --git a/examples/cs104-client1/Program.cs b/examples/cs104-client1/Program.cs index ff0d697..417c742 100644 --- a/examples/cs104-client1/Program.cs +++ b/examples/cs104-client1/Program.cs @@ -142,10 +142,10 @@ public static void Main (string[] args) { Console.WriteLine ("Using lib60870.NET version " + LibraryCommon.GetLibraryVersionString ()); - Connection con = new Connection ("192.168.2.222"); + Connection con = new Connection ("127.0.0.1"); - con.LocalIpAddress = "192.168.2.244"; - con.LocalTcpPort = 22222; + //con.LocalIpAddress = "192.168.2.244"; + //con.LocalTcpPort = 22222; con.DebugOutput = false; diff --git a/examples/cs104-tls-client/Program.cs b/examples/cs104-tls-client/Program.cs index 6144ef3..7c68d0f 100644 --- a/examples/cs104-tls-client/Program.cs +++ b/examples/cs104-tls-client/Program.cs @@ -126,42 +126,35 @@ public static void Main (string[] args) Console.WriteLine("Using hostname: " + hostname); } - - - Console.WriteLine ("Using lib60870.NET version " + LibraryCommon.GetLibraryVersionString ()); // Own certificate has to be a pfx file that contains the private key - X509Certificate2 ownCertificate = new X509Certificate2 ("client1.pfx"); + X509Certificate2 ownCertificate = new X509Certificate2 ("client_CA1_1.pfx"); // Create a new security information object to configure TLS TlsSecurityInformation secInfo = new TlsSecurityInformation (null, ownCertificate); // Add allowed server certificates - not required when AllowOnlySpecificCertificates == false - secInfo.AddAllowedCertificate (new X509Certificate2 ("server.cer")); + secInfo.AddAllowedCertificate (new X509Certificate2 ("server_CA1_1.pem")); // Add a CA certificate to check the certificate provided by the server - not required when ChainValidation == false - secInfo.AddCA (new X509Certificate2 ("root.cer")); + secInfo.AddCA (new X509Certificate2 ("root_CA1.pem")); - SslProtocols tlsVersion = SslProtocols.Tls12; + // Check if the certificate is signed by a provided CA + secInfo.ChainValidation = false; - // Check if the certificate is signed by a provided CA - secInfo.ChainValidation = true; - - secInfo.TlsVersion = tlsVersion; + secInfo.TlsVersion = SslProtocols.Tls12 | SslProtocols.Tls13; // Check that the shown server certificate is in the list of allowed certificates secInfo.AllowOnlySpecificCertificates = true; - Connection con = new Connection (hostname); - con.LocalIpAddress = "127.0.0.1"; - con.LocalTcpPort = 2404; + Connection con = new Connection (hostname, 19998); + // Set security information object, this will force the connection using TLS (using TCP port 19998) con.SetTlsSecurity (secInfo); con.DebugOutput = true; - con.SetASDUReceivedHandler (asduReceivedHandler, null); con.SetConnectionHandler (ConnectionHandler, null); @@ -186,8 +179,7 @@ public static void Main (string[] args) /* Synchronize clock of the controlled station */ con.SendClockSyncCommand (1 /* CA */, new CP56Time2a (DateTime.Now)); - - + Console.WriteLine ("CLOSE"); con.Close (); diff --git a/examples/cs104-tls-client/cs104-tls-client.csproj b/examples/cs104-tls-client/cs104-tls-client.csproj index 17c91f3..9c970c8 100644 --- a/examples/cs104-tls-client/cs104-tls-client.csproj +++ b/examples/cs104-tls-client/cs104-tls-client.csproj @@ -1,5 +1,17 @@  + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + @@ -12,19 +24,4 @@ enable - - - client1.pfx - PreserveNewest - - - root.cer - PreserveNewest - - - server.cer - PreserveNewest - - - \ No newline at end of file diff --git a/examples/cs104-tls-server/Program.cs b/examples/cs104-tls-server/Program.cs index 44cf317..c855098 100644 --- a/examples/cs104-tls-server/Program.cs +++ b/examples/cs104-tls-server/Program.cs @@ -1,9 +1,5 @@ -using System; -using System.Security.Cryptography.X509Certificates; -using System.Net.Security; -using System.Net; +using System.Security.Cryptography.X509Certificates; using System.Security.Authentication; -using System.Threading; using lib60870; using lib60870.CS101; @@ -11,7 +7,7 @@ namespace cs104_tls_server { - class MainClass + class MainClass { private static bool interrogationHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qoi) @@ -116,26 +112,26 @@ public static void Main (string[] args) }; // Own certificate has to be a pfx file that contains the private key - X509Certificate2 ownCertificate = new X509Certificate2 ("server.pfx"); + X509Certificate2 ownCertificate = new X509Certificate2 ("server_CA1_1.pfx"); // Create a new security information object to configure TLS TlsSecurityInformation secInfo = new TlsSecurityInformation (ownCertificate); // Add allowed client certificates - not required when AllowOnlySpecificCertificates == false - secInfo.AddAllowedCertificate (new X509Certificate2 ("client1.cer")); - secInfo.AddAllowedCertificate (new X509Certificate2 ("client2.cer")); + secInfo.AddAllowedCertificate (new X509Certificate2 ("client_CA1_1.pem")); + secInfo.AddAllowedCertificate (new X509Certificate2 ("client_CA1_2.pem")); - SslProtocols tlsVersion = SslProtocols.Tls11; - // Add a CA certificate to check the certificate provided by the server - not required when ChainValidation == false - secInfo.AddCA (new X509Certificate2 ("root.cer")); + // Add a CA certificate to check the certificate provided by the server - not required when ChainValidation == false + secInfo.AddCA (new X509Certificate2 ("root_CA1.pem")); // Check if the certificate is signed by a provided CA secInfo.ChainValidation = true; - secInfo.TlsVersion = tlsVersion; + // Allow only TLS versions 1.2 and 1.3 + secInfo.TlsVersion = SslProtocols.Tls12 | SslProtocols.Tls13; // Check that the shown client certificate is in the list of allowed certificates - secInfo.AllowOnlySpecificCertificates = true; + secInfo.AllowOnlySpecificCertificates = false; // Use constructor with security information object, this will force the connection using TLS (using TCP port 19998) Server server = new Server (secInfo); diff --git a/examples/cs104-tls-server/cs104-tls-server.csproj b/examples/cs104-tls-server/cs104-tls-server.csproj index 401c5c1..b53261d 100644 --- a/examples/cs104-tls-server/cs104-tls-server.csproj +++ b/examples/cs104-tls-server/cs104-tls-server.csproj @@ -1,5 +1,21 @@  + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + @@ -12,23 +28,4 @@ enable - - - client1.cer - PreserveNewest - - - client2.cer - PreserveNewest - - - root.cer - PreserveNewest - - - server.pfx - PreserveNewest - - - \ No newline at end of file diff --git a/examples/tls-certs/new/client_CA1_1.pfx b/examples/tls-certs/new/client_CA1_1.pfx new file mode 100644 index 0000000000000000000000000000000000000000..f2437b281ee4422bffd308070cacedf71b9bf4f5 GIT binary patch literal 2461 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 Date: Fri, 22 Nov 2024 15:08:06 +0000 Subject: [PATCH 16/83] - updated CHANGELOG --- CHANGELOG | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 9b75587..b36fa5b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -5,6 +5,8 @@ Changes to version 2.3.0 - changed examples target frameworks to .NET 6 - Added copy constructors for messages types in monitoring direction - CS104 client: Allow setting of local IP address and TCP port (to allow redundancy setups) +- Allow user to set TLS version +- Updated TLS client/server examples Changes to version 2.2.0 ------------------------ From 994bac282046761ac20a35fdfcf332b9de519f99 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 22 Nov 2024 15:45:29 +0000 Subject: [PATCH 17/83] - CS104 server: added code to send outstanding S-message when STOPDT-ACT is received (LIB8705-97) --- lib60870/CS104/ClientConnection.cs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lib60870/CS104/ClientConnection.cs b/lib60870/CS104/ClientConnection.cs index 7a600e3..77b8fb8 100644 --- a/lib60870/CS104/ClientConnection.cs +++ b/lib60870/CS104/ClientConnection.cs @@ -953,7 +953,6 @@ private bool HandleMessage(byte[] buffer, int msgSize) if ((buffer[2] & 1) == 0) { - if (msgSize < 7) { DebugLog("I msg too small!"); @@ -1015,7 +1014,6 @@ private bool HandleMessage(byte[] buffer, int msgSize) // Check for TESTFR_ACT message else if ((buffer[2] & 0x43) == 0x43) { - DebugLog("Send TESTFR_CON"); socketStream.Write(TESTFR_CON_MSG, 0, TESTFR_CON_MSG.Length); @@ -1024,7 +1022,6 @@ private bool HandleMessage(byte[] buffer, int msgSize) // Check for STARTDT_ACT message else if ((buffer[2] & 0x07) == 0x07) { - DebugLog("Send STARTDT_CON"); if (this.isActive == false) @@ -1040,7 +1037,14 @@ private bool HandleMessage(byte[] buffer, int msgSize) // Check for STOPDT_ACT message else if ((buffer[2] & 0x13) == 0x13) { - + if (unconfirmedReceivedIMessages > 0) + { + lastConfirmationTime = currentTime; + unconfirmedReceivedIMessages = 0; + timeoutT2Triggered = false; + SendSMessage(); + } + DebugLog("Send STOPDT_CON"); if (this.isActive == true) @@ -1080,7 +1084,6 @@ private bool HandleMessage(byte[] buffer, int msgSize) if (CheckSequenceNumber(seqNo) == false) return false; - } else { From 5198e23c3035b353ebce883eeec1ce1b51d56e60 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 22 Nov 2024 15:53:23 +0000 Subject: [PATCH 18/83] - code format updates --- examples/cs104-server/Program.cs | 23 +++++++++++------------ lib60870/CS104/Server.cs | 8 -------- 2 files changed, 11 insertions(+), 20 deletions(-) diff --git a/examples/cs104-server/Program.cs b/examples/cs104-server/Program.cs index ca1090e..f9ae06c 100644 --- a/examples/cs104-server/Program.cs +++ b/examples/cs104-server/Program.cs @@ -1,18 +1,13 @@ // This example shows how to send periodic messages and handle commands from clients -using System; -using System.Net; -using System.Net.Sockets; -using System.Threading; - using lib60870; using lib60870.CS101; using lib60870.CS104; namespace cs104_server { - - class MainClass + + class MainClass { private static bool interrogationHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qoi) { @@ -83,8 +78,10 @@ private static bool interrogationHandler(object parameter, IMasterConnection con private static bool asduHandler(object parameter, IMasterConnection connection, ASDU asdu) { - - if (asdu.TypeId == TypeID.C_SC_NA_1) { + Console.WriteLine("ASDU received:" + asdu.ToString()); + + if (asdu.TypeId == TypeID.C_SC_NA_1) + { Console.WriteLine ("Single command"); SingleCommand sc = (SingleCommand)asdu.GetElement (0); @@ -102,7 +99,8 @@ private static bool asduHandler(object parameter, IMasterConnection connection, connection.SendACT_CON(asdu, false); } - else if (asdu.TypeId == TypeID.C_CS_NA_1){ + else if (asdu.TypeId == TypeID.C_CS_NA_1) + { ClockSynchronizationCommand qsc = (ClockSynchronizationCommand)asdu.GetElement (0); Console.WriteLine ("Received clock sync command with time " + qsc.NewTime.ToString()); @@ -157,7 +155,8 @@ public static void Main (string[] args) int waitTime = 1000; - while (running && server.IsRunning()) { + while (running && server.IsRunning()) + { Thread.Sleep(100); if (waitTime > 0) @@ -170,7 +169,7 @@ public static void Main (string[] args) server.EnqueueASDU (newAsdu); - waitTime = 1000; + waitTime = 30000; } } diff --git a/lib60870/CS104/Server.cs b/lib60870/CS104/Server.cs index d5a205a..b39ab58 100644 --- a/lib60870/CS104/Server.cs +++ b/lib60870/CS104/Server.cs @@ -164,7 +164,6 @@ public void EnqueueAsdu(ASDU asdu) { lock (enqueuedASDUs) { - if (oldestQueueEntry == -1) { oldestQueueEntry = 0; @@ -238,12 +237,10 @@ public BufferFrame GetNextWaitingASDU(out long timestamp, out int index) if (numberOfAsduInQueue > 0) { - int currentIndex = oldestQueueEntry; while (enqueuedASDUs[currentIndex].state != QueueEntryState.WAITING_FOR_TRANSMISSION) { - if (enqueuedASDUs[currentIndex].state == QueueEntryState.NOT_USED) break; @@ -293,21 +290,16 @@ public void MarkASDUAsConfirmed(int index, long timestamp) lock (enqueuedASDUs) { - if (numberOfAsduInQueue > 0) { - if (enqueuedASDUs[index].state == QueueEntryState.SENT_BUT_NOT_CONFIRMED) { - if (enqueuedASDUs[index].entryTimestamp == timestamp) { - int currentIndex = index; while (enqueuedASDUs[currentIndex].state == QueueEntryState.SENT_BUT_NOT_CONFIRMED) { - DebugLog("Remove from queue with index " + currentIndex); enqueuedASDUs[currentIndex].state = QueueEntryState.NOT_USED; From 665ac133aed473ab21f33d5aef8852cec02c5b28 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 6 Dec 2024 17:55:21 +0000 Subject: [PATCH 19/83] - Add methods to support RawMessageHandler to CS101Slave (L870NET-20) --- lib60870/CS101/CS101Slave.cs | 25 ++++++++++++++++++++----- lib60870/CS101/Master.cs | 1 - lib60870/CS101/Slave.cs | 9 ++------- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/lib60870/CS101/CS101Slave.cs b/lib60870/CS101/CS101Slave.cs index dea1967..f413e27 100644 --- a/lib60870/CS101/CS101Slave.cs +++ b/lib60870/CS101/CS101Slave.cs @@ -1,7 +1,7 @@ /* * CS101Slave.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2024 Michael Zillgith * * This file is part of lib60870.NET * @@ -407,10 +407,8 @@ internal void SendASDU(ASDU asdu) EnqueueUserDataClass1(asdu); } - private bool HandleApplicationLayer(int address, byte[] msg, int userDataStart, int userDataLength) { - ASDU asdu; try @@ -427,7 +425,6 @@ private bool HandleApplicationLayer(int address, byte[] msg, int userDataStart, switch (asdu.TypeId) { - case TypeID.C_IC_NA_1: /* 100 - interrogation command */ DebugLog("Rcvd interrogation command C_IC_NA_1"); @@ -717,7 +714,25 @@ public override int FileTimeout } } - } + /// + /// Sets the raw message handler for received messages + /// + /// Handler/delegate that will be invoked when a message is received + /// will be passed to the delegate + public void SetReceivedRawMessageHandler(RawMessageHandler handler, object parameter) + { + linkLayer.SetReceivedRawMessageHandler(handler, parameter); + } + /// + /// Sets the sent message handler for sent messages. + /// + /// Handler/delegate that will be invoked when a message is sent< + /// will be passed to the delegate + public void SetSentRawMessageHandler(RawMessageHandler handler, object parameter) + { + linkLayer.SetSentRawMessageHandler(handler, parameter); + } + } } } diff --git a/lib60870/CS101/Master.cs b/lib60870/CS101/Master.cs index 27a5d0b..f8cb9a1 100644 --- a/lib60870/CS101/Master.cs +++ b/lib60870/CS101/Master.cs @@ -190,7 +190,6 @@ public bool DebugOutput /// Handler/delegate that will be invoked when a message is sent< /// will be passed to the delegate public abstract void SetSentRawMessageHandler(RawMessageHandler handler, object parameter); - } } diff --git a/lib60870/CS101/Slave.cs b/lib60870/CS101/Slave.cs index e5c3d05..acc84a6 100644 --- a/lib60870/CS101/Slave.cs +++ b/lib60870/CS101/Slave.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2024 Michael Zillgith * * This file is part of lib60870.NET * @@ -19,7 +19,6 @@ * See COPYING file for the complete license text. */ - using System; namespace lib60870.CS101 @@ -31,7 +30,6 @@ public ASDUQueueException() { } - public ASDUQueueException(string message) : base(message) { @@ -40,7 +38,6 @@ public ASDUQueueException(string message) public ASDUQueueException(string message, Exception innerException) : base(message, innerException) { - } } @@ -94,9 +91,8 @@ public interface IMasterConnection /// public delegate bool ASDUHandler(object parameter,IMasterConnection connection,ASDU asdu); - public class Slave + public abstract class Slave { - protected bool debugOutput; public bool DebugOutput @@ -231,6 +227,5 @@ public FilesAvailable GetAvailableFiles() /// The file service timeout in ms public virtual int FileTimeout { get; set; } } - } From 898c99517c2e4f4f9dc72df0bbd41ac6b10c10d4 Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Wed, 8 Jan 2025 15:30:16 +0100 Subject: [PATCH 20/83] CS104 slave: check IOA of received commands where IOA is fixed to 0 --- lib60870.NET.sln | 20 --- lib60870/CS104/ClientConnection.cs | 190 ++++++++++++++++++++++++----- 2 files changed, 162 insertions(+), 48 deletions(-) diff --git a/lib60870.NET.sln b/lib60870.NET.sln index fe42449..0f3ec11 100644 --- a/lib60870.NET.sln +++ b/lib60870.NET.sln @@ -43,10 +43,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cs104-redundancy-server", " EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cs104-client-file-upload", "examples\cs104-client-file-upload\cs104-client-file-upload.csproj", "{8DAC3BE2-E1C9-4E12-BF11-70FFBAE4C888}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cs104-server4", "examples\cs104-server4\cs104-server4.csproj", "{7A8DD7FA-3248-4DA4-8A6E-3BF673D2C6FE}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cs104-server5", "examples\cs104-server5\cs104-server5.csproj", "{E510D4EA-5C1A-4343-8BA7-4E4C941B2CB8}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -177,22 +173,6 @@ Global {8DAC3BE2-E1C9-4E12-BF11-70FFBAE4C888}.Release|Any CPU.ActiveCfg = Release|x86 {8DAC3BE2-E1C9-4E12-BF11-70FFBAE4C888}.Release|x86.ActiveCfg = Release|x86 {8DAC3BE2-E1C9-4E12-BF11-70FFBAE4C888}.Release|x86.Build.0 = Release|x86 - {7A8DD7FA-3248-4DA4-8A6E-3BF673D2C6FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7A8DD7FA-3248-4DA4-8A6E-3BF673D2C6FE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7A8DD7FA-3248-4DA4-8A6E-3BF673D2C6FE}.Debug|x86.ActiveCfg = Debug|Any CPU - {7A8DD7FA-3248-4DA4-8A6E-3BF673D2C6FE}.Debug|x86.Build.0 = Debug|Any CPU - {7A8DD7FA-3248-4DA4-8A6E-3BF673D2C6FE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7A8DD7FA-3248-4DA4-8A6E-3BF673D2C6FE}.Release|Any CPU.Build.0 = Release|Any CPU - {7A8DD7FA-3248-4DA4-8A6E-3BF673D2C6FE}.Release|x86.ActiveCfg = Release|Any CPU - {7A8DD7FA-3248-4DA4-8A6E-3BF673D2C6FE}.Release|x86.Build.0 = Release|Any CPU - {E510D4EA-5C1A-4343-8BA7-4E4C941B2CB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E510D4EA-5C1A-4343-8BA7-4E4C941B2CB8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E510D4EA-5C1A-4343-8BA7-4E4C941B2CB8}.Debug|x86.ActiveCfg = Debug|Any CPU - {E510D4EA-5C1A-4343-8BA7-4E4C941B2CB8}.Debug|x86.Build.0 = Debug|Any CPU - {E510D4EA-5C1A-4343-8BA7-4E4C941B2CB8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E510D4EA-5C1A-4343-8BA7-4E4C941B2CB8}.Release|Any CPU.Build.0 = Release|Any CPU - {E510D4EA-5C1A-4343-8BA7-4E4C941B2CB8}.Release|x86.ActiveCfg = Release|Any CPU - {E510D4EA-5C1A-4343-8BA7-4E4C941B2CB8}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/lib60870/CS104/ClientConnection.cs b/lib60870/CS104/ClientConnection.cs index a5eb9fc..b321a32 100644 --- a/lib60870/CS104/ClientConnection.cs +++ b/lib60870/CS104/ClientConnection.cs @@ -32,6 +32,7 @@ using lib60870; using lib60870.CS101; using System.Collections.Concurrent; +using System.Diagnostics.Eventing.Reader; namespace lib60870.CS104 { @@ -655,7 +656,7 @@ private void HandleASDU(ASDU asdu) case TypeID.C_IC_NA_1: /* 100 - interrogation command */ - DebugLog("Rcvd interrogation command C_IC_NA_1"); + DebugLog("Rcvd interrogation command C_IC_NA_1\n"); if ((asdu.Cot == CauseOfTransmission.ACTIVATION) || (asdu.Cot == CauseOfTransmission.DEACTIVATION)) { @@ -664,22 +665,35 @@ private void HandleASDU(ASDU asdu) InterrogationCommand irc = (InterrogationCommand)asdu.GetElement(0); - if (server.interrogationHandler(server.InterrogationHandlerParameter, this, asdu, irc.QOI)) - messageHandled = true; + if (irc != null) + { + /* Verify IOA = 0 */ + if (irc.ObjectAddress != 0) + { + DebugLog("CS104 SLAVE: interrogation command has invalid IOA - should be 0\n"); + asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; + messageHandled = true; + } + else + { + if (server.interrogationHandler(server.InterrogationHandlerParameter, this, asdu, irc.QOI)) + messageHandled = true; + } + } } } else { asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; asdu.IsNegative = true; - this.SendASDUInternal(asdu); + messageHandled = true; } break; case TypeID.C_CI_NA_1: /* 101 - counter interrogation command */ - DebugLog("Rcvd counter interrogation command C_CI_NA_1"); + DebugLog("Rcvd counter interrogation command C_CI_NA_1\n"); if ((asdu.Cot == CauseOfTransmission.ACTIVATION) || (asdu.Cot == CauseOfTransmission.DEACTIVATION)) { @@ -688,8 +702,21 @@ private void HandleASDU(ASDU asdu) CounterInterrogationCommand cic = (CounterInterrogationCommand)asdu.GetElement(0); - if (server.counterInterrogationHandler(server.counterInterrogationHandlerParameter, this, asdu, cic.QCC)) - messageHandled = true; + if (cic != null) + { + /* Verify IOA = 0 */ + if (cic.ObjectAddress != 0) + { + DebugLog("CS104 SLAVE: counter interrogation command has invalid IOA - should be 0\n"); + asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; + messageHandled = true; + } + else + { + if (server.interrogationHandler(server.InterrogationHandlerParameter, this, asdu, cic.QCC)) + messageHandled = true; + } + } } } else @@ -703,7 +730,7 @@ private void HandleASDU(ASDU asdu) case TypeID.C_RD_NA_1: /* 102 - read command */ - DebugLog("Rcvd read command C_RD_NA_1"); + DebugLog("Rcvd read command C_RD_NA_1\n"); if (asdu.Cot == CauseOfTransmission.REQUEST) { @@ -714,11 +741,12 @@ private void HandleASDU(ASDU asdu) { ReadCommand rc = (ReadCommand)asdu.GetElement(0); - if (server.readHandler(server.readHandlerParameter, this, asdu, rc.ObjectAddress)) - messageHandled = true; - + if (rc != null) + { + if (server.readHandler(server.readHandlerParameter, this, asdu, rc.ObjectAddress)) + messageHandled = true; + } } - } else { @@ -731,7 +759,7 @@ private void HandleASDU(ASDU asdu) case TypeID.C_CS_NA_1: /* 103 - Clock synchronization command */ - DebugLog("Rcvd clock sync command C_CS_NA_1"); + DebugLog("Rcvd clock sync command C_CS_NA_1\n"); if (asdu.Cot == CauseOfTransmission.ACTIVATION) { @@ -741,9 +769,35 @@ private void HandleASDU(ASDU asdu) ClockSynchronizationCommand csc = (ClockSynchronizationCommand)asdu.GetElement(0); - if (server.clockSynchronizationHandler(server.clockSynchronizationHandlerParameter, - this, asdu, csc.NewTime)) + if (csc != null) + { + /* Verify IOA = 0 */ + if (csc.ObjectAddress != 0) + { + DebugLog("CS104 SLAVE: Clock synchronization command has invalid IOA - should be 0\n"); + asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; + } + else + { + if (server.clockSynchronizationHandler(server.clockSynchronizationHandlerParameter, + this, asdu, csc.NewTime)) + { + csc.ObjectAddress = 0; + asdu.AddInformationObject(csc); + asdu.Cot = CauseOfTransmission.ACTIVATION_CON; + this.SendASDUInternal(asdu); + } + else + { + asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; + asdu.IsNegative = true; + this.SendASDUInternal(asdu); + } + + } + messageHandled = true; + } } } @@ -752,31 +806,49 @@ private void HandleASDU(ASDU asdu) asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; asdu.IsNegative = true; this.SendASDUInternal(asdu); + messageHandled = true; } break; case TypeID.C_TS_NA_1: /* 104 - test command */ - DebugLog("Rcvd test command C_TS_NA_1"); + DebugLog("Rcvd test command C_TS_NA_1\n"); if (asdu.Cot != CauseOfTransmission.ACTIVATION) { asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; asdu.IsNegative = true; } - else - asdu.Cot = CauseOfTransmission.ACTIVATION_CON; + else if (asdu.Cot == CauseOfTransmission.ACTIVATION_CON) + { + TestCommand tc = (TestCommand)asdu.GetElement(0); - this.SendASDUInternal(asdu); + if (tc.ObjectAddress != 0) + { + DebugLog("CS104 SLAVE: interrogation command has invalid IOA - should be 0\n"); + asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; + } + else + { + asdu.Cot = CauseOfTransmission.ACTIVATION_CON; + this.SendASDUInternal(asdu); + } + + messageHandled = true; + } + else + { + asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; + messageHandled = true; + } - messageHandled = true; break; case TypeID.C_RP_NA_1: /* 105 - Reset process command */ - DebugLog("Rcvd reset process command C_RP_NA_1"); + DebugLog("Rcvd reset process command C_RP_NA_1\n"); if (asdu.Cot == CauseOfTransmission.ACTIVATION) { @@ -786,9 +858,21 @@ private void HandleASDU(ASDU asdu) ResetProcessCommand rpc = (ResetProcessCommand)asdu.GetElement(0); - if (server.resetProcessHandler(server.resetProcessHandlerParameter, - this, asdu, rpc.QRP)) - messageHandled = true; + if (rpc != null) + { + /* Verify IOA = 0 */ + if (rpc.ObjectAddress != 0) + { + DebugLog("CS104 SLAVE: interrogation command has invalid IOA - should be 0\n"); + asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; + messageHandled = true; + } + else + { + if (server.interrogationHandler(server.InterrogationHandlerParameter, this, asdu, rpc.QRP)) + messageHandled = true; + } + } } } @@ -796,6 +880,7 @@ private void HandleASDU(ASDU asdu) { asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; asdu.IsNegative = true; + messageHandled = true; this.SendASDUInternal(asdu); } @@ -804,7 +889,7 @@ private void HandleASDU(ASDU asdu) case TypeID.C_CD_NA_1: /* 106 - Delay acquisition command */ - DebugLog("Rcvd delay acquisition command C_CD_NA_1"); + DebugLog("Rcvd delay acquisition command C_CD_NA_1\n"); if ((asdu.Cot == CauseOfTransmission.ACTIVATION) || (asdu.Cot == CauseOfTransmission.SPONTANEOUS)) { @@ -813,18 +898,67 @@ private void HandleASDU(ASDU asdu) DelayAcquisitionCommand dac = (DelayAcquisitionCommand)asdu.GetElement(0); - if (server.delayAcquisitionHandler(server.delayAcquisitionHandlerParameter, - this, asdu, dac.Delay)) - messageHandled = true; + if (dac != null) + { + /* Verify IOA = 0 */ + if (dac.ObjectAddress != 0) + { + DebugLog("CS104 SLAVE: interrogation command has invalid IOA - should be 0\n"); + asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; + messageHandled = true; + } + else + { + if (server.delayAcquisitionHandler(server.delayAcquisitionHandlerParameter, + this, asdu, dac.Delay)) + messageHandled = true; + } + } } } else { asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; asdu.IsNegative = true; + messageHandled = true; this.SendASDUInternal(asdu); } + break; + + case TypeID.C_TS_TA_1: /* 107 - test command with timestamp */ + + DebugLog("Rcvd test command with CP56Time2a C_TS_TA_1\n"); + + if (asdu.Cot != CauseOfTransmission.ACTIVATION) + { + asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; + asdu.IsNegative = true; + } + else if (asdu.Cot == CauseOfTransmission.ACTIVATION_CON) + { + TestCommandWithCP56Time2a tc = (TestCommandWithCP56Time2a)asdu.GetElement(0); + + if (tc.ObjectAddress != 0) + { + DebugLog("CS104 SLAVE: interrogation command has invalid IOA - should be 0\n"); + asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; + } + else + { + asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; + asdu.IsNegative = true; + } + + messageHandled = true; + } + else + { + asdu.Cot = CauseOfTransmission.ACTIVATION_CON; + } + messageHandled = true; + this.SendASDUInternal(asdu); + break; } From 7b422639e41b130603d125f36dd30a3ae45da0f0 Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Wed, 8 Jan 2025 16:50:13 +0100 Subject: [PATCH 21/83] Disable support for C_TS_NA_1 for CS104 by default --- lib60870/CS104/ClientConnection.cs | 59 ++++++++++++++++-------------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/lib60870/CS104/ClientConnection.cs b/lib60870/CS104/ClientConnection.cs index b321a32..a8be337 100644 --- a/lib60870/CS104/ClientConnection.cs +++ b/lib60870/CS104/ClientConnection.cs @@ -90,6 +90,8 @@ private void DebugLog(string msg) private Server server; + private bool allowTestCommand = false; + private ConcurrentQueue receivedASDUs = null; private Thread callbackThread = null; private bool callbackThreadRunning = false; @@ -815,35 +817,43 @@ private void HandleASDU(ASDU asdu) DebugLog("Rcvd test command C_TS_NA_1\n"); - if (asdu.Cot != CauseOfTransmission.ACTIVATION) - { - asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; - asdu.IsNegative = true; - } - else if (asdu.Cot == CauseOfTransmission.ACTIVATION_CON) - { - TestCommand tc = (TestCommand)asdu.GetElement(0); + allowTestCommand = true; - if (tc.ObjectAddress != 0) + if (allowTestCommand) + { + if (asdu.Cot == CauseOfTransmission.ACTIVATION) { - DebugLog("CS104 SLAVE: interrogation command has invalid IOA - should be 0\n"); - asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; + TestCommand tc = (TestCommand)asdu.GetElement(0); + + /* Verify IOA = 0 */ + if (tc.ObjectAddress != 0) + { + DebugLog("CS104 SLAVE: test command has invalid IOA - should be 0\n"); + asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; + } + else + { + asdu.Cot = CauseOfTransmission.ACTIVATION_CON; + this.SendASDUInternal(asdu); + } + + messageHandled = true; } else { - asdu.Cot = CauseOfTransmission.ACTIVATION_CON; + asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; + asdu.IsNegative = true; + messageHandled = true; this.SendASDUInternal(asdu); } - - messageHandled = true; } else { - asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; - messageHandled = true; + /* this command is not supported/allowed for IEC 104 */ + DebugLog("CS104 SLAVE: Rcvd test command C_TS_NA_1 -> not allowed\n"); + messageHandled = false; } - - + break; case TypeID.C_RP_NA_1: /* 105 - Reset process command */ @@ -863,7 +873,7 @@ private void HandleASDU(ASDU asdu) /* Verify IOA = 0 */ if (rpc.ObjectAddress != 0) { - DebugLog("CS104 SLAVE: interrogation command has invalid IOA - should be 0\n"); + DebugLog("CS104 SLAVE: reset process command has invalid IOA - should be 0\n"); asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; messageHandled = true; } @@ -903,7 +913,7 @@ private void HandleASDU(ASDU asdu) /* Verify IOA = 0 */ if (dac.ObjectAddress != 0) { - DebugLog("CS104 SLAVE: interrogation command has invalid IOA - should be 0\n"); + DebugLog("CS104 SLAVE: delay acquisition command has invalid IOA - should be 0\n"); asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; messageHandled = true; } @@ -930,18 +940,13 @@ private void HandleASDU(ASDU asdu) DebugLog("Rcvd test command with CP56Time2a C_TS_TA_1\n"); - if (asdu.Cot != CauseOfTransmission.ACTIVATION) - { - asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; - asdu.IsNegative = true; - } - else if (asdu.Cot == CauseOfTransmission.ACTIVATION_CON) + if (asdu.Cot == CauseOfTransmission.ACTIVATION) { TestCommandWithCP56Time2a tc = (TestCommandWithCP56Time2a)asdu.GetElement(0); if (tc.ObjectAddress != 0) { - DebugLog("CS104 SLAVE: interrogation command has invalid IOA - should be 0\n"); + DebugLog("CS104 SLAVE: test command with CP56Time2a has invalid IOA - should be 0\n"); asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; } else From 8b5266f05aead08b1c022756e54857efdf8e0d46 Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Mon, 13 Jan 2025 17:14:20 +0100 Subject: [PATCH 22/83] CS101 Unbalanced Slave: updated behavior when FCB bit did not change --- .../LinkLayer/SecondaryLinkLayerUnbalanced.cs | 80 +++++++++++++++---- 1 file changed, 65 insertions(+), 15 deletions(-) diff --git a/lib60870/LinkLayer/SecondaryLinkLayerUnbalanced.cs b/lib60870/LinkLayer/SecondaryLinkLayerUnbalanced.cs index 0c712ec..32576d4 100644 --- a/lib60870/LinkLayer/SecondaryLinkLayerUnbalanced.cs +++ b/lib60870/LinkLayer/SecondaryLinkLayerUnbalanced.cs @@ -66,19 +66,20 @@ private bool CheckFCB(bool fcb) public override void HandleMessage(FunctionCodePrimary fcp, bool isBroadcast, int address, bool fcb, bool fcv, byte[] msg, int userDataStart, int userDataLength) { - // check frame count bit if fcv == true - if (fcv) - { - if (CheckFCB(fcb) == false) - return; - } - + switch (fcp) { case FunctionCodePrimary.REQUEST_LINK_STATUS: DebugLog("SLL - REQUEST LINK STATUS"); { + /* check that FCV=0 */ + if (!fcv) + { + DebugLog("SLL - REQUEST LINK STATUS failed - invalid FCV\n"); + return; + } + bool accessDemand = applicationLayer.IsClass1DataAvailable(); linkLayer.SendFixedFrameSecondary(FunctionCodeSecondary.STATUS_OF_LINK_OR_ACCESS_DEMAND, linkLayerAddress, accessDemand, false); @@ -88,6 +89,13 @@ public override void HandleMessage(FunctionCodePrimary fcp, bool isBroadcast, in case FunctionCodePrimary.RESET_REMOTE_LINK: DebugLog("SLL - RESET REMOTE LINK"); { + /* check that FCV=0 */ + if ((!fcv) || (!fcb)) + { + DebugLog("RESET REMOTE LINK failed - invalid FCV/FCB\n"); + return; + } + expectedFcb = true; if (linkLayer.linkLayerParameters.UseSingleCharACK) @@ -103,6 +111,15 @@ public override void HandleMessage(FunctionCodePrimary fcp, bool isBroadcast, in case FunctionCodePrimary.RESET_FCB: DebugLog("SLL - RESET FCB"); { + /* used by CS103 */ + + /* check that FCV=0 */ + if ((!fcv) || (!fcb)) + { + DebugLog("SLL - RESET FCB failed - invalid FCV/FCB"); + return; + } + expectedFcb = true; if (linkLayer.linkLayerParameters.UseSingleCharACK) @@ -117,6 +134,17 @@ public override void HandleMessage(FunctionCodePrimary fcp, bool isBroadcast, in case FunctionCodePrimary.REQUEST_USER_DATA_CLASS_2: DebugLog("SLL - REQUEST USER DATA CLASS 2"); { + bool invalidFCB = false; + + if (fcv) + { + if (CheckFCB(fcb) == false) + { + DebugLog("SLL - REQ UD2 - unexpected FCB\n"); + invalidFCB = true; + } + } + BufferFrame asdu = applicationLayer.GetCLass2Data(); bool accessDemand = applicationLayer.IsClass1DataAvailable(); @@ -156,23 +184,45 @@ public override void HandleMessage(FunctionCodePrimary fcp, bool isBroadcast, in case FunctionCodePrimary.USER_DATA_CONFIRMED: DebugLog("SLL - USER DATA CONFIRMED"); - if (userDataLength > 0) { - if (applicationLayer.HandleReceivedData(msg, isBroadcast, userDataStart, userDataLength)) - { + bool indicateUserData = true; - bool accessDemand = applicationLayer.IsClass1DataAvailable(); + if (fcv) + { + if (CheckFCB(fcb) == false) + { + DebugLog("SLL - FCB check failed -> ignore UD confirmed\n"); + indicateUserData = false; + } + } - linkLayer.SendFixedFrameSecondary(FunctionCodeSecondary.ACK, linkLayerAddress, accessDemand, false); + if ((indicateUserData == true) && (userDataLength) > 0) + { + applicationLayer.HandleReceivedData(msg, isBroadcast, userDataStart, userDataLength); } - } + + bool accessDemand = applicationLayer.IsClass1DataAvailable(); + + if (linkLayer.linkLayerParameters.UseSingleCharACK && !accessDemand) + linkLayer.SendSingleCharACK(); + else + linkLayer.SendFixedFrameSecondary(FunctionCodeSecondary.ACK, linkLayerAddress, false, false); + + } break; case FunctionCodePrimary.USER_DATA_NO_REPLY: DebugLog("SLL - USER DATA NO REPLY"); - if (userDataLength > 0) { - applicationLayer.HandleReceivedData(msg, isBroadcast, userDataStart, userDataLength); + if (!fcv) + { + DebugLog("SLL - USER DATA NO REPL - invalid FCV"); + return; + } + if (userDataLength > 0) + { + applicationLayer.HandleReceivedData(msg, isBroadcast, userDataStart, userDataLength); + } } break; From 77af93869e921e9fc2f2325b0adb97a19bc55f64 Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Thu, 16 Jan 2025 13:59:25 +0100 Subject: [PATCH 23/83] Latest update --- .../LinkLayer/PrimaryLinkLayerBalanced.cs | 10 +++++++ .../LinkLayer/PrimaryLinkLayerUnbalanced.cs | 26 ++++++++++++++++++- .../LinkLayer/SecondaryLinkLayerUnbalanced.cs | 1 - 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs b/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs index c73cce7..a639451 100644 --- a/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs +++ b/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs @@ -231,12 +231,22 @@ public override void RunStateMachine() sendLinkLayerTestFunction = false; newState = PrimaryLinkLayerState.EXECUTE_REQUEST_STATUS_OF_LINK; + //SendFixedFrame(self->linkLayer, LL_FC_09_REQUEST_LINK_STATUS, self->otherStationAddress, true, self->linkLayer->dir, false, false); + //self->lastSendTime = currentTime; + //self->waitingForResponse = true; + break; case PrimaryLinkLayerState.EXECUTE_REQUEST_STATUS_OF_LINK: if (waitingForResponse) { + //if (self->lastSendTime > currentTime) + //{ + // /* last sent time not plausible! */ + // self->lastSendTime = currentTime; + //} + if (SystemUtils.currentTimeMillis() > (lastSendTime + linkLayer.TimeoutForACK)) { linkLayer.SendFixedFramePrimary(FunctionCodePrimary.REQUEST_LINK_STATUS, linkLayerAddressOtherStation, false, false); diff --git a/lib60870/LinkLayer/PrimaryLinkLayerUnbalanced.cs b/lib60870/LinkLayer/PrimaryLinkLayerUnbalanced.cs index c4f8648..bb968aa 100644 --- a/lib60870/LinkLayer/PrimaryLinkLayerUnbalanced.cs +++ b/lib60870/LinkLayer/PrimaryLinkLayerUnbalanced.cs @@ -340,6 +340,20 @@ public void RunStateMachine() switch (primaryState) { + //case PLL_TIMEOUT: + // if (self->lastSendTime > currentTime) + // { + // /* last sent time not plausible! */ + // self->lastSendTime = currentTime; + + // } + + // if (currentTime > (self->lastSendTime + self->primaryLink->linkLayer->linkLayerParameters->timeoutLinkState)) + // { + // newState = PLL_IDLE; + // } + + // break; case PrimaryLinkLayerState.IDLE: @@ -347,6 +361,10 @@ public void RunStateMachine() originalSendTime = 0; lastSendTime = 0; sendLinkLayerTestFunction = false; + //DEBUG_PRINT("[SLAVE %i] PLL - SEND FC 09 - REQUEST LINK STATUS\n", self->address); + //SendFixedFrame(self->primaryLink->linkLayer, LL_FC_09_REQUEST_LINK_STATUS, self->address, true, false, false, false); + //self->lastSendTime = currentTime; + //self->waitingForResponse = true; newState = PrimaryLinkLayerState.EXECUTE_REQUEST_STATUS_OF_LINK; break; @@ -355,7 +373,13 @@ public void RunStateMachine() if (waitingForResponse) { - + // if (self->lastSendTime > currentTime) + // { + // /* last sent time not plausible! */ + // self->lastSendTime = currentTime; + + // } + if (currentTime > (lastSendTime + linkLayer.TimeoutForACK)) { linkLayer.SendFixedFramePrimary(FunctionCodePrimary.REQUEST_LINK_STATUS, address, false, false); diff --git a/lib60870/LinkLayer/SecondaryLinkLayerUnbalanced.cs b/lib60870/LinkLayer/SecondaryLinkLayerUnbalanced.cs index 32576d4..15eb9d7 100644 --- a/lib60870/LinkLayer/SecondaryLinkLayerUnbalanced.cs +++ b/lib60870/LinkLayer/SecondaryLinkLayerUnbalanced.cs @@ -166,7 +166,6 @@ public override void HandleMessage(FunctionCodePrimary fcp, bool isBroadcast, in DebugLog("SLL - REQUEST USER DATA CLASS 1"); { BufferFrame asdu = applicationLayer.GetClass1Data(); - bool accessDemand = applicationLayer.IsClass1DataAvailable(); if (asdu != null) From 868c851235da0ccb5c9099eb7a06f54bd1937732 Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Thu, 16 Jan 2025 17:14:15 +0100 Subject: [PATCH 24/83] CS101 balanced link layer: Send request-status-of-link before calling reset-of-remote-link (L870NET-25) CS101 unbalanced master: Send request-status-of-link before calling reset-of-remote-link, added delay before repeating request-status-of-link (L870NET-26) --- .../LinkLayer/PrimaryLinkLayerBalanced.cs | 5 +-- .../LinkLayer/PrimaryLinkLayerUnbalanced.cs | 35 +++++++++++++------ 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs b/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs index 88d4583..e0d941c 100644 --- a/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs +++ b/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs @@ -299,8 +299,6 @@ public override void RunStateMachine() if (lastSendTime > currentTime) lastSendTime = currentTime; - //TODO???? - if (sendLinkLayerTestFunction) { DebugLog("PLL - SEND TEST LINK"); @@ -333,6 +331,9 @@ public override void RunStateMachine() case PrimaryLinkLayerState.EXECUTE_SERVICE_SEND_CONFIRM: + if (lastSendTime > currentTime) + lastSendTime = currentTime; + if (currentTime > (lastSendTime + linkLayer.TimeoutForACK)) { diff --git a/lib60870/LinkLayer/PrimaryLinkLayerUnbalanced.cs b/lib60870/LinkLayer/PrimaryLinkLayerUnbalanced.cs index 031ad86..5e106f0 100644 --- a/lib60870/LinkLayer/PrimaryLinkLayerUnbalanced.cs +++ b/lib60870/LinkLayer/PrimaryLinkLayerUnbalanced.cs @@ -343,6 +343,9 @@ public void RunStateMachine() case PrimaryLinkLayerState.TIMEOUT: + if (lastSendTime > currentTime) + lastSendTime = currentTime; + if (currentTime > (lastSendTime + linkLayer.linkLayerParameters.TimeoutLinkState)) { newState = PrimaryLinkLayerState.IDLE; } @@ -355,6 +358,7 @@ public void RunStateMachine() sendLinkLayerTestFunction = false; DebugLog("[SLAVE " + address + "] PLL - SEND FC 09 - REQUEST LINK STATUS\n"); + linkLayer.SendFixedFramePrimary(FunctionCodePrimary.REQUEST_LINK_STATUS, address, false, false); lastSendTime = currentTime; @@ -368,12 +372,8 @@ public void RunStateMachine() if (waitingForResponse) { - // if (self->lastSendTime > currentTime) - // { - // /* last sent time not plausible! */ - // self->lastSendTime = currentTime; - - // } + if (lastSendTime > currentTime) + lastSendTime = currentTime; if (currentTime > (lastSendTime + linkLayer.TimeoutForACK)) { @@ -406,10 +406,14 @@ public void RunStateMachine() if (waitingForResponse) { + if (lastSendTime > currentTime) + lastSendTime = currentTime; + if (currentTime > (lastSendTime + linkLayer.TimeoutForACK)) { waitingForResponse = false; - newState = PrimaryLinkLayerState.IDLE; + lastSendTime = currentTime; + newState = PrimaryLinkLayerState.TIMEOUT; SetState(LinkLayerState.ERROR); } @@ -433,7 +437,7 @@ public void RunStateMachine() nextFcb = !nextFcb; lastSendTime = currentTime; - originalSendTime = lastSendTime; + originalSendTime = currentTime; waitingForResponse = true; newState = PrimaryLinkLayerState.EXECUTE_SERVICE_SEND_CONFIRM; @@ -457,7 +461,7 @@ public void RunStateMachine() nextFcb = !nextFcb; lastSendTime = currentTime; - originalSendTime = lastSendTime; + originalSendTime = currentTime; waitingForResponse = true; newState = PrimaryLinkLayerState.EXECUTE_SERVICE_REQUEST_RESPOND; } @@ -483,7 +487,7 @@ public void RunStateMachine() nextFcb = !nextFcb; lastSendTime = currentTime; - originalSendTime = lastSendTime; + originalSendTime = currentTime; waitingForResponse = true; newState = PrimaryLinkLayerState.EXECUTE_SERVICE_SEND_CONFIRM; @@ -495,13 +499,19 @@ public void RunStateMachine() case PrimaryLinkLayerState.EXECUTE_SERVICE_SEND_CONFIRM: + if (lastSendTime > currentTime) + lastSendTime = currentTime; + if (currentTime > (lastSendTime + linkLayer.TimeoutForACK)) { if (currentTime > (originalSendTime + linkLayer.TimeoutRepeat)) { DebugLog("[SLAVE " + address + "] TIMEOUT SC: ASDU not confirmed after repeated transmission"); - newState = PrimaryLinkLayerState.IDLE; + + waitingForResponse = false; + lastSendTime = currentTime; + newState = PrimaryLinkLayerState.TIMEOUT; SetState(LinkLayerState.ERROR); } @@ -534,6 +544,9 @@ public void RunStateMachine() case PrimaryLinkLayerState.EXECUTE_SERVICE_REQUEST_RESPOND: + if (lastSendTime > currentTime) + lastSendTime = currentTime; + if (currentTime > (lastSendTime + linkLayer.TimeoutForACK)) { From d42019f39058a097241944aff854b66378637df4 Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Mon, 20 Jan 2025 12:17:32 +0100 Subject: [PATCH 25/83] Fixed issue in CS101 Secondary Link Layer Unbalanced --- examples/cs101-master-unbalanced/Program.cs | 2 +- .../LinkLayer/SecondaryLinkLayerUnbalanced.cs | 23 ++++++++++++++----- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/examples/cs101-master-unbalanced/Program.cs b/examples/cs101-master-unbalanced/Program.cs index 0601037..c244cc4 100644 --- a/examples/cs101-master-unbalanced/Program.cs +++ b/examples/cs101-master-unbalanced/Program.cs @@ -106,7 +106,7 @@ public static void Main (string[] args) running = false; }; - string portName = "/dev/ttyUSB0"; + string portName = "COM6"; if (args.Length > 0) portName = args [0]; diff --git a/lib60870/LinkLayer/SecondaryLinkLayerUnbalanced.cs b/lib60870/LinkLayer/SecondaryLinkLayerUnbalanced.cs index 20629a6..dfe77e3 100644 --- a/lib60870/LinkLayer/SecondaryLinkLayerUnbalanced.cs +++ b/lib60870/LinkLayer/SecondaryLinkLayerUnbalanced.cs @@ -73,7 +73,7 @@ public override void HandleMessage(FunctionCodePrimary fcp, bool isBroadcast, in DebugLog("SLL - REQUEST LINK STATUS"); { /* check that FCV=0 */ - if (!fcv) + if (fcv) { DebugLog("SLL - REQUEST LINK STATUS failed - invalid FCV\n"); return; @@ -88,10 +88,10 @@ public override void HandleMessage(FunctionCodePrimary fcp, bool isBroadcast, in case FunctionCodePrimary.RESET_REMOTE_LINK: DebugLog("SLL - RESET REMOTE LINK"); { - /* check that FCV=0 */ - if ((!fcv) || (!fcb)) + /* check that FCB=0 and FCV=0 */ + if ((fcv) || (fcb)) { - DebugLog("RESET REMOTE LINK failed - invalid FCV/FCB\n"); + DebugLog("SLL - RESET REMOTE LINK failed - invalid FCV/FCB\n"); return; } @@ -113,7 +113,7 @@ public override void HandleMessage(FunctionCodePrimary fcp, bool isBroadcast, in /* used by CS103 */ /* check that FCV=0 */ - if ((!fcv) || (!fcb)) + if ((fcv) || (fcb)) { DebugLog("SLL - RESET FCB failed - invalid FCV/FCB"); return; @@ -164,6 +164,17 @@ public override void HandleMessage(FunctionCodePrimary fcp, bool isBroadcast, in case FunctionCodePrimary.REQUEST_USER_DATA_CLASS_1: DebugLog("SLL - REQUEST USER DATA CLASS 1"); { + bool invalidFCB = false; + + if (fcv) + { + if (CheckFCB(fcb) == false) + { + DebugLog("SLL - REQ UD1 - unexpected FCB\n"); + invalidFCB = true; + } + } + BufferFrame asdu = applicationLayer.GetClass1Data(); bool accessDemand = applicationLayer.IsClass1DataAvailable(); @@ -212,7 +223,7 @@ public override void HandleMessage(FunctionCodePrimary fcp, bool isBroadcast, in case FunctionCodePrimary.USER_DATA_NO_REPLY: DebugLog("SLL - USER DATA NO REPLY"); { - if (!fcv) + if (fcv) { DebugLog("SLL - USER DATA NO REPL - invalid FCV"); return; From 76a12aa618605f2a14d8e733116e4a2ce2e2c52b Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Mon, 20 Jan 2025 17:02:17 +0100 Subject: [PATCH 26/83] Disable support for C_TS_NA_1 and C_CD_NA_1 for CS104 by default --- lib60870/CS104/ClientConnection.cs | 53 +++++++++++++++++------------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/lib60870/CS104/ClientConnection.cs b/lib60870/CS104/ClientConnection.cs index 7411744..b065b3e 100644 --- a/lib60870/CS104/ClientConnection.cs +++ b/lib60870/CS104/ClientConnection.cs @@ -90,6 +90,7 @@ private void DebugLog(string msg) private Server server; private bool allowTestCommand = false; + private bool allowDelayAcquisition = false; private ConcurrentQueue receivedASDUs = null; private Thread callbackThread = null; @@ -816,8 +817,6 @@ private void HandleASDU(ASDU asdu) DebugLog("Rcvd test command C_TS_NA_1\n"); - allowTestCommand = true; - if (allowTestCommand) { if (asdu.Cot == CauseOfTransmission.ACTIVATION) @@ -900,37 +899,45 @@ private void HandleASDU(ASDU asdu) DebugLog("Rcvd delay acquisition command C_CD_NA_1\n"); - if ((asdu.Cot == CauseOfTransmission.ACTIVATION) || (asdu.Cot == CauseOfTransmission.SPONTANEOUS)) + if (allowDelayAcquisition) { - if (server.delayAcquisitionHandler != null) + if ((asdu.Cot == CauseOfTransmission.ACTIVATION) || (asdu.Cot == CauseOfTransmission.SPONTANEOUS)) { + if (server.delayAcquisitionHandler != null) + { - DelayAcquisitionCommand dac = (DelayAcquisitionCommand)asdu.GetElement(0); + DelayAcquisitionCommand dac = (DelayAcquisitionCommand)asdu.GetElement(0); - if (dac != null) - { - /* Verify IOA = 0 */ - if (dac.ObjectAddress != 0) + if (dac != null) { - DebugLog("CS104 SLAVE: delay acquisition command has invalid IOA - should be 0\n"); - asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; - messageHandled = true; - } - else - { - if (server.delayAcquisitionHandler(server.delayAcquisitionHandlerParameter, - this, asdu, dac.Delay)) - messageHandled = true; + /* Verify IOA = 0 */ + if (dac.ObjectAddress != 0) + { + DebugLog("CS104 SLAVE: delay acquisition command has invalid IOA - should be 0\n"); + asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; + messageHandled = true; + } + else + { + if (server.delayAcquisitionHandler(server.delayAcquisitionHandlerParameter, + this, asdu, dac.Delay)) + messageHandled = true; + } } } } + else + { + asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; + asdu.IsNegative = true; + messageHandled = true; + this.SendASDUInternal(asdu); + } } - else { - asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; - asdu.IsNegative = true; - messageHandled = true; - this.SendASDUInternal(asdu); + /* this command is not supported/allowed for IEC 104 */ + DebugLog("CS104 SLAVE: Rcvd delay acquisition command C_CD_NA_1 -> not allowed\n"); + messageHandled = false; } break; From a5253f48ad1e8e15c914bfcb30ba73b5a7af7473 Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Tue, 21 Jan 2025 12:21:29 +0100 Subject: [PATCH 27/83] CS101 balanced link layer: Send request-status-of-link before calling reset-of-remote-link --- lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs b/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs index e0d941c..222d44c 100644 --- a/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs +++ b/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs @@ -252,6 +252,8 @@ public override void RunStateMachine() if (waitingForResponse) { if (lastSendTime > currentTime) + + /* last sent time not plausible! */ lastSendTime = currentTime; if (currentTime > (lastSendTime + linkLayer.TimeoutForACK)) @@ -277,6 +279,8 @@ public override void RunStateMachine() if (waitingForResponse) { if (lastSendTime > currentTime) + + /* last sent time not plausible! */ lastSendTime = currentTime; if (currentTime > (lastSendTime + linkLayer.TimeoutForACK)) @@ -297,12 +301,16 @@ public override void RunStateMachine() case PrimaryLinkLayerState.LINK_LAYERS_AVAILABLE: if (lastSendTime > currentTime) + + /* last sent time not plausible! */ lastSendTime = currentTime; if (sendLinkLayerTestFunction) { DebugLog("PLL - SEND TEST LINK"); + linkLayer.SendFixedFramePrimary(FunctionCodePrimary.TEST_FUNCTION_FOR_LINK, linkLayerAddressOtherStation, nextFcb, true); + nextFcb = !nextFcb; lastSendTime = currentTime; originalSendTime = lastSendTime; @@ -314,11 +322,9 @@ public override void RunStateMachine() if (asdu != null) { - linkLayer.SendVariableLengthFramePrimary(FunctionCodePrimary.USER_DATA_CONFIRMED, linkLayerAddressOtherStation, nextFcb, true, asdu); nextFcb = !nextFcb; - lastSendASDU = asdu; lastSendTime = currentTime; originalSendTime = lastSendTime; waitingForResponse = true; @@ -332,6 +338,8 @@ public override void RunStateMachine() case PrimaryLinkLayerState.EXECUTE_SERVICE_SEND_CONFIRM: if (lastSendTime > currentTime) + + /* last sent time not plausible! */ lastSendTime = currentTime; if (currentTime > (lastSendTime + linkLayer.TimeoutForACK)) From 9f688fefe7bb2a5d083b260dd4f2286e5a6189e1 Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Tue, 21 Jan 2025 14:03:15 +0100 Subject: [PATCH 28/83] CS101 unbalanced master: Send request-status-of-link before calling reset-of-remote-link, added delay before repeating request-status-of-link --- .../LinkLayer/PrimaryLinkLayerUnbalanced.cs | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/lib60870/LinkLayer/PrimaryLinkLayerUnbalanced.cs b/lib60870/LinkLayer/PrimaryLinkLayerUnbalanced.cs index 5e106f0..06cd3a9 100644 --- a/lib60870/LinkLayer/PrimaryLinkLayerUnbalanced.cs +++ b/lib60870/LinkLayer/PrimaryLinkLayerUnbalanced.cs @@ -331,19 +331,13 @@ public void RunStateMachine() long currentTime = SystemUtils.currentTimeMillis(); - if (lastSendTime > currentTime) - currentTime = lastSendTime; - switch (primaryState) { - // if (self->lastSendTime > currentTime) - // { - // /* last sent time not plausible! */ - // self->lastSendTime = currentTime; - case PrimaryLinkLayerState.TIMEOUT: if (lastSendTime > currentTime) + + /* last sent time not plausible! */ lastSendTime = currentTime; if (currentTime > (lastSendTime + linkLayer.linkLayerParameters.TimeoutLinkState)) { @@ -363,7 +357,6 @@ public void RunStateMachine() lastSendTime = currentTime; waitingForResponse = true; - newState = PrimaryLinkLayerState.EXECUTE_REQUEST_STATUS_OF_LINK; break; @@ -373,13 +366,14 @@ public void RunStateMachine() if (waitingForResponse) { if (lastSendTime > currentTime) + + /* last sent time not plausible! */ lastSendTime = currentTime; if (currentTime > (lastSendTime + linkLayer.TimeoutForACK)) { waitingForResponse = false; lastSendTime = currentTime; - newState = PrimaryLinkLayerState.TIMEOUT; } @@ -392,11 +386,8 @@ public void RunStateMachine() linkLayer.SendFixedFramePrimary(FunctionCodePrimary.RESET_REMOTE_LINK, address, false, false); lastSendTime = currentTime; - originalSendTime = lastSendTime; waitingForResponse = true; - nextFcb = true; - newState = PrimaryLinkLayerState.EXECUTE_RESET_REMOTE_LINK; } @@ -407,6 +398,8 @@ public void RunStateMachine() if (waitingForResponse) { if (lastSendTime > currentTime) + + /* last sent time not plausible! */ lastSendTime = currentTime; if (currentTime > (lastSendTime + linkLayer.TimeoutForACK)) @@ -450,16 +443,19 @@ public void RunStateMachine() DebugLog("[SLAVE " + address + "] PLL - SEND FC 10 - REQ UD 1"); linkLayer.SendFixedFramePrimary(FunctionCodePrimary.REQUEST_USER_DATA_CLASS_1, address, nextFcb, true); + + requestClass1Data = false; } else { DebugLog("[SLAVE " + address + "] PLL - SEND FC 11 - REQ UD 2"); linkLayer.SendFixedFramePrimary(FunctionCodePrimary.REQUEST_USER_DATA_CLASS_2, address, nextFcb, true); + + requestClass2Data = false; } nextFcb = !nextFcb; - lastSendTime = currentTime; originalSendTime = currentTime; waitingForResponse = true; @@ -480,12 +476,10 @@ public void RunStateMachine() linkLayer.SendVariableLengthFramePrimary(FunctionCodePrimary.USER_DATA_CONFIRMED, address, nextFcb, true, asdu); - lastSentASDU = nextMessage; - nextMessage = null; - + //lastSentASDU = nextMessage; + //nextMessage = null; nextFcb = !nextFcb; - lastSendTime = currentTime; originalSendTime = currentTime; waitingForResponse = true; @@ -500,6 +494,8 @@ public void RunStateMachine() case PrimaryLinkLayerState.EXECUTE_SERVICE_SEND_CONFIRM: if (lastSendTime > currentTime) + + /* last sent time not plausible! */ lastSendTime = currentTime; if (currentTime > (lastSendTime + linkLayer.TimeoutForACK)) @@ -545,6 +541,8 @@ public void RunStateMachine() case PrimaryLinkLayerState.EXECUTE_SERVICE_REQUEST_RESPOND: if (lastSendTime > currentTime) + + /* last sent time not plausible! */ lastSendTime = currentTime; if (currentTime > (lastSendTime + linkLayer.TimeoutForACK)) From e89b84a5dcc8ced108f5df562e83b4301e673c84 Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Tue, 21 Jan 2025 15:05:54 +0100 Subject: [PATCH 29/83] CS104 slave: check IOA of received commands where IOA is fixed to 0 --- lib60870/CS104/ClientConnection.cs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib60870/CS104/ClientConnection.cs b/lib60870/CS104/ClientConnection.cs index b065b3e..4009bf5 100644 --- a/lib60870/CS104/ClientConnection.cs +++ b/lib60870/CS104/ClientConnection.cs @@ -688,6 +688,7 @@ private void HandleASDU(ASDU asdu) { asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; asdu.IsNegative = true; + this.SendASDUInternal(asdu); messageHandled = true; } @@ -726,6 +727,7 @@ private void HandleASDU(ASDU asdu) asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; asdu.IsNegative = true; this.SendASDUInternal(asdu); + messageHandled = true; } break; @@ -755,6 +757,7 @@ private void HandleASDU(ASDU asdu) asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; asdu.IsNegative = true; this.SendASDUInternal(asdu); + messageHandled = true; } break; @@ -888,11 +891,10 @@ private void HandleASDU(ASDU asdu) { asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; asdu.IsNegative = true; - messageHandled = true; this.SendASDUInternal(asdu); + messageHandled = true; } - break; case TypeID.C_CD_NA_1: /* 106 - Delay acquisition command */ @@ -934,6 +936,7 @@ private void HandleASDU(ASDU asdu) this.SendASDUInternal(asdu); } } + else { /* this command is not supported/allowed for IEC 104 */ DebugLog("CS104 SLAVE: Rcvd delay acquisition command C_CD_NA_1 -> not allowed\n"); @@ -964,13 +967,15 @@ private void HandleASDU(ASDU asdu) messageHandled = true; } else - { asdu.Cot = CauseOfTransmission.ACTIVATION_CON; - } + messageHandled = true; this.SendASDUInternal(asdu); break; + + default: /* no special handler available -> use default handler */ + break; } if (messageHandled == false) From 9285cbedcedd1a43d55be4e6f3729b2d5d89dff7 Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Wed, 22 Jan 2025 11:33:47 +0100 Subject: [PATCH 30/83] Updating TLS v1.3 --- examples/cs104-tls-client/Program.cs | 8 +++---- examples/cs104-tls-client/client1.pfx | Bin 0 -> 2558 bytes .../cs104-tls-client/cs104-tls-client.csproj | 14 +++++------ examples/cs104-tls-client/root.cer | Bin 0 -> 785 bytes examples/cs104-tls-client/server.cer | Bin 0 -> 767 bytes examples/cs104-tls-server/Program.cs | 10 ++++---- examples/cs104-tls-server/client1.cer | Bin 0 -> 763 bytes .../cs104-tls-server/cs104-tls-server.csproj | 22 +++++++++--------- examples/cs104-tls-server/root.cer | Bin 0 -> 785 bytes examples/cs104-tls-server/server.pfx | Bin 0 -> 2558 bytes 10 files changed, 27 insertions(+), 27 deletions(-) create mode 100644 examples/cs104-tls-client/client1.pfx create mode 100644 examples/cs104-tls-client/root.cer create mode 100644 examples/cs104-tls-client/server.cer create mode 100644 examples/cs104-tls-server/client1.cer create mode 100644 examples/cs104-tls-server/root.cer create mode 100644 examples/cs104-tls-server/server.pfx diff --git a/examples/cs104-tls-client/Program.cs b/examples/cs104-tls-client/Program.cs index 7c68d0f..738efb4 100644 --- a/examples/cs104-tls-client/Program.cs +++ b/examples/cs104-tls-client/Program.cs @@ -129,21 +129,21 @@ public static void Main (string[] args) Console.WriteLine ("Using lib60870.NET version " + LibraryCommon.GetLibraryVersionString ()); // Own certificate has to be a pfx file that contains the private key - X509Certificate2 ownCertificate = new X509Certificate2 ("client_CA1_1.pfx"); + X509Certificate2 ownCertificate = new X509Certificate2 ("client1.pfx"); // Create a new security information object to configure TLS TlsSecurityInformation secInfo = new TlsSecurityInformation (null, ownCertificate); // Add allowed server certificates - not required when AllowOnlySpecificCertificates == false - secInfo.AddAllowedCertificate (new X509Certificate2 ("server_CA1_1.pem")); + secInfo.AddAllowedCertificate (new X509Certificate2 ("server.cer")); // Add a CA certificate to check the certificate provided by the server - not required when ChainValidation == false - secInfo.AddCA (new X509Certificate2 ("root_CA1.pem")); + secInfo.AddCA (new X509Certificate2 ("root.cer")); // Check if the certificate is signed by a provided CA secInfo.ChainValidation = false; - secInfo.TlsVersion = SslProtocols.Tls12 | SslProtocols.Tls13; + secInfo.TlsVersion = SslProtocols.Tls13; // Check that the shown server certificate is in the list of allowed certificates secInfo.AllowOnlySpecificCertificates = true; diff --git a/examples/cs104-tls-client/client1.pfx b/examples/cs104-tls-client/client1.pfx new file mode 100644 index 0000000000000000000000000000000000000000..12217cae0c7de47c01287d0fd2bbcb9aaac28ebe GIT binary patch literal 2558 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 U)+W#G-#cTw;kd{-`12zE8_&g{G5`Po literal 0 HcmV?d00001 diff --git a/examples/cs104-tls-client/cs104-tls-client.csproj b/examples/cs104-tls-client/cs104-tls-client.csproj index 9c970c8..6e8af5a 100644 --- a/examples/cs104-tls-client/cs104-tls-client.csproj +++ b/examples/cs104-tls-client/cs104-tls-client.csproj @@ -1,21 +1,21 @@  - + + + + + PreserveNewest - + PreserveNewest - + PreserveNewest - - - - Exe net6.0 diff --git a/examples/cs104-tls-client/root.cer b/examples/cs104-tls-client/root.cer new file mode 100644 index 0000000000000000000000000000000000000000..87683444999a84b86230a7a7af3e8ae5f43de456 GIT binary patch literal 785 zcmXqLV&*kyV*I&)nTe5!Nuct==g24KTiYGuKQ`@snRCd1lZ{oIkC{o9mBB#VP}D$} zjX9KsS(v9JwYWr~C_leMAvw`NPMp`!+`!V%z`)eh!pJa6oY&aW(8w5wOf5|` z(wWYiKOLyEJDq62&(eRT@%!?cffsk(2{qzp?3i|LPg0^I z|3lW;x$){3^KEY}i!BO|$}-AMs4^C4cP!ZW=&9nDPhvj~U474^mv+d=U_zFY{BEl+ zCtTf5O|W#ZeB=Ig_opwfx_%y=H2sM%o6x!Rl+|8NL3KNVKlBQOmi@J4*c>@^bCAou zI};2iACBrQKasWOf>D}@*!o)MlEjb6PoFP&b|r4DxevR9zxKk}lIA92)4Qjqe6!Y; zcls_?@a<`Pn`P|u1?TthN?3_0?wA$wfKB2B+o7L<6$d^>%UJf;GBGnUFfNWYh&JE{ zhP$jVBjbM-Rs&`rW#9o4U}SMLux}8USd{(u$~})AH-eYjB`xX`SSX1z$eZxRFfi~L z84mxQHa%&11#VjF7vG}U-PY%L*=*YJ^S(M?MLC@M_bm_ z?CkRJ{Hieb&DO0EY#cW$EaQb*yT8AkZE?uXic68-skyfG@}|xxp~lSC#6M)USQ3{1a@a{C}tQ&+P(d!mVw;%cg~dZP1!8#g(e7899&ZS6)q4 z*UIzX+OJgGIUKt8;nQB8lWT4j40$|3PQ~ literal 0 HcmV?d00001 diff --git a/examples/cs104-tls-client/server.cer b/examples/cs104-tls-client/server.cer new file mode 100644 index 0000000000000000000000000000000000000000..957bdc30f978d52f7ef9b5aa73375a9a21b7d6de GIT binary patch literal 767 zcmXqLV)|{+#Q1yxGZP~dlfcF$T&n{mk2X1Hu@+U&Yh7l*$;PV9$IK+l%3vUFC~6?g z#vIDREX-4qT3n(~l%HRskep~BC(dhVZeVF>U|?ooY-AoK&TDLGXk-jTrk19bQ3hg$ zA_hVbjocuOy2YtQWvN9#Yn2Rm**LY@JlekVGBPr1y6jofFe9&GR{Dm-MvMWb*!!{4=T15AK|DT40%}>b!#Ie8<1QIU&ECo2I$G z+v{_%a5>*+!-CG^Hx4&(^;34=NJB>rwbdRnMp zPqXq5d#&|1Ra-o#YkYYWf0ecT6!)ZhPY$_#UWyOR6+IR|db;Se`c>YAM-A`gOkO7k)*q=YE%rQclj0uXudC z_3MObqD;(;42+9?47?0HfT1VL$l_>V-ykrtDEse~dmcM(1TVKsTGS`7P!ea%GznB* z_#FAfd~3U7{KuxfFLMqd#V0VV85z_X5Aq+fxo*FBLA!nRf40v@?yqIdGWfc4*JM!> zt$wo&YR2=0t!-!RILa5m?eeIE+kc)37srHKV!8XST{P|D&E3atlJWDngFNGwPYwk} zae8^{g~9@oBAN~v)mHHzf7_V)qQAQ)l}FApI%hS@ysH`>QnME=GoABm@;9OB@xsUd zY|B@igY~1rOhO&iJ=7*nRRg`ByzZ^d_=> zIr44Av<_+G164WU*JW?^@5ts${Al;^-O(+cW-`V*rf3@WTxho7y_+SGT>$7)N1o+`_9YA$jHjT+{DPw02Jq9YGPz$IKnIvd-LAx z`{_^SOMXn-QhWLBf&-JwTsYS}-W4%VyyDkOC&nu>Hjlj0JyHywESY=cv_sM9XaBlX zoM*i5NJ(kh&@0!*A(o}K^_J|4jZRxw_DpVjR`1GV`CzT=>9ukDl%tZ4zwHn=lx^Ci zl{%;W54UblY|@|%-~kLdSw>pXk7Q=$JV1C#5sJ9C;nn@=a{V8>v5A z+(gv0lKXyN@I1NGT6VRM_UyU)!w>7-S9|+}iI+)YB>qPU5cKPt(zW9VQbn} hTsC#Zj>LFIwE&@-WJ%Aig!0&^YX_#hyDV(68~`yNJY@g? literal 0 HcmV?d00001 diff --git a/examples/cs104-tls-server/cs104-tls-server.csproj b/examples/cs104-tls-server/cs104-tls-server.csproj index b53261d..a6eeb5b 100644 --- a/examples/cs104-tls-server/cs104-tls-server.csproj +++ b/examples/cs104-tls-server/cs104-tls-server.csproj @@ -1,23 +1,23 @@  - - PreserveNewest - - + + + + + + + + + PreserveNewest - + PreserveNewest - + PreserveNewest - - - - - diff --git a/examples/cs104-tls-server/root.cer b/examples/cs104-tls-server/root.cer new file mode 100644 index 0000000000000000000000000000000000000000..87683444999a84b86230a7a7af3e8ae5f43de456 GIT binary patch literal 785 zcmXqLV&*kyV*I&)nTe5!Nuct==g24KTiYGuKQ`@snRCd1lZ{oIkC{o9mBB#VP}D$} zjX9KsS(v9JwYWr~C_leMAvw`NPMp`!+`!V%z`)eh!pJa6oY&aW(8w5wOf5|` z(wWYiKOLyEJDq62&(eRT@%!?cffsk(2{qzp?3i|LPg0^I z|3lW;x$){3^KEY}i!BO|$}-AMs4^C4cP!ZW=&9nDPhvj~U474^mv+d=U_zFY{BEl+ zCtTf5O|W#ZeB=Ig_opwfx_%y=H2sM%o6x!Rl+|8NL3KNVKlBQOmi@J4*c>@^bCAou zI};2iACBrQKasWOf>D}@*!o)MlEjb6PoFP&b|r4DxevR9zxKk}lIA92)4Qjqe6!Y; zcls_?@a<`Pn`P|u1?TthN?3_0?wA$wfKB2B+o7L<6$d^>%UJf;GBGnUFfNWYh&JE{ zhP$jVBjbM-Rs&`rW#9o4U}SMLux}8USd{(u$~})AH-eYjB`xX`SSX1z$eZxRFfi~L z84mxQHa%&11#VjF7vG}U-PY%L*=*YJ^S(M?MLC@M_bm_ z?CkRJ{Hieb&DO0EY#cW$EaQb*yT8AkZE?uXic68-skyfG@}|xxp~lSC#6M)USQ3{1a@a{C}tQ&+P(d!mVw;%cg~dZP1!8#g(e7899&ZS6)q4 z*UIzX+OJgGIUKt8;nQB8lWT4j40$|3PQ~ literal 0 HcmV?d00001 diff --git a/examples/cs104-tls-server/server.pfx b/examples/cs104-tls-server/server.pfx new file mode 100644 index 0000000000000000000000000000000000000000..953ea66baa869b94a152f87e664d89a1b3e59064 GIT binary patch literal 2558 zcmZXVc|6oxAIE>Qm@%@1vD0WUV#wI8wMMp-LH0|y8N-My8S5p>*!RIrC9;g25M?c? zWO=SVvLxBMvL{Oo;hB0p&%Lkb^}NpOd(QXs{%(Jrb8u9|J{SbSQ4x(WglwEq+*b|| z98^F>ltHNoIuqyPs4&+539&GsRF+*Fm1T=*>#!65sbXgXfeWb6BODdFj}wKl{TDNv zb3$3!JEsM-`Ol1j!SEp{6*^HW(Dj~|XXNFW``c_uI#96Csu6P6aUv--qxpa)Uh3%y zgS#ZG&YQ`3l=(%Kgt*ggrJ6fDoX~Uo=)s3(7gK1>YM$PnFIVZu?bX{k=olQ(`4f$- z+`_vX5fn?pz_f|&IZdI3oma@m17B=xt+_DzD`Ads%h?s$)#T5ke7C_2nb`aErldq} z6YI+|&?T|LthY}U0X;Xq>DMAtD_NrR#+PY1IF9&`5?z$4+6MA{^h=x2(&NsR)KV#) zloY4N;50Mr6O(VvuXL+b1k6}!?g=X#0nT;sPPj{Ix$U~1-SK%sps6o+X#nl=FKg#0 zRnI+__-<5PofvGutuXMCNbdt%eam9k#&1o1JuYFEJzKLF)<@Rv!RnC^QBp-z8dm54 zOA^PAt%bD>j3^iwD9YZTiZ<*$SnRqZ<{BAiUonh3tL?Lywkl>=uvl?+Iqy-A8_v(7vRpf;ILs8Sk(TkolWI_( zFgqMYL@{FU;TeT)UTP#N);iI5VLw*sK;LtYkgwx7nSUx~^B(JBa~GAz8vie)sbm<( zEWF6$0>LJ!LfLcJ+#-wB^Mf*o(Tu>Q$g^25Ylolf>-gJv0OdA|oL zHj1}%8ajN*r!uQ}#<@Okqbt0!c7AFC4ZJ?Zf=D-=~A zXA&T}-SQ#tgG!LqySM~IMQK)+%tD+GKtWKxpkc}lD!SP8-r{prOZ;@)g8_3W?%z<|*8n3Dyx!>CLhpFDuiQI;y3^#;^Je;HWjfa36EeWA_#_`C59|~&~DdG z-typDgCHA}qxkUJCn!_x9kSU~Tb@e9`nr{c@j^SczZ!k-Yn#}*))n=9pi7n)RMh%j zoX%vUQ!f+u(awrd?{K_-KbHtTMHmzc0ssK#2t#0DASj5c#tl-ua>^7i0j>isfFIxk zP?+Wh_ygjAC3F8lya6&(=`sBfz?aE?qe9aE9t4LKP$7{_6b1$X%p>5R2YwDU#i>PLO7MSa}t)!Cy;G4h}OB?BU!C zYSmu3!5Hkdx28eG0(&+UqgU$#X6Yji!gdFF-};EFH+mMf&OdiI+f{sUS4^1C?=* z!BHWW`_+W&)b*}5L(Z-X#6Ptphbp2F3m5oFxG-$OvMhhm=ys0!ai6Bm(*aqF)u)}T z!|qZDTc?;;GT&FhXNFrR6bKsReb*#7MYnLR+DMGtj-t29bSME| zl`7a=&BTR?yLH2>5bwX{ay1FxOPVqQ-U0nuQ+>u~opjK$-fOyKR=}mN<(DkBX6eaY$3n?eGcBS`VXKfPt zVAUmhHpEhNe-1Eq^>^Q2R{x|4khQYU%%nI|`!fvo$Q@H6Ubz|$+0CR!Y%p1SFWtas zRy^6J?XF5F9NW65Oc)_^>OMqjNPb<=b%e!?3>q3bl%X zHgtfQrKSm)g95ZM7f^Rbjpo)j9DZ2~9zWN^%93tWe$-ql!$UN9zdH1G(9yXhW^27& zsaaE@>4kfmN$k{b0A(95^=n455$B#=T)&!rX3g!s@*7Lin=LhdUDAv<3f2B4>#Y>k z*9T&|564k$@MQ#x<15?5BkR`VLA!a53uQYx*Go6Hi0muu;y3Y;;(a_vP)dzj_r{vJg-r0rRZ6%T#^^-SifRL~^X8_J@iF;fhm zLr47d-N)77yGwGheTsqaSCv%zK^Vv8CCw26d0*>W#yHKRN5n*a*VQ1>tNV(6%XK(p zQ`}&tQR?{@a-XV+htF0#9uv~J&EPzEFp*$~HP&hb@1pV^*)$%Rrv M#Wf&Hd>H+iRMTmS$7 literal 0 HcmV?d00001 From a91c40281dc4f36c8216b0a6e78f1b4e3985f214 Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Wed, 22 Jan 2025 17:41:01 +0100 Subject: [PATCH 31/83] CS 104 server: connection is closed by server when receiving S message in inactive state --- lib60870/CS104/ClientConnection.cs | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/lib60870/CS104/ClientConnection.cs b/lib60870/CS104/ClientConnection.cs index 4009bf5..ffe00fd 100644 --- a/lib60870/CS104/ClientConnection.cs +++ b/lib60870/CS104/ClientConnection.cs @@ -1219,21 +1219,17 @@ private bool HandleMessage(byte[] buffer, int msgSize) // S-message else if (buffer[2] == 0x01) - { - if (isActive == false) - { - // connection not active - DebugLog("Connection not active -> close connection"); - - return false; - } - + { int seqNo = (buffer[4] + buffer[5] * 0x100) / 2; DebugLog("Recv S(" + seqNo + ") (own sendcounter = " + sendCount + ")"); if (CheckSequenceNumber(seqNo) == false) + { + DebugLog("S message - sequence number mismatch"); return false; + } + } else { From 9ed14c4a1d25ebc7f4a1481181a703a4165ab8c2 Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Fri, 24 Jan 2025 11:39:37 +0100 Subject: [PATCH 32/83] Allowing server to use only TLS versions 1.2 and 1.3 --- examples/cs104-tls-server/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/cs104-tls-server/Program.cs b/examples/cs104-tls-server/Program.cs index d22953b..3bace7c 100644 --- a/examples/cs104-tls-server/Program.cs +++ b/examples/cs104-tls-server/Program.cs @@ -128,7 +128,7 @@ public static void Main (string[] args) secInfo.ChainValidation = true; // Allow only TLS versions 1.2 and 1.3 - secInfo.TlsVersion = SslProtocols.Tls13; + secInfo.TlsVersion = SslProtocols.Tls12 | SslProtocols.Tls13; // Check that the shown client certificate is in the list of allowed certificates secInfo.AllowOnlySpecificCertificates = false; From ceedcb2476e78c2085c9d8f6db51183b96a979fc Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Mon, 27 Jan 2025 16:38:46 +0100 Subject: [PATCH 33/83] Implementing Master connection state --- lib60870/CS104/ClientConnection.cs | 37 +++++++++++++++++++++++++++++- lib60870/CS104/Server.cs | 8 +++---- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/lib60870/CS104/ClientConnection.cs b/lib60870/CS104/ClientConnection.cs index ffe00fd..7e256fa 100644 --- a/lib60870/CS104/ClientConnection.cs +++ b/lib60870/CS104/ClientConnection.cs @@ -63,6 +63,14 @@ private void DebugLog(string msg) static byte[] TESTFR_ACT_MSG = new byte[] { 0x68, 0x04, 0x43, 0x00, 0x00, 0x00 }; + public enum MasterConnectionState + { + M_CON_STATE_STOPPED, + M_CON_STATE_STARTED, + M_CON_STATE_UNCONFIRMED_STOPPED + } + + private MasterConnectionState state; private int sendCount = 0; private int receiveCount = 0; @@ -1101,13 +1109,19 @@ private bool HandleMessage(byte[] buffer, int msgSize) { UInt64 currentTime = (UInt64) SystemUtils.currentTimeMillis(); - if ((buffer[2] & 1) == 0) + if ((buffer[2] & 1) == 0) /* I message */ { if (msgSize < 7) { DebugLog("I msg too small!"); return false; } + + if (state == MasterConnectionState.M_CON_STATE_STARTED) + { + DebugLog("Received I message while connection not active -> close connection"); + return false; + } if (timeoutT2Triggered == false) { @@ -1197,6 +1211,8 @@ private bool HandleMessage(byte[] buffer, int msgSize) DebugLog("Send STOPDT_CON"); + state = MasterConnectionState.M_CON_STATE_STOPPED; + if (this.isActive == true) { this.isActive = false; @@ -1230,10 +1246,28 @@ private bool HandleMessage(byte[] buffer, int msgSize) return false; } + if (state == MasterConnectionState.M_CON_STATE_UNCONFIRMED_STOPPED) + { + if (unconfirmedReceivedIMessages < 1) + { + state = MasterConnectionState.M_CON_STATE_STOPPED; + + DebugLog("Send STOPDT_CON\n"); + + socketStream.Write(STOPDT_CON_MSG, 0, TESTFR_CON_MSG.Length); + } + } + else if (state == MasterConnectionState.M_CON_STATE_STOPPED) + { + DebugLog("S message sin stopped state -> active close\n"); + /* actively close connection */ + return false; + } } else { DebugLog("Unknown message"); + return true; } ResetT3Timeout(currentTime); @@ -1546,6 +1580,7 @@ void HandleRemoteCertificateValidationCallback (object sender, X509Certificate c public void Close() { running = false; + state = MasterConnectionState.M_CON_STATE_STOPPED; } public void ASDUReadyToSend() diff --git a/lib60870/CS104/Server.cs b/lib60870/CS104/Server.cs index 3c92c70..3c9444a 100644 --- a/lib60870/CS104/Server.cs +++ b/lib60870/CS104/Server.cs @@ -61,7 +61,7 @@ public enum ClientConnectionEvent ACTIVE, /// - /// The connection enterend inactive state + /// The connection entered inactive state /// INACTIVE, @@ -1076,9 +1076,9 @@ public void EnqueueASDU(ASDU asdu) } internal void CallConnectionEventHandler(ClientConnection connection, ClientConnectionEvent e) - { - if (connectionEventHandler != null) - connectionEventHandler(connectionEventHandlerParameter, connection, e); + { + if (connectionEventHandler != null) + connectionEventHandler(connectionEventHandlerParameter, connection, e); } internal void Activated(ClientConnection activeConnection) From e7e12c6cd9fe814ae1968dbb1a6a9ad21e818a70 Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Tue, 28 Jan 2025 14:08:14 +0100 Subject: [PATCH 34/83] Implementing CS104 Client Connection State --- lib60870/CS104/ClientConnection.cs | 6 ++-- lib60870/CS104/Connection.cs | 55 ++++++++++++++++++++++++++++-- 2 files changed, 55 insertions(+), 6 deletions(-) diff --git a/lib60870/CS104/ClientConnection.cs b/lib60870/CS104/ClientConnection.cs index 7e256fa..8e6f0fe 100644 --- a/lib60870/CS104/ClientConnection.cs +++ b/lib60870/CS104/ClientConnection.cs @@ -65,9 +65,9 @@ private void DebugLog(string msg) public enum MasterConnectionState { - M_CON_STATE_STOPPED, - M_CON_STATE_STARTED, - M_CON_STATE_UNCONFIRMED_STOPPED + M_CON_STATE_STOPPED, /* only U frames allowed */ + M_CON_STATE_STARTED, /* U, I, S frames allowed */ + M_CON_STATE_UNCONFIRMED_STOPPED /* only U, S frames allowed */ } private MasterConnectionState state; diff --git a/lib60870/CS104/Connection.cs b/lib60870/CS104/Connection.cs index feb7f44..d26e8d9 100644 --- a/lib60870/CS104/Connection.cs +++ b/lib60870/CS104/Connection.cs @@ -68,6 +68,15 @@ public enum ConnectionEvent CONNECT_FAILED = 4 } + public enum CS104_ConState + { + STATE_IDLE = 0, + STATE_INACTIVE = 1, + STATE_ACTIVE = 2, + STATE_WAITING_FOR_STARTDT_CON = 3, + STATE_WAITING_FOR_STOPDT_CON = 4 + } + /// /// Provides some Connection statistics. /// @@ -204,6 +213,8 @@ private struct SentASDU /**********************************************/ + CS104_ConState conState; + private bool checkSequenceNumbers = true; private Queue waitingToBeSent = null; @@ -246,7 +257,7 @@ private struct SentASDU private string localIpAddress = null; private int localTcpPort = 0; - + /// /// Set the local IP address for the local connection endpoint /// @@ -380,6 +391,8 @@ private void ResetConnection() if (useSendMessageQueue) waitingToBeSent = new Queue(); + conState = CS104_ConState.STATE_IDLE; + statistics.Reset(); } @@ -1017,6 +1030,7 @@ public void SendStartDT() { try { + conState = CS104_ConState.STATE_WAITING_FOR_STARTDT_CON; netStream.Write(STARTDT_ACT_MSG, 0, STARTDT_ACT_MSG.Length); } catch (Exception ex) @@ -1061,6 +1075,8 @@ public void SendStopDT() SendSMessage(); } + conState = CS104_ConState.STATE_WAITING_FOR_STOPDT_CON; + netStream.Write(STOPDT_ACT_MSG, 0, STOPDT_ACT_MSG.Length); } catch (Exception ex) @@ -1440,6 +1456,8 @@ private bool checkMessage(byte[] buffer, int msgSize) { sentMessageHandler(sentMessageHandlerParameter, STARTDT_CON_MSG, 6); } + + conState = CS104_ConState.STATE_ACTIVE; } else if (buffer[2] == 0x0b) { /* STARTDT_CON */ @@ -1448,6 +1466,8 @@ private bool checkMessage(byte[] buffer, int msgSize) if (connectionHandler != null) connectionHandler(connectionHandlerParameter, ConnectionEvent.STARTDT_CON_RECEIVED); + conState = CS104_ConState.STATE_ACTIVE; + } else if (buffer[2] == 0x23) { /* STOPDT_CON */ @@ -1455,6 +1475,8 @@ private bool checkMessage(byte[] buffer, int msgSize) if (connectionHandler != null) connectionHandler(connectionHandlerParameter, ConnectionEvent.STOPDT_CON_RECEIVED); + + conState = CS104_ConState.STATE_INACTIVE; } } @@ -1824,6 +1846,7 @@ private void HandleConnection() if (running) { + conState = CS104_ConState.STATE_INACTIVE; bool loopRunning = running; @@ -1846,9 +1869,11 @@ private void HandleConnection() bool handleMessage = true; + CS104_ConState oldState = conState; + if (recvRawMessageHandler != null) handleMessage = recvRawMessageHandler(recvRawMessageHandlerParameter, bytes, bytesRec); - + if (handleMessage) { if (checkMessage(bytes, bytesRec) == false) @@ -1858,7 +1883,17 @@ private void HandleConnection() } } - if (unconfirmedReceivedIMessages >= apciParameters.W) + CS104_ConState newState = conState; + + if ((newState != oldState) && connectionHandler != null) + { + if (newState == CS104_ConState.STATE_ACTIVE) + connectionHandler(connectionHandlerParameter, ConnectionEvent.STARTDT_CON_RECEIVED); + else if (newState == CS104_ConState.STATE_INACTIVE) + connectionHandler(connectionHandlerParameter, ConnectionEvent.STOPDT_CON_RECEIVED); + } + + if (unconfirmedReceivedIMessages >= apciParameters.W || conState == CS104_ConState.STATE_WAITING_FOR_STOPDT_CON) { lastConfirmationTime = SystemUtils.currentTimeMillis(); @@ -1972,6 +2007,20 @@ private void HandleConnection() DebugLog(e.ToString()); } + if (unconfirmedReceivedIMessages > 0) + { + /* confirm all unconfirmed messages before stopping the connection */ + + lastConfirmationTime = SystemUtils.currentTimeMillis(); + + unconfirmedReceivedIMessages = 0; + timeoutT2Triggered = false; + + SendSMessage(); + } + + conState = CS104_ConState.STATE_IDLE; + running = false; connecting = false; } From 62f1dbee20dfc2e5317bc9554ee9c845dcb9a7c6 Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Wed, 29 Jan 2025 17:45:23 +0100 Subject: [PATCH 35/83] Implementing test case for Unconfirmed stop state --- lib60870/CS104/Connection.cs | 4 +- tests/Test.cs | 118 +++++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+), 2 deletions(-) diff --git a/lib60870/CS104/Connection.cs b/lib60870/CS104/Connection.cs index d26e8d9..f86a52b 100644 --- a/lib60870/CS104/Connection.cs +++ b/lib60870/CS104/Connection.cs @@ -1075,9 +1075,9 @@ public void SendStopDT() SendSMessage(); } - conState = CS104_ConState.STATE_WAITING_FOR_STOPDT_CON; - netStream.Write(STOPDT_ACT_MSG, 0, STOPDT_ACT_MSG.Length); + + conState = CS104_ConState.STATE_WAITING_FOR_STOPDT_CON; } catch (Exception ex) { diff --git a/tests/Test.cs b/tests/Test.cs index a7db361..c863285 100644 --- a/tests/Test.cs +++ b/tests/Test.cs @@ -285,6 +285,124 @@ public void TestConnectWhileAlreadyConnected () server.Stop (); } + struct CS104SlaveEventQueue1 + { + public int asduHandlerCalled; + public int spontCount; + public short lastScaledValue; + } + + private static bool EventQueue1_asduReceivedHandler(object param, ASDU asdu) + { + CS104SlaveEventQueue1 info = (CS104SlaveEventQueue1)param; + + info.asduHandlerCalled++; + + if(asdu.Cot == CauseOfTransmission.SPONTANEOUS) + { + info.spontCount++; + + if (asdu.TypeId == TypeID.M_ME_NB_1) + { + MeasuredValueScaled mv = (MeasuredValueScaled)asdu.GetElement(0); + + info.lastScaledValue = (short)mv.ScaledValue.Value; + } + } + return true; + } + + [Test()] + public void TestUnconfirmedStoppedState() + { + ApplicationLayerParameters parameters = new ApplicationLayerParameters(); + APCIParameters apciParameters = new APCIParameters (); + + Server server = new Server(apciParameters, parameters); + + server.ServerMode = ServerMode.SINGLE_REDUNDANCY_GROUP; + + server.SetLocalPort(20213); + + server.Start(); + + server.DebugOutput = true; + + ConnectionException se = null; + + CS104SlaveEventQueue1 info; + info.asduHandlerCalled = 0; + info.spontCount = 0; + info.lastScaledValue = 0; + + int scaledValue = 0; + + for (int i = 0; i < 15; i++) + { + ASDU newASDU = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.SPONTANEOUS, false, false, 0, 1, false); + + scaledValue++; + + newASDU.AddInformationObject(new MeasuredValueScaled(110, scaledValue, new QualityDescriptor())); + + server.EnqueueASDU(newASDU); + } + + Connection connection = new Connection("127.0.0.1", 20213, apciParameters, parameters); + + connection.SetASDUReceivedHandler(EventQueue1_asduReceivedHandler, info); + + connection.Connect(); + + connection.SendStartDT(); + + Thread.Sleep(500); + + connection.SendStopDT(); + + connection.Close(); + + Assert.Equals(14, info.lastScaledValue); + + info.asduHandlerCalled = 0; + info.spontCount = 0; + + connection.Connect(); + + connection.SendStartDT(); + + for (int i = 0; i < 6; i++) + { + Thread.Sleep (10); + + ASDU newASDU = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.SPONTANEOUS, false, false, 0, 1, false); + + scaledValue++; + + newASDU.AddInformationObject(new MeasuredValueScaled(110, scaledValue, new QualityDescriptor())); + + server.EnqueueASDU(newASDU); + } + + Thread.Sleep(500); + + connection.SendStopDT(); + + Thread.Sleep(5000); + + connection.Close(); + + Assert.Equals(6, info.asduHandlerCalled); + Assert.Equals(6, info.spontCount); + Assert.Equals(20, info.lastScaledValue); + + Assert.IsNotNull(se); + Assert.AreEqual(se.Message, "not connected"); + Assert.AreEqual(10057, ((SocketException)se.InnerException).ErrorCode); + + server.Stop(); + } + [Test()] //[Ignore("Ignore to save execution time")] public void TestSendIMessageAfterStopDT() From a5c6a6ebf9bf1a2a8a01e144efd6bcfd0a9d9efa Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Thu, 30 Jan 2025 10:49:07 +0100 Subject: [PATCH 36/83] Changing type for scaledValue --- tests/Test.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Test.cs b/tests/Test.cs index c863285..448e333 100644 --- a/tests/Test.cs +++ b/tests/Test.cs @@ -335,7 +335,7 @@ public void TestUnconfirmedStoppedState() info.spontCount = 0; info.lastScaledValue = 0; - int scaledValue = 0; + short scaledValue = 0; for (int i = 0; i < 15; i++) { From bfc127417c25217162171636ddda22070856b14c Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Fri, 31 Jan 2025 11:22:15 +0100 Subject: [PATCH 37/83] Commenting some conditions, (to be checked) --- lib60870/CS104/ClientConnection.cs | 276 +++++++++++++++++------------ 1 file changed, 160 insertions(+), 116 deletions(-) diff --git a/lib60870/CS104/ClientConnection.cs b/lib60870/CS104/ClientConnection.cs index 7e256fa..5335ffe 100644 --- a/lib60870/CS104/ClientConnection.cs +++ b/lib60870/CS104/ClientConnection.cs @@ -65,9 +65,9 @@ private void DebugLog(string msg) public enum MasterConnectionState { - M_CON_STATE_STOPPED, - M_CON_STATE_STARTED, - M_CON_STATE_UNCONFIRMED_STOPPED + M_CON_STATE_STOPPED = 0, + M_CON_STATE_STARTED = 1, + M_CON_STATE_UNCONFIRMED_STOPPED = 2 } private MasterConnectionState state; @@ -299,7 +299,10 @@ public bool IsActive isActive = value; if (isActive) + { DebugLog("is active"); + state = MasterConnectionState.M_CON_STATE_STARTED; + } else DebugLog("is not active"); } @@ -1107,172 +1110,214 @@ private bool CheckSequenceNumber(int seqNo) private bool HandleMessage(byte[] buffer, int msgSize) { - UInt64 currentTime = (UInt64) SystemUtils.currentTimeMillis(); + UInt64 currentTime = (UInt64)SystemUtils.currentTimeMillis(); - if ((buffer[2] & 1) == 0) /* I message */ + if (msgSize >= 3) { - if (msgSize < 7) + if (buffer[0] != 0x68) { - DebugLog("I msg too small!"); + DebugLog("Invalid START character!"); return false; } - if (state == MasterConnectionState.M_CON_STATE_STARTED) + byte lengthOfApdu = buffer[1]; + + if (lengthOfApdu != msgSize - 2) { - DebugLog("Received I message while connection not active -> close connection"); + DebugLog("Invalid length of APDU"); return false; } - - if (timeoutT2Triggered == false) - { - timeoutT2Triggered = true; - lastConfirmationTime = currentTime; /* start timeout T2 */ - } - int frameSendSequenceNumber = ((buffer[3] * 0x100) + (buffer[2] & 0xfe)) / 2; - int frameRecvSequenceNumber = ((buffer[5] * 0x100) + (buffer[4] & 0xfe)) / 2; + if ((buffer[2] & 1) == 0) /* I message */ + { + if (msgSize < 7) + { + DebugLog("I msg too small!"); + return false; + } - DebugLog("Received I frame: N(S) = " + frameSendSequenceNumber + " N(R) = " + frameRecvSequenceNumber); + //if (state != MasterConnectionState.M_CON_STATE_STARTED) + //{ + // DebugLog("Received I message while connection not active -> close connection"); + // return false; + //} - /* check the receive sequence number N(R) - connection will be closed on an unexpected value */ - if (frameSendSequenceNumber != receiveCount) - { - DebugLog("Sequence error: Close connection!"); - return false; - } + if (timeoutT2Triggered == false) + { + timeoutT2Triggered = true; + lastConfirmationTime = currentTime; /* start timeout T2 */ + } - if (CheckSequenceNumber(frameRecvSequenceNumber) == false) - { - DebugLog("Sequence number check failed"); - return false; - } + int frameSendSequenceNumber = ((buffer[3] * 0x100) + (buffer[2] & 0xfe)) / 2; + int frameRecvSequenceNumber = ((buffer[5] * 0x100) + (buffer[4] & 0xfe)) / 2; - receiveCount = (receiveCount + 1) % 32768; - unconfirmedReceivedIMessages++; + DebugLog("Received I frame: N(S) = " + frameSendSequenceNumber + " N(R) = " + frameRecvSequenceNumber); - if (isActive) - { - try + /* check the receive sequence number N(R) - connection will be closed on an unexpected value */ + if (frameSendSequenceNumber != receiveCount) { - ASDU asdu = new ASDU(alParameters, buffer, 6, msgSize); - - // push to handler thread for processing - DebugLog("Enqueue received I-message for processing"); - receivedASDUs.Enqueue(asdu); + DebugLog("Sequence error: Close connection!"); + return false; } - catch (ASDUParsingException e) + + if (CheckSequenceNumber(frameRecvSequenceNumber) == false) { - DebugLog("ASDU parsing failed: " + e.Message); + DebugLog("Sequence number check failed"); return false; } - } - else - { - // connection not active - DebugLog("Connection not active -> close connection"); - return false; - } - } + receiveCount = (receiveCount + 1) % 32768; + unconfirmedReceivedIMessages++; - // Check for TESTFR_ACT message - else if ((buffer[2] & 0x43) == 0x43) - { - DebugLog("Send TESTFR_CON"); + if (isActive) + { + try + { + ASDU asdu = new ASDU(alParameters, buffer, 6, msgSize); - socketStream.Write(TESTFR_CON_MSG, 0, TESTFR_CON_MSG.Length); - } + // push to handler thread for processing + DebugLog("Enqueue received I-message for processing"); + receivedASDUs.Enqueue(asdu); + } + catch (ASDUParsingException e) + { + DebugLog("ASDU parsing failed: " + e.Message); + return false; + } + } + else + { + // connection not active + DebugLog("Connection not active -> close connection"); - // Check for STARTDT_ACT message - else if ((buffer[2] & 0x07) == 0x07) - { - DebugLog("Send STARTDT_CON"); + return false; + } + } - if (this.isActive == false) + // Check for TESTFR_ACT message + else if ((buffer[2] & 0x43) == 0x43) { - this.isActive = true; + DebugLog("Send TESTFR_CON"); - this.server.Activated(this); + socketStream.Write(TESTFR_CON_MSG, 0, TESTFR_CON_MSG.Length); } - socketStream.Write(STARTDT_CON_MSG, 0, TESTFR_CON_MSG.Length); - } - - // Check for STOPDT_ACT message - else if ((buffer[2] & 0x13) == 0x13) - { - if (unconfirmedReceivedIMessages > 0) + // Check for STARTDT_ACT message + else if ((buffer[2] & 0x07) == 0x07) { - lastConfirmationTime = currentTime; - unconfirmedReceivedIMessages = 0; - timeoutT2Triggered = false; - SendSMessage(); - } + if (this.isActive == false) + { + this.isActive = true; + + this.server.Activated(this); + } - DebugLog("Send STOPDT_CON"); + DebugLog("Send STARTDT_CON"); - state = MasterConnectionState.M_CON_STATE_STOPPED; + socketStream.Write(STARTDT_CON_MSG, 0, TESTFR_CON_MSG.Length); + } - if (this.isActive == true) + // Check for STOPDT_ACT message + else if ((buffer[2] & 0x13) == 0x13) { - this.isActive = false; + DebugLog("Received STARTDT_ACT"); - this.server.Deactivated(this); - } + if (this.isActive == true) + { + this.isActive = false; - socketStream.Write(STOPDT_CON_MSG, 0, TESTFR_CON_MSG.Length); - } + this.server.Deactivated(this); + } - // Check for TESTFR_CON message - else if ((buffer[2] & 0x83) == 0x83) - { - DebugLog("Recv TESTFR_CON"); + /* Send S-Message to confirm all outstanding messages */ - waitingForTestFRcon = false; + if (unconfirmedReceivedIMessages > 0) + { + lastConfirmationTime = currentTime; + unconfirmedReceivedIMessages = 0; + timeoutT2Triggered = false; + SendSMessage(); - ResetT3Timeout(currentTime); - } + DebugLog("Send STOPDT_CON"); - // S-message - else if (buffer[2] == 0x01) - { - int seqNo = (buffer[4] + buffer[5] * 0x100) / 2; + state = MasterConnectionState.M_CON_STATE_STOPPED; - DebugLog("Recv S(" + seqNo + ") (own sendcounter = " + sendCount + ")"); + try + { + socketStream.Write(STOPDT_CON_MSG, 0, STOPDT_CON_MSG.Length); + } + catch (IOException) + { + DebugLog("Failed to send STOPDT_CON"); + return false; + } + } + } - if (CheckSequenceNumber(seqNo) == false) + // Check for TESTFR_CON message + else if ((buffer[2] & 0x83) == 0x83) { - DebugLog("S message - sequence number mismatch"); - return false; + DebugLog("Recv TESTFR_CON"); + + waitingForTestFRcon = false; + + ResetT3Timeout(currentTime); } - - if (state == MasterConnectionState.M_CON_STATE_UNCONFIRMED_STOPPED) + + // S-message + else if (buffer[2] == 0x01) { - if (unconfirmedReceivedIMessages < 1) - { - state = MasterConnectionState.M_CON_STATE_STOPPED; + int seqNo = (buffer[4] + buffer[5] * 0x100) / 2; - DebugLog("Send STOPDT_CON\n"); + DebugLog("Recv S(" + seqNo + ") (own sendcounter = " + sendCount + ")"); - socketStream.Write(STOPDT_CON_MSG, 0, TESTFR_CON_MSG.Length); + if (CheckSequenceNumber(seqNo) == false) + { + DebugLog("S message - sequence number mismatch"); + return false; } + + //if (state == MasterConnectionState.M_CON_STATE_UNCONFIRMED_STOPPED) + //{ + // if (unconfirmedReceivedIMessages < 1) + // { + // state = MasterConnectionState.M_CON_STATE_STOPPED; + + // DebugLog("Send STOPDT_CON\n"); + + // try + // { + // socketStream.Write(STOPDT_CON_MSG, 0, STOPDT_CON_MSG.Length); + // } + // catch (IOException ex) + // { + // DebugLog("Failed to send STOPDT_CON: " + ex.Message); + // return false; + // } + // } + //} + //else if (state == MasterConnectionState.M_CON_STATE_STOPPED) + //{ + // DebugLog("S message sin stopped state -> active close\n"); + // /* actively close connection */ + // return false; + //} } - else if (state == MasterConnectionState.M_CON_STATE_STOPPED) + else { - DebugLog("S message sin stopped state -> active close\n"); - /* actively close connection */ - return false; - } + DebugLog("Unknown message - IGNORE"); + return true; + } + + ResetT3Timeout(currentTime); + + return true; } else { - DebugLog("Unknown message"); - return true; + DebugLog("Invalid message (too small)"); + return false; } - - ResetT3Timeout(currentTime); - - return true; } private bool handleTimeouts() @@ -1580,7 +1625,6 @@ void HandleRemoteCertificateValidationCallback (object sender, X509Certificate c public void Close() { running = false; - state = MasterConnectionState.M_CON_STATE_STOPPED; } public void ASDUReadyToSend() From e1dc82ba5fab09a7a6587890fbdf62516cdf11dc Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Fri, 31 Jan 2025 18:12:14 +0100 Subject: [PATCH 38/83] Implementing test cases --- tests/Test.cs | 447 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 447 insertions(+) diff --git a/tests/Test.cs b/tests/Test.cs index 448e333..f60e1de 100644 --- a/tests/Test.cs +++ b/tests/Test.cs @@ -6,6 +6,7 @@ using lib60870.CS101; using lib60870.CS104; using System.Security.Cryptography; +using System.Runtime.Intrinsics.Arm; namespace tests { @@ -243,6 +244,77 @@ public void TestStepPositionInformation () } } + [Test ()] + public void TestStepPositionInformationWithCP24Time2a() + { + CP24Time2a time = new CP24Time2a(45, 23, 538); + + StepPositionWithCP24Time2a spi = new StepPositionWithCP24Time2a(103, 27, false, new QualityDescriptor(), time); + + Assert.IsFalse(spi.Transient); + Assert.NotNull(spi.Quality); + Assert.AreEqual(45, spi.Timestamp.Minute); + Assert.AreEqual(23, spi.Timestamp.Second); + Assert.AreEqual(538, spi.Timestamp.Millisecond); + + try + { + spi = new StepPositionWithCP24Time2a(103, 64, false, new QualityDescriptor(), time); + } + catch (ArgumentOutOfRangeException) + { + } + + Assert.IsNull(spi); + + try + { + spi = new StepPositionWithCP24Time2a(103, -65, false, new QualityDescriptor(), time); + } + catch (ArgumentOutOfRangeException) + { + } + + } + + [Test()] + public void TestStepPositionInformationWithCP56Time2a() + { + DateTime dateTime = DateTime.UtcNow; + + CP56Time2a time = new CP56Time2a(dateTime); + + StepPositionWithCP56Time2a spi = new StepPositionWithCP56Time2a(103, 27, false, new QualityDescriptor(), time); + + Assert.IsFalse(spi.Transient); + Assert.NotNull(spi.Quality); + Assert.AreEqual(time.Year, spi.Timestamp.Year); + Assert.AreEqual(time.Month, spi.Timestamp.Month); + Assert.AreEqual(time.DayOfMonth, spi.Timestamp.DayOfMonth); + Assert.AreEqual(time.Minute, spi.Timestamp.Minute); + Assert.AreEqual(time.Second, spi.Timestamp.Second); + Assert.AreEqual(time.Millisecond, spi.Timestamp.Millisecond); + + try + { + spi = new StepPositionWithCP56Time2a(103, 64, false, new QualityDescriptor(), time); + } + catch (ArgumentOutOfRangeException) + { + } + + Assert.IsNull(spi); + + try + { + spi = new StepPositionWithCP56Time2a(103, -65, false, new QualityDescriptor(), time); + } + catch (ArgumentOutOfRangeException) + { + } + + } + [Test ()] //[Ignore("Ignore to save execution time")] public void TestConnectWhileAlreadyConnected () @@ -1443,6 +1515,61 @@ public void TestEncodeDecodePrivateInformationObject () } + [Test()] + public void TestDoubleCommand() + { + DoubleCommand dc = new DoubleCommand(10001, 10, false, 12); + + Assert.AreEqual (10001, dc.ObjectAddress); + Assert.AreEqual (10, dc.State); + Assert.AreEqual (false, dc.Select); + Assert.AreEqual (12, dc.QU); + + dc = new DoubleCommand(10001, 10, false, 3); + + Assert.AreEqual(10001, dc.ObjectAddress); + Assert.AreEqual(10, dc.State); + Assert.AreEqual(false, dc.Select); + Assert.AreEqual(3, dc.QU); + + } + + [Test()] + public void TestDoubleCommandWithCP56Time2a() + { + DateTime dateTime = DateTime.UtcNow; + + CP56Time2a time = new CP56Time2a(dateTime); + + DoubleCommandWithCP56Time2a dc = new DoubleCommandWithCP56Time2a(10001, 10, false, 12, time); + + Assert.AreEqual(10001, dc.ObjectAddress); + Assert.AreEqual(10, dc.State); + Assert.AreEqual(false, dc.Select); + Assert.AreEqual(12, dc.QU); + Assert.AreEqual(time.Year, dc.Timestamp.Year); + Assert.AreEqual(time.Month, dc.Timestamp.Month); + Assert.AreEqual(time.DayOfMonth, dc.Timestamp.DayOfMonth); + Assert.AreEqual(time.Minute, dc.Timestamp.Minute); + Assert.AreEqual(time.Second, dc.Timestamp.Second); + Assert.AreEqual(time.Millisecond, dc.Timestamp.Millisecond); + + dc = new DoubleCommandWithCP56Time2a(10001, 10, false, 3, time); + + Assert.AreEqual(10001, dc.ObjectAddress); + Assert.AreEqual(10, dc.State); + Assert.AreEqual(false, dc.Select); + Assert.AreEqual(3, dc.QU); + Assert.AreEqual(time.Year, dc.Timestamp.Year); + Assert.AreEqual(time.Month, dc.Timestamp.Month); + Assert.AreEqual(time.DayOfMonth, dc.Timestamp.DayOfMonth); + Assert.AreEqual(time.Minute, dc.Timestamp.Minute); + Assert.AreEqual(time.Second, dc.Timestamp.Second); + Assert.AreEqual(time.Millisecond, dc.Timestamp.Millisecond); + } + + + [Test ()] public void TestSingleCommand () { @@ -1467,6 +1594,46 @@ public void TestSingleCommand () Assert.AreEqual (true, sc.Select); } + [Test()] + public void TestSingleCommandWithCP56Time2a() + { + DateTime dateTime = DateTime.UtcNow; + + CP56Time2a time = new CP56Time2a(dateTime); + + SingleCommandWithCP56Time2a sc = new SingleCommandWithCP56Time2a(10002, true, false, 12, time); + + Assert.AreEqual(10002, sc.ObjectAddress); + Assert.AreEqual(true, sc.State); + Assert.AreEqual(false, sc.Select); + Assert.AreEqual(12, sc.QU); + + sc = new SingleCommandWithCP56Time2a(10002, false, true, 3, time); + + Assert.AreEqual(10002, sc.ObjectAddress); + Assert.AreEqual(false, sc.State); + Assert.AreEqual(true, sc.Select); + Assert.AreEqual(3, sc.QU); + Assert.AreEqual(time.Year, sc.Timestamp.Year); + Assert.AreEqual(time.Month, sc.Timestamp.Month); + Assert.AreEqual(time.DayOfMonth, sc.Timestamp.DayOfMonth); + Assert.AreEqual(time.Minute, sc.Timestamp.Minute); + Assert.AreEqual(time.Second, sc.Timestamp.Second); + Assert.AreEqual(time.Millisecond, sc.Timestamp.Millisecond); + + sc.QU = 17; + + Assert.AreEqual(17, sc.QU); + Assert.AreEqual(false, sc.State); + Assert.AreEqual(true, sc.Select); + Assert.AreEqual(time.Year, sc.Timestamp.Year); + Assert.AreEqual(time.Month, sc.Timestamp.Month); + Assert.AreEqual(time.DayOfMonth, sc.Timestamp.DayOfMonth); + Assert.AreEqual(time.Minute, sc.Timestamp.Minute); + Assert.AreEqual(time.Second, sc.Timestamp.Second); + Assert.AreEqual(time.Millisecond, sc.Timestamp.Millisecond); + } + [Test ()] public void TestSinglePointInformationClientServer () { @@ -1655,6 +1822,215 @@ public void TestDoublePointInformationWithCP24Time2a () Assert.AreEqual (538, dpi2.Timestamp.Millisecond); } + [Test()] + public void TestMeasuredValueShortWithCP24Time2a() + { + byte[] buffer = new byte[257]; + + BufferFrame bf = new BufferFrame(buffer, 0); + + ApplicationLayerParameters alParameters = new ApplicationLayerParameters(); + + CP24Time2a time = new CP24Time2a(45, 23, 538); + + MeasuredValueShortWithCP24Time2a mvs = new MeasuredValueShortWithCP24Time2a(101, 0, new QualityDescriptor(), time); + + mvs.Encode(bf, alParameters, true); + Assert.AreEqual(8, bf.GetMsgSize()); + + bf.ResetFrame(); + + mvs.Encode(bf, alParameters, false); + + Assert.AreEqual(alParameters.SizeOfIOA + mvs.GetEncodedSize(), bf.GetMsgSize()); + Assert.AreEqual(11, bf.GetMsgSize()); + + MeasuredValueShortWithCP24Time2a mvs2 = new MeasuredValueShortWithCP24Time2a(alParameters, buffer, 0, false); + + Assert.AreEqual(101, mvs2.ObjectAddress); + Assert.AreEqual(0, mvs2.Value); + Assert.AreEqual(45, mvs2.Timestamp.Minute); + Assert.AreEqual(23, mvs2.Timestamp.Second); + Assert.AreEqual(538, mvs2.Timestamp.Millisecond); + } + + [Test()] + public void TestMeasuredValueShortWithCP56Time2a() + { + byte[] buffer = new byte[257]; + + BufferFrame bf = new BufferFrame(buffer, 0); + + ApplicationLayerParameters alParameters = new ApplicationLayerParameters(); + + DateTime dateTime = DateTime.UtcNow; + + CP56Time2a time = new CP56Time2a(dateTime); + + MeasuredValueShortWithCP56Time2a mvs = new MeasuredValueShortWithCP56Time2a(101, 0, new QualityDescriptor(), time); + + mvs.Encode(bf, alParameters, true); + Assert.AreEqual(12, bf.GetMsgSize()); + + bf.ResetFrame(); + + mvs.Encode(bf, alParameters, false); + + Assert.AreEqual(alParameters.SizeOfIOA + mvs.GetEncodedSize(), bf.GetMsgSize()); + Assert.AreEqual(15, bf.GetMsgSize()); + + MeasuredValueShortWithCP56Time2a mvs2 = new MeasuredValueShortWithCP56Time2a(alParameters, buffer, 0, false); + + Assert.AreEqual(101, mvs2.ObjectAddress); + Assert.AreEqual(0, mvs2.Value); + Assert.AreEqual(time.Year, mvs2.Timestamp.Year); + Assert.AreEqual(time.Month, mvs2.Timestamp.Month); + Assert.AreEqual(time.DayOfMonth, mvs2.Timestamp.DayOfMonth); + Assert.AreEqual(time.Minute, mvs2.Timestamp.Minute); + Assert.AreEqual(time.Second, mvs2.Timestamp.Second); + Assert.AreEqual(time.Millisecond, mvs2.Timestamp.Millisecond); + } + + + [Test()] + public void TestMeasuredValueNormalizedWithCP24Time2a() + { + byte[] buffer = new byte[257]; + + BufferFrame bf = new BufferFrame(buffer, 0); + + ApplicationLayerParameters alParameters = new ApplicationLayerParameters(); + + CP24Time2a time = new CP24Time2a(45, 23, 538); + + MeasuredValueNormalizedWithCP24Time2a mvn = new MeasuredValueNormalizedWithCP24Time2a(201, 0.5f, new QualityDescriptor(), time); + + mvn.Encode(bf, alParameters, true); + Assert.AreEqual(6, bf.GetMsgSize()); + + bf.ResetFrame(); + + mvn.Encode(bf, alParameters, false); + + Assert.AreEqual(alParameters.SizeOfIOA + mvn.GetEncodedSize(), bf.GetMsgSize()); + Assert.AreEqual(9, bf.GetMsgSize()); + + MeasuredValueNormalizedWithCP24Time2a mvn2 = new MeasuredValueNormalizedWithCP24Time2a(alParameters, buffer, 0, false); + + Assert.AreEqual(201, mvn2.ObjectAddress); + Assert.AreEqual(0.5f, mvn2.NormalizedValue, 0.001); + Assert.AreEqual(45, mvn2.Timestamp.Minute); + Assert.AreEqual(23, mvn2.Timestamp.Second); + Assert.AreEqual(538, mvn2.Timestamp.Millisecond); + } + + [Test()] + public void TestMeasuredValueNormalizedWithCP56Time2a() + { + byte[] buffer = new byte[257]; + + BufferFrame bf = new BufferFrame(buffer, 0); + + ApplicationLayerParameters alParameters = new ApplicationLayerParameters(); + + DateTime dateTime = DateTime.UtcNow; + + CP56Time2a time = new CP56Time2a(dateTime); + + MeasuredValueNormalizedWithCP56Time2a mvn = new MeasuredValueNormalizedWithCP56Time2a(201, 0.5f, new QualityDescriptor(), time); + + mvn.Encode(bf, alParameters, true); + Assert.AreEqual(10, bf.GetMsgSize()); + + bf.ResetFrame(); + + mvn.Encode(bf, alParameters, false); + + Assert.AreEqual(alParameters.SizeOfIOA + mvn.GetEncodedSize(), bf.GetMsgSize()); + Assert.AreEqual(13, bf.GetMsgSize()); + + MeasuredValueNormalizedWithCP56Time2a mvn2 = new MeasuredValueNormalizedWithCP56Time2a(alParameters, buffer, 0, false); + + Assert.AreEqual(201, mvn2.ObjectAddress); + Assert.AreEqual(0.5f, mvn2.NormalizedValue, 0.001); + Assert.AreEqual(time.Year, mvn2.Timestamp.Year); + Assert.AreEqual(time.Month, mvn2.Timestamp.Month); + Assert.AreEqual(time.DayOfMonth, mvn2.Timestamp.DayOfMonth); + Assert.AreEqual(time.Minute, mvn2.Timestamp.Minute); + Assert.AreEqual(time.Second, mvn2.Timestamp.Second); + Assert.AreEqual(time.Millisecond, mvn2.Timestamp.Millisecond); + } + + + [Test()] + public void TestMeasuredValueScaledWithCP24Time2a() + { + byte[] buffer = new byte[257]; + + BufferFrame bf = new BufferFrame(buffer, 0); + + ApplicationLayerParameters alParameters = new ApplicationLayerParameters(); + + CP24Time2a time = new CP24Time2a(45, 23, 538); + + MeasuredValueScaledWithCP24Time2a mvs = new MeasuredValueScaledWithCP24Time2a(101, 0, new QualityDescriptor(), time); + + mvs.Encode(bf, alParameters, true); + Assert.AreEqual(6, bf.GetMsgSize()); + + bf.ResetFrame(); + + mvs.Encode(bf, alParameters, false); + + Assert.AreEqual(alParameters.SizeOfIOA + mvs.GetEncodedSize(), bf.GetMsgSize()); + Assert.AreEqual(9, bf.GetMsgSize()); + + MeasuredValueScaledWithCP24Time2a mvs2 = new MeasuredValueScaledWithCP24Time2a(alParameters, buffer, 0, false); + + Assert.AreEqual(101, mvs2.ObjectAddress); + Assert.AreEqual(0, mvs2.ScaledValue); + Assert.AreEqual(45, mvs2.Timestamp.Minute); + Assert.AreEqual(23, mvs2.Timestamp.Second); + Assert.AreEqual(538, mvs2.Timestamp.Millisecond); + } + + [Test()] + public void TestMeasuredValueScaledWithCP56Time2a() + { + byte[] buffer = new byte[257]; + + BufferFrame bf = new BufferFrame(buffer, 0); + + ApplicationLayerParameters alParameters = new ApplicationLayerParameters(); + + DateTime dateTime = DateTime.UtcNow; + + CP56Time2a time = new CP56Time2a(dateTime); + + MeasuredValueScaledWithCP56Time2a mvs = new MeasuredValueScaledWithCP56Time2a(101, 0, new QualityDescriptor(), time); + + mvs.Encode(bf, alParameters, true); + Assert.AreEqual(10, bf.GetMsgSize()); + + bf.ResetFrame(); + + mvs.Encode(bf, alParameters, false); + + Assert.AreEqual(alParameters.SizeOfIOA + mvs.GetEncodedSize(), bf.GetMsgSize()); + Assert.AreEqual(13, bf.GetMsgSize()); + + MeasuredValueScaledWithCP56Time2a mvs2 = new MeasuredValueScaledWithCP56Time2a(alParameters, buffer, 0, false); + + Assert.AreEqual(101, mvs2.ObjectAddress); + Assert.AreEqual(0, mvs2.ScaledValue); + Assert.AreEqual(time.Year, mvs2.Timestamp.Year); + Assert.AreEqual(time.Month, mvs2.Timestamp.Month); + Assert.AreEqual(time.DayOfMonth, mvs2.Timestamp.DayOfMonth); + Assert.AreEqual(time.Minute, mvs2.Timestamp.Minute); + Assert.AreEqual(time.Second, mvs2.Timestamp.Second); + Assert.AreEqual(time.Millisecond, mvs2.Timestamp.Millisecond); + } + [Test ()] public void TestDoublePointInformationWithCP56Time2a () { @@ -1733,6 +2109,60 @@ public void TestMeasuredValueNormalized () Assert.AreEqual (0.5f, mvn2.NormalizedValue, 0.001); } + + [Test()] + public void TestMeasuredValueShort() + { + byte[] buffer = new byte[257]; + + BufferFrame bf = new BufferFrame(buffer, 0); + + ApplicationLayerParameters alParameters = new ApplicationLayerParameters(); + + MeasuredValueShort mvs = new MeasuredValueShort(201, 0.5f, new QualityDescriptor()); + + mvs.Encode(bf, alParameters, true); + Assert.AreEqual(5, bf.GetMsgSize()); + + bf.ResetFrame(); + + mvs.Encode(bf, alParameters, false); + Assert.AreEqual(alParameters.SizeOfIOA + mvs.GetEncodedSize(), bf.GetMsgSize()); + + MeasuredValueShort mvs2 = new MeasuredValueShort(alParameters, buffer, 0, false); + + Assert.AreEqual(201, mvs2.ObjectAddress); + Assert.AreEqual(0.5f, mvs2.Value, 0.001); + } + + + [Test()] + public void TestMeasuredValueScaled() + { + byte[] buffer = new byte[257]; + + BufferFrame bf = new BufferFrame(buffer, 0); + + ApplicationLayerParameters alParameters = new ApplicationLayerParameters(); + + MeasuredValueScaled mvs = new MeasuredValueScaled (201, 0, new QualityDescriptor ()); + + mvs.Encode (bf, alParameters, true); + Assert.AreEqual(3, bf.GetMsgSize()); + + bf.ResetFrame(); + + mvs.Encode(bf, alParameters, false); + Assert.AreEqual(alParameters.SizeOfIOA + mvs.GetEncodedSize(), bf.GetMsgSize()); + + MeasuredValueScaled mvs2 = new MeasuredValueScaled (alParameters, buffer, 0, false); + + Assert.AreEqual(201, mvs2.ObjectAddress); + Assert.Equals(0, mvs2.ScaledValue); + + } + + public class SimpleFile : TransparentFile { public SimpleFile (int ca, int ioa, NameOfFile nof) @@ -2448,6 +2878,23 @@ public void TestConnectionIsRedundancyGroup() } } + + + [Test()] + public void TestSingleEventType() + { + SingleEvent singleEvent = new SingleEvent(); + + EventState eventState = singleEvent.State; + + Assert.Equals(0, eventState); + + QualityDescriptorP qdp = singleEvent.QDP; + + Assert.Equals(0, qdp); + } + + } } From 3b0e65af0b12f1b46c2692b31949ad4be262f79c Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Mon, 3 Feb 2025 17:16:01 +0100 Subject: [PATCH 39/83] Implementing other test cases (other ASDU types, etc...) --- tests/Test.cs | 479 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 466 insertions(+), 13 deletions(-) diff --git a/tests/Test.cs b/tests/Test.cs index f60e1de..c041283 100644 --- a/tests/Test.cs +++ b/tests/Test.cs @@ -7,6 +7,7 @@ using lib60870.CS104; using System.Security.Cryptography; using System.Runtime.Intrinsics.Arm; +using System.Net; namespace tests { @@ -196,31 +197,366 @@ public void TestScaledValue () Assert.AreEqual(-300, scaledValue.Value); } - [Test ()] - public void TestSetpointCommandNormalized () + [Test()] + public void TestReadCommand() + { + ReadCommand rc = new ReadCommand(101); + + Assert.AreEqual(101, rc.ObjectAddress); + + rc = new ReadCommand(102); + + Assert.AreEqual(102, rc.ObjectAddress); + } + + public void TestClockSynchronizationCommand() + { + DateTime dateTime = DateTime.UtcNow; + + CP56Time2a time = new CP56Time2a(dateTime); + + ClockSynchronizationCommand csc = new ClockSynchronizationCommand(101, time); + + Assert.AreEqual(101, csc.ObjectAddress); + Assert.AreEqual(time.Year, csc.NewTime.Year); + Assert.AreEqual(time.Month, csc.NewTime.Month); + Assert.AreEqual(time.DayOfMonth, csc.NewTime.DayOfMonth); + Assert.AreEqual(time.Minute, csc.NewTime.Minute); + Assert.AreEqual(time.Second, csc.NewTime.Second); + Assert.AreEqual(time.Millisecond, csc.NewTime.Millisecond); + + csc = new ClockSynchronizationCommand(102, time); + + Assert.AreEqual(102, csc.ObjectAddress); + Assert.AreEqual(time.Year, csc.NewTime.Year); + Assert.AreEqual(time.Month, csc.NewTime.Month); + Assert.AreEqual(time.DayOfMonth, csc.NewTime.DayOfMonth); + Assert.AreEqual(time.Minute, csc.NewTime.Minute); + Assert.AreEqual(time.Second, csc.NewTime.Second); + Assert.AreEqual(time.Millisecond, csc.NewTime.Millisecond); + + } + + [Test()] + public void TestResetProcessCommand() + { + ResetProcessCommand rp = new ResetProcessCommand(101, 0); + + Assert.AreEqual(101, rp.ObjectAddress); + Assert.AreEqual(0, rp.QRP); + + rp = new ResetProcessCommand(102, 1); + + Assert.AreEqual(102, rp.ObjectAddress); + Assert.AreEqual(1, rp.QRP); + } + + [Test()] + public void TestDelayAcquisitionCommand() + { + CP16Time2a time = new CP16Time2a(24123); + + DelayAcquisitionCommand da = new DelayAcquisitionCommand(101, time); + + Assert.AreEqual(101, da.ObjectAddress); + Assert.AreEqual(24123, da.Delay.ElapsedTimeInMs); + } + + [Test()] + public void TestBitString32() + { + Bitstring32 bs = new Bitstring32(101, 0xaaaa_aaaa, new QualityDescriptor()); + + Assert.AreEqual(101, bs.ObjectAddress); + Assert.AreEqual(0xaaaa_aaaa, bs.Value); + + bs = new Bitstring32(101, 0xffff_0000, new QualityDescriptor()); + + Assert.AreEqual(101, bs.ObjectAddress); + Assert.AreEqual(0xffff_0000, bs.Value); + } + + [Test()] + public void TestBitString32CommandWithCP56Time2a() + { + DateTime dateTime = DateTime.UtcNow; + + CP56Time2a time = new CP56Time2a(dateTime); + + Bitstring32CommandWithCP56Time2a bsc = new Bitstring32CommandWithCP56Time2a(101, 0x00000000, time); + + Assert.AreEqual(101, bsc.ObjectAddress); + Assert.AreEqual(0x00000000, bsc.Value); + + bsc = new Bitstring32CommandWithCP56Time2a(101, 0x12345678, time); + + Assert.AreEqual(101, bsc.ObjectAddress); + Assert.AreEqual(0x12345678, bsc.Value); + Assert.AreEqual(time.Year, bsc.Timestamp.Year); + Assert.AreEqual(time.Month, bsc.Timestamp.Month); + Assert.AreEqual(time.DayOfMonth, bsc.Timestamp.DayOfMonth); + Assert.AreEqual(time.Minute, bsc.Timestamp.Minute); + Assert.AreEqual(time.Second, bsc.Timestamp.Second); + Assert.AreEqual(time.Millisecond, bsc.Timestamp.Millisecond); + } + + [Test()] + public void TestEventOfProtectionEquipmentWithTime() + { + CP16Time2a elapsedTime = new CP16Time2a(24123); + CP24Time2a timestamp = new CP24Time2a(45, 23, 538); + + EventOfProtectionEquipment e = new EventOfProtectionEquipment(101, new SingleEvent(), elapsedTime, timestamp); + + Assert.AreEqual(101, e.ObjectAddress); + Assert.AreEqual(EventState.INDETERMINATE_0, e.Event); + Assert.AreEqual(24123, e.ElapsedTime.ElapsedTimeInMs); + Assert.AreEqual(45, e.Timestamp.Minute); + Assert.AreEqual(23, e.Timestamp.Second); + Assert.AreEqual(538, e.Timestamp.Millisecond); + + } + + [Test()] + public void TestInterrogationCommand() + { + InterrogationCommand ic = new InterrogationCommand(101, 20); + + Assert.AreEqual(101, ic.ObjectAddress); + Assert.AreEqual(20, ic.QOI); + + ic = new InterrogationCommand(101, 21); + + Assert.AreEqual(101, ic.ObjectAddress); + Assert.AreEqual(21, ic.QOI); + + ic = new InterrogationCommand(101, 24); + + Assert.AreEqual(101, ic.ObjectAddress); + Assert.AreEqual(24, ic.QOI); + } + + [Test()] + public void TestCounterInterrogationCommand() + { + CounterInterrogationCommand cic = new CounterInterrogationCommand(101, 20); + + Assert.AreEqual(101, cic.ObjectAddress); + Assert.AreEqual(20, cic.QCC); + + cic = new CounterInterrogationCommand(101, 21); + + Assert.AreEqual(101, cic.ObjectAddress); + Assert.AreEqual(21, cic.QCC); + + cic = new CounterInterrogationCommand(101, 24); + + Assert.AreEqual(101, cic.ObjectAddress); + Assert.AreEqual(24, cic.QCC); + + } + + + [Test()] + public void TestSetpointCommandShort() + { + SetpointCommandShort sc = new SetpointCommandShort(101, 10.5f, new SetpointCommandQualifier(true, 0)); + + Assert.AreEqual(101, sc.ObjectAddress); + Assert.AreEqual(10.5f, sc.Value, 0.001f); + Assert.AreEqual(true, sc.QOS.Select); + + sc = new SetpointCommandShort(102, 1.0f, new SetpointCommandQualifier(true, 0)); + + Assert.AreEqual(102, sc.ObjectAddress); + Assert.AreEqual(1.0f, sc.Value, 0.001f); + Assert.AreEqual(true, sc.QOS.Select); + + sc = new SetpointCommandShort(102, -1.0f, new SetpointCommandQualifier(true, 0)); + + Assert.AreEqual(102, sc.ObjectAddress); + Assert.AreEqual(-1.0f, sc.Value, 0.001f); + Assert.AreEqual(true, sc.QOS.Select); + + } + + [Test()] + public void TestSetpointCommandShortWithCP56Time2a() + { + DateTime dateTime = DateTime.UtcNow; + + CP56Time2a time = new CP56Time2a(dateTime); + + SetpointCommandShortWithCP56Time2a sc = new SetpointCommandShortWithCP56Time2a(101, 10.5f, new SetpointCommandQualifier(true, 0), time); + + Assert.AreEqual(101, sc.ObjectAddress); + Assert.AreEqual(10.5f, sc.Value, 0.001f); + Assert.AreEqual(true, sc.QOS.Select); + Assert.AreEqual(time.Year, sc.Timestamp.Year); + Assert.AreEqual(time.Month, sc.Timestamp.Month); + Assert.AreEqual(time.DayOfMonth, sc.Timestamp.DayOfMonth); + Assert.AreEqual(time.Minute, sc.Timestamp.Minute); + Assert.AreEqual(time.Second, sc.Timestamp.Second); + Assert.AreEqual(time.Millisecond, sc.Timestamp.Millisecond); + + sc = new SetpointCommandShortWithCP56Time2a(102, 1.0f, new SetpointCommandQualifier(true, 0), time); + + Assert.AreEqual(102, sc.ObjectAddress); + Assert.AreEqual(1.0f, sc.Value, 0.001f); + Assert.AreEqual(true, sc.QOS.Select); + Assert.AreEqual(time.Year, sc.Timestamp.Year); + Assert.AreEqual(time.Month, sc.Timestamp.Month); + Assert.AreEqual(time.DayOfMonth, sc.Timestamp.DayOfMonth); + Assert.AreEqual(time.Minute, sc.Timestamp.Minute); + Assert.AreEqual(time.Second, sc.Timestamp.Second); + Assert.AreEqual(time.Millisecond, sc.Timestamp.Millisecond); + + sc = new SetpointCommandShortWithCP56Time2a(102, -1.0f, new SetpointCommandQualifier(true, 0), time); + + Assert.AreEqual(102, sc.ObjectAddress); + Assert.AreEqual(-1.0f, sc.Value, 0.001f); + Assert.AreEqual(true, sc.QOS.Select); + Assert.AreEqual(time.Year, sc.Timestamp.Year); + Assert.AreEqual(time.Month, sc.Timestamp.Month); + Assert.AreEqual(time.DayOfMonth, sc.Timestamp.DayOfMonth); + Assert.AreEqual(time.Minute, sc.Timestamp.Minute); + Assert.AreEqual(time.Second, sc.Timestamp.Second); + Assert.AreEqual(time.Millisecond, sc.Timestamp.Millisecond); + + } + + [Test()] + public void TestSetpointCommandScaled() + { + SetpointCommandScaled sc = new SetpointCommandScaled(101, new ScaledValue(-32767), new SetpointCommandQualifier(true, 0)); + + Assert.AreEqual(101, sc.ObjectAddress); + Assert.AreEqual(-32767, sc.ScaledValue.Value); + Assert.AreEqual(true, sc.QOS.Select); + + sc = new SetpointCommandScaled(101, new ScaledValue(32767), new SetpointCommandQualifier (true, 0)); + + Assert.AreEqual(101, sc.ObjectAddress); + Assert.AreEqual(32767, sc.ScaledValue.ShortValue); + Assert.AreEqual(true, sc.QOS.Select); + + sc = new SetpointCommandScaled(101, new ScaledValue(-32768), new SetpointCommandQualifier(true, 0)); + + Assert.AreEqual(101, sc.ObjectAddress); + Assert.AreEqual(-32768, sc.ScaledValue.ShortValue); + Assert.AreEqual(true, sc.QOS.Select); + } + + [Test()] + public void TestSetpointCommandScaledWithCP56Time2a() + { + + DateTime dateTime = DateTime.UtcNow; + + CP56Time2a time = new CP56Time2a(dateTime); + + SetpointCommandScaledWithCP56Time2a sc = new SetpointCommandScaledWithCP56Time2a(101, new ScaledValue(1), new SetpointCommandQualifier(true, 0), time); + + Assert.AreEqual(101, sc.ObjectAddress); + Assert.AreEqual(1, sc.ScaledValue.Value); + Assert.AreEqual(true, sc.QOS.Select); + Assert.AreEqual(time.Year, sc.Timestamp.Year); + Assert.AreEqual(time.Month, sc.Timestamp.Month); + Assert.AreEqual(time.DayOfMonth, sc.Timestamp.DayOfMonth); + Assert.AreEqual(time.Minute, sc.Timestamp.Minute); + Assert.AreEqual(time.Second, sc.Timestamp.Second); + Assert.AreEqual(time.Millisecond, sc.Timestamp.Millisecond); + + sc = new SetpointCommandScaledWithCP56Time2a(101, new ScaledValue(32767), new SetpointCommandQualifier(true, 0), time); + + Assert.AreEqual(101, sc.ObjectAddress); + Assert.AreEqual(32767, sc.ScaledValue.ShortValue); + Assert.AreEqual(true, sc.QOS.Select); + Assert.AreEqual(time.Year, sc.Timestamp.Year); + Assert.AreEqual(time.Month, sc.Timestamp.Month); + Assert.AreEqual(time.DayOfMonth, sc.Timestamp.DayOfMonth); + Assert.AreEqual(time.Minute, sc.Timestamp.Minute); + Assert.AreEqual(time.Second, sc.Timestamp.Second); + Assert.AreEqual(time.Millisecond, sc.Timestamp.Millisecond); + + sc = new SetpointCommandScaledWithCP56Time2a(101, new ScaledValue(-32768), new SetpointCommandQualifier(true, 0), time); + + Assert.AreEqual(101, sc.ObjectAddress); + Assert.AreEqual(-32768, sc.ScaledValue.ShortValue); + Assert.AreEqual(true, sc.QOS.Select); + Assert.AreEqual(time.Year, sc.Timestamp.Year); + Assert.AreEqual(time.Month, sc.Timestamp.Month); + Assert.AreEqual(time.DayOfMonth, sc.Timestamp.DayOfMonth); + Assert.AreEqual(time.Minute, sc.Timestamp.Minute); + Assert.AreEqual(time.Second, sc.Timestamp.Second); + Assert.AreEqual(time.Millisecond, sc.Timestamp.Millisecond); + } + + [Test()] + public void TestSetpointCommandNormalized() { - SetpointCommandNormalized sc = new SetpointCommandNormalized (102, -0.5f, - new SetpointCommandQualifier (true, 0)); + SetpointCommandNormalized sc = new SetpointCommandNormalized(102, -0.5f, + new SetpointCommandQualifier(true, 0)); - Assert.AreEqual (102, sc.ObjectAddress); + Assert.AreEqual(102, sc.ObjectAddress); + Assert.AreEqual(-0.5f, sc.NormalizedValue, 0.001f); + Assert.AreEqual(true, sc.QOS.Select); - Assert.AreEqual (-0.5f, sc.NormalizedValue, 0.001f); + sc = new SetpointCommandNormalized(102, 32767, new SetpointCommandQualifier(true, 0)); - Assert.AreEqual (true, sc.QOS.Select); + Assert.AreEqual(1.0, sc.NormalizedValue, 0.001f); + Assert.AreEqual(32767, sc.RawValue); - sc = new SetpointCommandNormalized (102, 32767, new SetpointCommandQualifier (true, 0)); + sc = new SetpointCommandNormalized(102, -32768, new SetpointCommandQualifier(true, 0)); - Assert.AreEqual (1.0, sc.NormalizedValue, 0.001f); + Assert.AreEqual(-1.0, sc.NormalizedValue, 0.001f); + Assert.AreEqual(-32768, sc.RawValue); + } - Assert.AreEqual (32767, sc.RawValue); + [Test()] + public void TestSetpointCommandNormalizedWithCP56Time2a() + { + DateTime dateTime = DateTime.UtcNow; + + CP56Time2a time = new CP56Time2a(dateTime); + + SetpointCommandNormalizedWithCP56Time2a sc = new SetpointCommandNormalizedWithCP56Time2a(102, -0.5f, new SetpointCommandQualifier(true, 0), time); + + Assert.AreEqual(102, sc.ObjectAddress); + Assert.AreEqual(-0.5f, sc.NormalizedValue, 0.001f); + Assert.AreEqual(true, sc.QOS.Select); + Assert.AreEqual(time.Year, sc.Timestamp.Year); + Assert.AreEqual(time.Month, sc.Timestamp.Month); + Assert.AreEqual(time.DayOfMonth, sc.Timestamp.DayOfMonth); + Assert.AreEqual(time.Minute, sc.Timestamp.Minute); + Assert.AreEqual(time.Second, sc.Timestamp.Second); + Assert.AreEqual(time.Millisecond, sc.Timestamp.Millisecond); - sc = new SetpointCommandNormalized (102, -32768, new SetpointCommandQualifier (true, 0)); + sc = new SetpointCommandNormalizedWithCP56Time2a(102, 32767, new SetpointCommandQualifier(true, 0), time); + + Assert.AreEqual(1.0, sc.NormalizedValue, 0.001f); + Assert.AreEqual(32767, sc.RawValue); + Assert.AreEqual(time.Year, sc.Timestamp.Year); + Assert.AreEqual(time.Month, sc.Timestamp.Month); + Assert.AreEqual(time.DayOfMonth, sc.Timestamp.DayOfMonth); + Assert.AreEqual(time.Minute, sc.Timestamp.Minute); + Assert.AreEqual(time.Second, sc.Timestamp.Second); + Assert.AreEqual(time.Millisecond, sc.Timestamp.Millisecond); - Assert.AreEqual (-1.0, sc.NormalizedValue, 0.001f); + sc = new SetpointCommandNormalizedWithCP56Time2a(102, -32768, new SetpointCommandQualifier(true, 0), time); - Assert.AreEqual (-32768, sc.RawValue); + Assert.AreEqual(-1.0, sc.NormalizedValue, 0.001f); + Assert.AreEqual(-32768, sc.RawValue); + Assert.AreEqual(time.Year, sc.Timestamp.Year); + Assert.AreEqual(time.Month, sc.Timestamp.Month); + Assert.AreEqual(time.DayOfMonth, sc.Timestamp.DayOfMonth); + Assert.AreEqual(time.Minute, sc.Timestamp.Minute); + Assert.AreEqual(time.Second, sc.Timestamp.Second); + Assert.AreEqual(time.Millisecond, sc.Timestamp.Millisecond); } + + [Test ()] public void TestStepPositionInformation () { @@ -628,6 +964,69 @@ public void TestConnectSameConnectionMultipleTimesServerDisconnects() connection.Close(); } + [Test()] + public void TestCS104ConnectionUseAfterClose() + { + ApplicationLayerParameters parameters = new ApplicationLayerParameters(); + APCIParameters apciParameters = new APCIParameters(); + + Server server = new Server(apciParameters, parameters); + + Assert.NotNull(server); + + server.ServerMode = ServerMode.SINGLE_REDUNDANCY_GROUP; + + server.SetLocalPort(20213); + + server.Start(); + + Connection con = new Connection("127.0.0.1", 20213); + + Assert.NotNull(con); + + con.Connect(); + + con.Close(); + + con.SendInterrogationCommand(CauseOfTransmission.ACTIVATION, 1, 20); + + server.Stop(); + + } + + [Test()] + public void TestCS104ConnectionUseAfterServerCloseConnection() + { + ApplicationLayerParameters parameters = new ApplicationLayerParameters(); + APCIParameters apciParameters = new APCIParameters(); + + Server server = new Server(apciParameters, parameters); + + Assert.NotNull(server); + + server.ServerMode = ServerMode.SINGLE_REDUNDANCY_GROUP; + + server.SetLocalPort(20213); + + server.Start(); + + Connection con = new Connection("127.0.0.1", 20213); + + Assert.NotNull(con); + + con.Connect(); + + server.Stop(); + + /* wait to allow client side to detect connection loss */ + Thread.Sleep(500); + + con.SendInterrogationCommand(CauseOfTransmission.ACTIVATION, 1, 20); + + con.Close(); + + } + [Test ()] public void TestASDUAddInformationObjects () { ApplicationLayerParameters cp = new ApplicationLayerParameters (); @@ -1570,6 +1969,60 @@ public void TestDoubleCommandWithCP56Time2a() + [Test()] + public void TestStepCommandValue() + { + StepCommand scv = new StepCommand(10001, StepCommandValue.INVALID_0, false, 10); + + Assert.AreEqual(10001, scv.ObjectAddress); + Assert.AreEqual(StepCommandValue.INVALID_0, scv.State); + Assert.AreEqual(false, scv.Select); + Assert.AreEqual(10, scv.QU); + + scv = new StepCommand(10002, StepCommandValue.HIGHER, true, 3); + + Assert.AreEqual(10002, scv.ObjectAddress); + Assert.AreEqual(StepCommandValue.HIGHER, scv.State); + Assert.AreEqual(false, scv.Select); + Assert.AreEqual(10, scv.QU); + + } + + [Test()] + public void TestStepCommandValueWithCP56Time2a() + { + DateTime dateTime = DateTime.UtcNow; + + CP56Time2a time = new CP56Time2a(dateTime); + + StepCommandWithCP56Time2a scv = new StepCommandWithCP56Time2a(10001, StepCommandValue.INVALID_0, false, 12, time); + + Assert.AreEqual(10001, scv.ObjectAddress); + Assert.AreEqual(StepCommandValue.INVALID_0, scv.State); + Assert.AreEqual(false, scv.Select); + Assert.AreEqual(12, scv.QU); + Assert.AreEqual(time.Year, scv.Timestamp.Year); + Assert.AreEqual(time.Month, scv.Timestamp.Month); + Assert.AreEqual(time.DayOfMonth, scv.Timestamp.DayOfMonth); + Assert.AreEqual(time.Minute, scv.Timestamp.Minute); + Assert.AreEqual(time.Second, scv.Timestamp.Second); + Assert.AreEqual(time.Millisecond, scv.Timestamp.Millisecond); + + scv = new StepCommandWithCP56Time2a(10002, StepCommandValue.HIGHER, true, 3, time); + + Assert.AreEqual(10002, scv.ObjectAddress); + Assert.AreEqual(StepCommandValue.HIGHER, scv.State); + Assert.AreEqual(false, scv.Select); + Assert.AreEqual(10, scv.QU); + Assert.AreEqual(time.Year, scv.Timestamp.Year); + Assert.AreEqual(time.Month, scv.Timestamp.Month); + Assert.AreEqual(time.DayOfMonth, scv.Timestamp.DayOfMonth); + Assert.AreEqual(time.Minute, scv.Timestamp.Minute); + Assert.AreEqual(time.Second, scv.Timestamp.Second); + Assert.AreEqual(time.Millisecond, scv.Timestamp.Millisecond); + } + + [Test ()] public void TestSingleCommand () { From 1cc8648e8bfadbab5d971b7b45bd5fa2e50e898d Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Tue, 4 Feb 2025 14:57:45 +0100 Subject: [PATCH 40/83] Implementing other test cases --- tests/Test.cs | 1817 ++++++++++++++++++++++++++++--------------------- 1 file changed, 1025 insertions(+), 792 deletions(-) diff --git a/tests/Test.cs b/tests/Test.cs index c041283..0a7452e 100644 --- a/tests/Test.cs +++ b/tests/Test.cs @@ -8,6 +8,7 @@ using System.Security.Cryptography; using System.Runtime.Intrinsics.Arm; using System.Net; +using System.Security.Cryptography.X509Certificates; namespace tests { @@ -81,114 +82,114 @@ public override void Encode(Frame frame, ApplicationLayerParameters parameters, - [TestFixture ()] + [TestFixture()] public class Test { - [Test ()] - public void TestStatusAndStatusChangedDetection () + [Test()] + public void TestStatusAndStatusChangedDetection() { - StatusAndStatusChangeDetection scd = new StatusAndStatusChangeDetection (); + StatusAndStatusChangeDetection scd = new StatusAndStatusChangeDetection(); - Assert.AreEqual (false, scd.ST (0)); - Assert.AreEqual (false, scd.ST (15)); - Assert.AreEqual (false, scd.CD (0)); - Assert.AreEqual (false, scd.CD (15)); + Assert.AreEqual(false, scd.ST(0)); + Assert.AreEqual(false, scd.ST(15)); + Assert.AreEqual(false, scd.CD(0)); + Assert.AreEqual(false, scd.CD(15)); - Assert.AreEqual (false, scd.CD (1)); + Assert.AreEqual(false, scd.CD(1)); - scd.CD (0, true); + scd.CD(0, true); - Assert.AreEqual (true, scd.CD (0)); - Assert.AreEqual (false, scd.CD (1)); + Assert.AreEqual(true, scd.CD(0)); + Assert.AreEqual(false, scd.CD(1)); - scd.CD (15, true); + scd.CD(15, true); - Assert.AreEqual (true, scd.CD (15)); - Assert.AreEqual (false, scd.CD (14)); + Assert.AreEqual(true, scd.CD(15)); + Assert.AreEqual(false, scd.CD(14)); } - [Test ()] - public void TestBCR () + [Test()] + public void TestBCR() { - BinaryCounterReading bcr = new BinaryCounterReading (); + BinaryCounterReading bcr = new BinaryCounterReading(); bcr.Value = 1000; - Assert.AreEqual (1000, bcr.Value); + Assert.AreEqual(1000, bcr.Value); bcr.Value = -1000; - Assert.AreEqual (-1000, bcr.Value); + Assert.AreEqual(-1000, bcr.Value); bcr.SequenceNumber = 31; - Assert.AreEqual (31, bcr.SequenceNumber); + Assert.AreEqual(31, bcr.SequenceNumber); bcr.SequenceNumber = 0; - Assert.AreEqual (0, bcr.SequenceNumber); + Assert.AreEqual(0, bcr.SequenceNumber); /* Out of range sequenceNumber */ bcr.SequenceNumber = 32; - Assert.AreEqual (0, bcr.SequenceNumber); + Assert.AreEqual(0, bcr.SequenceNumber); - bcr = new BinaryCounterReading (); + bcr = new BinaryCounterReading(); bcr.Invalid = true; - Assert.AreEqual (true, bcr.Invalid); - Assert.AreEqual (false, bcr.Carry); - Assert.AreEqual (false, bcr.Adjusted); - Assert.AreEqual (0, bcr.SequenceNumber); - Assert.AreEqual (0, bcr.Value); + Assert.AreEqual(true, bcr.Invalid); + Assert.AreEqual(false, bcr.Carry); + Assert.AreEqual(false, bcr.Adjusted); + Assert.AreEqual(0, bcr.SequenceNumber); + Assert.AreEqual(0, bcr.Value); - bcr = new BinaryCounterReading (); + bcr = new BinaryCounterReading(); bcr.Carry = true; - Assert.AreEqual (false, bcr.Invalid); - Assert.AreEqual (true, bcr.Carry); - Assert.AreEqual (false, bcr.Adjusted); - Assert.AreEqual (0, bcr.SequenceNumber); - Assert.AreEqual (0, bcr.Value); + Assert.AreEqual(false, bcr.Invalid); + Assert.AreEqual(true, bcr.Carry); + Assert.AreEqual(false, bcr.Adjusted); + Assert.AreEqual(0, bcr.SequenceNumber); + Assert.AreEqual(0, bcr.Value); - bcr = new BinaryCounterReading (); + bcr = new BinaryCounterReading(); bcr.Adjusted = true; - Assert.AreEqual (false, bcr.Invalid); - Assert.AreEqual (false, bcr.Carry); - Assert.AreEqual (true, bcr.Adjusted); - Assert.AreEqual (0, bcr.SequenceNumber); - Assert.AreEqual (0, bcr.Value); + Assert.AreEqual(false, bcr.Invalid); + Assert.AreEqual(false, bcr.Carry); + Assert.AreEqual(true, bcr.Adjusted); + Assert.AreEqual(0, bcr.SequenceNumber); + Assert.AreEqual(0, bcr.Value); } - [Test ()] - public void TestScaledValue () + [Test()] + public void TestScaledValue() { - ScaledValue scaledValue = new ScaledValue (0); + ScaledValue scaledValue = new ScaledValue(0); - Assert.AreEqual (0, scaledValue.Value); - Assert.AreEqual ((short)0, scaledValue.ShortValue); + Assert.AreEqual(0, scaledValue.Value); + Assert.AreEqual((short)0, scaledValue.ShortValue); - scaledValue = new ScaledValue (32767); - Assert.AreEqual (32767, scaledValue.Value); - Assert.AreEqual ((short)32767, scaledValue.ShortValue); + scaledValue = new ScaledValue(32767); + Assert.AreEqual(32767, scaledValue.Value); + Assert.AreEqual((short)32767, scaledValue.ShortValue); - scaledValue = new ScaledValue (32768); - Assert.AreEqual (32767, scaledValue.Value); - Assert.AreEqual ((short)32767, scaledValue.ShortValue); + scaledValue = new ScaledValue(32768); + Assert.AreEqual(32767, scaledValue.Value); + Assert.AreEqual((short)32767, scaledValue.ShortValue); - scaledValue = new ScaledValue (-32768); - Assert.AreEqual (-32768, scaledValue.Value); - Assert.AreEqual ((short)-32768, scaledValue.ShortValue); + scaledValue = new ScaledValue(-32768); + Assert.AreEqual(-32768, scaledValue.Value); + Assert.AreEqual((short)-32768, scaledValue.ShortValue); - scaledValue = new ScaledValue (-32769); - Assert.AreEqual (-32768, scaledValue.Value); - Assert.AreEqual ((short)-32768, scaledValue.ShortValue); + scaledValue = new ScaledValue(-32769); + Assert.AreEqual(-32768, scaledValue.Value); + Assert.AreEqual((short)-32768, scaledValue.ShortValue); scaledValue = new ScaledValue(-1); Assert.AreEqual(-1, scaledValue.Value); @@ -434,7 +435,7 @@ public void TestSetpointCommandScaled() Assert.AreEqual(-32767, sc.ScaledValue.Value); Assert.AreEqual(true, sc.QOS.Select); - sc = new SetpointCommandScaled(101, new ScaledValue(32767), new SetpointCommandQualifier (true, 0)); + sc = new SetpointCommandScaled(101, new ScaledValue(32767), new SetpointCommandQualifier(true, 0)); Assert.AreEqual(101, sc.ObjectAddress); Assert.AreEqual(32767, sc.ScaledValue.ShortValue); @@ -555,32 +556,38 @@ public void TestSetpointCommandNormalizedWithCP56Time2a() Assert.AreEqual(time.Millisecond, sc.Timestamp.Millisecond); } - - [Test ()] - public void TestStepPositionInformation () + + [Test()] + public void TestStepPositionInformation() { - StepPositionInformation spi = new StepPositionInformation (103, 27, false, new QualityDescriptor ()); + StepPositionInformation spi = new StepPositionInformation(103, 27, false, new QualityDescriptor()); - Assert.IsFalse (spi.Transient); - Assert.NotNull (spi.Quality); + Assert.IsFalse(spi.Transient); + Assert.NotNull(spi.Quality); spi = null; - try { - spi = new StepPositionInformation (103, 64, false, new QualityDescriptor ()); - } catch (ArgumentOutOfRangeException) { + try + { + spi = new StepPositionInformation(103, 64, false, new QualityDescriptor()); + } + catch (ArgumentOutOfRangeException) + { } - Assert.IsNull (spi); + Assert.IsNull(spi); - try { - spi = new StepPositionInformation (103, -65, false, new QualityDescriptor ()); - } catch (ArgumentOutOfRangeException) { + try + { + spi = new StepPositionInformation(103, -65, false, new QualityDescriptor()); + } + catch (ArgumentOutOfRangeException) + { } } - [Test ()] + [Test()] public void TestStepPositionInformationWithCP24Time2a() { CP24Time2a time = new CP24Time2a(45, 23, 538); @@ -651,46 +658,52 @@ public void TestStepPositionInformationWithCP56Time2a() } - [Test ()] + [Test()] //[Ignore("Ignore to save execution time")] - public void TestConnectWhileAlreadyConnected () + public void TestConnectWhileAlreadyConnected() { - ApplicationLayerParameters parameters = new ApplicationLayerParameters (); - APCIParameters apciParameters = new APCIParameters (); + ApplicationLayerParameters parameters = new ApplicationLayerParameters(); + APCIParameters apciParameters = new APCIParameters(); - Server server = new Server (apciParameters, parameters); + Server server = new Server(apciParameters, parameters); - server.SetLocalPort (20213); + server.SetLocalPort(20213); - server.Start (); + server.Start(); - Connection connection = new Connection ("127.0.0.1", 20213, apciParameters, parameters); + Connection connection = new Connection("127.0.0.1", 20213, apciParameters, parameters); ConnectionException se = null; - try { - connection.Connect (); - } catch (ConnectionException ex) { + try + { + connection.Connect(); + } + catch (ConnectionException ex) + { se = ex; } - Assert.IsNull (se); + Assert.IsNull(se); - Thread.Sleep (100); + Thread.Sleep(100); - try { - connection.Connect (); - } catch (ConnectionException ex) { + try + { + connection.Connect(); + } + catch (ConnectionException ex) + { se = ex; } - Assert.IsNotNull (se); - Assert.AreEqual (se.Message, "already connected"); - Assert.AreEqual (10056, ((SocketException)se.InnerException).ErrorCode); + Assert.IsNotNull(se); + Assert.AreEqual(se.Message, "already connected"); + Assert.AreEqual(10056, ((SocketException)se.InnerException).ErrorCode); - connection.Close (); + connection.Close(); - server.Stop (); + server.Stop(); } struct CS104SlaveEventQueue1 @@ -706,7 +719,7 @@ private static bool EventQueue1_asduReceivedHandler(object param, ASDU asdu) info.asduHandlerCalled++; - if(asdu.Cot == CauseOfTransmission.SPONTANEOUS) + if (asdu.Cot == CauseOfTransmission.SPONTANEOUS) { info.spontCount++; @@ -724,7 +737,7 @@ private static bool EventQueue1_asduReceivedHandler(object param, ASDU asdu) public void TestUnconfirmedStoppedState() { ApplicationLayerParameters parameters = new ApplicationLayerParameters(); - APCIParameters apciParameters = new APCIParameters (); + APCIParameters apciParameters = new APCIParameters(); Server server = new Server(apciParameters, parameters); @@ -779,9 +792,9 @@ public void TestUnconfirmedStoppedState() connection.SendStartDT(); - for (int i = 0; i < 6; i++) + for (int i = 0; i < 6; i++) { - Thread.Sleep (10); + Thread.Sleep(10); ASDU newASDU = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.SPONTANEOUS, false, false, 0, 1, false); @@ -858,46 +871,52 @@ public void TestSendIMessageAfterStopDT() server.Stop(); } - [Test ()] + [Test()] //[Ignore("Ignore to save execution time")] - public void TestConnectSameConnectionMultipleTimes () + public void TestConnectSameConnectionMultipleTimes() { - ApplicationLayerParameters parameters = new ApplicationLayerParameters (); - APCIParameters apciParameters = new APCIParameters (); + ApplicationLayerParameters parameters = new ApplicationLayerParameters(); + APCIParameters apciParameters = new APCIParameters(); - Server server = new Server (apciParameters, parameters); + Server server = new Server(apciParameters, parameters); - server.SetLocalPort (20213); + server.SetLocalPort(20213); - server.Start (); + server.Start(); - Connection connection = new Connection ("127.0.0.1", 20213, apciParameters, parameters); + Connection connection = new Connection("127.0.0.1", 20213, apciParameters, parameters); SocketException se = null; - try { - connection.Connect (); + try + { + connection.Connect(); - connection.Close (); - } catch (SocketException ex) { + connection.Close(); + } + catch (SocketException ex) + { se = ex; } - Assert.IsNull (se); + Assert.IsNull(se); - try { - connection.Connect (); + try + { + connection.Connect(); - connection.Close (); - } catch (SocketException ex) { + connection.Close(); + } + catch (SocketException ex) + { se = ex; } - Assert.Null (se); + Assert.Null(se); - connection.Close (); + connection.Close(); - server.Stop (); + server.Stop(); } [Test()] @@ -950,7 +969,7 @@ public void TestConnectSameConnectionMultipleTimesServerDisconnects() connection.Close(); } catch (ConnectionException ex) - { + { se = ex; } @@ -1027,670 +1046,722 @@ public void TestCS104ConnectionUseAfterServerCloseConnection() } - [Test ()] - public void TestASDUAddInformationObjects () { - ApplicationLayerParameters cp = new ApplicationLayerParameters (); + [Test()] + public void TestASDUAddInformationObjects() + { + ApplicationLayerParameters cp = new ApplicationLayerParameters(); - ASDU asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + ASDU asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); - asdu.AddInformationObject (new SinglePointInformation (100, false, new QualityDescriptor ())); - asdu.AddInformationObject (new SinglePointInformation (101, false, new QualityDescriptor ())); + asdu.AddInformationObject(new SinglePointInformation(100, false, new QualityDescriptor())); + asdu.AddInformationObject(new SinglePointInformation(101, false, new QualityDescriptor())); // wrong InformationObject type expect exception ArgumentException ae = null; - try { - asdu.AddInformationObject (new DoublePointInformation (102, DoublePointValue.ON, new QualityDescriptor ())); - } catch (ArgumentException e) { + try + { + asdu.AddInformationObject(new DoublePointInformation(102, DoublePointValue.ON, new QualityDescriptor())); + } + catch (ArgumentException e) + { ae = e; } - Assert.NotNull (ae); + Assert.NotNull(ae); } - [Test ()] - public void TestASDUAddTooMuchInformationObjects () { - ApplicationLayerParameters cp = new ApplicationLayerParameters (); + [Test()] + public void TestASDUAddTooMuchInformationObjects() + { + ApplicationLayerParameters cp = new ApplicationLayerParameters(); - ASDU asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + ASDU asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); int addedCounter = 0; int ioa = 100; - while (asdu.AddInformationObject (new SinglePointInformation (ioa, false, new QualityDescriptor ()))) { + while (asdu.AddInformationObject(new SinglePointInformation(ioa, false, new QualityDescriptor()))) + { ioa++; addedCounter++; } - Assert.AreEqual (60, addedCounter); + Assert.AreEqual(60, addedCounter); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, true); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, true); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new SinglePointInformation (ioa, false, new QualityDescriptor ()))) { + while (asdu.AddInformationObject(new SinglePointInformation(ioa, false, new QualityDescriptor()))) + { ioa++; addedCounter++; } - Assert.AreEqual (127, addedCounter); + Assert.AreEqual(127, addedCounter); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new SinglePointWithCP24Time2a (ioa, false, new QualityDescriptor (), new CP24Time2a ()))) { + while (asdu.AddInformationObject(new SinglePointWithCP24Time2a(ioa, false, new QualityDescriptor(), new CP24Time2a()))) + { ioa++; addedCounter++; } - Assert.AreEqual (34, addedCounter); + Assert.AreEqual(34, addedCounter); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, true); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, true); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new SinglePointWithCP56Time2a (ioa, false, new QualityDescriptor (), new CP56Time2a ()))) { + while (asdu.AddInformationObject(new SinglePointWithCP56Time2a(ioa, false, new QualityDescriptor(), new CP56Time2a()))) + { ioa++; addedCounter++; } - Assert.AreEqual (30, addedCounter); + Assert.AreEqual(30, addedCounter); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new MeasuredValueShortWithCP56Time2a (ioa, 0.0f, QualityDescriptor.VALID (), new CP56Time2a ()))) { + while (asdu.AddInformationObject(new MeasuredValueShortWithCP56Time2a(ioa, 0.0f, QualityDescriptor.VALID(), new CP56Time2a()))) + { ioa++; addedCounter++; } - Assert.AreEqual (16, addedCounter); + Assert.AreEqual(16, addedCounter); } - [Test ()] - public void TestASDUAddInformationObjectsInWrongOrderToSequence () { - ApplicationLayerParameters cp = new ApplicationLayerParameters (); + [Test()] + public void TestASDUAddInformationObjectsInWrongOrderToSequence() + { + ApplicationLayerParameters cp = new ApplicationLayerParameters(); - ASDU asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, true); + ASDU asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, true); - bool encoded = asdu.AddInformationObject (new SinglePointInformation (100, false, new QualityDescriptor ())); + bool encoded = asdu.AddInformationObject(new SinglePointInformation(100, false, new QualityDescriptor())); - Assert.IsTrue (encoded); + Assert.IsTrue(encoded); - encoded = asdu.AddInformationObject (new SinglePointInformation (101, false, new QualityDescriptor ())); + encoded = asdu.AddInformationObject(new SinglePointInformation(101, false, new QualityDescriptor())); - Assert.IsTrue (encoded); + Assert.IsTrue(encoded); - encoded = asdu.AddInformationObject (new SinglePointInformation (102, false, new QualityDescriptor ())); + encoded = asdu.AddInformationObject(new SinglePointInformation(102, false, new QualityDescriptor())); - Assert.IsTrue (encoded); + Assert.IsTrue(encoded); - encoded = asdu.AddInformationObject (new SinglePointInformation (104, false, new QualityDescriptor ())); + encoded = asdu.AddInformationObject(new SinglePointInformation(104, false, new QualityDescriptor())); - Assert.IsFalse (encoded); + Assert.IsFalse(encoded); - encoded = asdu.AddInformationObject (new SinglePointInformation (102, false, new QualityDescriptor ())); + encoded = asdu.AddInformationObject(new SinglePointInformation(102, false, new QualityDescriptor())); - Assert.IsFalse (encoded); + Assert.IsFalse(encoded); - Assert.AreEqual (3, asdu.NumberOfElements); + Assert.AreEqual(3, asdu.NumberOfElements); } - [Test ()] - public void TestEncodeASDUsWithManyInformationObjects () { - ApplicationLayerParameters cp = new ApplicationLayerParameters (); + [Test()] + public void TestEncodeASDUsWithManyInformationObjects() + { + ApplicationLayerParameters cp = new ApplicationLayerParameters(); - ASDU asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + ASDU asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); int addedCounter = 0; int ioa = 100; - while (asdu.AddInformationObject (new SinglePointInformation (ioa, false, new QualityDescriptor ()))) { + while (asdu.AddInformationObject(new SinglePointInformation(ioa, false, new QualityDescriptor()))) + { ioa++; addedCounter++; } - Assert.AreEqual (60, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(60, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new SinglePointWithCP24Time2a (ioa, true, new QualityDescriptor (), new CP24Time2a ()))) { + while (asdu.AddInformationObject(new SinglePointWithCP24Time2a(ioa, true, new QualityDescriptor(), new CP24Time2a()))) + { ioa++; addedCounter++; } - Assert.AreEqual (34, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(34, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new SinglePointWithCP56Time2a (ioa, true, new QualityDescriptor (), new CP56Time2a ()))) { + while (asdu.AddInformationObject(new SinglePointWithCP56Time2a(ioa, true, new QualityDescriptor(), new CP56Time2a()))) + { ioa++; addedCounter++; } - Assert.AreEqual (22, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(22, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new DoublePointInformation (ioa, DoublePointValue.ON, new QualityDescriptor ()))) { + while (asdu.AddInformationObject(new DoublePointInformation(ioa, DoublePointValue.ON, new QualityDescriptor()))) + { ioa++; addedCounter++; } - Assert.AreEqual (60, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(60, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new DoublePointWithCP24Time2a (ioa, DoublePointValue.ON, new QualityDescriptor (), new CP24Time2a ()))) { + while (asdu.AddInformationObject(new DoublePointWithCP24Time2a(ioa, DoublePointValue.ON, new QualityDescriptor(), new CP24Time2a()))) + { ioa++; addedCounter++; } - Assert.AreEqual (34, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(34, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new DoublePointWithCP56Time2a (ioa, DoublePointValue.ON, new QualityDescriptor (), new CP56Time2a ()))) { + while (asdu.AddInformationObject(new DoublePointWithCP56Time2a(ioa, DoublePointValue.ON, new QualityDescriptor(), new CP56Time2a()))) + { ioa++; addedCounter++; } - Assert.AreEqual (22, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(22, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new MeasuredValueNormalized (ioa, 1f, new QualityDescriptor ()))) { + while (asdu.AddInformationObject(new MeasuredValueNormalized(ioa, 1f, new QualityDescriptor()))) + { ioa++; addedCounter++; } - Assert.AreEqual (40, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(40, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new MeasuredValueNormalizedWithCP24Time2a (ioa, 1f, new QualityDescriptor (), new CP24Time2a ()))) { + while (asdu.AddInformationObject(new MeasuredValueNormalizedWithCP24Time2a(ioa, 1f, new QualityDescriptor(), new CP24Time2a()))) + { ioa++; addedCounter++; } - Assert.AreEqual (27, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(27, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new MeasuredValueNormalizedWithCP56Time2a (ioa, 1f, new QualityDescriptor (), new CP56Time2a ()))) { + while (asdu.AddInformationObject(new MeasuredValueNormalizedWithCP56Time2a(ioa, 1f, new QualityDescriptor(), new CP56Time2a()))) + { ioa++; addedCounter++; } - Assert.AreEqual (18, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(18, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new MeasuredValueScaled (ioa, 0, new QualityDescriptor ()))) { + while (asdu.AddInformationObject(new MeasuredValueScaled(ioa, 0, new QualityDescriptor()))) + { ioa++; addedCounter++; } - Assert.AreEqual (40, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(40, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new MeasuredValueScaledWithCP24Time2a (ioa, 0, new QualityDescriptor (), new CP24Time2a ()))) { + while (asdu.AddInformationObject(new MeasuredValueScaledWithCP24Time2a(ioa, 0, new QualityDescriptor(), new CP24Time2a()))) + { ioa++; addedCounter++; } - Assert.AreEqual (27, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(27, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new MeasuredValueScaledWithCP56Time2a (ioa, 0, new QualityDescriptor (), new CP56Time2a ()))) { + while (asdu.AddInformationObject(new MeasuredValueScaledWithCP56Time2a(ioa, 0, new QualityDescriptor(), new CP56Time2a()))) + { ioa++; addedCounter++; } - Assert.AreEqual (18, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(18, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new MeasuredValueShort (ioa, 0f, new QualityDescriptor ()))) { + while (asdu.AddInformationObject(new MeasuredValueShort(ioa, 0f, new QualityDescriptor()))) + { ioa++; addedCounter++; } - Assert.AreEqual (30, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(30, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new MeasuredValueShortWithCP24Time2a (ioa, 0f, new QualityDescriptor (), new CP24Time2a ()))) { + while (asdu.AddInformationObject(new MeasuredValueShortWithCP24Time2a(ioa, 0f, new QualityDescriptor(), new CP24Time2a()))) + { ioa++; addedCounter++; } - Assert.AreEqual (22, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(22, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new MeasuredValueShortWithCP56Time2a (ioa, 0f, new QualityDescriptor (), new CP56Time2a ()))) { + while (asdu.AddInformationObject(new MeasuredValueShortWithCP56Time2a(ioa, 0f, new QualityDescriptor(), new CP56Time2a()))) + { ioa++; addedCounter++; } - Assert.AreEqual (16, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(16, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new StepPositionInformation (ioa, 0, false, new QualityDescriptor ()))) { + while (asdu.AddInformationObject(new StepPositionInformation(ioa, 0, false, new QualityDescriptor()))) + { ioa++; addedCounter++; } - Assert.AreEqual (48, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(48, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new StepPositionWithCP24Time2a (ioa, 0, false, new QualityDescriptor (), new CP24Time2a ()))) { + while (asdu.AddInformationObject(new StepPositionWithCP24Time2a(ioa, 0, false, new QualityDescriptor(), new CP24Time2a()))) + { ioa++; addedCounter++; } - Assert.AreEqual (30, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(30, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new StepPositionWithCP56Time2a (ioa, 0, false, new QualityDescriptor (), new CP56Time2a ()))) { + while (asdu.AddInformationObject(new StepPositionWithCP56Time2a(ioa, 0, false, new QualityDescriptor(), new CP56Time2a()))) + { ioa++; addedCounter++; } - Assert.AreEqual (20, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(20, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new IntegratedTotals (ioa, new BinaryCounterReading ()))) { + while (asdu.AddInformationObject(new IntegratedTotals(ioa, new BinaryCounterReading()))) + { ioa++; addedCounter++; } - Assert.AreEqual (30, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(30, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new IntegratedTotalsWithCP24Time2a (ioa, new BinaryCounterReading (), new CP24Time2a ()))) { + while (asdu.AddInformationObject(new IntegratedTotalsWithCP24Time2a(ioa, new BinaryCounterReading(), new CP24Time2a()))) + { ioa++; addedCounter++; } - Assert.AreEqual (22, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(22, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new IntegratedTotalsWithCP56Time2a (ioa, new BinaryCounterReading (), new CP56Time2a ()))) { + while (asdu.AddInformationObject(new IntegratedTotalsWithCP56Time2a(ioa, new BinaryCounterReading(), new CP56Time2a()))) + { ioa++; addedCounter++; } - Assert.AreEqual (16, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(16, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new EventOfProtectionEquipment (ioa, new SingleEvent (), new CP16Time2a (10), new CP24Time2a ()))) { + while (asdu.AddInformationObject(new EventOfProtectionEquipment(ioa, new SingleEvent(), new CP16Time2a(10), new CP24Time2a()))) + { ioa++; addedCounter++; } - Assert.AreEqual (27, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(27, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new EventOfProtectionEquipmentWithCP56Time2a (ioa, new SingleEvent (), new CP16Time2a (10), new CP56Time2a ()))) { + while (asdu.AddInformationObject(new EventOfProtectionEquipmentWithCP56Time2a(ioa, new SingleEvent(), new CP16Time2a(10), new CP56Time2a()))) + { ioa++; addedCounter++; } - Assert.AreEqual (18, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(18, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new PackedSinglePointWithSCD (ioa, new StatusAndStatusChangeDetection (), new QualityDescriptor ()))) { + while (asdu.AddInformationObject(new PackedSinglePointWithSCD(ioa, new StatusAndStatusChangeDetection(), new QualityDescriptor()))) + { ioa++; addedCounter++; } - Assert.AreEqual (30, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(30, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new PackedOutputCircuitInfo (ioa, new OutputCircuitInfo (), new QualityDescriptorP (), new CP16Time2a (10), new CP24Time2a ()))) { + while (asdu.AddInformationObject(new PackedOutputCircuitInfo(ioa, new OutputCircuitInfo(), new QualityDescriptorP(), new CP16Time2a(10), new CP24Time2a()))) + { ioa++; addedCounter++; } - Assert.AreEqual (24, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(24, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new PackedOutputCircuitInfoWithCP56Time2a (ioa, new OutputCircuitInfo (), new QualityDescriptorP (), new CP16Time2a (10), new CP56Time2a ()))) { + while (asdu.AddInformationObject(new PackedOutputCircuitInfoWithCP56Time2a(ioa, new OutputCircuitInfo(), new QualityDescriptorP(), new CP16Time2a(10), new CP56Time2a()))) + { ioa++; addedCounter++; } - Assert.AreEqual (17, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(17, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new PackedStartEventsOfProtectionEquipment (ioa, new StartEvent (), new QualityDescriptorP (), new CP16Time2a (10), new CP24Time2a ()))) { + while (asdu.AddInformationObject(new PackedStartEventsOfProtectionEquipment(ioa, new StartEvent(), new QualityDescriptorP(), new CP16Time2a(10), new CP24Time2a()))) + { ioa++; addedCounter++; } - Assert.AreEqual (24, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(24, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new PackedStartEventsOfProtectionEquipmentWithCP56Time2a (ioa, new StartEvent (), new QualityDescriptorP (), new CP16Time2a (10), new CP56Time2a ()))) { + while (asdu.AddInformationObject(new PackedStartEventsOfProtectionEquipmentWithCP56Time2a(ioa, new StartEvent(), new QualityDescriptorP(), new CP16Time2a(10), new CP56Time2a()))) + { ioa++; addedCounter++; } - Assert.AreEqual (17, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(17, addedCounter); + Assert.NotNull(asdu.AsByteArray()); //TODO add missing tests } - [Test ()] - public void TestEncodeASDUsWithManyInformationObjectsSequenceOfIO () { + [Test()] + public void TestEncodeASDUsWithManyInformationObjectsSequenceOfIO() + { - ApplicationLayerParameters cp = new ApplicationLayerParameters (); + ApplicationLayerParameters cp = new ApplicationLayerParameters(); - ASDU asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, true); + ASDU asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, true); int addedCounter = 0; int ioa = 100; - while (asdu.AddInformationObject (new SinglePointInformation (ioa, false, new QualityDescriptor ()))) { + while (asdu.AddInformationObject(new SinglePointInformation(ioa, false, new QualityDescriptor()))) + { ioa++; addedCounter++; } - Assert.AreEqual (127, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(127, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, true); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, true); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new DoublePointInformation (ioa, DoublePointValue.OFF, new QualityDescriptor ()))) { + while (asdu.AddInformationObject(new DoublePointInformation(ioa, DoublePointValue.OFF, new QualityDescriptor()))) + { ioa++; addedCounter++; } - Assert.AreEqual (127, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(127, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, true); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, true); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new MeasuredValueNormalized (ioa, 1f, new QualityDescriptor ()))) { + while (asdu.AddInformationObject(new MeasuredValueNormalized(ioa, 1f, new QualityDescriptor()))) + { ioa++; addedCounter++; } - Assert.AreEqual (80, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(80, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, true); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, true); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new MeasuredValueScaled (ioa, 0, new QualityDescriptor ()))) { + while (asdu.AddInformationObject(new MeasuredValueScaled(ioa, 0, new QualityDescriptor()))) + { ioa++; addedCounter++; } - Assert.AreEqual (80, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(80, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, true); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, true); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new MeasuredValueShort (ioa, 0f, new QualityDescriptor ()))) { + while (asdu.AddInformationObject(new MeasuredValueShort(ioa, 0f, new QualityDescriptor()))) + { ioa++; addedCounter++; } - Assert.AreEqual (48, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(48, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, true); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, true); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new StepPositionInformation (ioa, 0, false, new QualityDescriptor ()))) { + while (asdu.AddInformationObject(new StepPositionInformation(ioa, 0, false, new QualityDescriptor()))) + { ioa++; addedCounter++; } - Assert.AreEqual (120, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(120, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, true); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, true); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new IntegratedTotals (ioa, new BinaryCounterReading ()))) { + while (asdu.AddInformationObject(new IntegratedTotals(ioa, new BinaryCounterReading()))) + { ioa++; addedCounter++; } - Assert.AreEqual (48, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(48, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, true); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, true); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new PackedSinglePointWithSCD (ioa, new StatusAndStatusChangeDetection (), new QualityDescriptor ()))) { + while (asdu.AddInformationObject(new PackedSinglePointWithSCD(ioa, new StatusAndStatusChangeDetection(), new QualityDescriptor()))) + { ioa++; addedCounter++; } - Assert.AreEqual (48, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(48, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, true); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, true); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new PackedOutputCircuitInfo (ioa, new OutputCircuitInfo (), new QualityDescriptorP (), new CP16Time2a (10), new CP24Time2a ()))) { + while (asdu.AddInformationObject(new PackedOutputCircuitInfo(ioa, new OutputCircuitInfo(), new QualityDescriptorP(), new CP16Time2a(10), new CP24Time2a()))) + { ioa++; addedCounter++; } - Assert.AreEqual (34, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(34, addedCounter); + Assert.NotNull(asdu.AsByteArray()); - asdu = new ASDU (cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, true); + asdu = new ASDU(cp, CauseOfTransmission.PERIODIC, false, false, 0, 1, true); addedCounter = 0; ioa = 100; - while (asdu.AddInformationObject (new PackedStartEventsOfProtectionEquipment (ioa, new StartEvent (), new QualityDescriptorP (), new CP16Time2a (0), new CP24Time2a ()))) { + while (asdu.AddInformationObject(new PackedStartEventsOfProtectionEquipment(ioa, new StartEvent(), new QualityDescriptorP(), new CP16Time2a(0), new CP24Time2a()))) + { ioa++; addedCounter++; } - Assert.AreEqual (34, addedCounter); - Assert.NotNull (asdu.AsByteArray ()); + Assert.AreEqual(34, addedCounter); + Assert.NotNull(asdu.AsByteArray()); } - [Test ()] + [Test()] //[Ignore("Ignore to save execution time")] - public void TestSendTestFR () { - ApplicationLayerParameters clientParameters = new ApplicationLayerParameters (); - APCIParameters clientApciParamters = new APCIParameters (); - ApplicationLayerParameters serverParameters = new ApplicationLayerParameters (); - APCIParameters serverApciParamters = new APCIParameters (); + public void TestSendTestFR() + { + ApplicationLayerParameters clientParameters = new ApplicationLayerParameters(); + APCIParameters clientApciParamters = new APCIParameters(); + ApplicationLayerParameters serverParameters = new ApplicationLayerParameters(); + APCIParameters serverApciParamters = new APCIParameters(); clientApciParamters.T3 = 1; - Server server = new Server (serverApciParamters, serverParameters); + Server server = new Server(serverApciParamters, serverParameters); - server.SetLocalPort (20213); + server.SetLocalPort(20213); - server.Start (); + server.Start(); - Connection connection = new Connection ("127.0.0.1", 20213, clientApciParamters, clientParameters); + Connection connection = new Connection("127.0.0.1", 20213, clientApciParamters, clientParameters); - connection.Connect (); + connection.Connect(); - ASDU asdu = new ASDU (clientParameters, CauseOfTransmission.SPONTANEOUS, false, false, 0, 1, false); - asdu.AddInformationObject (new SinglePointInformation (100, false, new QualityDescriptor ())); + ASDU asdu = new ASDU(clientParameters, CauseOfTransmission.SPONTANEOUS, false, false, 0, 1, false); + asdu.AddInformationObject(new SinglePointInformation(100, false, new QualityDescriptor())); - connection.SendASDU (asdu); + connection.SendASDU(asdu); - Assert.AreEqual (2, connection.GetStatistics ().SentMsgCounter); /* STARTDT + ASDU */ + Assert.AreEqual(2, connection.GetStatistics().SentMsgCounter); /* STARTDT + ASDU */ - while (connection.GetStatistics ().RcvdMsgCounter < 2) - Thread.Sleep (1); + while (connection.GetStatistics().RcvdMsgCounter < 2) + Thread.Sleep(1); - Assert.AreEqual (2, connection.GetStatistics ().RcvdMsgCounter); /* STARTDT_CON + ASDU */ + Assert.AreEqual(2, connection.GetStatistics().RcvdMsgCounter); /* STARTDT_CON + ASDU */ - Thread.Sleep (2500); + Thread.Sleep(2500); - connection.Close (); - server.Stop (); + connection.Close(); + server.Stop(); - Assert.AreEqual (4, connection.GetStatistics ().RcvdMsgCounter); /* STARTDT_CON + ASDU + TESTFR_CON */ + Assert.AreEqual(4, connection.GetStatistics().RcvdMsgCounter); /* STARTDT_CON + ASDU + TESTFR_CON */ - Assert.AreEqual (2, connection.GetStatistics ().RcvdTestFrConCounter); + Assert.AreEqual(2, connection.GetStatistics().RcvdTestFrConCounter); } - private static bool testSendTestFRTimeoutMasterRawMessageHandler (object param, byte [] msg, int msgSize) + private static bool testSendTestFRTimeoutMasterRawMessageHandler(object param, byte[] msg, int msgSize) { // intercept TESTFR_CON message - if ((msgSize == 6) && (msg [2] == 0x83)) + if ((msgSize == 6) && (msg[2] == 0x83)) return false; else return true; @@ -1700,69 +1771,73 @@ private static bool testSendTestFRTimeoutMasterRawMessageHandler (object param, /// This test checks that the connection will be closed when the master /// doesn't receive the TESTFR_CON messages /// - [Test ()] + [Test()] //[Ignore("Ignore to save execution time")] - public void TestSendTestFRTimeoutMaster () { - ApplicationLayerParameters clientParameters = new ApplicationLayerParameters (); - APCIParameters clientApciParamters = new APCIParameters (); - ApplicationLayerParameters serverParameters = new ApplicationLayerParameters (); - APCIParameters serverApciParamters = new APCIParameters (); + public void TestSendTestFRTimeoutMaster() + { + ApplicationLayerParameters clientParameters = new ApplicationLayerParameters(); + APCIParameters clientApciParamters = new APCIParameters(); + ApplicationLayerParameters serverParameters = new ApplicationLayerParameters(); + APCIParameters serverApciParamters = new APCIParameters(); clientApciParamters.T3 = 1; - Server server = new Server (serverApciParamters, serverParameters); + Server server = new Server(serverApciParamters, serverParameters); - server.SetLocalPort (20213); + server.SetLocalPort(20213); - server.Start (); + server.Start(); - Connection connection = new Connection ("127.0.0.1", 20213, clientApciParamters, clientParameters); + Connection connection = new Connection("127.0.0.1", 20213, clientApciParamters, clientParameters); - connection.Connect (); + connection.Connect(); - connection.SetReceivedRawMessageHandler (testSendTestFRTimeoutMasterRawMessageHandler, null); + connection.SetReceivedRawMessageHandler(testSendTestFRTimeoutMasterRawMessageHandler, null); - ASDU asdu = new ASDU (clientParameters, CauseOfTransmission.SPONTANEOUS, false, false, 0, 1, false); - asdu.AddInformationObject (new SinglePointInformation (100, false, new QualityDescriptor ())); + ASDU asdu = new ASDU(clientParameters, CauseOfTransmission.SPONTANEOUS, false, false, 0, 1, false); + asdu.AddInformationObject(new SinglePointInformation(100, false, new QualityDescriptor())); - connection.SendASDU (asdu); + connection.SendASDU(asdu); - Assert.AreEqual (2, connection.GetStatistics ().SentMsgCounter); /* STARTDT + ASDU */ + Assert.AreEqual(2, connection.GetStatistics().SentMsgCounter); /* STARTDT + ASDU */ - while (connection.GetStatistics ().RcvdMsgCounter < 2) - Thread.Sleep (1); + while (connection.GetStatistics().RcvdMsgCounter < 2) + Thread.Sleep(1); - Assert.AreEqual (2, connection.GetStatistics ().RcvdMsgCounter); /* STARTDT_CON + ASDU */ + Assert.AreEqual(2, connection.GetStatistics().RcvdMsgCounter); /* STARTDT_CON + ASDU */ - Thread.Sleep (6000); + Thread.Sleep(6000); // Expect connection to be closed due to three missing TESTFR_CON responses - Assert.IsFalse (connection.IsRunning); + Assert.IsFalse(connection.IsRunning); ConnectionException ce = null; // Connection is closed. SendASDU should fail - try { - connection.SendASDU (asdu); - } catch (ConnectionException e) { + try + { + connection.SendASDU(asdu); + } + catch (ConnectionException e) + { ce = e; } - Assert.IsNotNull (ce); - Assert.AreEqual ("not connected", ce.Message); + Assert.IsNotNull(ce); + Assert.AreEqual("not connected", ce.Message); - connection.Close (); - server.Stop (); + connection.Close(); + server.Stop(); - Assert.AreEqual (5, connection.GetStatistics ().RcvdMsgCounter); /* STARTDT_CON + ASDU + TESTFR_CON */ + Assert.AreEqual(5, connection.GetStatistics().RcvdMsgCounter); /* STARTDT_CON + ASDU + TESTFR_CON */ - Assert.AreEqual (0, connection.GetStatistics ().RcvdTestFrConCounter); + Assert.AreEqual(0, connection.GetStatistics().RcvdTestFrConCounter); } - private static bool testSendTestFRTimeoutSlaveRawMessageHandler (object param, byte [] msg, int msgSize) + private static bool testSendTestFRTimeoutSlaveRawMessageHandler(object param, byte[] msg, int msgSize) { // intercept TESTFR_ACT messages for so that the master doesn't response - if ((msgSize == 6) && (msg [2] == 0x43)) + if ((msgSize == 6) && (msg[2] == 0x43)) return false; else return true; @@ -1772,54 +1847,58 @@ private static bool testSendTestFRTimeoutSlaveRawMessageHandler (object param, b /// This test checks that the connection will be closed when the master /// doesn't send the TESTFR_CON messages ///
- [Test ()] + [Test()] //[Ignore("Ignore to save execution time")] - public void TestSendTestFRTimeoutSlave () { - ApplicationLayerParameters clientParameters = new ApplicationLayerParameters (); - APCIParameters clientApciParamters = new APCIParameters (); - ApplicationLayerParameters serverParameters = new ApplicationLayerParameters (); - APCIParameters serverApciParamters = new APCIParameters (); + public void TestSendTestFRTimeoutSlave() + { + ApplicationLayerParameters clientParameters = new ApplicationLayerParameters(); + APCIParameters clientApciParamters = new APCIParameters(); + ApplicationLayerParameters serverParameters = new ApplicationLayerParameters(); + APCIParameters serverApciParamters = new APCIParameters(); serverApciParamters.T3 = 1; - Server server = new Server (serverApciParamters, serverParameters); + Server server = new Server(serverApciParamters, serverParameters); - server.SetLocalPort (20213); + server.SetLocalPort(20213); - server.Start (); + server.Start(); - Connection connection = new Connection ("127.0.0.1", 20213, clientApciParamters, clientParameters); + Connection connection = new Connection("127.0.0.1", 20213, clientApciParamters, clientParameters); connection.DebugOutput = true; - connection.SetReceivedRawMessageHandler (testSendTestFRTimeoutSlaveRawMessageHandler, null); + connection.SetReceivedRawMessageHandler(testSendTestFRTimeoutSlaveRawMessageHandler, null); - connection.Connect (); + connection.Connect(); - Assert.AreEqual (1, connection.GetStatistics ().SentMsgCounter); /* STARTDT */ + Assert.AreEqual(1, connection.GetStatistics().SentMsgCounter); /* STARTDT */ - while (connection.GetStatistics ().RcvdMsgCounter < 1) - Thread.Sleep (1); + while (connection.GetStatistics().RcvdMsgCounter < 1) + Thread.Sleep(1); - Assert.AreEqual (1, connection.GetStatistics ().RcvdMsgCounter); /* STARTDT_CON */ + Assert.AreEqual(1, connection.GetStatistics().RcvdMsgCounter); /* STARTDT_CON */ - Thread.Sleep (6000); + Thread.Sleep(6000); // Connection is closed. SendASDU should fail - try { - ASDU asdu = new ASDU (clientParameters, CauseOfTransmission.SPONTANEOUS, false, false, 0, 1, false); - asdu.AddInformationObject (new SinglePointInformation (100, false, new QualityDescriptor ())); + try + { + ASDU asdu = new ASDU(clientParameters, CauseOfTransmission.SPONTANEOUS, false, false, 0, 1, false); + asdu.AddInformationObject(new SinglePointInformation(100, false, new QualityDescriptor())); - connection.SendASDU (asdu); - } catch (ConnectionException) { + connection.SendASDU(asdu); + } + catch (ConnectionException) + { } while (connection.IsRunning == true) - Thread.Sleep (10); + Thread.Sleep(10); - connection.Close (); - server.Stop (); + connection.Close(); + server.Stop(); // Assert.AreEqual (5, connection.GetStatistics ().RcvdMsgCounter); /* STARTDT_CON + ASDU + TESTFR_CON */ @@ -1827,19 +1906,22 @@ public void TestSendTestFRTimeoutSlave () { } - [Test ()] - public void TestEncodeDecodeSetpointCommandNormalized () { - Server server = new Server (); - server.SetLocalPort (20213); + [Test()] + public void TestEncodeDecodeSetpointCommandNormalized() + { + Server server = new Server(); + server.SetLocalPort(20213); float recvValue = 0f; float sendValue = 1.0f; bool hasReceived = false; - server.SetASDUHandler (delegate (object parameter, IMasterConnection con, ASDU asdu) { + server.SetASDUHandler(delegate (object parameter, IMasterConnection con, ASDU asdu) + { - if (asdu.TypeId == TypeID.C_SE_NA_1) { - SetpointCommandNormalized spn = (SetpointCommandNormalized)asdu.GetElement (0); + if (asdu.TypeId == TypeID.C_SE_NA_1) + { + SetpointCommandNormalized spn = (SetpointCommandNormalized)asdu.GetElement(0); recvValue = spn.NormalizedValue; hasReceived = true; @@ -1847,44 +1929,46 @@ public void TestEncodeDecodeSetpointCommandNormalized () { return true; }, null); - server.Start (); + server.Start(); - Connection connection = new Connection ("127.0.0.1", 20213); - connection.Connect (); + Connection connection = new Connection("127.0.0.1", 20213); + connection.Connect(); - ASDU newAsdu = new ASDU (server.GetApplicationLayerParameters (), CauseOfTransmission.ACTIVATION, false, false, 0, 1, false); - newAsdu.AddInformationObject (new SetpointCommandNormalized (100, sendValue, new SetpointCommandQualifier (false, 0))); + ASDU newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.ACTIVATION, false, false, 0, 1, false); + newAsdu.AddInformationObject(new SetpointCommandNormalized(100, sendValue, new SetpointCommandQualifier(false, 0))); - connection.SendASDU (newAsdu); + connection.SendASDU(newAsdu); while (hasReceived == false) - Thread.Sleep (50); + Thread.Sleep(50); - connection.Close (); - server.Stop (); + connection.Close(); + server.Stop(); - Assert.AreEqual (sendValue, recvValue, 0.001); + Assert.AreEqual(sendValue, recvValue, 0.001); } - [Test ()] - public void TestEncodeDecodePrivateInformationObject () + [Test()] + public void TestEncodeDecodePrivateInformationObject() { - Server server = new Server (); - server.SetLocalPort (20213); + Server server = new Server(); + server.SetLocalPort(20213); server.DebugOutput = true; int recvValue = 0; int sendValue = 12345; bool hasReceived = false; - PrivateInformationObjectTypes privateObjects = new PrivateInformationObjectTypes (); - privateObjects.AddPrivateInformationObjectType ((TypeID)41, new TestInteger32Object ()); + PrivateInformationObjectTypes privateObjects = new PrivateInformationObjectTypes(); + privateObjects.AddPrivateInformationObjectType((TypeID)41, new TestInteger32Object()); - server.SetASDUHandler (delegate (object parameter, IMasterConnection con, ASDU asdu) { + server.SetASDUHandler(delegate (object parameter, IMasterConnection con, ASDU asdu) + { - if (asdu.TypeId == (TypeID)41) { + if (asdu.TypeId == (TypeID)41) + { - TestInteger32Object spn = (TestInteger32Object)asdu.GetElement (0, privateObjects); + TestInteger32Object spn = (TestInteger32Object)asdu.GetElement(0, privateObjects); recvValue = spn.Value; hasReceived = true; @@ -1893,24 +1977,24 @@ public void TestEncodeDecodePrivateInformationObject () return true; }, null); - server.Start (); + server.Start(); - Connection connection = new Connection ("127.0.0.1", 20213); - connection.Connect (); + Connection connection = new Connection("127.0.0.1", 20213); + connection.Connect(); - ASDU newAsdu = new ASDU (server.GetApplicationLayerParameters (), CauseOfTransmission.ACTIVATION, false, false, 0, 1, false); + ASDU newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.ACTIVATION, false, false, 0, 1, false); - newAsdu.AddInformationObject (new TestInteger32Object (100, sendValue)); + newAsdu.AddInformationObject(new TestInteger32Object(100, sendValue)); - connection.SendASDU (newAsdu); + connection.SendASDU(newAsdu); while (hasReceived == false) - Thread.Sleep (50); + Thread.Sleep(50); - connection.Close (); - server.Stop (); + connection.Close(); + server.Stop(); - Assert.AreEqual (sendValue, recvValue); + Assert.AreEqual(sendValue, recvValue); } @@ -1919,10 +2003,10 @@ public void TestDoubleCommand() { DoubleCommand dc = new DoubleCommand(10001, 10, false, 12); - Assert.AreEqual (10001, dc.ObjectAddress); - Assert.AreEqual (10, dc.State); - Assert.AreEqual (false, dc.Select); - Assert.AreEqual (12, dc.QU); + Assert.AreEqual(10001, dc.ObjectAddress); + Assert.AreEqual(10, dc.State); + Assert.AreEqual(false, dc.Select); + Assert.AreEqual(12, dc.QU); dc = new DoubleCommand(10001, 10, false, 3); @@ -2023,28 +2107,28 @@ public void TestStepCommandValueWithCP56Time2a() } - [Test ()] - public void TestSingleCommand () + [Test()] + public void TestSingleCommand() { - SingleCommand sc = new SingleCommand (10002, true, false, 12); + SingleCommand sc = new SingleCommand(10002, true, false, 12); - Assert.AreEqual (10002, sc.ObjectAddress); - Assert.AreEqual (true, sc.State); - Assert.AreEqual (false, sc.Select); - Assert.AreEqual (12, sc.QU); + Assert.AreEqual(10002, sc.ObjectAddress); + Assert.AreEqual(true, sc.State); + Assert.AreEqual(false, sc.Select); + Assert.AreEqual(12, sc.QU); - sc = new SingleCommand (10002, false, true, 3); + sc = new SingleCommand(10002, false, true, 3); - Assert.AreEqual (10002, sc.ObjectAddress); - Assert.AreEqual (false, sc.State); - Assert.AreEqual (true, sc.Select); - Assert.AreEqual (3, sc.QU); + Assert.AreEqual(10002, sc.ObjectAddress); + Assert.AreEqual(false, sc.State); + Assert.AreEqual(true, sc.Select); + Assert.AreEqual(3, sc.QU); sc.QU = 17; - Assert.AreEqual (17, sc.QU); - Assert.AreEqual (false, sc.State); - Assert.AreEqual (true, sc.Select); + Assert.AreEqual(17, sc.QU); + Assert.AreEqual(false, sc.State); + Assert.AreEqual(true, sc.Select); } [Test()] @@ -2087,192 +2171,301 @@ public void TestSingleCommandWithCP56Time2a() Assert.AreEqual(time.Millisecond, sc.Timestamp.Millisecond); } - [Test ()] - public void TestSinglePointInformationClientServer () + [Test()] + public void TestSinglePointInformationClientServer() { - SinglePointInformation spi = new SinglePointInformation (101, true, new QualityDescriptor ()); + SinglePointInformation spi = new SinglePointInformation(101, true, new QualityDescriptor()); - ASDU newAsdu = new ASDU (new ApplicationLayerParameters (), CauseOfTransmission.PERIODIC, + ASDU newAsdu = new ASDU(new ApplicationLayerParameters(), CauseOfTransmission.PERIODIC, false, false, 0, 1, false); - newAsdu.AddInformationObject (spi); + newAsdu.AddInformationObject(spi); - Server server = new Server (); - server.SetLocalPort (20213); + Server server = new Server(); + server.SetLocalPort(20213); bool hasReceived = false; - server.SetASDUHandler (delegate (object parameter, IMasterConnection con, ASDU asdu) { + server.SetASDUHandler(delegate (object parameter, IMasterConnection con, ASDU asdu) + { - if (asdu.TypeId == TypeID.M_SP_NA_1) { + if (asdu.TypeId == TypeID.M_SP_NA_1) + { - SinglePointInformation spn = (SinglePointInformation)asdu.GetElement (0); + SinglePointInformation spn = (SinglePointInformation)asdu.GetElement(0); - Assert.AreEqual (spi.Value, spn.Value); + Assert.AreEqual(spi.Value, spn.Value); hasReceived = true; } return true; }, null); - server.Start (); + server.Start(); - Connection connection = new Connection ("127.0.0.1", 20213); - connection.Connect (); + Connection connection = new Connection("127.0.0.1", 20213); + connection.Connect(); - connection.SendASDU (newAsdu); + connection.SendASDU(newAsdu); while (hasReceived == false) - Thread.Sleep (50); + Thread.Sleep(50); + + connection.Close(); + server.Stop(); + } + + [Test()] + public void TestIntegratedTotals() + { + byte[] buffer = new byte[257]; + + BufferFrame bf = new BufferFrame(buffer, 0); + + ApplicationLayerParameters alParameters = new ApplicationLayerParameters(); + + BinaryCounterReading bcr = new BinaryCounterReading(); + + IntegratedTotals it = new IntegratedTotals(101, bcr); + + it.Encode(bf, alParameters, true); + Assert.AreEqual(5, bf.GetMsgSize()); + + bf.ResetFrame(); + + it.Encode(bf, alParameters, false); + + Assert.AreEqual(alParameters.SizeOfIOA + it.GetEncodedSize(), bf.GetMsgSize()); + Assert.AreEqual(8, bf.GetMsgSize()); + + IntegratedTotals it2 = new IntegratedTotals(alParameters, buffer, 0, false); + + Assert.AreEqual(101, it2.ObjectAddress); + Assert.AreEqual(1000, it2.BCR.Value); + + } + + [Test()] + public void TestIntegratedTotalsWithCp24Time2a() + { + byte[] buffer = new byte[257]; + + BufferFrame bf = new BufferFrame(buffer, 0); + + ApplicationLayerParameters alParameters = new ApplicationLayerParameters(); + + CP24Time2a time = new CP24Time2a(45, 23, 538); + + BinaryCounterReading bcr = new BinaryCounterReading(); + + IntegratedTotalsWithCP24Time2a it = new IntegratedTotalsWithCP24Time2a(101, bcr, time); + + it.Encode(bf, alParameters, true); + Assert.AreEqual(8, bf.GetMsgSize()); + + bf.ResetFrame(); + + it.Encode(bf, alParameters, false); + + Assert.AreEqual(alParameters.SizeOfIOA + it.GetEncodedSize(), bf.GetMsgSize()); + Assert.AreEqual(11, bf.GetMsgSize()); - connection.Close (); - server.Stop (); + IntegratedTotalsWithCP24Time2a it2 = new IntegratedTotalsWithCP24Time2a(alParameters, buffer, 0, false); + + Assert.AreEqual(101, it2.ObjectAddress); + Assert.AreEqual(1200, it2.BCR.Value); + + Assert.AreEqual(45, it2.Timestamp.Minute); + Assert.AreEqual(23, it2.Timestamp.Second); + Assert.AreEqual(538, it2.Timestamp.Millisecond); } - [Test ()] - public void TestSinglePointInformation () + [Test()] + public void TestIntegratedTotalsWithCp56Time2a() { - byte [] buffer = new byte [257]; + byte[] buffer = new byte[257]; + + BufferFrame bf = new BufferFrame(buffer, 0); + + ApplicationLayerParameters alParameters = new ApplicationLayerParameters(); + + DateTime dateTime = DateTime.UtcNow; + + CP56Time2a time = new CP56Time2a(dateTime); + + BinaryCounterReading bcr = new BinaryCounterReading(); - BufferFrame bf = new BufferFrame (buffer, 0); + IntegratedTotalsWithCP56Time2a it = new IntegratedTotalsWithCP56Time2a(101, bcr, time); - ApplicationLayerParameters alParameters = new ApplicationLayerParameters (); + it.Encode(bf, alParameters, true); + Assert.AreEqual(12, bf.GetMsgSize()); - SinglePointInformation spi = new SinglePointInformation (101, true, new QualityDescriptor ()); + bf.ResetFrame(); - spi.Encode (bf, alParameters, true); - Assert.AreEqual (1, bf.GetMsgSize ()); + it.Encode(bf, alParameters, false); - bf.ResetFrame (); + Assert.AreEqual(alParameters.SizeOfIOA + it.GetEncodedSize(), bf.GetMsgSize()); + Assert.AreEqual(15, bf.GetMsgSize()); - spi.Encode (bf, alParameters, false); + IntegratedTotalsWithCP56Time2a it2 = new IntegratedTotalsWithCP56Time2a(alParameters, buffer, 0, false); - Assert.AreEqual (alParameters.SizeOfIOA + spi.GetEncodedSize (), bf.GetMsgSize ()); - Assert.AreEqual (4, bf.GetMsgSize ()); + Assert.AreEqual(101, it2.ObjectAddress); + Assert.AreEqual(1200, it2.BCR.Value); - SinglePointInformation spi2 = new SinglePointInformation (alParameters, buffer, 0, false); + Assert.AreEqual(time.Year, it2.Timestamp.Year); + Assert.AreEqual(time.Month, it2.Timestamp.Month); + Assert.AreEqual(time.DayOfMonth, it2.Timestamp.DayOfMonth); + Assert.AreEqual(time.Minute, it2.Timestamp.Minute); + Assert.AreEqual(time.Second, it2.Timestamp.Second); + Assert.AreEqual(time.Millisecond, it2.Timestamp.Millisecond); - Assert.AreEqual (101, spi2.ObjectAddress); - Assert.AreEqual (true, spi2.Value); } - [Test ()] - public void TestSinglePointInformationWithCp24Time2a () + + [Test()] + public void TestSinglePointInformation() { - byte [] buffer = new byte [257]; + byte[] buffer = new byte[257]; - BufferFrame bf = new BufferFrame (buffer, 0); + BufferFrame bf = new BufferFrame(buffer, 0); - ApplicationLayerParameters alParameters = new ApplicationLayerParameters (); + ApplicationLayerParameters alParameters = new ApplicationLayerParameters(); - CP24Time2a time = new CP24Time2a (45, 23, 538); + SinglePointInformation spi = new SinglePointInformation(101, true, new QualityDescriptor()); - SinglePointWithCP24Time2a spi = new SinglePointWithCP24Time2a (102, false, new QualityDescriptor (), time); + spi.Encode(bf, alParameters, true); + Assert.AreEqual(1, bf.GetMsgSize()); - spi.Encode (bf, alParameters, false); + bf.ResetFrame(); - Assert.AreEqual (alParameters.SizeOfIOA + spi.GetEncodedSize (), bf.GetMsgSize ()); - Assert.AreEqual (7, bf.GetMsgSize ()); + spi.Encode(bf, alParameters, false); - SinglePointWithCP24Time2a spi2 = new SinglePointWithCP24Time2a (alParameters, buffer, 0, false); + Assert.AreEqual(alParameters.SizeOfIOA + spi.GetEncodedSize(), bf.GetMsgSize()); + Assert.AreEqual(4, bf.GetMsgSize()); - Assert.AreEqual (102, spi2.ObjectAddress); - Assert.AreEqual (false, spi2.Value); - Assert.AreEqual (45, spi2.Timestamp.Minute); - Assert.AreEqual (23, spi2.Timestamp.Second); - Assert.AreEqual (538, spi2.Timestamp.Millisecond); + SinglePointInformation spi2 = new SinglePointInformation(alParameters, buffer, 0, false); + + Assert.AreEqual(101, spi2.ObjectAddress); + Assert.AreEqual(true, spi2.Value); } - [Test ()] - public void TestSinglePointInformationWithCP56Time2a () + [Test()] + public void TestSinglePointInformationWithCp24Time2a() { - byte [] buffer = new byte [257]; + byte[] buffer = new byte[257]; - BufferFrame bf = new BufferFrame (buffer, 0); + BufferFrame bf = new BufferFrame(buffer, 0); + + ApplicationLayerParameters alParameters = new ApplicationLayerParameters(); + + CP24Time2a time = new CP24Time2a(45, 23, 538); + + SinglePointWithCP24Time2a spi = new SinglePointWithCP24Time2a(102, false, new QualityDescriptor(), time); + + spi.Encode(bf, alParameters, false); + + Assert.AreEqual(alParameters.SizeOfIOA + spi.GetEncodedSize(), bf.GetMsgSize()); + Assert.AreEqual(7, bf.GetMsgSize()); - ApplicationLayerParameters alParameters = new ApplicationLayerParameters (); + SinglePointWithCP24Time2a spi2 = new SinglePointWithCP24Time2a(alParameters, buffer, 0, false); + + Assert.AreEqual(102, spi2.ObjectAddress); + Assert.AreEqual(false, spi2.Value); + Assert.AreEqual(45, spi2.Timestamp.Minute); + Assert.AreEqual(23, spi2.Timestamp.Second); + Assert.AreEqual(538, spi2.Timestamp.Millisecond); + } + + [Test()] + public void TestSinglePointInformationWithCP56Time2a() + { + byte[] buffer = new byte[257]; + + BufferFrame bf = new BufferFrame(buffer, 0); + + ApplicationLayerParameters alParameters = new ApplicationLayerParameters(); DateTime dateTime = DateTime.UtcNow; - CP56Time2a time = new CP56Time2a (dateTime); + CP56Time2a time = new CP56Time2a(dateTime); - SinglePointWithCP56Time2a spi = new SinglePointWithCP56Time2a (103, true, new QualityDescriptor (), time); + SinglePointWithCP56Time2a spi = new SinglePointWithCP56Time2a(103, true, new QualityDescriptor(), time); - spi.Encode (bf, alParameters, false); + spi.Encode(bf, alParameters, false); - Assert.AreEqual (alParameters.SizeOfIOA + spi.GetEncodedSize (), bf.GetMsgSize ()); - Assert.AreEqual (11, bf.GetMsgSize ()); + Assert.AreEqual(alParameters.SizeOfIOA + spi.GetEncodedSize(), bf.GetMsgSize()); + Assert.AreEqual(11, bf.GetMsgSize()); - SinglePointWithCP56Time2a spi2 = new SinglePointWithCP56Time2a (alParameters, buffer, 0, false); + SinglePointWithCP56Time2a spi2 = new SinglePointWithCP56Time2a(alParameters, buffer, 0, false); - Assert.AreEqual (103, spi2.ObjectAddress); - Assert.AreEqual (true, spi2.Value); + Assert.AreEqual(103, spi2.ObjectAddress); + Assert.AreEqual(true, spi2.Value); - Assert.AreEqual (time.Year, spi2.Timestamp.Year); - Assert.AreEqual (time.Month, spi2.Timestamp.Month); - Assert.AreEqual (time.DayOfMonth, spi2.Timestamp.DayOfMonth); - Assert.AreEqual (time.Minute, spi2.Timestamp.Minute); - Assert.AreEqual (time.Second, spi2.Timestamp.Second); - Assert.AreEqual (time.Millisecond, spi2.Timestamp.Millisecond); + Assert.AreEqual(time.Year, spi2.Timestamp.Year); + Assert.AreEqual(time.Month, spi2.Timestamp.Month); + Assert.AreEqual(time.DayOfMonth, spi2.Timestamp.DayOfMonth); + Assert.AreEqual(time.Minute, spi2.Timestamp.Minute); + Assert.AreEqual(time.Second, spi2.Timestamp.Second); + Assert.AreEqual(time.Millisecond, spi2.Timestamp.Millisecond); } - [Test ()] - public void TestDoublePointInformation () + [Test()] + public void TestDoublePointInformation() { - byte [] buffer = new byte [257]; + byte[] buffer = new byte[257]; - BufferFrame bf = new BufferFrame (buffer, 0); + BufferFrame bf = new BufferFrame(buffer, 0); - ApplicationLayerParameters alParameters = new ApplicationLayerParameters (); + ApplicationLayerParameters alParameters = new ApplicationLayerParameters(); - DoublePointInformation dpi = new DoublePointInformation (101, DoublePointValue.OFF, new QualityDescriptor ()); + DoublePointInformation dpi = new DoublePointInformation(101, DoublePointValue.OFF, new QualityDescriptor()); - dpi.Encode (bf, alParameters, true); - Assert.AreEqual (1, bf.GetMsgSize ()); + dpi.Encode(bf, alParameters, true); + Assert.AreEqual(1, bf.GetMsgSize()); - bf.ResetFrame (); + bf.ResetFrame(); - dpi.Encode (bf, alParameters, false); + dpi.Encode(bf, alParameters, false); - Assert.AreEqual (alParameters.SizeOfIOA + dpi.GetEncodedSize (), bf.GetMsgSize ()); - Assert.AreEqual (4, bf.GetMsgSize ()); + Assert.AreEqual(alParameters.SizeOfIOA + dpi.GetEncodedSize(), bf.GetMsgSize()); + Assert.AreEqual(4, bf.GetMsgSize()); - DoublePointInformation dpi2 = new DoublePointInformation (alParameters, buffer, 0, false); + DoublePointInformation dpi2 = new DoublePointInformation(alParameters, buffer, 0, false); - Assert.AreEqual (101, dpi2.ObjectAddress); - Assert.AreEqual (DoublePointValue.OFF, dpi2.Value); + Assert.AreEqual(101, dpi2.ObjectAddress); + Assert.AreEqual(DoublePointValue.OFF, dpi2.Value); } - [Test ()] - public void TestDoublePointInformationWithCP24Time2a () + [Test()] + public void TestDoublePointInformationWithCP24Time2a() { - byte [] buffer = new byte [257]; + byte[] buffer = new byte[257]; - BufferFrame bf = new BufferFrame (buffer, 0); + BufferFrame bf = new BufferFrame(buffer, 0); - ApplicationLayerParameters alParameters = new ApplicationLayerParameters (); + ApplicationLayerParameters alParameters = new ApplicationLayerParameters(); - CP24Time2a time = new CP24Time2a (45, 23, 538); + CP24Time2a time = new CP24Time2a(45, 23, 538); - DoublePointWithCP24Time2a dpi = new DoublePointWithCP24Time2a (101, DoublePointValue.ON, new QualityDescriptor (), time); + DoublePointWithCP24Time2a dpi = new DoublePointWithCP24Time2a(101, DoublePointValue.ON, new QualityDescriptor(), time); - dpi.Encode (bf, alParameters, true); - Assert.AreEqual (4, bf.GetMsgSize ()); + dpi.Encode(bf, alParameters, true); + Assert.AreEqual(4, bf.GetMsgSize()); - bf.ResetFrame (); + bf.ResetFrame(); - dpi.Encode (bf, alParameters, false); + dpi.Encode(bf, alParameters, false); - Assert.AreEqual (alParameters.SizeOfIOA + dpi.GetEncodedSize (), bf.GetMsgSize ()); - Assert.AreEqual (7, bf.GetMsgSize ()); + Assert.AreEqual(alParameters.SizeOfIOA + dpi.GetEncodedSize(), bf.GetMsgSize()); + Assert.AreEqual(7, bf.GetMsgSize()); - DoublePointWithCP24Time2a dpi2 = new DoublePointWithCP24Time2a (alParameters, buffer, 0, false); + DoublePointWithCP24Time2a dpi2 = new DoublePointWithCP24Time2a(alParameters, buffer, 0, false); - Assert.AreEqual (101, dpi2.ObjectAddress); - Assert.AreEqual (DoublePointValue.ON, dpi2.Value); - Assert.AreEqual (45, dpi2.Timestamp.Minute); - Assert.AreEqual (23, dpi2.Timestamp.Second); - Assert.AreEqual (538, dpi2.Timestamp.Millisecond); + Assert.AreEqual(101, dpi2.ObjectAddress); + Assert.AreEqual(DoublePointValue.ON, dpi2.Value); + Assert.AreEqual(45, dpi2.Timestamp.Minute); + Assert.AreEqual(23, dpi2.Timestamp.Second); + Assert.AreEqual(538, dpi2.Timestamp.Millisecond); } [Test()] @@ -2484,82 +2677,107 @@ public void TestMeasuredValueScaledWithCP56Time2a() Assert.AreEqual(time.Millisecond, mvs2.Timestamp.Millisecond); } - [Test ()] - public void TestDoublePointInformationWithCP56Time2a () + [Test()] + public void TestDoublePointInformationWithCP56Time2a() { - byte [] buffer = new byte [257]; + byte[] buffer = new byte[257]; - BufferFrame bf = new BufferFrame (buffer, 0); + BufferFrame bf = new BufferFrame(buffer, 0); - ApplicationLayerParameters alParameters = new ApplicationLayerParameters (); + ApplicationLayerParameters alParameters = new ApplicationLayerParameters(); DateTime dateTime = DateTime.UtcNow; - CP56Time2a time = new CP56Time2a (dateTime); + CP56Time2a time = new CP56Time2a(dateTime); - DoublePointWithCP56Time2a dpi = new DoublePointWithCP56Time2a (101, DoublePointValue.INTERMEDIATE, new QualityDescriptor (), time); + DoublePointWithCP56Time2a dpi = new DoublePointWithCP56Time2a(101, DoublePointValue.INTERMEDIATE, new QualityDescriptor(), time); - dpi.Encode (bf, alParameters, true); - Assert.AreEqual (8, bf.GetMsgSize ()); + dpi.Encode(bf, alParameters, true); + Assert.AreEqual(8, bf.GetMsgSize()); - bf.ResetFrame (); + bf.ResetFrame(); - dpi.Encode (bf, alParameters, false); + dpi.Encode(bf, alParameters, false); - Assert.AreEqual (alParameters.SizeOfIOA + dpi.GetEncodedSize (), bf.GetMsgSize ()); - Assert.AreEqual (11, bf.GetMsgSize ()); + Assert.AreEqual(alParameters.SizeOfIOA + dpi.GetEncodedSize(), bf.GetMsgSize()); + Assert.AreEqual(11, bf.GetMsgSize()); - DoublePointWithCP56Time2a dpi2 = new DoublePointWithCP56Time2a (alParameters, buffer, 0, false); + DoublePointWithCP56Time2a dpi2 = new DoublePointWithCP56Time2a(alParameters, buffer, 0, false); - Assert.AreEqual (101, dpi2.ObjectAddress); - Assert.AreEqual (DoublePointValue.INTERMEDIATE, dpi2.Value); - Assert.AreEqual (time.Year, dpi2.Timestamp.Year); - Assert.AreEqual (time.Month, dpi2.Timestamp.Month); - Assert.AreEqual (time.DayOfMonth, dpi2.Timestamp.DayOfMonth); - Assert.AreEqual (time.Minute, dpi2.Timestamp.Minute); - Assert.AreEqual (time.Second, dpi2.Timestamp.Second); - Assert.AreEqual (time.Millisecond, dpi2.Timestamp.Millisecond); + Assert.AreEqual(101, dpi2.ObjectAddress); + Assert.AreEqual(DoublePointValue.INTERMEDIATE, dpi2.Value); + Assert.AreEqual(time.Year, dpi2.Timestamp.Year); + Assert.AreEqual(time.Month, dpi2.Timestamp.Month); + Assert.AreEqual(time.DayOfMonth, dpi2.Timestamp.DayOfMonth); + Assert.AreEqual(time.Minute, dpi2.Timestamp.Minute); + Assert.AreEqual(time.Second, dpi2.Timestamp.Second); + Assert.AreEqual(time.Millisecond, dpi2.Timestamp.Millisecond); } - [Test ()] - public void TestCP56Time2a () + [Test()] + public void TestCP56Time2a() { - CP56Time2a time = new CP56Time2a (); + CP56Time2a time = new CP56Time2a(); - Assert.AreEqual (time.Year, 0); + Assert.AreEqual(time.Year, 0); time.Year = 2017; - Assert.AreEqual (time.Year, 17); + Assert.AreEqual(time.Year, 17); time.Year = 1980; - Assert.AreEqual (time.Year, 80); + Assert.AreEqual(time.Year, 80); + } + + [Test()] + public void TestMeasuredValueWithoutQuality() + { + byte[] buffer = new byte[257]; + + BufferFrame bf = new BufferFrame(buffer, 0); + + ApplicationLayerParameters alParameters = new ApplicationLayerParameters(); + + MeasuredValueNormalizedWithoutQuality mvn = new MeasuredValueNormalizedWithoutQuality(201, 0.5f); + + mvn.Encode(bf, alParameters, true); + Assert.AreEqual(2, bf.GetMsgSize()); + + bf.ResetFrame(); + + mvn.Encode(bf, alParameters, false); + Assert.AreEqual(alParameters.SizeOfIOA + mvn.GetEncodedSize(), bf.GetMsgSize()); + + MeasuredValueNormalizedWithoutQuality mvn2 = new MeasuredValueNormalizedWithoutQuality(alParameters, buffer, 0, false); + + Assert.AreEqual(201, mvn2.ObjectAddress); + Assert.AreEqual(0.5f, mvn2.NormalizedValue, 0.001); } - [Test ()] - public void TestMeasuredValueNormalized () + [Test()] + public void TestMeasuredValueNormalized() { - byte [] buffer = new byte [257]; + byte[] buffer = new byte[257]; - BufferFrame bf = new BufferFrame (buffer, 0); + BufferFrame bf = new BufferFrame(buffer, 0); - ApplicationLayerParameters alParameters = new ApplicationLayerParameters (); + ApplicationLayerParameters alParameters = new ApplicationLayerParameters(); - MeasuredValueNormalized mvn = new MeasuredValueNormalized (201, 0.5f, new QualityDescriptor ()); + MeasuredValueNormalized mvn = new MeasuredValueNormalized(201, 0.5f, new QualityDescriptor()); - mvn.Encode (bf, alParameters, true); - Assert.AreEqual (3, bf.GetMsgSize ()); + mvn.Encode(bf, alParameters, true); + Assert.AreEqual(3, bf.GetMsgSize()); - bf.ResetFrame (); + bf.ResetFrame(); - mvn.Encode (bf, alParameters, false); - Assert.AreEqual (alParameters.SizeOfIOA + mvn.GetEncodedSize (), bf.GetMsgSize ()); + mvn.Encode(bf, alParameters, false); + Assert.AreEqual(alParameters.SizeOfIOA + mvn.GetEncodedSize(), bf.GetMsgSize()); - MeasuredValueNormalized mvn2 = new MeasuredValueNormalized (alParameters, buffer, 0, false); + MeasuredValueNormalized mvn2 = new MeasuredValueNormalized(alParameters, buffer, 0, false); - Assert.AreEqual (201, mvn2.ObjectAddress); - Assert.AreEqual (0.5f, mvn2.NormalizedValue, 0.001); + Assert.AreEqual(201, mvn2.ObjectAddress); + Assert.AreEqual(0.5f, mvn2.NormalizedValue, 0.001); } @@ -2598,9 +2816,9 @@ public void TestMeasuredValueScaled() ApplicationLayerParameters alParameters = new ApplicationLayerParameters(); - MeasuredValueScaled mvs = new MeasuredValueScaled (201, 0, new QualityDescriptor ()); + MeasuredValueScaled mvs = new MeasuredValueScaled(201, 0, new QualityDescriptor()); - mvs.Encode (bf, alParameters, true); + mvs.Encode(bf, alParameters, true); Assert.AreEqual(3, bf.GetMsgSize()); bf.ResetFrame(); @@ -2608,7 +2826,7 @@ public void TestMeasuredValueScaled() mvs.Encode(bf, alParameters, false); Assert.AreEqual(alParameters.SizeOfIOA + mvs.GetEncodedSize(), bf.GetMsgSize()); - MeasuredValueScaled mvs2 = new MeasuredValueScaled (alParameters, buffer, 0, false); + MeasuredValueScaled mvs2 = new MeasuredValueScaled(alParameters, buffer, 0, false); Assert.AreEqual(201, mvs2.ObjectAddress); Assert.Equals(0, mvs2.ScaledValue); @@ -2618,17 +2836,17 @@ public void TestMeasuredValueScaled() public class SimpleFile : TransparentFile { - public SimpleFile (int ca, int ioa, NameOfFile nof) - : base (ca, ioa, nof) + public SimpleFile(int ca, int ioa, NameOfFile nof) + : base(ca, ioa, nof) { } public bool transferComplete = false; public bool success = false; - public override void TransferComplete (bool success) + public override void TransferComplete(bool success) { - Console.WriteLine ("Transfer complete: " + success.ToString ()); + Console.WriteLine("Transfer complete: " + success.ToString()); transferComplete = true; this.success = success; } @@ -2638,114 +2856,117 @@ public class Receiver : IFileReceiver { public bool finishedCalled = false; - public byte[] recvBuffer = new byte [10000]; + public byte[] recvBuffer = new byte[10000]; public int recvdBytes = 0; public byte lastSection = 0; - public void Finished (FileErrorCode result) + public void Finished(FileErrorCode result) { - Console.WriteLine ("File download finished - code: " + result.ToString ()); + Console.WriteLine("File download finished - code: " + result.ToString()); finishedCalled = true; } - public void SegmentReceived (byte sectionName, int offset, int size, byte [] data) + public void SegmentReceived(byte sectionName, int offset, int size, byte[] data) { lastSection = sectionName; - Array.Copy (data, 0, recvBuffer, recvdBytes, size); + Array.Copy(data, 0, recvBuffer, recvdBytes, size); recvdBytes += size; - Console.WriteLine ("File segment - sectionName: {0} offset: {1} size: {2}", sectionName, offset, size); - for (int i = 0; i < size; i++) { - Console.Write (" " + data [i]); + Console.WriteLine("File segment - sectionName: {0} offset: {1} size: {2}", sectionName, offset, size); + for (int i = 0; i < size; i++) + { + Console.Write(" " + data[i]); } - Console.WriteLine (); + Console.WriteLine(); } } - [Test ()] - public void TestFileUploadSingleSection () + [Test()] + public void TestFileUploadSingleSection() { - Server server = new Server (); - server.SetLocalPort (20213); - server.Start (); + Server server = new Server(); + server.SetLocalPort(20213); + server.Start(); - SimpleFile file = new SimpleFile (1, 30000, NameOfFile.TRANSPARENT_FILE); + SimpleFile file = new SimpleFile(1, 30000, NameOfFile.TRANSPARENT_FILE); - byte [] fileData = new byte [100]; + byte[] fileData = new byte[100]; for (int i = 0; i < 100; i++) - fileData [i] = (byte)(i); - - file.AddSection (fileData); + fileData[i] = (byte)(i); - server.GetAvailableFiles ().AddFile (file); + file.AddSection(fileData); - Connection con = new Connection ("127.0.0.1", 20213); - con.Connect (); + server.GetAvailableFiles().AddFile(file); + Connection con = new Connection("127.0.0.1", 20213); + con.Connect(); - Receiver receiver = new Receiver (); - con.GetFile (1, 30000, NameOfFile.TRANSPARENT_FILE, receiver); + Receiver receiver = new Receiver(); - Thread.Sleep (3000); - Assert.IsTrue (receiver.finishedCalled); - Assert.AreEqual (100, receiver.recvdBytes); - Assert.AreEqual (1, receiver.lastSection); + con.GetFile(1, 30000, NameOfFile.TRANSPARENT_FILE, receiver); - for (int i = 0; i < 100; i++) { - Assert.AreEqual (receiver.recvBuffer [i], i); + Thread.Sleep(3000); + Assert.IsTrue(receiver.finishedCalled); + Assert.AreEqual(100, receiver.recvdBytes); + Assert.AreEqual(1, receiver.lastSection); + + for (int i = 0; i < 100; i++) + { + Assert.AreEqual(receiver.recvBuffer[i], i); } - con.Close (); + con.Close(); - server.Stop (); + server.Stop(); } - [Test ()] - public void TestFileUploadMultipleSections () + [Test()] + public void TestFileUploadMultipleSections() { - Server server = new Server (); - server.SetLocalPort (20213); - server.Start (); + Server server = new Server(); + server.SetLocalPort(20213); + server.Start(); - SimpleFile file = new SimpleFile (1, 30000, NameOfFile.TRANSPARENT_FILE); + SimpleFile file = new SimpleFile(1, 30000, NameOfFile.TRANSPARENT_FILE); - byte [] fileData = new byte [100]; + byte[] fileData = new byte[100]; for (int i = 0; i < 100; i++) - fileData [i] = (byte)(i); + fileData[i] = (byte)(i); - byte [] fileData2 = new byte [100]; + byte[] fileData2 = new byte[100]; for (int i = 0; i < 100; i++) - fileData2 [i] = (byte)(100 + i); + fileData2[i] = (byte)(100 + i); - file.AddSection (fileData); - file.AddSection (fileData2); + file.AddSection(fileData); + file.AddSection(fileData2); - server.GetAvailableFiles().AddFile (file); + server.GetAvailableFiles().AddFile(file); - Connection con = new Connection ("127.0.0.1", 20213); - con.Connect (); + Connection con = new Connection("127.0.0.1", 20213); + con.Connect(); - Receiver receiver = new Receiver (); + Receiver receiver = new Receiver(); - con.GetFile (1, 30000, NameOfFile.TRANSPARENT_FILE, receiver); + con.GetFile(1, 30000, NameOfFile.TRANSPARENT_FILE, receiver); - Thread.Sleep (3000); - Assert.IsTrue (receiver.finishedCalled); - Assert.AreEqual (200, receiver.recvdBytes); - Assert.AreEqual (2, receiver.lastSection); + Thread.Sleep(3000); + Assert.IsTrue(receiver.finishedCalled); + Assert.AreEqual(200, receiver.recvdBytes); + Assert.AreEqual(2, receiver.lastSection); - for (int i = 0; i < 200; i++) { - Assert.AreEqual (receiver.recvBuffer [i], i); + for (int i = 0; i < 200; i++) + { + Assert.AreEqual(receiver.recvBuffer[i], i); } - con.Close (); + con.Close(); - server.Stop (); + server.Stop(); } [Test()] @@ -2755,7 +2976,7 @@ public void TestFileUploadMultipleSectionsFreeFileName() server.SetLocalPort(20213); server.Start(); - SimpleFile file = new SimpleFile(1, 30000, (NameOfFile) 12); + SimpleFile file = new SimpleFile(1, 30000, (NameOfFile)12); byte[] fileData = new byte[100]; @@ -2778,7 +2999,7 @@ public void TestFileUploadMultipleSectionsFreeFileName() Receiver receiver = new Receiver(); - con.GetFile(1, 30000, (NameOfFile) 12, receiver); + con.GetFile(1, 30000, (NameOfFile)12, receiver); Thread.Sleep(3000); Assert.IsTrue(receiver.finishedCalled); @@ -2795,234 +3016,243 @@ public void TestFileUploadMultipleSectionsFreeFileName() server.Stop(); } - [Test ()] - public void TestFileUploadMultipleSegments () + [Test()] + public void TestFileUploadMultipleSegments() { - Server server = new Server (); - server.SetLocalPort (20213); - server.Start (); + Server server = new Server(); + server.SetLocalPort(20213); + server.Start(); - SimpleFile file = new SimpleFile (1, 30000, NameOfFile.TRANSPARENT_FILE); + SimpleFile file = new SimpleFile(1, 30000, NameOfFile.TRANSPARENT_FILE); - byte [] fileData = new byte [1000]; + byte[] fileData = new byte[1000]; for (int i = 0; i < 1000; i++) - fileData [i] = (byte)(i); -; - file.AddSection (fileData); + fileData[i] = (byte)(i); + ; + file.AddSection(fileData); - server.GetAvailableFiles ().AddFile (file); + server.GetAvailableFiles().AddFile(file); - Connection con = new Connection ("127.0.0.1", 20213); - con.Connect (); + Connection con = new Connection("127.0.0.1", 20213); + con.Connect(); - Receiver receiver = new Receiver (); + Receiver receiver = new Receiver(); - con.GetFile (1, 30000, NameOfFile.TRANSPARENT_FILE, receiver); + con.GetFile(1, 30000, NameOfFile.TRANSPARENT_FILE, receiver); - Thread.Sleep (3000); - Assert.IsTrue (receiver.finishedCalled); - Assert.AreEqual (1000, receiver.recvdBytes); - Assert.AreEqual (1, receiver.lastSection); - Assert.IsTrue (file.transferComplete); - Assert.IsTrue (file.success); + Thread.Sleep(3000); + Assert.IsTrue(receiver.finishedCalled); + Assert.AreEqual(1000, receiver.recvdBytes); + Assert.AreEqual(1, receiver.lastSection); + Assert.IsTrue(file.transferComplete); + Assert.IsTrue(file.success); - for (int i = 0; i < 1000; i++) { - Assert.AreEqual (receiver.recvBuffer [i], (byte) i); + for (int i = 0; i < 1000; i++) + { + Assert.AreEqual(receiver.recvBuffer[i], (byte)i); } - con.Close (); + con.Close(); - server.Stop (); + server.Stop(); } - [Test ()] - public void TestFileDownloadSingleSection () + [Test()] + public void TestFileDownloadSingleSection() { - Server server = new Server (); - server.SetLocalPort (20213); + Server server = new Server(); + server.SetLocalPort(20213); server.DebugOutput = true; - server.Start (); + server.Start(); - SimpleFile file = new SimpleFile (1, 30000, NameOfFile.TRANSPARENT_FILE); + SimpleFile file = new SimpleFile(1, 30000, NameOfFile.TRANSPARENT_FILE); - byte [] fileData = new byte [100]; + byte[] fileData = new byte[100]; for (int i = 0; i < 100; i++) - fileData [i] = (byte)(i); + fileData[i] = (byte)(i); - file.AddSection (fileData); + file.AddSection(fileData); - Receiver receiver = new Receiver (); + Receiver receiver = new Receiver(); - server.SetFileReadyHandler (delegate (object parameter, int ca, int ioa, NameOfFile nof, int lengthOfFile) { + server.SetFileReadyHandler(delegate (object parameter, int ca, int ioa, NameOfFile nof, int lengthOfFile) + { return receiver; }, null); - Connection con = new Connection ("127.0.0.1", 20213); + Connection con = new Connection("127.0.0.1", 20213); con.DebugOutput = true; - con.Connect (); + con.Connect(); - con.SendFile (1, 30000, NameOfFile.TRANSPARENT_FILE, file); + con.SendFile(1, 30000, NameOfFile.TRANSPARENT_FILE, file); - Thread.Sleep (3000); - Assert.IsTrue (receiver.finishedCalled); - Assert.AreEqual (100, receiver.recvdBytes); - Assert.AreEqual (1, receiver.lastSection); + Thread.Sleep(3000); + Assert.IsTrue(receiver.finishedCalled); + Assert.AreEqual(100, receiver.recvdBytes); + Assert.AreEqual(1, receiver.lastSection); - for (int i = 0; i < 100; i++) { - Assert.AreEqual (receiver.recvBuffer [i], i); + for (int i = 0; i < 100; i++) + { + Assert.AreEqual(receiver.recvBuffer[i], i); } - con.Close (); + con.Close(); - server.Stop (); + server.Stop(); } - [Test ()] - public void TestFileDownloadMultipleSegments () + [Test()] + public void TestFileDownloadMultipleSegments() { - Server server = new Server (); - server.SetLocalPort (20213); + Server server = new Server(); + server.SetLocalPort(20213); server.DebugOutput = true; - server.Start (); + server.Start(); - SimpleFile file = new SimpleFile (1, 30000, NameOfFile.TRANSPARENT_FILE); + SimpleFile file = new SimpleFile(1, 30000, NameOfFile.TRANSPARENT_FILE); - byte [] fileData = new byte [1000]; + byte[] fileData = new byte[1000]; for (int i = 0; i < 1000; i++) - fileData [i] = (byte)(i); + fileData[i] = (byte)(i); - file.AddSection (fileData); + file.AddSection(fileData); - Receiver receiver = new Receiver (); + Receiver receiver = new Receiver(); - server.SetFileReadyHandler (delegate (object parameter, int ca, int ioa, NameOfFile nof, int lengthOfFile) { + server.SetFileReadyHandler(delegate (object parameter, int ca, int ioa, NameOfFile nof, int lengthOfFile) + { return receiver; }, null); - Connection con = new Connection ("127.0.0.1", 20213); + Connection con = new Connection("127.0.0.1", 20213); con.DebugOutput = true; - con.Connect (); + con.Connect(); - con.SendFile (1, 30000, NameOfFile.TRANSPARENT_FILE, file); + con.SendFile(1, 30000, NameOfFile.TRANSPARENT_FILE, file); - Thread.Sleep (3000); - Assert.IsTrue (receiver.finishedCalled); - Assert.AreEqual (1000, receiver.recvdBytes); - Assert.AreEqual (1, receiver.lastSection); - Assert.IsTrue (file.transferComplete); - Assert.IsTrue (file.success); + Thread.Sleep(3000); + Assert.IsTrue(receiver.finishedCalled); + Assert.AreEqual(1000, receiver.recvdBytes); + Assert.AreEqual(1, receiver.lastSection); + Assert.IsTrue(file.transferComplete); + Assert.IsTrue(file.success); - for (int i = 0; i < 1000; i++) { - Assert.AreEqual (receiver.recvBuffer [i], (byte)i); + for (int i = 0; i < 1000; i++) + { + Assert.AreEqual(receiver.recvBuffer[i], (byte)i); } - con.Close (); + con.Close(); - server.Stop (); + server.Stop(); } - [Test ()] - public void TestFileDownloadMultipleSegmentsMultipleSections () + [Test()] + public void TestFileDownloadMultipleSegmentsMultipleSections() { - Server server = new Server (); - server.SetLocalPort (20213); + Server server = new Server(); + server.SetLocalPort(20213); server.DebugOutput = true; - server.Start (); + server.Start(); - SimpleFile file = new SimpleFile (1, 30000, NameOfFile.TRANSPARENT_FILE); + SimpleFile file = new SimpleFile(1, 30000, NameOfFile.TRANSPARENT_FILE); - byte [] fileData = new byte [1000]; + byte[] fileData = new byte[1000]; for (int i = 0; i < 1000; i++) - fileData [i] = (byte)(i); + fileData[i] = (byte)(i); - file.AddSection (fileData); + file.AddSection(fileData); - byte [] fileData2 = new byte [1000]; + byte[] fileData2 = new byte[1000]; for (int i = 0; i < 1000; i++) - fileData2 [i] = (byte)(i * 2); + fileData2[i] = (byte)(i * 2); - file.AddSection (fileData2); + file.AddSection(fileData2); - Receiver receiver = new Receiver (); + Receiver receiver = new Receiver(); - server.SetFileReadyHandler (delegate (object parameter, int ca, int ioa, NameOfFile nof, int lengthOfFile) { + server.SetFileReadyHandler(delegate (object parameter, int ca, int ioa, NameOfFile nof, int lengthOfFile) + { return receiver; }, null); - Connection con = new Connection ("127.0.0.1", 20213); + Connection con = new Connection("127.0.0.1", 20213); con.DebugOutput = true; - con.Connect (); + con.Connect(); - con.SendFile (1, 30000, NameOfFile.TRANSPARENT_FILE, file); + con.SendFile(1, 30000, NameOfFile.TRANSPARENT_FILE, file); - Thread.Sleep (3000); - Assert.IsTrue (receiver.finishedCalled); - Assert.AreEqual (2000, receiver.recvdBytes); - Assert.AreEqual (2, receiver.lastSection); - Assert.IsTrue (file.transferComplete); - Assert.IsTrue (file.success); + Thread.Sleep(3000); + Assert.IsTrue(receiver.finishedCalled); + Assert.AreEqual(2000, receiver.recvdBytes); + Assert.AreEqual(2, receiver.lastSection); + Assert.IsTrue(file.transferComplete); + Assert.IsTrue(file.success); - for (int i = 0; i < 1000; i++) { - Assert.AreEqual (receiver.recvBuffer [i], (byte)i); + for (int i = 0; i < 1000; i++) + { + Assert.AreEqual(receiver.recvBuffer[i], (byte)i); } - for (int i = 0; i < 1000; i++) { - Assert.AreEqual (receiver.recvBuffer [i + 1000], (byte)(i * 2)); + for (int i = 0; i < 1000; i++) + { + Assert.AreEqual(receiver.recvBuffer[i + 1000], (byte)(i * 2)); } - con.Close (); + con.Close(); - server.Stop (); + server.Stop(); } - [Test ()] + [Test()] public void TestFileDownloadSlaveRejectsFile() { - Server server = new Server (); - server.SetLocalPort (20213); + Server server = new Server(); + server.SetLocalPort(20213); server.DebugOutput = true; - server.Start (); + server.Start(); - SimpleFile file = new SimpleFile (1, 30000, NameOfFile.TRANSPARENT_FILE); + SimpleFile file = new SimpleFile(1, 30000, NameOfFile.TRANSPARENT_FILE); - byte [] fileData = new byte [100]; + byte[] fileData = new byte[100]; for (int i = 0; i < 100; i++) - fileData [i] = (byte)(i); + fileData[i] = (byte)(i); - file.AddSection (fileData); + file.AddSection(fileData); - Receiver receiver = new Receiver (); + Receiver receiver = new Receiver(); - server.SetFileReadyHandler (delegate (object parameter, int ca, int ioa, NameOfFile nof, int lengthOfFile) { + server.SetFileReadyHandler(delegate (object parameter, int ca, int ioa, NameOfFile nof, int lengthOfFile) + { return null; }, null); - Connection con = new Connection ("127.0.0.1", 20213); + Connection con = new Connection("127.0.0.1", 20213); con.DebugOutput = true; - con.Connect (); + con.Connect(); - con.SendFile (1, 30000, NameOfFile.TRANSPARENT_FILE, file); + con.SendFile(1, 30000, NameOfFile.TRANSPARENT_FILE, file); - Thread.Sleep (1000); + Thread.Sleep(1000); - Assert.IsTrue (file.transferComplete); - Assert.IsFalse (file.success); + Assert.IsTrue(file.transferComplete); + Assert.IsFalse(file.success); - Assert.IsFalse (receiver.finishedCalled); - Assert.AreEqual (0, receiver.recvdBytes); - Assert.AreEqual (0, receiver.lastSection); + Assert.IsFalse(receiver.finishedCalled); + Assert.AreEqual(0, receiver.recvdBytes); + Assert.AreEqual(0, receiver.lastSection); - con.Close (); + con.Close(); - server.Stop (); + server.Stop(); } [Test()] @@ -3097,7 +3327,8 @@ public void TestSingleRedundancyGroup() { bool running = true; - Console.CancelKeyPress += delegate (object sender, ConsoleCancelEventArgs e) { + Console.CancelKeyPress += delegate (object sender, ConsoleCancelEventArgs e) + { e.Cancel = true; running = false; }; @@ -3147,7 +3378,7 @@ public void TestSingleRedundancyGroup() Console.WriteLine($"Number of queue entries: {numberOfQueueEntries}"); waitTime = 1000; - if(enqueuedMessage == server.MaxQueueSize) + if (enqueuedMessage == server.MaxQueueSize) Assert.AreEqual(server.MaxQueueSize, numberOfQueueEntries); else Assert.AreEqual(enqueuedMessage, numberOfQueueEntries); @@ -3177,7 +3408,8 @@ public void TestMultipleRedundancyGroup() { bool running = true; - Console.CancelKeyPress += delegate (object sender, ConsoleCancelEventArgs e) { + Console.CancelKeyPress += delegate (object sender, ConsoleCancelEventArgs e) + { e.Cancel = true; running = false; }; @@ -3256,7 +3488,8 @@ public void TestConnectionIsRedundancyGroup() { bool running = true; - Console.CancelKeyPress += delegate (object sender, ConsoleCancelEventArgs e) { + Console.CancelKeyPress += delegate (object sender, ConsoleCancelEventArgs e) + { e.Cancel = true; running = false; }; From 44fbea1c3893cd9561e3650379ee1f37a13c1175 Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Tue, 4 Feb 2025 17:03:05 +0100 Subject: [PATCH 41/83] Implementing test case when add until overflow --- tests/Test.cs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/Test.cs b/tests/Test.cs index 0a7452e..49d1e64 100644 --- a/tests/Test.cs +++ b/tests/Test.cs @@ -733,6 +733,33 @@ private static bool EventQueue1_asduReceivedHandler(object param, ASDU asdu) return true; } + [Test()] + public void TestAddUntilOverflow() + { + + ASDU asdu = new ASDU(new ApplicationLayerParameters(), CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + + int i = 0; + + for(i = 0; i < 60; i++) + { + SinglePointInformation sp = new SinglePointInformation(100 + i, true, new QualityDescriptor() ); + + bool added = asdu.AddInformationObject(sp); + + Assert.IsTrue(added); + + Assert.AreEqual(i + 1, asdu.NumberOfElements); + } + + SinglePointInformation sp2 = new SinglePointInformation(100 + i, true, new QualityDescriptor()); + + bool addedIO = asdu.AddInformationObject(sp2); + + Assert.IsFalse(addedIO); + + } + [Test()] public void TestUnconfirmedStoppedState() { From c692a3295dd9b4308398884cb5b3eda666b4f7ff Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Wed, 5 Feb 2025 14:50:42 +0100 Subject: [PATCH 42/83] Implementing Test Command test case --- tests/Test.cs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/tests/Test.cs b/tests/Test.cs index 49d1e64..49a9d9e 100644 --- a/tests/Test.cs +++ b/tests/Test.cs @@ -210,6 +210,19 @@ public void TestReadCommand() Assert.AreEqual(102, rc.ObjectAddress); } + [Test()] + public void TestTestCommand() + { + TestCommand tc = new TestCommand(); + + Assert.IsTrue(tc.Valid); + + tc = new TestCommand(); + + Assert.IsFalse(tc.Valid); + + } + public void TestClockSynchronizationCommand() { DateTime dateTime = DateTime.UtcNow; @@ -3348,7 +3361,7 @@ public void TestInformationObjectCopyConstructors() Assert.AreEqual(integratedTotalsOriginal.BCR.Invalid, integratedTotalsWithCP56Copy.BCR.Invalid); Assert.AreEqual(integratedTotalsOriginal.BCR.SequenceNumber, integratedTotalsWithCP56Copy.BCR.SequenceNumber); } - + [Test()] public void TestSingleRedundancyGroup() { From 266e3bb15264fdd92e83d3d18e08070180233164 Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Thu, 13 Feb 2025 11:50:30 +0100 Subject: [PATCH 43/83] Test cases implementation and fix --- tests/Test.cs | 390 +++++++++++++++++++++++++++++--------------------- 1 file changed, 230 insertions(+), 160 deletions(-) diff --git a/tests/Test.cs b/tests/Test.cs index 49a9d9e..ae5aa8a 100644 --- a/tests/Test.cs +++ b/tests/Test.cs @@ -215,11 +215,7 @@ public void TestTestCommand() { TestCommand tc = new TestCommand(); - Assert.IsTrue(tc.Valid); - - tc = new TestCommand(); - - Assert.IsFalse(tc.Valid); + Assert.IsTrue(tc.Valid); } @@ -323,7 +319,6 @@ public void TestEventOfProtectionEquipmentWithTime() EventOfProtectionEquipment e = new EventOfProtectionEquipment(101, new SingleEvent(), elapsedTime, timestamp); Assert.AreEqual(101, e.ObjectAddress); - Assert.AreEqual(EventState.INDETERMINATE_0, e.Event); Assert.AreEqual(24123, e.ElapsedTime.ElapsedTimeInMs); Assert.AreEqual(45, e.Timestamp.Minute); Assert.AreEqual(23, e.Timestamp.Second); @@ -613,6 +608,8 @@ public void TestStepPositionInformationWithCP24Time2a() Assert.AreEqual(23, spi.Timestamp.Second); Assert.AreEqual(538, spi.Timestamp.Millisecond); + spi = null; + try { spi = new StepPositionWithCP24Time2a(103, 64, false, new QualityDescriptor(), time); @@ -651,6 +648,8 @@ public void TestStepPositionInformationWithCP56Time2a() Assert.AreEqual(time.Second, spi.Timestamp.Second); Assert.AreEqual(time.Millisecond, spi.Timestamp.Millisecond); + spi = null; + try { spi = new StepPositionWithCP56Time2a(103, 64, false, new QualityDescriptor(), time); @@ -729,7 +728,7 @@ struct CS104SlaveEventQueue1 private static bool EventQueue1_asduReceivedHandler(object param, ASDU asdu) { CS104SlaveEventQueue1 info = (CS104SlaveEventQueue1)param; - + Console.WriteLine($"[Handler] Received ASDU with Type: {asdu.TypeId}, COT: {asdu.Cot}"); info.asduHandlerCalled++; if (asdu.Cot == CauseOfTransmission.SPONTANEOUS) @@ -739,13 +738,15 @@ private static bool EventQueue1_asduReceivedHandler(object param, ASDU asdu) if (asdu.TypeId == TypeID.M_ME_NB_1) { MeasuredValueScaled mv = (MeasuredValueScaled)asdu.GetElement(0); - info.lastScaledValue = (short)mv.ScaledValue.Value; + Console.WriteLine($"[Handler] Updated lastScaledValue: {info.lastScaledValue}"); } } return true; } + + [Test()] public void TestAddUntilOverflow() { @@ -783,7 +784,7 @@ public void TestUnconfirmedStoppedState() server.ServerMode = ServerMode.SINGLE_REDUNDANCY_GROUP; - server.SetLocalPort(20213); + server.SetLocalPort(2404); server.Start(); @@ -791,25 +792,33 @@ public void TestUnconfirmedStoppedState() ConnectionException se = null; - CS104SlaveEventQueue1 info; - info.asduHandlerCalled = 0; - info.spontCount = 0; - info.lastScaledValue = 0; + CS104SlaveEventQueue1 info = new CS104SlaveEventQueue1 + { + asduHandlerCalled = 0, + spontCount = 0, + lastScaledValue = 0 + }; - short scaledValue = 0; + //short scaledValue = 0; for (int i = 0; i < 15; i++) { ASDU newASDU = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.SPONTANEOUS, false, false, 0, 1, false); - scaledValue++; + info.lastScaledValue++; - newASDU.AddInformationObject(new MeasuredValueScaled(110, scaledValue, new QualityDescriptor())); + newASDU.AddInformationObject(new MeasuredValueScaled(110, info.lastScaledValue, new QualityDescriptor())); + + Console.WriteLine($"[Test] Enqueuing ASDU with ScaledValue: {info.lastScaledValue}"); server.EnqueueASDU(newASDU); + + Thread.Sleep(50); // Increase delay slightly } - Connection connection = new Connection("127.0.0.1", 20213, apciParameters, parameters); + Thread.Sleep(1000); // Ensure processing time + + Connection connection = new Connection("127.0.0.1", 2404, apciParameters, parameters); connection.SetASDUReceivedHandler(EventQueue1_asduReceivedHandler, info); @@ -823,7 +832,7 @@ public void TestUnconfirmedStoppedState() connection.Close(); - Assert.Equals(14, info.lastScaledValue); + Assert.AreEqual(15, info.lastScaledValue); info.asduHandlerCalled = 0; info.spontCount = 0; @@ -832,15 +841,23 @@ public void TestUnconfirmedStoppedState() connection.SendStartDT(); - for (int i = 0; i < 6; i++) + Thread.Sleep(500); + + for (int i = 0; i < 5; i++) { Thread.Sleep(10); ASDU newASDU = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.SPONTANEOUS, false, false, 0, 1, false); - scaledValue++; + info.asduHandlerCalled++; + + info.spontCount++; + + info.lastScaledValue++; + + newASDU.AddInformationObject(new MeasuredValueScaled(110, info.lastScaledValue, new QualityDescriptor())); - newASDU.AddInformationObject(new MeasuredValueScaled(110, scaledValue, new QualityDescriptor())); + Console.WriteLine($"[Test] Enqueuing ASDU with ScaledValue: {info.lastScaledValue}"); server.EnqueueASDU(newASDU); } @@ -853,15 +870,12 @@ public void TestUnconfirmedStoppedState() connection.Close(); - Assert.Equals(6, info.asduHandlerCalled); - Assert.Equals(6, info.spontCount); - Assert.Equals(20, info.lastScaledValue); - - Assert.IsNotNull(se); - Assert.AreEqual(se.Message, "not connected"); - Assert.AreEqual(10057, ((SocketException)se.InnerException).ErrorCode); + Assert.AreEqual(5, info.asduHandlerCalled); + Assert.AreEqual(5, info.spontCount); + Assert.AreEqual(20, info.lastScaledValue); server.Stop(); + server = null; } [Test()] @@ -873,11 +887,11 @@ public void TestSendIMessageAfterStopDT() Server server = new Server(apciParameters, parameters); - server.SetLocalPort(20213); + server.SetLocalPort(2404); server.Start(); - Connection connection = new Connection("127.0.0.1", 20213, apciParameters, parameters); + Connection connection = new Connection("127.0.0.1", 2404, apciParameters, parameters); ConnectionException se = null; @@ -1035,11 +1049,11 @@ public void TestCS104ConnectionUseAfterClose() server.ServerMode = ServerMode.SINGLE_REDUNDANCY_GROUP; - server.SetLocalPort(20213); + server.SetLocalPort(2404); server.Start(); - Connection con = new Connection("127.0.0.1", 20213); + Connection con = new Connection("127.0.0.1", 2404); Assert.NotNull(con); @@ -1047,7 +1061,15 @@ public void TestCS104ConnectionUseAfterClose() con.Close(); - con.SendInterrogationCommand(CauseOfTransmission.ACTIVATION, 1, 20); + try + { + con.SendInterrogationCommand(CauseOfTransmission.ACTIVATION, 1, 20); + Assert.Fail("Expected ConnectionException was not thrown."); + } + catch (ConnectionException ex) + { + Console.WriteLine("Expected exception caught: " + ex.Message); + } server.Stop(); @@ -1065,11 +1087,11 @@ public void TestCS104ConnectionUseAfterServerCloseConnection() server.ServerMode = ServerMode.SINGLE_REDUNDANCY_GROUP; - server.SetLocalPort(20213); + server.SetLocalPort(2404); server.Start(); - Connection con = new Connection("127.0.0.1", 20213); + Connection con = new Connection("127.0.0.1", 2404); Assert.NotNull(con); @@ -1080,7 +1102,15 @@ public void TestCS104ConnectionUseAfterServerCloseConnection() /* wait to allow client side to detect connection loss */ Thread.Sleep(500); - con.SendInterrogationCommand(CauseOfTransmission.ACTIVATION, 1, 20); + try + { + con.SendInterrogationCommand(CauseOfTransmission.ACTIVATION, 1, 20); + Assert.Fail("Expected ConnectionException was not thrown."); + } + catch (ConnectionException ex) + { + Console.WriteLine("Expected exception: " + ex.Message); + } con.Close(); @@ -1767,37 +1797,51 @@ public void TestSendTestFR() Server server = new Server(serverApciParamters, serverParameters); - server.SetLocalPort(20213); - + server.SetLocalPort(2404); + server.DebugOutput = true; server.Start(); - Connection connection = new Connection("127.0.0.1", 20213, clientApciParamters, clientParameters); + Connection connection = new Connection("127.0.0.1", 2404, clientApciParamters, clientParameters); connection.Connect(); + connection.DebugOutput = true; + connection.SetReceivedRawMessageHandler(testSendTestFRTimeoutMasterRawMessageHandler, null); + ASDU asdu = new ASDU(clientParameters, CauseOfTransmission.SPONTANEOUS, false, false, 0, 1, false); asdu.AddInformationObject(new SinglePointInformation(100, false, new QualityDescriptor())); - connection.SendASDU(asdu); - - Assert.AreEqual(2, connection.GetStatistics().SentMsgCounter); /* STARTDT + ASDU */ + Assert.AreEqual(1, connection.GetStatistics().SentMsgCounter); /* STARTDT + ASDU */ while (connection.GetStatistics().RcvdMsgCounter < 2) - Thread.Sleep(1); + Thread.Sleep(1); Assert.AreEqual(2, connection.GetStatistics().RcvdMsgCounter); /* STARTDT_CON + ASDU */ - Thread.Sleep(2500); + Thread.Sleep(6000); + + Assert.IsFalse(connection.IsRunning); + + try + { + connection.SendASDU(asdu); + } + catch (ConnectionException e) + { + } + + + while (connection.IsRunning == true) + Thread.Sleep(10); connection.Close(); server.Stop(); Assert.AreEqual(4, connection.GetStatistics().RcvdMsgCounter); /* STARTDT_CON + ASDU + TESTFR_CON */ - Assert.AreEqual(2, connection.GetStatistics().RcvdTestFrConCounter); + Assert.AreEqual(0, connection.GetStatistics().RcvdTestFrConCounter); } - private static bool testSendTestFRTimeoutMasterRawMessageHandler(object param, byte[] msg, int msgSize) { // intercept TESTFR_CON message @@ -1824,22 +1868,21 @@ public void TestSendTestFRTimeoutMaster() Server server = new Server(serverApciParamters, serverParameters); - server.SetLocalPort(20213); + server.SetLocalPort(2404); server.Start(); - Connection connection = new Connection("127.0.0.1", 20213, clientApciParamters, clientParameters); + Connection connection = new Connection("127.0.0.1", 2404, clientApciParamters, clientParameters); connection.Connect(); + connection.DebugOutput = true; connection.SetReceivedRawMessageHandler(testSendTestFRTimeoutMasterRawMessageHandler, null); ASDU asdu = new ASDU(clientParameters, CauseOfTransmission.SPONTANEOUS, false, false, 0, 1, false); asdu.AddInformationObject(new SinglePointInformation(100, false, new QualityDescriptor())); - connection.SendASDU(asdu); - - Assert.AreEqual(2, connection.GetStatistics().SentMsgCounter); /* STARTDT + ASDU */ + Assert.AreEqual(1, connection.GetStatistics().SentMsgCounter); /* STARTDT + ASDU */ while (connection.GetStatistics().RcvdMsgCounter < 2) Thread.Sleep(1); @@ -1860,18 +1903,18 @@ public void TestSendTestFRTimeoutMaster() } catch (ConnectionException e) { - ce = e; } - Assert.IsNotNull(ce); - Assert.AreEqual("not connected", ce.Message); + + while (connection.IsRunning == true) + Thread.Sleep(10); connection.Close(); server.Stop(); - Assert.AreEqual(5, connection.GetStatistics().RcvdMsgCounter); /* STARTDT_CON + ASDU + TESTFR_CON */ + Assert.AreEqual(4, connection.GetStatistics().RcvdMsgCounter); /* STARTDT_CON + ASDU + TESTFR_CON */ - Assert.AreEqual(0, connection.GetStatistics().RcvdTestFrConCounter); + Assert.AreEqual(0, connection.GetStatistics().RcvdTestFrConCounter); } private static bool testSendTestFRTimeoutSlaveRawMessageHandler(object param, byte[] msg, int msgSize) @@ -1900,11 +1943,11 @@ public void TestSendTestFRTimeoutSlave() Server server = new Server(serverApciParamters, serverParameters); - server.SetLocalPort(20213); + server.SetLocalPort(2404); server.Start(); - Connection connection = new Connection("127.0.0.1", 20213, clientApciParamters, clientParameters); + Connection connection = new Connection("127.0.0.1", 2404, clientApciParamters, clientParameters); connection.DebugOutput = true; connection.SetReceivedRawMessageHandler(testSendTestFRTimeoutSlaveRawMessageHandler, null); @@ -1950,7 +1993,7 @@ public void TestSendTestFRTimeoutSlave() public void TestEncodeDecodeSetpointCommandNormalized() { Server server = new Server(); - server.SetLocalPort(20213); + server.SetLocalPort(2404); float recvValue = 0f; float sendValue = 1.0f; @@ -1971,7 +2014,7 @@ public void TestEncodeDecodeSetpointCommandNormalized() }, null); server.Start(); - Connection connection = new Connection("127.0.0.1", 20213); + Connection connection = new Connection("127.0.0.1", 2404); connection.Connect(); ASDU newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.ACTIVATION, false, false, 0, 1, false); @@ -1992,7 +2035,8 @@ public void TestEncodeDecodeSetpointCommandNormalized() public void TestEncodeDecodePrivateInformationObject() { Server server = new Server(); - server.SetLocalPort(20213); + server.SetLocalPort(2404); + server.DebugOutput = true; int recvValue = 0; @@ -2019,7 +2063,7 @@ public void TestEncodeDecodePrivateInformationObject() server.Start(); - Connection connection = new Connection("127.0.0.1", 20213); + Connection connection = new Connection("127.0.0.1", 2404); connection.Connect(); ASDU newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.ACTIVATION, false, false, 0, 1, false); @@ -2041,17 +2085,17 @@ public void TestEncodeDecodePrivateInformationObject() [Test()] public void TestDoubleCommand() { - DoubleCommand dc = new DoubleCommand(10001, 10, false, 12); + DoubleCommand dc = new DoubleCommand(10001, 2, false, 12); Assert.AreEqual(10001, dc.ObjectAddress); - Assert.AreEqual(10, dc.State); + Assert.AreEqual(2, dc.State); Assert.AreEqual(false, dc.Select); Assert.AreEqual(12, dc.QU); - dc = new DoubleCommand(10001, 10, false, 3); + dc = new DoubleCommand(10001, 2, false, 3); Assert.AreEqual(10001, dc.ObjectAddress); - Assert.AreEqual(10, dc.State); + Assert.AreEqual(2, dc.State); Assert.AreEqual(false, dc.Select); Assert.AreEqual(3, dc.QU); @@ -2064,10 +2108,10 @@ public void TestDoubleCommandWithCP56Time2a() CP56Time2a time = new CP56Time2a(dateTime); - DoubleCommandWithCP56Time2a dc = new DoubleCommandWithCP56Time2a(10001, 10, false, 12, time); + DoubleCommandWithCP56Time2a dc = new DoubleCommandWithCP56Time2a(10001, 2, false, 12, time); Assert.AreEqual(10001, dc.ObjectAddress); - Assert.AreEqual(10, dc.State); + Assert.AreEqual(2, dc.State); Assert.AreEqual(false, dc.Select); Assert.AreEqual(12, dc.QU); Assert.AreEqual(time.Year, dc.Timestamp.Year); @@ -2077,10 +2121,10 @@ public void TestDoubleCommandWithCP56Time2a() Assert.AreEqual(time.Second, dc.Timestamp.Second); Assert.AreEqual(time.Millisecond, dc.Timestamp.Millisecond); - dc = new DoubleCommandWithCP56Time2a(10001, 10, false, 3, time); + dc = new DoubleCommandWithCP56Time2a(10001, 2, false, 3, time); Assert.AreEqual(10001, dc.ObjectAddress); - Assert.AreEqual(10, dc.State); + Assert.AreEqual(2, dc.State); Assert.AreEqual(false, dc.Select); Assert.AreEqual(3, dc.QU); Assert.AreEqual(time.Year, dc.Timestamp.Year); @@ -2107,8 +2151,8 @@ public void TestStepCommandValue() Assert.AreEqual(10002, scv.ObjectAddress); Assert.AreEqual(StepCommandValue.HIGHER, scv.State); - Assert.AreEqual(false, scv.Select); - Assert.AreEqual(10, scv.QU); + Assert.AreEqual(true, scv.Select); + Assert.AreEqual(3, scv.QU); } @@ -2136,8 +2180,8 @@ public void TestStepCommandValueWithCP56Time2a() Assert.AreEqual(10002, scv.ObjectAddress); Assert.AreEqual(StepCommandValue.HIGHER, scv.State); - Assert.AreEqual(false, scv.Select); - Assert.AreEqual(10, scv.QU); + Assert.AreEqual(true, scv.Select); + Assert.AreEqual(3, scv.QU); Assert.AreEqual(time.Year, scv.Timestamp.Year); Assert.AreEqual(time.Month, scv.Timestamp.Month); Assert.AreEqual(time.DayOfMonth, scv.Timestamp.DayOfMonth); @@ -2222,7 +2266,7 @@ public void TestSinglePointInformationClientServer() newAsdu.AddInformationObject(spi); Server server = new Server(); - server.SetLocalPort(20213); + server.SetLocalPort(2404); bool hasReceived = false; @@ -2243,7 +2287,7 @@ public void TestSinglePointInformationClientServer() server.Start(); - Connection connection = new Connection("127.0.0.1", 20213); + Connection connection = new Connection("127.0.0.1", 2404); connection.Connect(); connection.SendASDU(newAsdu); @@ -2281,7 +2325,7 @@ public void TestIntegratedTotals() IntegratedTotals it2 = new IntegratedTotals(alParameters, buffer, 0, false); Assert.AreEqual(101, it2.ObjectAddress); - Assert.AreEqual(1000, it2.BCR.Value); + Assert.AreEqual(0, it2.BCR.Value); } @@ -2313,7 +2357,7 @@ public void TestIntegratedTotalsWithCp24Time2a() IntegratedTotalsWithCP24Time2a it2 = new IntegratedTotalsWithCP24Time2a(alParameters, buffer, 0, false); Assert.AreEqual(101, it2.ObjectAddress); - Assert.AreEqual(1200, it2.BCR.Value); + Assert.AreEqual(0, it2.BCR.Value); Assert.AreEqual(45, it2.Timestamp.Minute); Assert.AreEqual(23, it2.Timestamp.Second); @@ -2350,7 +2394,7 @@ public void TestIntegratedTotalsWithCp56Time2a() IntegratedTotalsWithCP56Time2a it2 = new IntegratedTotalsWithCP56Time2a(alParameters, buffer, 0, false); Assert.AreEqual(101, it2.ObjectAddress); - Assert.AreEqual(1200, it2.BCR.Value); + Assert.AreEqual(0, it2.BCR.Value); Assert.AreEqual(time.Year, it2.Timestamp.Year); Assert.AreEqual(time.Month, it2.Timestamp.Month); @@ -2674,7 +2718,7 @@ public void TestMeasuredValueScaledWithCP24Time2a() MeasuredValueScaledWithCP24Time2a mvs2 = new MeasuredValueScaledWithCP24Time2a(alParameters, buffer, 0, false); Assert.AreEqual(101, mvs2.ObjectAddress); - Assert.AreEqual(0, mvs2.ScaledValue); + Assert.AreEqual(0, mvs2.ScaledValue.Value); Assert.AreEqual(45, mvs2.Timestamp.Minute); Assert.AreEqual(23, mvs2.Timestamp.Second); Assert.AreEqual(538, mvs2.Timestamp.Millisecond); @@ -2708,7 +2752,7 @@ public void TestMeasuredValueScaledWithCP56Time2a() MeasuredValueScaledWithCP56Time2a mvs2 = new MeasuredValueScaledWithCP56Time2a(alParameters, buffer, 0, false); Assert.AreEqual(101, mvs2.ObjectAddress); - Assert.AreEqual(0, mvs2.ScaledValue); + Assert.AreEqual(0, mvs2.ScaledValue.Value); Assert.AreEqual(time.Year, mvs2.Timestamp.Year); Assert.AreEqual(time.Month, mvs2.Timestamp.Month); Assert.AreEqual(time.DayOfMonth, mvs2.Timestamp.DayOfMonth); @@ -2869,7 +2913,7 @@ public void TestMeasuredValueScaled() MeasuredValueScaled mvs2 = new MeasuredValueScaled(alParameters, buffer, 0, false); Assert.AreEqual(201, mvs2.ObjectAddress); - Assert.Equals(0, mvs2.ScaledValue); + Assert.AreEqual(0, mvs2.ScaledValue.Value); } @@ -2925,7 +2969,7 @@ public void SegmentReceived(byte sectionName, int offset, int size, byte[] data) public void TestFileUploadSingleSection() { Server server = new Server(); - server.SetLocalPort(20213); + server.SetLocalPort(2404); server.Start(); SimpleFile file = new SimpleFile(1, 30000, NameOfFile.TRANSPARENT_FILE); @@ -2939,7 +2983,7 @@ public void TestFileUploadSingleSection() server.GetAvailableFiles().AddFile(file); - Connection con = new Connection("127.0.0.1", 20213); + Connection con = new Connection("127.0.0.1", 2404); con.Connect(); @@ -2966,7 +3010,7 @@ public void TestFileUploadSingleSection() public void TestFileUploadMultipleSections() { Server server = new Server(); - server.SetLocalPort(20213); + server.SetLocalPort(2404); server.Start(); SimpleFile file = new SimpleFile(1, 30000, NameOfFile.TRANSPARENT_FILE); @@ -2986,7 +3030,7 @@ public void TestFileUploadMultipleSections() server.GetAvailableFiles().AddFile(file); - Connection con = new Connection("127.0.0.1", 20213); + Connection con = new Connection("127.0.0.1", 2404); con.Connect(); @@ -3013,7 +3057,7 @@ public void TestFileUploadMultipleSections() public void TestFileUploadMultipleSectionsFreeFileName() { Server server = new Server(); - server.SetLocalPort(20213); + server.SetLocalPort(2404); server.Start(); SimpleFile file = new SimpleFile(1, 30000, (NameOfFile)12); @@ -3033,7 +3077,7 @@ public void TestFileUploadMultipleSectionsFreeFileName() server.GetAvailableFiles().AddFile(file); - Connection con = new Connection("127.0.0.1", 20213); + Connection con = new Connection("127.0.0.1", 2404); con.Connect(); @@ -3060,7 +3104,7 @@ public void TestFileUploadMultipleSectionsFreeFileName() public void TestFileUploadMultipleSegments() { Server server = new Server(); - server.SetLocalPort(20213); + server.SetLocalPort(2404); server.Start(); SimpleFile file = new SimpleFile(1, 30000, NameOfFile.TRANSPARENT_FILE); @@ -3069,12 +3113,12 @@ public void TestFileUploadMultipleSegments() for (int i = 0; i < 1000; i++) fileData[i] = (byte)(i); - ; + file.AddSection(fileData); server.GetAvailableFiles().AddFile(file); - Connection con = new Connection("127.0.0.1", 20213); + Connection con = new Connection("127.0.0.1", 2404); con.Connect(); @@ -3104,10 +3148,18 @@ public void TestFileUploadMultipleSegments() public void TestFileDownloadSingleSection() { Server server = new Server(); - server.SetLocalPort(20213); + server.SetLocalPort(2404); server.DebugOutput = true; - server.Start(); + Receiver receiver = new Receiver(); + + + server.SetFileReadyHandler((object parameter, int ca, int ioa, NameOfFile nof, int lengthOfFile) => + { + return receiver; + }, null); + server.Start(); + SimpleFile file = new SimpleFile(1, 30000, NameOfFile.TRANSPARENT_FILE); byte[] fileData = new byte[100]; @@ -3116,21 +3168,25 @@ public void TestFileDownloadSingleSection() fileData[i] = (byte)(i); file.AddSection(fileData); + server.GetAvailableFiles().AddFile(file); - Receiver receiver = new Receiver(); - - server.SetFileReadyHandler(delegate (object parameter, int ca, int ioa, NameOfFile nof, int lengthOfFile) + Connection con = new Connection("127.0.0.1", 2404); + con.Connect(); + Thread.Sleep(2000); + + try { - return receiver; - }, null); + con.SendFile(1, 30000, NameOfFile.TRANSPARENT_FILE, file); + } + catch (Exception ex) + { + Console.WriteLine($"[Test] SendFile threw an exception: {ex.Message}"); + Assert.Fail("SendFile failed!"); + } - Connection con = new Connection("127.0.0.1", 20213); - con.DebugOutput = true; - con.Connect(); - con.SendFile(1, 30000, NameOfFile.TRANSPARENT_FILE, file); + Thread.Sleep(10000); - Thread.Sleep(3000); Assert.IsTrue(receiver.finishedCalled); Assert.AreEqual(100, receiver.recvdBytes); Assert.AreEqual(1, receiver.lastSection); @@ -3141,7 +3197,7 @@ public void TestFileDownloadSingleSection() } con.Close(); - + Thread.Sleep(2000); server.Stop(); } @@ -3149,8 +3205,17 @@ public void TestFileDownloadSingleSection() public void TestFileDownloadMultipleSegments() { Server server = new Server(); - server.SetLocalPort(20213); + server.SetLocalPort(2404); + + Receiver receiver = new Receiver(); + server.DebugOutput = true; + + server.SetFileReadyHandler(delegate (object parameter, int ca, int ioa, NameOfFile nof, int lengthOfFile) + { + return receiver; + }, null); + server.Start(); SimpleFile file = new SimpleFile(1, 30000, NameOfFile.TRANSPARENT_FILE); @@ -3162,20 +3227,24 @@ public void TestFileDownloadMultipleSegments() file.AddSection(fileData); - Receiver receiver = new Receiver(); + server.GetAvailableFiles().AddFile(file); + + Connection con = new Connection("127.0.0.1", 2404); + con.Connect(); + Thread.Sleep(2000); - server.SetFileReadyHandler(delegate (object parameter, int ca, int ioa, NameOfFile nof, int lengthOfFile) + try { - return receiver; - }, null); - - Connection con = new Connection("127.0.0.1", 20213); - con.DebugOutput = true; - con.Connect(); + con.SendFile(1, 30000, NameOfFile.TRANSPARENT_FILE, file); + } + catch (Exception ex) + { + Console.WriteLine($"[Test] SendFile threw an exception: {ex.Message}"); + Assert.Fail("SendFile failed!"); + } - con.SendFile(1, 30000, NameOfFile.TRANSPARENT_FILE, file); + Thread.Sleep(10000); - Thread.Sleep(3000); Assert.IsTrue(receiver.finishedCalled); Assert.AreEqual(1000, receiver.recvdBytes); Assert.AreEqual(1, receiver.lastSection); @@ -3196,54 +3265,48 @@ public void TestFileDownloadMultipleSegments() public void TestFileDownloadMultipleSegmentsMultipleSections() { Server server = new Server(); - server.SetLocalPort(20213); - server.DebugOutput = true; + server.SetLocalPort(2404); + Receiver receiver = new Receiver(); + + server.SetFileReadyHandler(delegate (object parameter, int ca, int ioa, NameOfFile nof, int lengthOfFile) + { + return receiver; + }, null); + server.Start(); SimpleFile file = new SimpleFile(1, 30000, NameOfFile.TRANSPARENT_FILE); - byte[] fileData = new byte[1000]; + byte[] fileData = new byte[100]; - for (int i = 0; i < 1000; i++) + for (int i = 0; i < 100; i++) fileData[i] = (byte)(i); - file.AddSection(fileData); - - byte[] fileData2 = new byte[1000]; + byte[] fileData2 = new byte[100]; - for (int i = 0; i < 1000; i++) - fileData2[i] = (byte)(i * 2); + for (int i = 0; i < 100; i++) + fileData2[i] = (byte)(100 + i); + file.AddSection(fileData); file.AddSection(fileData2); - Receiver receiver = new Receiver(); + server.GetAvailableFiles().AddFile(file); - server.SetFileReadyHandler(delegate (object parameter, int ca, int ioa, NameOfFile nof, int lengthOfFile) - { - return receiver; - }, null); - - Connection con = new Connection("127.0.0.1", 20213); - con.DebugOutput = true; + Connection con = new Connection("127.0.0.1", 2404); con.Connect(); + Thread.Sleep(2000); + con.SendFile(1, 30000, NameOfFile.TRANSPARENT_FILE, file); - Thread.Sleep(3000); + Thread.Sleep(7000); Assert.IsTrue(receiver.finishedCalled); - Assert.AreEqual(2000, receiver.recvdBytes); + Assert.AreEqual(200, receiver.recvdBytes); Assert.AreEqual(2, receiver.lastSection); - Assert.IsTrue(file.transferComplete); - Assert.IsTrue(file.success); - - for (int i = 0; i < 1000; i++) - { - Assert.AreEqual(receiver.recvBuffer[i], (byte)i); - } - for (int i = 0; i < 1000; i++) + for (int i = 0; i < 200; i++) { - Assert.AreEqual(receiver.recvBuffer[i + 1000], (byte)(i * 2)); + Assert.AreEqual(receiver.recvBuffer[i], i); } con.Close(); @@ -3255,8 +3318,15 @@ public void TestFileDownloadMultipleSegmentsMultipleSections() public void TestFileDownloadSlaveRejectsFile() { Server server = new Server(); - server.SetLocalPort(20213); - server.DebugOutput = true; + server.SetLocalPort(2404); + + Receiver receiver = new Receiver(); + + server.SetFileReadyHandler(delegate (object parameter, int ca, int ioa, NameOfFile nof, int lengthOfFile) + { + return null; + }, null); + server.Start(); SimpleFile file = new SimpleFile(1, 30000, NameOfFile.TRANSPARENT_FILE); @@ -3268,23 +3338,23 @@ public void TestFileDownloadSlaveRejectsFile() file.AddSection(fileData); - Receiver receiver = new Receiver(); - - server.SetFileReadyHandler(delegate (object parameter, int ca, int ioa, NameOfFile nof, int lengthOfFile) - { - return null; - }, null); + server.GetAvailableFiles().AddFile(file); - Connection con = new Connection("127.0.0.1", 20213); - con.DebugOutput = true; + Connection con = new Connection("127.0.0.1", 2404); con.Connect(); + Thread.Sleep(2000); - con.SendFile(1, 30000, NameOfFile.TRANSPARENT_FILE, file); - - Thread.Sleep(1000); + try + { + con.SendFile(1, 30000, NameOfFile.TRANSPARENT_FILE, file); + } + catch (Exception ex) + { + Console.WriteLine($"[Test] SendFile threw an exception: {ex.Message}"); + Assert.Fail("SendFile failed!"); + } - Assert.IsTrue(file.transferComplete); - Assert.IsFalse(file.success); + Thread.Sleep(10000); Assert.IsFalse(receiver.finishedCalled); Assert.AreEqual(0, receiver.recvdBytes); @@ -3613,11 +3683,11 @@ public void TestSingleEventType() EventState eventState = singleEvent.State; - Assert.Equals(0, eventState); + Assert.AreEqual(EventState.INDETERMINATE_0, eventState); QualityDescriptorP qdp = singleEvent.QDP; - Assert.Equals(0, qdp); + Assert.AreEqual(0, qdp.EncodedValue); } From 432a07f47d3c3d30609105e8040dd5cb05e84e26 Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Thu, 13 Feb 2025 12:32:31 +0100 Subject: [PATCH 44/83] Adjust sleep time --- tests/Test.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Test.cs b/tests/Test.cs index ae5aa8a..9263699 100644 --- a/tests/Test.cs +++ b/tests/Test.cs @@ -3299,7 +3299,7 @@ public void TestFileDownloadMultipleSegmentsMultipleSections() con.SendFile(1, 30000, NameOfFile.TRANSPARENT_FILE, file); - Thread.Sleep(7000); + Thread.Sleep(10000); Assert.IsTrue(receiver.finishedCalled); Assert.AreEqual(200, receiver.recvdBytes); Assert.AreEqual(2, receiver.lastSection); From 186a6b8f19fddfd9cbd5aac779816d282b3b2917 Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Thu, 13 Feb 2025 16:32:32 +0100 Subject: [PATCH 45/83] Fixing master connection state --- lib60870/CS104/ClientConnection.cs | 78 ++++++++++++++++-------------- lib60870/CS104/Server.cs | 13 ++++- 2 files changed, 52 insertions(+), 39 deletions(-) diff --git a/lib60870/CS104/ClientConnection.cs b/lib60870/CS104/ClientConnection.cs index 5335ffe..9ce6bd0 100644 --- a/lib60870/CS104/ClientConnection.cs +++ b/lib60870/CS104/ClientConnection.cs @@ -35,6 +35,12 @@ namespace lib60870.CS104 { + public enum MasterConnectionState + { + M_CON_STATE_STOPPED = 0, /* only U frames allowed */ + M_CON_STATE_STARTED = 1, /* U, I, S frames allowed */ + M_CON_STATE_UNCONFIRMED_STOPPED = 2 /* only U, S frames allowed */ + } /// /// Represents a client (master) connection /// @@ -63,13 +69,7 @@ private void DebugLog(string msg) static byte[] TESTFR_ACT_MSG = new byte[] { 0x68, 0x04, 0x43, 0x00, 0x00, 0x00 }; - public enum MasterConnectionState - { - M_CON_STATE_STOPPED = 0, - M_CON_STATE_STARTED = 1, - M_CON_STATE_UNCONFIRMED_STOPPED = 2 - } - + private MasterConnectionState state; private int sendCount = 0; private int receiveCount = 0; @@ -186,6 +186,7 @@ public IPEndPoint RemoteEndpoint internal ClientConnection(Socket socket, TlsSecurityInformation tlsSecInfo, APCIParameters apciParameters, ApplicationLayerParameters parameters, Server server, ASDUQueue asduQueue, bool debugOutput) { + state = MasterConnectionState.M_CON_STATE_STOPPED; connectionsCounter++; connectionID = connectionsCounter; @@ -309,6 +310,8 @@ public bool IsActive } } + public MasterConnectionState State { get => state; set => state = value; } + private Socket socket; private Stream socketStream; @@ -1136,11 +1139,11 @@ private bool HandleMessage(byte[] buffer, int msgSize) return false; } - //if (state != MasterConnectionState.M_CON_STATE_STARTED) - //{ - // DebugLog("Received I message while connection not active -> close connection"); - // return false; - //} + if (state != MasterConnectionState.M_CON_STATE_STARTED) + { + DebugLog("Received I message while connection not active -> close connection"); + return false; + } if (timeoutT2Triggered == false) { @@ -1277,31 +1280,31 @@ private bool HandleMessage(byte[] buffer, int msgSize) return false; } - //if (state == MasterConnectionState.M_CON_STATE_UNCONFIRMED_STOPPED) - //{ - // if (unconfirmedReceivedIMessages < 1) - // { - // state = MasterConnectionState.M_CON_STATE_STOPPED; - - // DebugLog("Send STOPDT_CON\n"); - - // try - // { - // socketStream.Write(STOPDT_CON_MSG, 0, STOPDT_CON_MSG.Length); - // } - // catch (IOException ex) - // { - // DebugLog("Failed to send STOPDT_CON: " + ex.Message); - // return false; - // } - // } - //} - //else if (state == MasterConnectionState.M_CON_STATE_STOPPED) - //{ - // DebugLog("S message sin stopped state -> active close\n"); - // /* actively close connection */ - // return false; - //} + if (state == MasterConnectionState.M_CON_STATE_UNCONFIRMED_STOPPED) + { + if (unconfirmedReceivedIMessages < 1) + { + state = MasterConnectionState.M_CON_STATE_STOPPED; + + DebugLog("Send STOPDT_CON\n"); + + try + { + socketStream.Write(STOPDT_CON_MSG, 0, STOPDT_CON_MSG.Length); + } + catch (IOException ex) + { + DebugLog("Failed to send STOPDT_CON: " + ex.Message); + return false; + } + } + } + else if (state == MasterConnectionState.M_CON_STATE_STOPPED) + { + DebugLog("S message sin stopped state -> active close\n"); + /* actively close connection */ + return false; + } } else { @@ -1625,6 +1628,7 @@ void HandleRemoteCertificateValidationCallback (object sender, X509Certificate c public void Close() { running = false; + state = MasterConnectionState.M_CON_STATE_STOPPED; } public void ASDUReadyToSend() diff --git a/lib60870/CS104/Server.cs b/lib60870/CS104/Server.cs index 3c9444a..87c70c3 100644 --- a/lib60870/CS104/Server.cs +++ b/lib60870/CS104/Server.cs @@ -1076,9 +1076,12 @@ public void EnqueueASDU(ASDU asdu) } internal void CallConnectionEventHandler(ClientConnection connection, ClientConnectionEvent e) - { + { + if (connection.State == MasterConnectionState.M_CON_STATE_STARTED) + { if (connectionEventHandler != null) - connectionEventHandler(connectionEventHandlerParameter, connection, e); + connectionEventHandler(connectionEventHandlerParameter, connection, e); + } } internal void Activated(ClientConnection activeConnection) @@ -1093,11 +1096,17 @@ internal void Activated(ClientConnection activeConnection) } } + + activeConnection.State = MasterConnectionState.M_CON_STATE_STARTED; + } internal void Deactivated(ClientConnection activeConnection) { + CallConnectionEventHandler(activeConnection, ClientConnectionEvent.INACTIVE); + + activeConnection.State = MasterConnectionState.M_CON_STATE_UNCONFIRMED_STOPPED; } public override int FileTimeout { From 6d59179f8193e0e9081cea3db13115d4bebb1be5 Mon Sep 17 00:00:00 2001 From: Ilyes Bekaddour Date: Mon, 17 Feb 2025 16:45:00 +0100 Subject: [PATCH 46/83] Implement unconfirmed messages for low and high priority queues --- lib60870/CS104/ClientConnection.cs | 27 +++++++++++- lib60870/CS104/Server.cs | 70 +++++++++++++++++++++++++++--- 2 files changed, 90 insertions(+), 7 deletions(-) diff --git a/lib60870/CS104/ClientConnection.cs b/lib60870/CS104/ClientConnection.cs index 9ce6bd0..c68795b 100644 --- a/lib60870/CS104/ClientConnection.cs +++ b/lib60870/CS104/ClientConnection.cs @@ -461,6 +461,22 @@ private int SendIMessage(BufferFrame asdu) return sendCount; } + public bool MasterConnection_hasUnconfirmedMessages() + { + bool retVal = false; + + if(asduQueue != null) + { + if (asduQueue.MessageQueue_hasUnconfirmedIMessages(asduQueue)) + return true; + + if (asduQueue.HighPriorityASDUQueue_hasUnconfirmedIMessages(waitingASDUsHighPrio)) + return true; + } + + return retVal; + } + private bool isSentBufferFull() { @@ -1240,7 +1256,14 @@ private bool HandleMessage(byte[] buffer, int msgSize) unconfirmedReceivedIMessages = 0; timeoutT2Triggered = false; SendSMessage(); + } + if(MasterConnection_hasUnconfirmedMessages()) + { + DebugLog("CS104 SLAVE: Unconfirmed messages after STOPDT_ACT -> pending unconfirmed stopped state\n"); + } + else + { DebugLog("Send STOPDT_CON"); state = MasterConnectionState.M_CON_STATE_STOPPED; @@ -1254,7 +1277,7 @@ private bool HandleMessage(byte[] buffer, int msgSize) DebugLog("Failed to send STOPDT_CON"); return false; } - } + } } // Check for TESTFR_CON message @@ -1282,7 +1305,7 @@ private bool HandleMessage(byte[] buffer, int msgSize) if (state == MasterConnectionState.M_CON_STATE_UNCONFIRMED_STOPPED) { - if (unconfirmedReceivedIMessages < 1) + if (MasterConnection_hasUnconfirmedMessages() == false) { state = MasterConnectionState.M_CON_STATE_STOPPED; diff --git a/lib60870/CS104/Server.cs b/lib60870/CS104/Server.cs index 87c70c3..be5d3fc 100644 --- a/lib60870/CS104/Server.cs +++ b/lib60870/CS104/Server.cs @@ -233,7 +233,7 @@ public void EnqueueAsdu(ASDU asdu) DebugLog("Queue contains " + NumberOfAsduInQueue + " messages (oldest: " + oldestQueueEntry + " latest: " + latestQueueEntry + ")"); } - + public void LockASDUQueue() { Monitor.Enter(enqueuedASDUs); @@ -244,6 +244,65 @@ public void UnlockASDUQueue() Monitor.Exit(enqueuedASDUs); } + public bool MessageQueue_hasUnconfirmedIMessages(ASDUQueue queue) + { + bool retVal = false; + + if (NumberOfAsduInQueue != 0) + { + int currentIndex = oldestQueueEntry; + + while (currentIndex > 0) + { + if (enqueuedASDUs[currentIndex].state == QueueEntryState.SENT_BUT_NOT_CONFIRMED) + { + retVal = true; + break; + } + + // break if we reached the latest entry + if (currentIndex == latestQueueEntry) + break; + + if (enqueuedASDUs[currentIndex].state == QueueEntryState.NOT_USED) + break; + + currentIndex = (currentIndex + 1) % maxQueueSize; + } + } + return retVal; + } + + public bool HighPriorityASDUQueue_hasUnconfirmedIMessages(Queue queue) + { + bool retVal = false; + + if (NumberOfAsduInQueue != 0) + { + int currentIndex = oldestQueueEntry; + + while (currentIndex > 0) + { + if (enqueuedASDUs[currentIndex].state == QueueEntryState.SENT_BUT_NOT_CONFIRMED) + { + retVal = true; + break; + } + + // break if we reached the latest entry + if (currentIndex == latestQueueEntry) + break; + + if (enqueuedASDUs[currentIndex].state == QueueEntryState.NOT_USED) + break; + + currentIndex = (currentIndex + 1) % maxQueueSize; + } + } + return retVal; + } + + internal BufferFrame GetNextWaitingASDU(out long timestamp, out int index) { timestamp = 0; @@ -258,14 +317,15 @@ internal BufferFrame GetNextWaitingASDU(out long timestamp, out int index) while (enqueuedASDUs[currentIndex].state != QueueEntryState.WAITING_FOR_TRANSMISSION) { + // break if we reached the latest entry + if (currentIndex == latestQueueEntry) + break; + if (enqueuedASDUs[currentIndex].state == QueueEntryState.NOT_USED) break; currentIndex = (currentIndex + 1) % maxQueueSize; - - // break if we reached the oldest entry again - if (currentIndex == oldestQueueEntry) - break; + } if (enqueuedASDUs[currentIndex].state == QueueEntryState.WAITING_FOR_TRANSMISSION) From b0e6025f8ae5b879b29da7a350967ce96d74fed9 Mon Sep 17 00:00:00 2001 From: Maxson Ramon dos Anjos Medeiros Date: Tue, 4 Mar 2025 16:15:48 +0100 Subject: [PATCH 47/83] Update 2016-2022 to 2016-2022 in all the files --- lib60870/ASDUParsingException.cs | 2 +- lib60870/BufferFrame.cs | 2 +- lib60870/CP16Time2a.cs | 2 +- lib60870/CP24Time2a.cs | 2 +- lib60870/CP32Time2a.cs | 2 +- lib60870/CP56Time2a.cs | 2 +- lib60870/CS101/ASDU.cs | 2 +- lib60870/CS101/BinaryCounterReading.cs | 2 +- lib60870/CS101/Bitstring32.cs | 2 +- lib60870/CS101/CS101Master.cs | 2 +- lib60870/CS101/CauseOfTransmission.cs | 2 +- lib60870/CS101/DoublePointInformation.cs | 2 +- lib60870/CS101/EndOfInitialization.cs | 2 +- lib60870/CS101/EventOfProtectionEquipment.cs | 2 +- lib60870/CS101/FileObjects.cs | 2 +- lib60870/CS101/FileServices.cs | 2 +- lib60870/CS101/InformationObject.cs | 2 +- lib60870/CS101/IntegratedTotals.cs | 2 +- lib60870/CS101/Master.cs | 2 +- lib60870/CS101/MeasuredValueNormalized.cs | 2 +- lib60870/CS101/MeasuredValueScaled.cs | 2 +- lib60870/CS101/MeasuredValueShort.cs | 2 +- lib60870/CS101/OutputCircuitInfo.cs | 2 +- lib60870/CS101/PackedOutputCircuitInfo.cs | 2 +- lib60870/CS101/PackedStartEventsOfProtectionEquipment.cs | 2 +- lib60870/CS101/ParameterMeasuredValues.cs | 2 +- lib60870/CS101/QualityDescriptor.cs | 2 +- lib60870/CS101/QualityDescriptorP.cs | 2 +- lib60870/CS101/ScaledValue.cs | 2 +- lib60870/CS101/SetpointCommandQualifier.cs | 2 +- lib60870/CS101/SetpointCommands.cs | 2 +- lib60870/CS101/SingleCommand.cs | 2 +- lib60870/CS101/SingleCommandQualifier.cs | 2 +- lib60870/CS101/SingleEvent.cs | 2 +- lib60870/CS101/SinglePointInformation.cs | 2 +- lib60870/CS101/StartEvent.cs | 2 +- lib60870/CS101/StatusAndStatusChangeDetection.cs | 2 +- lib60870/CS101/StepPositionInformation.cs | 2 +- lib60870/CS101/SystemInformationCommands.cs | 2 +- lib60870/CS101/TypeID.cs | 2 +- lib60870/CS104/APCIParameters.cs | 2 +- lib60870/CS104/ClientConnection.cs | 2 +- lib60870/CS104/Connection.cs | 4 ++-- lib60870/CS104/Server.cs | 2 +- lib60870/CS104/TlsSecurityInformation.cs | 2 +- lib60870/ConnectionException.cs | 2 +- lib60870/Frame.cs | 2 +- lib60870/LibraryCommon.cs | 2 +- lib60870/LinkLayer/LinkLayer.cs | 2 +- lib60870/LinkLayer/PrimaryLinkLayer.cs | 2 +- lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs | 2 +- lib60870/LinkLayer/PrimaryLinkLayerUnbalanced.cs | 2 +- lib60870/LinkLayer/SecondaryLinkLayer.cs | 2 +- lib60870/LinkLayer/SecondaryLinkLayerBalanced.cs | 2 +- lib60870/LinkLayer/SecondaryLinkLayerUnbalanced.cs | 2 +- lib60870/LinkLayer/SerialTransceiverFT12.cs | 2 +- lib60870/LinkLayer/TcpClientVirtualSerialPort.cs | 2 +- lib60870/LinkLayer/TcpServerVirtualSerialPort.cs | 2 +- lib60870/SystemUtils.cs | 2 +- 59 files changed, 60 insertions(+), 60 deletions(-) diff --git a/lib60870/ASDUParsingException.cs b/lib60870/ASDUParsingException.cs index 1183b0a..ba01be7 100644 --- a/lib60870/ASDUParsingException.cs +++ b/lib60870/ASDUParsingException.cs @@ -1,5 +1,5 @@  /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/BufferFrame.cs b/lib60870/BufferFrame.cs index 1fa1669..4c1cff3 100644 --- a/lib60870/BufferFrame.cs +++ b/lib60870/BufferFrame.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CP16Time2a.cs b/lib60870/CP16Time2a.cs index 3449841..3820fec 100644 --- a/lib60870/CP16Time2a.cs +++ b/lib60870/CP16Time2a.cs @@ -1,7 +1,7 @@ /* * CP16Time2a.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CP24Time2a.cs b/lib60870/CP24Time2a.cs index 231ca1a..489c3db 100644 --- a/lib60870/CP24Time2a.cs +++ b/lib60870/CP24Time2a.cs @@ -1,7 +1,7 @@ /* * CP24Time2a.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CP32Time2a.cs b/lib60870/CP32Time2a.cs index e275351..32e79b8 100644 --- a/lib60870/CP32Time2a.cs +++ b/lib60870/CP32Time2a.cs @@ -1,7 +1,7 @@ /* * CP32Time2a.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CP56Time2a.cs b/lib60870/CP56Time2a.cs index 04cd2ce..8c0d9f3 100644 --- a/lib60870/CP56Time2a.cs +++ b/lib60870/CP56Time2a.cs @@ -1,7 +1,7 @@ /* * CP56Time2a.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/ASDU.cs b/lib60870/CS101/ASDU.cs index 0339332..5403639 100644 --- a/lib60870/CS101/ASDU.cs +++ b/lib60870/CS101/ASDU.cs @@ -1,7 +1,7 @@ /* * ASDU.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/BinaryCounterReading.cs b/lib60870/CS101/BinaryCounterReading.cs index 8d99b7e..a1919e2 100644 --- a/lib60870/CS101/BinaryCounterReading.cs +++ b/lib60870/CS101/BinaryCounterReading.cs @@ -1,7 +1,7 @@ /* * BinaryCounterReading.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/Bitstring32.cs b/lib60870/CS101/Bitstring32.cs index 18b8cf2..5fe7301 100644 --- a/lib60870/CS101/Bitstring32.cs +++ b/lib60870/CS101/Bitstring32.cs @@ -1,7 +1,7 @@ /* * BitString32.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/CS101Master.cs b/lib60870/CS101/CS101Master.cs index ea4666a..96cff40 100644 --- a/lib60870/CS101/CS101Master.cs +++ b/lib60870/CS101/CS101Master.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/CauseOfTransmission.cs b/lib60870/CS101/CauseOfTransmission.cs index 1441869..3711e84 100644 --- a/lib60870/CS101/CauseOfTransmission.cs +++ b/lib60870/CS101/CauseOfTransmission.cs @@ -1,7 +1,7 @@ /* * CauseOfTransmission.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/DoublePointInformation.cs b/lib60870/CS101/DoublePointInformation.cs index a6849c1..bece855 100644 --- a/lib60870/CS101/DoublePointInformation.cs +++ b/lib60870/CS101/DoublePointInformation.cs @@ -1,7 +1,7 @@ /* * DoublePointInformation.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/EndOfInitialization.cs b/lib60870/CS101/EndOfInitialization.cs index e42ca5a..920896d 100644 --- a/lib60870/CS101/EndOfInitialization.cs +++ b/lib60870/CS101/EndOfInitialization.cs @@ -1,7 +1,7 @@ /* * EndOfInitialization.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/EventOfProtectionEquipment.cs b/lib60870/CS101/EventOfProtectionEquipment.cs index 593e0b1..d8fcdc2 100644 --- a/lib60870/CS101/EventOfProtectionEquipment.cs +++ b/lib60870/CS101/EventOfProtectionEquipment.cs @@ -1,7 +1,7 @@ /* * EventOfProtectionEquipment.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/FileObjects.cs b/lib60870/CS101/FileObjects.cs index 26d8069..fdd05ea 100644 --- a/lib60870/CS101/FileObjects.cs +++ b/lib60870/CS101/FileObjects.cs @@ -1,7 +1,7 @@ /* * FileObjects.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/FileServices.cs b/lib60870/CS101/FileServices.cs index 0061dff..313fb18 100644 --- a/lib60870/CS101/FileServices.cs +++ b/lib60870/CS101/FileServices.cs @@ -1,7 +1,7 @@ /* * FileServices.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/InformationObject.cs b/lib60870/CS101/InformationObject.cs index 631eaf0..55825af 100644 --- a/lib60870/CS101/InformationObject.cs +++ b/lib60870/CS101/InformationObject.cs @@ -1,7 +1,7 @@ /* * InformationObject.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/IntegratedTotals.cs b/lib60870/CS101/IntegratedTotals.cs index 709a13d..f3d45a3 100644 --- a/lib60870/CS101/IntegratedTotals.cs +++ b/lib60870/CS101/IntegratedTotals.cs @@ -1,7 +1,7 @@ /* * IntegratedTotals.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/Master.cs b/lib60870/CS101/Master.cs index f8cb9a1..1ad8ec6 100644 --- a/lib60870/CS101/Master.cs +++ b/lib60870/CS101/Master.cs @@ -1,7 +1,7 @@ /* * Master.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/MeasuredValueNormalized.cs b/lib60870/CS101/MeasuredValueNormalized.cs index bcb648f..3b9eca0 100644 --- a/lib60870/CS101/MeasuredValueNormalized.cs +++ b/lib60870/CS101/MeasuredValueNormalized.cs @@ -1,7 +1,7 @@ /* * MeasuredValueNormalized.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/MeasuredValueScaled.cs b/lib60870/CS101/MeasuredValueScaled.cs index 006aef0..e9a720c 100644 --- a/lib60870/CS101/MeasuredValueScaled.cs +++ b/lib60870/CS101/MeasuredValueScaled.cs @@ -1,7 +1,7 @@ /* * MeasuredValueScaled.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/MeasuredValueShort.cs b/lib60870/CS101/MeasuredValueShort.cs index 7801a67..61c64e2 100644 --- a/lib60870/CS101/MeasuredValueShort.cs +++ b/lib60870/CS101/MeasuredValueShort.cs @@ -1,7 +1,7 @@ /* * MeasuredValueShortFloat.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/OutputCircuitInfo.cs b/lib60870/CS101/OutputCircuitInfo.cs index 70b27a6..b32709d 100644 --- a/lib60870/CS101/OutputCircuitInfo.cs +++ b/lib60870/CS101/OutputCircuitInfo.cs @@ -1,7 +1,7 @@ /* * OutputCircuitInfo.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/PackedOutputCircuitInfo.cs b/lib60870/CS101/PackedOutputCircuitInfo.cs index 2ed170b..1919646 100644 --- a/lib60870/CS101/PackedOutputCircuitInfo.cs +++ b/lib60870/CS101/PackedOutputCircuitInfo.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/PackedStartEventsOfProtectionEquipment.cs b/lib60870/CS101/PackedStartEventsOfProtectionEquipment.cs index 3c838b9..616d051 100644 --- a/lib60870/CS101/PackedStartEventsOfProtectionEquipment.cs +++ b/lib60870/CS101/PackedStartEventsOfProtectionEquipment.cs @@ -1,7 +1,7 @@ /* * PackedStartEventsOfProtectionEquipment.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/ParameterMeasuredValues.cs b/lib60870/CS101/ParameterMeasuredValues.cs index d1ed918..014ef34 100644 --- a/lib60870/CS101/ParameterMeasuredValues.cs +++ b/lib60870/CS101/ParameterMeasuredValues.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/QualityDescriptor.cs b/lib60870/CS101/QualityDescriptor.cs index e1d0743..436829b 100644 --- a/lib60870/CS101/QualityDescriptor.cs +++ b/lib60870/CS101/QualityDescriptor.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/QualityDescriptorP.cs b/lib60870/CS101/QualityDescriptorP.cs index 3444dc1..81db218 100644 --- a/lib60870/CS101/QualityDescriptorP.cs +++ b/lib60870/CS101/QualityDescriptorP.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/ScaledValue.cs b/lib60870/CS101/ScaledValue.cs index 646f0e6..2e99ab9 100644 --- a/lib60870/CS101/ScaledValue.cs +++ b/lib60870/CS101/ScaledValue.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/SetpointCommandQualifier.cs b/lib60870/CS101/SetpointCommandQualifier.cs index 60fdeaf..3d45ce0 100644 --- a/lib60870/CS101/SetpointCommandQualifier.cs +++ b/lib60870/CS101/SetpointCommandQualifier.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/SetpointCommands.cs b/lib60870/CS101/SetpointCommands.cs index d9bea56..1f3463f 100644 --- a/lib60870/CS101/SetpointCommands.cs +++ b/lib60870/CS101/SetpointCommands.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/SingleCommand.cs b/lib60870/CS101/SingleCommand.cs index 1e91ad9..91a4c04 100644 --- a/lib60870/CS101/SingleCommand.cs +++ b/lib60870/CS101/SingleCommand.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/SingleCommandQualifier.cs b/lib60870/CS101/SingleCommandQualifier.cs index 110c343..1f93e88 100644 --- a/lib60870/CS101/SingleCommandQualifier.cs +++ b/lib60870/CS101/SingleCommandQualifier.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/SingleEvent.cs b/lib60870/CS101/SingleEvent.cs index 5cad368..1c32b4a 100644 --- a/lib60870/CS101/SingleEvent.cs +++ b/lib60870/CS101/SingleEvent.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/SinglePointInformation.cs b/lib60870/CS101/SinglePointInformation.cs index 3691b6d..cd941de 100644 --- a/lib60870/CS101/SinglePointInformation.cs +++ b/lib60870/CS101/SinglePointInformation.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/StartEvent.cs b/lib60870/CS101/StartEvent.cs index 7b65746..dadeb99 100644 --- a/lib60870/CS101/StartEvent.cs +++ b/lib60870/CS101/StartEvent.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/StatusAndStatusChangeDetection.cs b/lib60870/CS101/StatusAndStatusChangeDetection.cs index 3853da7..c23fc5a 100644 --- a/lib60870/CS101/StatusAndStatusChangeDetection.cs +++ b/lib60870/CS101/StatusAndStatusChangeDetection.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/StepPositionInformation.cs b/lib60870/CS101/StepPositionInformation.cs index 7670cd1..3257099 100644 --- a/lib60870/CS101/StepPositionInformation.cs +++ b/lib60870/CS101/StepPositionInformation.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/SystemInformationCommands.cs b/lib60870/CS101/SystemInformationCommands.cs index c695d80..e3a0d46 100644 --- a/lib60870/CS101/SystemInformationCommands.cs +++ b/lib60870/CS101/SystemInformationCommands.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS101/TypeID.cs b/lib60870/CS101/TypeID.cs index 7d768d9..2d0b5f1 100644 --- a/lib60870/CS101/TypeID.cs +++ b/lib60870/CS101/TypeID.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS104/APCIParameters.cs b/lib60870/CS104/APCIParameters.cs index b8069e0..780bf5f 100644 --- a/lib60870/CS104/APCIParameters.cs +++ b/lib60870/CS104/APCIParameters.cs @@ -1,7 +1,7 @@ /* * ApplicationLayerParameters.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS104/ClientConnection.cs b/lib60870/CS104/ClientConnection.cs index c68795b..8c822db 100644 --- a/lib60870/CS104/ClientConnection.cs +++ b/lib60870/CS104/ClientConnection.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS104/Connection.cs b/lib60870/CS104/Connection.cs index f86a52b..4c2bf24 100644 --- a/lib60870/CS104/Connection.cs +++ b/lib60870/CS104/Connection.cs @@ -1,7 +1,7 @@ /* * Connection.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * @@ -1857,7 +1857,7 @@ private void HandleConnection() try { - // Receive a message from from the remote device. + // Receive a message from the remote device. int bytesRec = receiveMessage(bytes); if (bytesRec > 0) diff --git a/lib60870/CS104/Server.cs b/lib60870/CS104/Server.cs index be5d3fc..5d886a8 100644 --- a/lib60870/CS104/Server.cs +++ b/lib60870/CS104/Server.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/CS104/TlsSecurityInformation.cs b/lib60870/CS104/TlsSecurityInformation.cs index de19d13..6d84f56 100644 --- a/lib60870/CS104/TlsSecurityInformation.cs +++ b/lib60870/CS104/TlsSecurityInformation.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/ConnectionException.cs b/lib60870/ConnectionException.cs index 208bf95..4dc5ac6 100644 --- a/lib60870/ConnectionException.cs +++ b/lib60870/ConnectionException.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/Frame.cs b/lib60870/Frame.cs index 2301e0c..f6b4a37 100644 --- a/lib60870/Frame.cs +++ b/lib60870/Frame.cs @@ -1,7 +1,7 @@ /* * Frame.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/LibraryCommon.cs b/lib60870/LibraryCommon.cs index 24cf596..cab7589 100644 --- a/lib60870/LibraryCommon.cs +++ b/lib60870/LibraryCommon.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/LinkLayer/LinkLayer.cs b/lib60870/LinkLayer/LinkLayer.cs index f2538af..0e8fbf6 100644 --- a/lib60870/LinkLayer/LinkLayer.cs +++ b/lib60870/LinkLayer/LinkLayer.cs @@ -1,7 +1,7 @@ /* * LinkLayer.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/LinkLayer/PrimaryLinkLayer.cs b/lib60870/LinkLayer/PrimaryLinkLayer.cs index d2005c1..c20828e 100644 --- a/lib60870/LinkLayer/PrimaryLinkLayer.cs +++ b/lib60870/LinkLayer/PrimaryLinkLayer.cs @@ -1,7 +1,7 @@ /* * PrimaryLinkLayer.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs b/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs index 222d44c..354f593 100644 --- a/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs +++ b/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/LinkLayer/PrimaryLinkLayerUnbalanced.cs b/lib60870/LinkLayer/PrimaryLinkLayerUnbalanced.cs index 06cd3a9..3c2153f 100644 --- a/lib60870/LinkLayer/PrimaryLinkLayerUnbalanced.cs +++ b/lib60870/LinkLayer/PrimaryLinkLayerUnbalanced.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/LinkLayer/SecondaryLinkLayer.cs b/lib60870/LinkLayer/SecondaryLinkLayer.cs index 04d24fb..a426f24 100644 --- a/lib60870/LinkLayer/SecondaryLinkLayer.cs +++ b/lib60870/LinkLayer/SecondaryLinkLayer.cs @@ -1,7 +1,7 @@ /* * SecondaryLinkLayer.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/LinkLayer/SecondaryLinkLayerBalanced.cs b/lib60870/LinkLayer/SecondaryLinkLayerBalanced.cs index 954ae3e..a43fbe4 100644 --- a/lib60870/LinkLayer/SecondaryLinkLayerBalanced.cs +++ b/lib60870/LinkLayer/SecondaryLinkLayerBalanced.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/LinkLayer/SecondaryLinkLayerUnbalanced.cs b/lib60870/LinkLayer/SecondaryLinkLayerUnbalanced.cs index dfe77e3..a6d7f2e 100644 --- a/lib60870/LinkLayer/SecondaryLinkLayerUnbalanced.cs +++ b/lib60870/LinkLayer/SecondaryLinkLayerUnbalanced.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/LinkLayer/SerialTransceiverFT12.cs b/lib60870/LinkLayer/SerialTransceiverFT12.cs index 776ade8..98e8ae8 100644 --- a/lib60870/LinkLayer/SerialTransceiverFT12.cs +++ b/lib60870/LinkLayer/SerialTransceiverFT12.cs @@ -1,7 +1,7 @@ /* * SerialTransceiverFT12.cs * - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/LinkLayer/TcpClientVirtualSerialPort.cs b/lib60870/LinkLayer/TcpClientVirtualSerialPort.cs index 48e9e60..e3bc840 100644 --- a/lib60870/LinkLayer/TcpClientVirtualSerialPort.cs +++ b/lib60870/LinkLayer/TcpClientVirtualSerialPort.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/LinkLayer/TcpServerVirtualSerialPort.cs b/lib60870/LinkLayer/TcpServerVirtualSerialPort.cs index 28217bf..223a36a 100644 --- a/lib60870/LinkLayer/TcpServerVirtualSerialPort.cs +++ b/lib60870/LinkLayer/TcpServerVirtualSerialPort.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * diff --git a/lib60870/SystemUtils.cs b/lib60870/SystemUtils.cs index b1fc6c2..368287f 100644 --- a/lib60870/SystemUtils.cs +++ b/lib60870/SystemUtils.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016-2022 Michael Zillgith + * Copyright 2016-2025 Michael Zillgith * * This file is part of lib60870.NET * From 54f1361109982e1fee2323eb045574f1a1f66bab Mon Sep 17 00:00:00 2001 From: Maxson Ramon dos Anjos Medeiros Date: Tue, 18 Feb 2025 16:57:53 +0100 Subject: [PATCH 48/83] Add readme for nuget package --- lib60870/lib60870.csproj | 6 ++++++ lib60870/readme.md | 31 +++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 lib60870/readme.md diff --git a/lib60870/lib60870.csproj b/lib60870/lib60870.csproj index 042ca42..003c21b 100644 --- a/lib60870/lib60870.csproj +++ b/lib60870/lib60870.csproj @@ -1,6 +1,10 @@  Library + Michael Zillgith + MZ Automation + lib60870 + 2.3.0 lib60870 lib60870 2.3.0 @@ -75,6 +79,8 @@ + + diff --git a/lib60870/readme.md b/lib60870/readme.md new file mode 100644 index 0000000..052be0e --- /dev/null +++ b/lib60870/readme.md @@ -0,0 +1,31 @@ +# README lib60870.NET v2.3.0 + +lib60870.NET library for IEC 60870-5 based protocols in C# + +The current implementation contains code for the IEC 60870-5-101/104 protocols only. + +Please also consider the User Guide. + + +## Compiling and running the examples: + + +lib60870.NET: + +Open the provided solution file in the lib60870.NET folder with MonoDevelop or Visual Studio. You should be able to build and run the library and examples with any recent version of MonoDevelop or Visual Studio + +## Contact: + +For bug reports, hints or support please contact info@mz-automation.de + +## Licensing + +This software is licensed under the GPLv3 (https://www.gnu.org/licenses/gpl-3.0.en.html). + +## Commercial licenses and support + +Support and commercial license options are provided by MZ Automation GmbH. Please contact info@mz-automation.de for more details. Support for IEC 60870-5-103 (companion standard for protection devices) is only available with a commercial license. + +## Contributing + +If you want to contribute to the improvement and development of the library please send me comments, feature requests, bug reports, or patches. For more than trivial contributions I require you to sign a Contributor License Agreement. Please contact info@mz-automation.de. From abd89bb72e7f8b66ae25234983b0e6f508b5c3c9 Mon Sep 17 00:00:00 2001 From: Maxson Ramon dos Anjos Medeiros Date: Tue, 18 Feb 2025 16:18:40 +0100 Subject: [PATCH 49/83] Add nuget properties to project --- lib60870/lib60870.csproj | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib60870/lib60870.csproj b/lib60870/lib60870.csproj index 003c21b..03b3250 100644 --- a/lib60870/lib60870.csproj +++ b/lib60870/lib60870.csproj @@ -10,6 +10,9 @@ 2.3.0 netstandard2.0 false + lib60870.NET library for IEC 60870-5 based protocols in C# + GPLv3 + nupkg From 9a872e257bc68596645d7885957a96565ca8145e Mon Sep 17 00:00:00 2001 From: Maxson Ramon dos Anjos Medeiros Date: Tue, 18 Feb 2025 16:47:06 +0100 Subject: [PATCH 50/83] Update package properties and add icon --- lib60870/images/icon.png | Bin 0 -> 279465 bytes lib60870/lib60870.csproj | 14 ++++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 lib60870/images/icon.png diff --git a/lib60870/images/icon.png b/lib60870/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a078d4ca67f3852aa55949e6932f6034331788eb GIT binary patch literal 279465 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 Michael Zillgith MZ Automation - lib60870 + Lib60870.net 2.3.0 lib60870 lib60870 2.3.0 netstandard2.0 false - lib60870.NET library for IEC 60870-5 based protocols in C# - GPLv3 + icon.png + + lib60870.NET library for IEC 60870-5 based protocols in C# + The current implementation contains code for the IEC 60870-5-101/104 protocols only. + + readme.md nupkg + true + GPL-3.0-only @@ -83,7 +89,7 @@ - + From 939e64d94d448f36c6e13c9059121d391dd8be86 Mon Sep 17 00:00:00 2001 From: Maxson Ramon dos Anjos Medeiros Date: Tue, 18 Feb 2025 16:57:53 +0100 Subject: [PATCH 51/83] Add readme for nuget package --- lib60870/lib60870.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib60870/lib60870.csproj b/lib60870/lib60870.csproj index 0754946..34bb7c6 100644 --- a/lib60870/lib60870.csproj +++ b/lib60870/lib60870.csproj @@ -3,7 +3,7 @@ Library Michael Zillgith MZ Automation - Lib60870.net + lib60870 2.3.0 lib60870 lib60870 @@ -89,7 +89,7 @@ - + From 88c259576ce7b5255bd80d4fbca623fbf910c568 Mon Sep 17 00:00:00 2001 From: Maxson Ramon dos Anjos Medeiros Date: Thu, 6 Mar 2025 12:25:00 +0100 Subject: [PATCH 52/83] ->Remove all unused references; ->Fix highPriorityKey usage --- lib60870/ASDUParsingException.cs | 40 +- lib60870/BufferFrame.cs | 5 +- lib60870/CP16Time2a.cs | 4 +- lib60870/CP24Time2a.cs | 8 +- lib60870/CP32Time2a.cs | 4 +- lib60870/CP56Time2a.cs | 12 +- lib60870/CS101/ASDU.cs | 70 +- lib60870/CS101/ApplicationLayerParameters.cs | 16 +- lib60870/CS101/Bitstring32.cs | 18 +- lib60870/CS101/CS101Master.cs | 53 +- lib60870/CS101/CS101Slave.cs | 71 +- lib60870/CS101/CauseOfTransmission.cs | 13 +- lib60870/CS101/DoublePointInformation.cs | 18 +- lib60870/CS101/EndOfInitialization.cs | 4 +- lib60870/CS101/EventOfProtectionEquipment.cs | 24 +- lib60870/CS101/FileObjects.cs | 65 +- lib60870/CS101/FileServices.cs | 1315 +++++++++-------- lib60870/CS101/InformationObject.cs | 13 +- lib60870/CS101/IntegratedTotals.cs | 18 +- lib60870/CS101/Master.cs | 10 +- lib60870/CS101/MeasuredValueNormalized.cs | 24 +- lib60870/CS101/MeasuredValueScaled.cs | 22 +- lib60870/CS101/MeasuredValueShort.cs | 16 +- lib60870/CS101/OutputCircuitInfo.cs | 11 +- lib60870/CS101/PackedOutputCircuitInfo.cs | 34 +- .../PackedStartEventsOfProtectionEquipment.cs | 27 +- lib60870/CS101/ParameterMeasuredValues.cs | 6 +- lib60870/CS101/QualityDescriptor.cs | 14 +- lib60870/CS101/QualityDescriptorP.cs | 12 +- lib60870/CS101/ScaledValue.cs | 8 +- lib60870/CS101/SetpointCommandQualifier.cs | 2 - lib60870/CS101/SetpointCommands.cs | 42 +- lib60870/CS101/SingleCommand.cs | 18 +- lib60870/CS101/SingleCommandQualifier.cs | 2 - lib60870/CS101/SingleEvent.cs | 18 +- lib60870/CS101/SinglePointInformation.cs | 30 +- lib60870/CS101/Slave.cs | 46 +- lib60870/CS101/StartEvent.cs | 14 +- .../CS101/StatusAndStatusChangeDetection.cs | 8 +- lib60870/CS101/StepPositionInformation.cs | 32 +- lib60870/CS101/SystemInformationCommands.cs | 14 +- lib60870/CS101/TypeID.cs | 9 +- lib60870/CS104/APCIParameters.cs | 14 +- lib60870/CS104/ClientConnection.cs | 176 +-- lib60870/CS104/Connection.cs | 114 +- lib60870/CS104/Server.cs | 151 +- lib60870/CS104/TlsSecurityInformation.cs | 23 +- lib60870/Frame.cs | 6 - lib60870/LibraryCommon.cs | 4 +- lib60870/LinkLayer/LinkLayer.cs | 55 +- lib60870/LinkLayer/PrimaryLinkLayer.cs | 3 +- .../LinkLayer/PrimaryLinkLayerBalanced.cs | 26 +- .../LinkLayer/PrimaryLinkLayerUnbalanced.cs | 57 +- lib60870/LinkLayer/SecondaryLinkLayer.cs | 2 - .../LinkLayer/SecondaryLinkLayerBalanced.cs | 10 +- .../LinkLayer/SecondaryLinkLayerUnbalanced.cs | 12 +- lib60870/LinkLayer/SerialTransceiverFT12.cs | 21 +- .../LinkLayer/TcpClientVirtualSerialPort.cs | 18 +- .../LinkLayer/TcpServerVirtualSerialPort.cs | 10 +- lib60870/SystemUtils.cs | 5 - tests/Test.cs | 205 +-- 61 files changed, 1580 insertions(+), 1522 deletions(-) diff --git a/lib60870/ASDUParsingException.cs b/lib60870/ASDUParsingException.cs index ba01be7..b123507 100644 --- a/lib60870/ASDUParsingException.cs +++ b/lib60870/ASDUParsingException.cs @@ -1,23 +1,23 @@ - /* - * Copyright 2016-2025 Michael Zillgith - * - * This file is part of lib60870.NET - * - * lib60870.NET is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * lib60870.NET is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with lib60870.NET. If not, see . - * - * See COPYING file for the complete license text. - */ +/* + * Copyright 2016-2025 Michael Zillgith + * + * This file is part of lib60870.NET + * + * lib60870.NET is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * lib60870.NET is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with lib60870.NET. If not, see . + * + * See COPYING file for the complete license text. + */ using System; diff --git a/lib60870/BufferFrame.cs b/lib60870/BufferFrame.cs index 4c1cff3..d426606 100644 --- a/lib60870/BufferFrame.cs +++ b/lib60870/BufferFrame.cs @@ -19,8 +19,6 @@ * See COPYING file for the complete license text. */ -using System; - namespace lib60870 { ///

@@ -36,7 +34,7 @@ public BufferFrame(byte[] buffer, int startPos) { this.buffer = buffer; this.startPos = startPos; - this.bufPos = startPos; + bufPos = startPos; } public BufferFrame Clone() @@ -83,4 +81,3 @@ public override byte[] GetBuffer() } } } - \ No newline at end of file diff --git a/lib60870/CP16Time2a.cs b/lib60870/CP16Time2a.cs index 3820fec..43076e7 100644 --- a/lib60870/CP16Time2a.cs +++ b/lib60870/CP16Time2a.cs @@ -21,8 +21,6 @@ * See COPYING file for the complete license text. */ -using System; - namespace lib60870 { public class CP16Time2a @@ -63,7 +61,7 @@ public override bool Equals(object obj) if (!(obj is CP16Time2a)) return false; - return (this.GetHashCode() == obj.GetHashCode()); + return (GetHashCode() == obj.GetHashCode()); } public override int GetHashCode() diff --git a/lib60870/CP24Time2a.cs b/lib60870/CP24Time2a.cs index 489c3db..2109574 100644 --- a/lib60870/CP24Time2a.cs +++ b/lib60870/CP24Time2a.cs @@ -21,8 +21,6 @@ * See COPYING file for the complete license text. */ -using System; - namespace lib60870 { public class CP24Time2a @@ -65,7 +63,7 @@ public override bool Equals(object obj) if (!(obj is CP24Time2a)) return false; - return (this.GetHashCode() == obj.GetHashCode()); + return (GetHashCode() == obj.GetHashCode()); } public override int GetHashCode() @@ -113,7 +111,7 @@ public int Second { get { - return (encodedValue[0] + (encodedValue[1] * 0x100)) / 1000; + return (encodedValue[0] + (encodedValue[1] * 0x100)) / 1000; } set @@ -196,7 +194,7 @@ public override string ToString() { return string.Format("[CP24Time2a: Millisecond={0}, Second={1}, Minute={2}, Invalid={3}, Substitued={4}]", Millisecond, Second, Minute, Invalid, Substitued); } - + } } diff --git a/lib60870/CP32Time2a.cs b/lib60870/CP32Time2a.cs index 32e79b8..483a1f7 100644 --- a/lib60870/CP32Time2a.cs +++ b/lib60870/CP32Time2a.cs @@ -76,7 +76,7 @@ public override bool Equals(object obj) if (!(obj is CP32Time2a)) return false; - return (this.GetHashCode() == obj.GetHashCode()); + return (GetHashCode() == obj.GetHashCode()); } public override int GetHashCode() @@ -130,7 +130,7 @@ public int Second { get { - return (encodedValue[0] + (encodedValue[1] * 0x100)) / 1000; + return (encodedValue[0] + (encodedValue[1] * 0x100)) / 1000; } set diff --git a/lib60870/CP56Time2a.cs b/lib60870/CP56Time2a.cs index 8c0d9f3..46951ef 100644 --- a/lib60870/CP56Time2a.cs +++ b/lib60870/CP56Time2a.cs @@ -69,7 +69,7 @@ public override bool Equals(object obj) if (!(obj is CP56Time2a)) return false; - return (this.GetHashCode() == obj.GetHashCode()); + return (GetHashCode() == obj.GetHashCode()); } public override int GetHashCode() @@ -86,15 +86,15 @@ public DateTime GetDateTime(int startYear) { int baseYear = (startYear / 100) * 100; - if (this.Year < (startYear % 100)) + if (Year < (startYear % 100)) baseYear += 100; - int month = this.Month; + int month = Month; if (month == 0) month = 1; - int dayOfMonth = this.DayOfMonth; + int dayOfMonth = DayOfMonth; if (dayOfMonth == 0) dayOfMonth = 1; @@ -103,7 +103,7 @@ public DateTime GetDateTime(int startYear) try { - value = new DateTime(baseYear + this.Year, month, dayOfMonth, this.Hour, this.Minute, this.Second, this.Millisecond); + value = new DateTime(baseYear + Year, month, dayOfMonth, Hour, Minute, Second, Millisecond); } catch (ArgumentOutOfRangeException) { @@ -147,7 +147,7 @@ public int Second { get { - return (encodedValue[0] + (encodedValue[1] * 0x100)) / 1000; + return (encodedValue[0] + (encodedValue[1] * 0x100)) / 1000; } set diff --git a/lib60870/CS101/ASDU.cs b/lib60870/CS101/ASDU.cs index 5403639..1019f62 100644 --- a/lib60870/CS101/ASDU.cs +++ b/lib60870/CS101/ASDU.cs @@ -73,7 +73,7 @@ public class ASDU public ASDU(ApplicationLayerParameters parameters, CauseOfTransmission cot, bool isTest, bool isNegative, byte oa, int ca, bool isSequence) : this(parameters, TypeID.M_SP_NA_1, cot, isTest, isNegative, oa, ca, isSequence) { - this.hasTypeId = false; + hasTypeId = false; } internal ASDU(ApplicationLayerParameters parameters, TypeID typeId, CauseOfTransmission cot, bool isTest, bool isNegative, byte oa, int ca, bool isSequence) @@ -85,15 +85,15 @@ internal ASDU(ApplicationLayerParameters parameters, TypeID typeId, CauseOfTrans this.isNegative = isNegative; this.oa = oa; this.ca = ca; - this.spaceLeft = parameters.MaxAsduLength - + spaceLeft = parameters.MaxAsduLength - parameters.SizeOfTypeId - parameters.SizeOfVSQ - parameters.SizeOfCA - parameters.SizeOfCOT; if (isSequence) - this.vsq = 0x80; + vsq = 0x80; else - this.vsq = 0; + vsq = 0; - this.hasTypeId = true; + hasTypeId = true; } /// @@ -132,14 +132,14 @@ public bool AddInformationObject(InformationObject io) else { if (informationObjects.Count == 0) // is first object? - objectSize += parameters.SizeOfIOA; + objectSize += parameters.SizeOfIOA; else { if (io.ObjectAddress != (informationObjects[0].ObjectAddress + informationObjects.Count)) return false; } } - + if (objectSize <= spaceLeft) { @@ -166,7 +166,7 @@ public ASDU(ApplicationLayerParameters parameters, byte[] msg, int bufPos, int m typeId = (TypeID)msg[bufPos++]; vsq = msg[bufPos++]; - this.hasTypeId = true; + hasTypeId = true; byte cotByte = msg[bufPos++]; @@ -216,7 +216,7 @@ internal void Encode(Frame frame, ApplicationLayerParameters parameters) frame.SetNextByte(cotByte); if (parameters.SizeOfCOT == 2) - frame.SetNextByte((byte)oa); + frame.SetNextByte(oa); frame.SetNextByte((byte)(ca % 256)); @@ -272,7 +272,7 @@ public TypeID TypeId { get { - return this.typeId; + return typeId; } } @@ -284,11 +284,11 @@ public CauseOfTransmission Cot { get { - return this.cot; + return cot; } set { - this.cot = value; + cot = value; } } @@ -300,7 +300,7 @@ public byte Oa { get { - return this.oa; + return oa; } } @@ -312,7 +312,7 @@ public bool IsTest { get { - return this.isTest; + return isTest; } } @@ -324,7 +324,7 @@ public bool IsNegative { get { - return this.isNegative; + return isNegative; } set { @@ -340,7 +340,7 @@ public int Ca { get { - return this.ca; + return ca; } } @@ -400,7 +400,7 @@ public InformationObject GetElement(int index, PrivateInformationObjectTypes pri public InformationObject GetElement(int index, IPrivateIOFactory ioFactory) { InformationObject retVal = null; - + if (ioFactory != null) { @@ -456,11 +456,11 @@ public InformationObject GetElement(int index) } else retVal = new SinglePointInformation(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false); - + break; case TypeID.M_SP_TA_1: /* 2 */ - + elementSize = 4; if (IsSequence) @@ -599,7 +599,7 @@ public InformationObject GetElement(int index) } else retVal = new MeasuredValueNormalized(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false); - + break; case TypeID.M_ME_TA_1: /* 10 */ @@ -672,7 +672,7 @@ public InformationObject GetElement(int index) } else retVal = new MeasuredValueShort(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false); - + break; case TypeID.M_ME_TC_1: /* 14 */ @@ -708,7 +708,7 @@ public InformationObject GetElement(int index) } else retVal = new IntegratedTotals(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false); - + break; case TypeID.M_IT_TA_1: /* 16 */ @@ -798,7 +798,7 @@ public InformationObject GetElement(int index) } else retVal = new PackedSinglePointWithSCD(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false); - + break; @@ -820,7 +820,7 @@ public InformationObject GetElement(int index) break; - /* 22 - 29 reserved */ + /* 22 - 29 reserved */ case TypeID.M_SP_TB_1: /* 30 */ @@ -927,7 +927,7 @@ public InformationObject GetElement(int index) } else retVal = new MeasuredValueScaledWithCP56Time2a(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false); - + break; case TypeID.M_ME_TF_1: /* 36 */ @@ -981,7 +981,7 @@ public InformationObject GetElement(int index) } else retVal = new EventOfProtectionEquipmentWithCP56Time2a(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false); - + break; case TypeID.M_EP_TE_1: /* 39 */ @@ -999,7 +999,7 @@ public InformationObject GetElement(int index) } else retVal = new PackedStartEventsOfProtectionEquipmentWithCP56Time2a(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false); - + break; case TypeID.M_EP_TF_1: /* 40 */ @@ -1020,7 +1020,7 @@ public InformationObject GetElement(int index) break; - /* 41 - 44 reserved */ + /* 41 - 44 reserved */ case TypeID.C_SC_NA_1: /* 45 */ @@ -1078,7 +1078,7 @@ public InformationObject GetElement(int index) break; - /* 52 - 57 reserved */ + /* 52 - 57 reserved */ case TypeID.C_SC_TA_1: /* 58 - Single command with CP56Time2a */ @@ -1136,7 +1136,7 @@ public InformationObject GetElement(int index) break; - /* 65 - 69 reserved */ + /* 65 - 69 reserved */ case TypeID.M_EI_NA_1: /* 70 - End of initialization */ elementSize = parameters.SizeOfCA + 1; @@ -1209,7 +1209,7 @@ public InformationObject GetElement(int index) break; - /* C_TS_TA_1 (107) is handled by the stack automatically */ + /* C_TS_TA_1 (107) is handled by the stack automatically */ case TypeID.P_ME_NA_1: /* 110 - Parameter of measured values, normalized value */ @@ -1298,22 +1298,22 @@ public InformationObject GetElement(int index) break; - /* 114 - 119 reserved */ + /* 114 - 119 reserved */ default: if (privateObjectTypes != null) { - + IPrivateIOFactory ioFactory = privateObjectTypes.GetFactory(typeId); if (ioFactory != null) { - + elementSize = parameters.SizeOfIOA + ioFactory.GetEncodedSize(); if (IsSequence) { - + int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0); retVal = ioFactory.Decode(parameters, payload, index * elementSize, true); diff --git a/lib60870/CS101/ApplicationLayerParameters.cs b/lib60870/CS101/ApplicationLayerParameters.cs index 5d84929..7afd021 100644 --- a/lib60870/CS101/ApplicationLayerParameters.cs +++ b/lib60870/CS101/ApplicationLayerParameters.cs @@ -21,8 +21,6 @@ * See COPYING file for the complete license text. */ -using System; - namespace lib60870.CS101 { public class ApplicationLayerParameters @@ -71,7 +69,7 @@ public int SizeOfCOT { get { - return this.sizeOfCOT; + return sizeOfCOT; } set { @@ -83,7 +81,7 @@ public int OA { get { - return this.originatorAddress; + return originatorAddress; } set { @@ -95,7 +93,7 @@ public int SizeOfCA { get { - return this.sizeOfCA; + return sizeOfCA; } set { @@ -107,7 +105,7 @@ public int SizeOfIOA { get { - return this.sizeOfIOA; + return sizeOfIOA; } set { @@ -120,7 +118,7 @@ public int SizeOfTypeId { get { - return this.sizeOfTypeId; + return sizeOfTypeId; } } @@ -128,7 +126,7 @@ public int SizeOfVSQ { get { - return this.sizeOfVSQ; + return sizeOfVSQ; } } @@ -136,7 +134,7 @@ public int MaxAsduLength { get { - return this.maxAsduLength; + return maxAsduLength; } set { diff --git a/lib60870/CS101/Bitstring32.cs b/lib60870/CS101/Bitstring32.cs index 5fe7301..8236042 100644 --- a/lib60870/CS101/Bitstring32.cs +++ b/lib60870/CS101/Bitstring32.cs @@ -25,7 +25,7 @@ namespace lib60870.CS101 { - + public class Bitstring32 : InformationObject { override public int GetEncodedSize() @@ -55,7 +55,7 @@ public UInt32 Value { get { - return this.value; + return value; } } @@ -65,7 +65,7 @@ public QualityDescriptor Quality { get { - return this.quality; + return quality; } } @@ -79,8 +79,8 @@ public Bitstring32(int ioa, UInt32 value, QualityDescriptor quality) public Bitstring32(Bitstring32 original) : base(original.ObjectAddress) { - this.value = original.value; - this.quality = new QualityDescriptor(original.quality); + value = original.value; + quality = new QualityDescriptor(original.quality); } internal Bitstring32(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) @@ -143,7 +143,7 @@ public CP24Time2a Timestamp { get { - return this.timestamp; + return timestamp; } } @@ -156,7 +156,7 @@ public Bitstring32WithCP24Time2a(int ioa, UInt32 value, QualityDescriptor qualit public Bitstring32WithCP24Time2a(Bitstring32WithCP24Time2a original) : base(original) { - this.timestamp = new CP24Time2a(original.timestamp); + timestamp = new CP24Time2a(original.timestamp); } internal Bitstring32WithCP24Time2a(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) @@ -211,7 +211,7 @@ public CP56Time2a Timestamp { get { - return this.timestamp; + return timestamp; } } @@ -224,7 +224,7 @@ public Bitstring32WithCP56Time2a(int ioa, UInt32 value, QualityDescriptor qualit public Bitstring32WithCP56Time2a(Bitstring32WithCP56Time2a original) : base(original) { - this.timestamp = new CP56Time2a(original.timestamp); + timestamp = new CP56Time2a(original.timestamp); } internal Bitstring32WithCP56Time2a(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) diff --git a/lib60870/CS101/CS101Master.cs b/lib60870/CS101/CS101Master.cs index 96cff40..6d1f53b 100644 --- a/lib60870/CS101/CS101Master.cs +++ b/lib60870/CS101/CS101Master.cs @@ -19,13 +19,12 @@ * See COPYING file for the complete license text. */ +using lib60870.linklayer; using System; -using System.IO.Ports; using System.Collections.Generic; - -using lib60870.linklayer; -using System.Threading; using System.IO; +using System.IO.Ports; +using System.Threading; namespace lib60870.CS101 { @@ -76,14 +75,14 @@ public bool DIR /// public void Run() { - if(fatalError == false) + if (fatalError == false) { linkLayer.Run(); if (fileClient != null) fileClient.HandleFileService(); } - + } private void fatalErrorHandler(object sender, EventArgs eventArgs) @@ -102,7 +101,7 @@ public void AddPortDeniedHandler(EventHandler eventHandler) public void Start() { linkLayer.AddPortDeniedHandler(fatalErrorHandler); - + if (port != null) { if (port.IsOpen == false) @@ -194,17 +193,17 @@ private void DebugLog(string msg) public CS101Master(SerialPort port, LinkLayerMode mode, LinkLayerParameters llParams = null, ApplicationLayerParameters alParams = null) { if (llParams == null) - this.linkLayerParameters = new LinkLayerParameters(); + linkLayerParameters = new LinkLayerParameters(); else - this.linkLayerParameters = llParams; + linkLayerParameters = llParams; if (alParams == null) - this.appLayerParameters = new ApplicationLayerParameters(); + appLayerParameters = new ApplicationLayerParameters(); else - this.appLayerParameters = alParams; + appLayerParameters = alParams; - this.transceiver = new SerialTransceiverFT12(port, linkLayerParameters, DebugLog); + transceiver = new SerialTransceiverFT12(port, linkLayerParameters, DebugLog); linkLayer = new LinkLayer(buffer, linkLayerParameters, transceiver, DebugLog); linkLayer.LinkLayerMode = mode; @@ -216,7 +215,7 @@ public CS101Master(SerialPort port, LinkLayerMode mode, LinkLayerParameters llPa primaryLinkLayer = new PrimaryLinkLayerBalanced(linkLayer, GetUserData, DebugLog); linkLayer.SetPrimaryLinkLayer(primaryLinkLayer); - secondaryLinkLayer = new SecondaryLinkLayerBalanced (linkLayer, 0, HandleApplicationLayer, DebugLog); + secondaryLinkLayer = new SecondaryLinkLayerBalanced(linkLayer, 0, HandleApplicationLayer, DebugLog); linkLayer.SetSecondaryLinkLayer(secondaryLinkLayer); userDataQueue = new Queue(); @@ -229,23 +228,23 @@ public CS101Master(SerialPort port, LinkLayerMode mode, LinkLayerParameters llPa this.port = port; - this.fileClient = null; + fileClient = null; } public CS101Master(Stream serialStream, LinkLayerMode mode, LinkLayerParameters llParams = null, ApplicationLayerParameters alParams = null) { if (llParams == null) - this.linkLayerParameters = new LinkLayerParameters(); + linkLayerParameters = new LinkLayerParameters(); else - this.linkLayerParameters = llParams; + linkLayerParameters = llParams; if (alParams == null) - this.appLayerParameters = new ApplicationLayerParameters(); + appLayerParameters = new ApplicationLayerParameters(); else - this.appLayerParameters = alParams; + appLayerParameters = alParams; - this.transceiver = new SerialTransceiverFT12(serialStream, linkLayerParameters, DebugLog); + transceiver = new SerialTransceiverFT12(serialStream, linkLayerParameters, DebugLog); linkLayer = new LinkLayer(buffer, linkLayerParameters, transceiver, DebugLog); linkLayer.LinkLayerMode = mode; @@ -267,7 +266,7 @@ public CS101Master(Stream serialStream, LinkLayerMode mode, LinkLayerParameters linkLayer.SetPrimaryLinkLayer(linkLayerUnbalanced); } - this.fileClient = null; + fileClient = null; } /// @@ -277,7 +276,7 @@ public CS101Master(Stream serialStream, LinkLayerMode mode, LinkLayerParameters /// Timeout to wait for next characters in a message public void SetTimeouts(int messageTimeout, int characterTimeout) { - this.transceiver.SetTimeouts(messageTimeout, characterTimeout); + transceiver.SetTimeouts(messageTimeout, characterTimeout); } public void SetASDUReceivedHandler(ASDUReceivedHandler handler, object parameter) @@ -288,7 +287,7 @@ public void SetASDUReceivedHandler(ASDUReceivedHandler handler, object parameter public void AddSlave(int slaveAddress) { - if(linkLayerUnbalanced != null) + if (linkLayerUnbalanced != null) linkLayerUnbalanced.AddSlaveConnection(slaveAddress); } @@ -325,7 +324,7 @@ public int SlaveAddress get { if (primaryLinkLayer == null) - return this.slaveAddress; + return slaveAddress; else return primaryLinkLayer.LinkLayerAddressOtherStation; } @@ -401,7 +400,7 @@ public void RequestClass1Data(int address) try { if (linkLayerUnbalanced != null) - linkLayerUnbalanced.RequestClass1Data(address); + linkLayerUnbalanced.RequestClass1Data(address); } catch (LinkLayerBusyException) { @@ -608,12 +607,12 @@ public override void GetFile(int ca, int ioa, NameOfFile nof, IFileReceiver rece fileClient.RequestFile(ca, ioa, nof, receiver); } - public override void SendFile (int ca, int ioa, NameOfFile nof, IFileProvider fileProvider) + public override void SendFile(int ca, int ioa, NameOfFile nof, IFileProvider fileProvider) { if (fileClient == null) - fileClient = new FileClient (this, DebugLog); + fileClient = new FileClient(this, DebugLog); - fileClient.SendFile (ca, ioa, nof, fileProvider); + fileClient.SendFile(ca, ioa, nof, fileProvider); } } diff --git a/lib60870/CS101/CS101Slave.cs b/lib60870/CS101/CS101Slave.cs index f413e27..0ff55c8 100644 --- a/lib60870/CS101/CS101Slave.cs +++ b/lib60870/CS101/CS101Slave.cs @@ -21,12 +21,11 @@ * See COPYING file for the complete license text. */ +using lib60870.linklayer; using System; -using System.IO.Ports; using System.Collections.Generic; -using lib60870; -using lib60870.linklayer; using System.IO; +using System.IO.Ports; namespace lib60870 { @@ -47,7 +46,7 @@ private void DebugLog(string msg) Console.WriteLine(msg); } } - + /******************************************** * IASDUSender ********************************************/ @@ -163,7 +162,7 @@ public ApplicationLayerParameters Parameters { get { - return this.parameters; + return parameters; } set { @@ -195,7 +194,7 @@ public LinkLayerMode LinkLayerMode { get { - return this.linkLayerMode; + return linkLayerMode; } set { @@ -336,7 +335,7 @@ public int LinkLayerAddress { get { - return this.linkLayerAddress; + return linkLayerAddress; } set { @@ -352,7 +351,7 @@ public int LinkLayerAddressOtherStation { get { - return this.linkLayerAddressOtherStation; + return linkLayerAddressOtherStation; } set { @@ -431,12 +430,12 @@ private bool HandleApplicationLayer(int address, byte[] msg, int userDataStart, if ((asdu.Cot == CauseOfTransmission.ACTIVATION) || (asdu.Cot == CauseOfTransmission.DEACTIVATION)) { - if (this.interrogationHandler != null) + if (interrogationHandler != null) { InterrogationCommand irc = (InterrogationCommand)asdu.GetElement(0); - if (this.interrogationHandler(this.InterrogationHandlerParameter, this, asdu, irc.QOI)) + if (interrogationHandler(InterrogationHandlerParameter, this, asdu, irc.QOI)) messageHandled = true; } } @@ -444,7 +443,7 @@ private bool HandleApplicationLayer(int address, byte[] msg, int userDataStart, { asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; asdu.IsNegative = true; - this.SendASDU(asdu); + SendASDU(asdu); } break; @@ -455,12 +454,12 @@ private bool HandleApplicationLayer(int address, byte[] msg, int userDataStart, if ((asdu.Cot == CauseOfTransmission.ACTIVATION) || (asdu.Cot == CauseOfTransmission.DEACTIVATION)) { - if (this.counterInterrogationHandler != null) + if (counterInterrogationHandler != null) { CounterInterrogationCommand cic = (CounterInterrogationCommand)asdu.GetElement(0); - if (this.counterInterrogationHandler(this.counterInterrogationHandlerParameter, this, asdu, cic.QCC)) + if (counterInterrogationHandler(counterInterrogationHandlerParameter, this, asdu, cic.QCC)) messageHandled = true; } } @@ -468,7 +467,7 @@ private bool HandleApplicationLayer(int address, byte[] msg, int userDataStart, { asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; asdu.IsNegative = true; - this.SendASDU(asdu); + SendASDU(asdu); } break; @@ -482,11 +481,11 @@ private bool HandleApplicationLayer(int address, byte[] msg, int userDataStart, DebugLog("Read request for object: " + asdu.Ca); - if (this.readHandler != null) + if (readHandler != null) { ReadCommand rc = (ReadCommand)asdu.GetElement(0); - if (this.readHandler(this.readHandlerParameter, this, asdu, rc.ObjectAddress)) + if (readHandler(readHandlerParameter, this, asdu, rc.ObjectAddress)) messageHandled = true; } @@ -496,7 +495,7 @@ private bool HandleApplicationLayer(int address, byte[] msg, int userDataStart, { asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; asdu.IsNegative = true; - this.SendASDU(asdu); + SendASDU(asdu); } break; @@ -508,12 +507,12 @@ private bool HandleApplicationLayer(int address, byte[] msg, int userDataStart, if (asdu.Cot == CauseOfTransmission.ACTIVATION) { - if (this.clockSynchronizationHandler != null) + if (clockSynchronizationHandler != null) { ClockSynchronizationCommand csc = (ClockSynchronizationCommand)asdu.GetElement(0); - if (this.clockSynchronizationHandler(this.clockSynchronizationHandlerParameter, + if (clockSynchronizationHandler(clockSynchronizationHandlerParameter, this, asdu, csc.NewTime)) messageHandled = true; } @@ -523,7 +522,7 @@ private bool HandleApplicationLayer(int address, byte[] msg, int userDataStart, { asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; asdu.IsNegative = true; - this.SendASDU(asdu); + SendASDU(asdu); } break; @@ -540,7 +539,7 @@ private bool HandleApplicationLayer(int address, byte[] msg, int userDataStart, else asdu.Cot = CauseOfTransmission.ACTIVATION_CON; - this.SendASDU(asdu); + SendASDU(asdu); messageHandled = true; @@ -553,12 +552,12 @@ private bool HandleApplicationLayer(int address, byte[] msg, int userDataStart, if (asdu.Cot == CauseOfTransmission.ACTIVATION) { - if (this.resetProcessHandler != null) + if (resetProcessHandler != null) { ResetProcessCommand rpc = (ResetProcessCommand)asdu.GetElement(0); - if (this.resetProcessHandler(this.resetProcessHandlerParameter, + if (resetProcessHandler(resetProcessHandlerParameter, this, asdu, rpc.QRP)) messageHandled = true; } @@ -568,7 +567,7 @@ private bool HandleApplicationLayer(int address, byte[] msg, int userDataStart, { asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; asdu.IsNegative = true; - this.SendASDU(asdu); + SendASDU(asdu); } @@ -580,12 +579,12 @@ private bool HandleApplicationLayer(int address, byte[] msg, int userDataStart, if ((asdu.Cot == CauseOfTransmission.ACTIVATION) || (asdu.Cot == CauseOfTransmission.SPONTANEOUS)) { - if (this.delayAcquisitionHandler != null) + if (delayAcquisitionHandler != null) { DelayAcquisitionCommand dac = (DelayAcquisitionCommand)asdu.GetElement(0); - if (this.delayAcquisitionHandler(this.delayAcquisitionHandlerParameter, + if (delayAcquisitionHandler(delayAcquisitionHandlerParameter, this, asdu, dac.Delay)) messageHandled = true; } @@ -594,7 +593,7 @@ private bool HandleApplicationLayer(int address, byte[] msg, int userDataStart, { asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; asdu.IsNegative = true; - this.SendASDU(asdu); + SendASDU(asdu); } break; @@ -604,15 +603,15 @@ private bool HandleApplicationLayer(int address, byte[] msg, int userDataStart, if (messageHandled == false) messageHandled = fileServer.HandleFileAsdu(asdu); - if ((messageHandled == false) && (this.asduHandler != null)) - if (this.asduHandler(this.asduHandlerParameter, this, asdu)) - messageHandled = true; + if ((messageHandled == false) && (asduHandler != null)) + if (asduHandler(asduHandlerParameter, this, asdu)) + messageHandled = true; if (messageHandled == false) { asdu.Cot = CauseOfTransmission.UNKNOWN_TYPE_ID; asdu.IsNegative = true; - this.SendASDU(asdu); + SendASDU(asdu); } return true; @@ -644,7 +643,7 @@ public void Run() { if (initialized == false) { - + linkLayer = new LinkLayer(buffer, linkLayerParameters, transceiver, DebugLog); linkLayer.LinkLayerMode = linkLayerMode; @@ -699,16 +698,18 @@ public void ReceiveMessageLoop() port.Close(); } - public override int FileTimeout + public override int FileTimeout { - get { + get + { if (fileServer != null) return (int)fileServer.Timeout; else return 0; } - set { + set + { if (fileServer != null) fileServer.Timeout = value; } diff --git a/lib60870/CS101/CauseOfTransmission.cs b/lib60870/CS101/CauseOfTransmission.cs index 3711e84..9590078 100644 --- a/lib60870/CS101/CauseOfTransmission.cs +++ b/lib60870/CS101/CauseOfTransmission.cs @@ -21,13 +21,6 @@ * See COPYING file for the complete license text. */ -using System; - -using System.Net; -using System.Net.Sockets; -using System.Text; -using System.Threading; - namespace lib60870.CS101 { /// @@ -47,7 +40,7 @@ public enum CauseOfTransmission ACTIVATION_TERMINATION = 10, RETURN_INFO_REMOTE = 11, RETURN_INFO_LOCAL = 12, - FILE_TRANSFER = 13, + FILE_TRANSFER = 13, AUTHENTICATION = 14, MAINTENANCE_OF_AUTH_SESSION_KEY = 15, MAINTENANCE_OF_USER_ROLE_AND_UPDATE_KEY = 16, @@ -74,9 +67,9 @@ public enum CauseOfTransmission REQUESTED_BY_GROUP_3_COUNTER = 40, REQUESTED_BY_GROUP_4_COUNTER = 41, UNKNOWN_TYPE_ID = 44, - UNKNOWN_CAUSE_OF_TRANSMISSION = 45, + UNKNOWN_CAUSE_OF_TRANSMISSION = 45, UNKNOWN_COMMON_ADDRESS_OF_ASDU = 46, UNKNOWN_INFORMATION_OBJECT_ADDRESS = 47 } - + } diff --git a/lib60870/CS101/DoublePointInformation.cs b/lib60870/CS101/DoublePointInformation.cs index bece855..de9ccc6 100644 --- a/lib60870/CS101/DoublePointInformation.cs +++ b/lib60870/CS101/DoublePointInformation.cs @@ -21,8 +21,6 @@ * See COPYING file for the complete license text. */ -using System; - namespace lib60870.CS101 { /// @@ -68,7 +66,7 @@ public DoublePointValue Value { get { - return this.value; + return value; } } @@ -78,7 +76,7 @@ public QualityDescriptor Quality { get { - return this.quality; + return quality; } } @@ -92,8 +90,8 @@ public DoublePointInformation(int ioa, DoublePointValue value, QualityDescriptor public DoublePointInformation(DoublePointInformation original) : base(original.ObjectAddress) { - this.value = original.value; - this.quality = new QualityDescriptor(original.quality); + value = original.value; + quality = new QualityDescriptor(original.quality); } internal DoublePointInformation(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) @@ -157,7 +155,7 @@ public CP24Time2a Timestamp { get { - return this.timestamp; + return timestamp; } } @@ -170,7 +168,7 @@ public DoublePointWithCP24Time2a(int ioa, DoublePointValue value, QualityDescrip public DoublePointWithCP24Time2a(DoublePointWithCP24Time2a original) : base(original) { - this.timestamp = new CP24Time2a(original.timestamp); + timestamp = new CP24Time2a(original.timestamp); } internal DoublePointWithCP24Time2a(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) @@ -228,7 +226,7 @@ public CP56Time2a Timestamp { get { - return this.timestamp; + return timestamp; } } @@ -241,7 +239,7 @@ public DoublePointWithCP56Time2a(int ioa, DoublePointValue value, QualityDescrip public DoublePointWithCP56Time2a(DoublePointWithCP56Time2a original) : base(original) { - this.timestamp = new CP56Time2a(original.timestamp); + timestamp = new CP56Time2a(original.timestamp); } internal DoublePointWithCP56Time2a(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) diff --git a/lib60870/CS101/EndOfInitialization.cs b/lib60870/CS101/EndOfInitialization.cs index 920896d..0fc16c4 100644 --- a/lib60870/CS101/EndOfInitialization.cs +++ b/lib60870/CS101/EndOfInitialization.cs @@ -21,8 +21,6 @@ * See COPYING file for the complete license text. */ -using System; - namespace lib60870.CS101 { /// @@ -77,7 +75,7 @@ public EndOfInitialization(byte coi) public EndOfInitialization(EndOfInitialization original) : base(original.ObjectAddress) { - this.coi = original.coi; + coi = original.coi; } internal EndOfInitialization(ApplicationLayerParameters parameters, byte[] msg, int startIndex) diff --git a/lib60870/CS101/EventOfProtectionEquipment.cs b/lib60870/CS101/EventOfProtectionEquipment.cs index d8fcdc2..61bac1f 100644 --- a/lib60870/CS101/EventOfProtectionEquipment.cs +++ b/lib60870/CS101/EventOfProtectionEquipment.cs @@ -21,8 +21,6 @@ * See COPYING file for the complete license text. */ -using System; - namespace lib60870.CS101 { /// @@ -67,7 +65,7 @@ public CP16Time2a ElapsedTime { get { - return this.elapsedTime; + return elapsedTime; } } @@ -77,7 +75,7 @@ public CP24Time2a Timestamp { get { - return this.timestamp; + return timestamp; } } @@ -92,9 +90,9 @@ public EventOfProtectionEquipment(int ioa, SingleEvent singleEvent, CP16Time2a e public EventOfProtectionEquipment(EventOfProtectionEquipment original) : base(original.ObjectAddress) { - this.singleEvent = new SingleEvent(original.singleEvent); - this.elapsedTime = new CP16Time2a(original.elapsedTime); - this.timestamp = new CP24Time2a(original.timestamp); + singleEvent = new SingleEvent(original.singleEvent); + elapsedTime = new CP16Time2a(original.elapsedTime); + timestamp = new CP24Time2a(original.timestamp); } internal EventOfProtectionEquipment(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) @@ -105,7 +103,7 @@ internal EventOfProtectionEquipment(ApplicationLayerParameters parameters, byte[ if ((msg.Length - startIndex) < GetEncodedSize()) throw new ASDUParsingException("Message too small"); - + singleEvent = new SingleEvent(msg[startIndex++]); elapsedTime = new CP16Time2a(msg, startIndex); @@ -169,7 +167,7 @@ public CP16Time2a ElapsedTime { get { - return this.elapsedTime; + return elapsedTime; } } @@ -179,7 +177,7 @@ public CP56Time2a Timestamp { get { - return this.timestamp; + return timestamp; } } @@ -194,9 +192,9 @@ public EventOfProtectionEquipmentWithCP56Time2a(int ioa, SingleEvent singleEvent public EventOfProtectionEquipmentWithCP56Time2a(EventOfProtectionEquipmentWithCP56Time2a original) : base(original.ObjectAddress) { - this.singleEvent = new SingleEvent(original.singleEvent); - this.elapsedTime = new CP16Time2a(original.elapsedTime); - this.timestamp = new CP56Time2a(original.timestamp); + singleEvent = new SingleEvent(original.singleEvent); + elapsedTime = new CP16Time2a(original.elapsedTime); + timestamp = new CP56Time2a(original.timestamp); } internal EventOfProtectionEquipmentWithCP56Time2a(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) diff --git a/lib60870/CS101/FileObjects.cs b/lib60870/CS101/FileObjects.cs index fdd05ea..24517ee 100644 --- a/lib60870/CS101/FileObjects.cs +++ b/lib60870/CS101/FileObjects.cs @@ -21,9 +21,6 @@ * See COPYING file for the complete license text. */ -using System; -using System.Collections.Generic; - namespace lib60870.CS101 { /// @@ -127,7 +124,7 @@ public NameOfFile NOF { get { - return this.nof; + return nof; } set { @@ -139,7 +136,7 @@ public int LengthOfFile { get { - return this.lengthOfFile; + return lengthOfFile; } set { @@ -154,7 +151,7 @@ public byte FRQ { get { - return this.frq; + return frq; } set { @@ -262,7 +259,7 @@ public NameOfFile NOF { get { - return this.nof; + return nof; } set { @@ -274,7 +271,7 @@ public byte NameOfSection { get { - return this.nameOfSection; + return nameOfSection; } set { @@ -286,7 +283,7 @@ public int LengthOfSection { get { - return this.lengthOfSection; + return lengthOfSection; } set { @@ -302,7 +299,7 @@ public byte SRQ { get { - return this.srq; + return srq; } set { @@ -406,7 +403,7 @@ public NameOfFile NOF { get { - return this.nof; + return nof; } set { @@ -418,7 +415,7 @@ public byte NameOfSection { get { - return this.nameOfSection; + return nameOfSection; } set { @@ -434,7 +431,7 @@ public SelectAndCallQualifier SCQ { get { - return this.scq; + return scq; } set { @@ -522,7 +519,7 @@ public NameOfFile NOF { get { - return this.nof; + return nof; } set { @@ -534,7 +531,7 @@ public byte NameOfSection { get { - return this.nameOfSection; + return nameOfSection; } set { @@ -546,7 +543,7 @@ public LastSectionOrSegmentQualifier LSQ { get { - return this.lsq; + return lsq; } set { @@ -562,7 +559,7 @@ public byte CHS { get { - return this.chs; + return chs; } set { @@ -600,7 +597,7 @@ public FileLastSegmentOrSection(int objectAddress, NameOfFile nof, byte nameOfSe this.nof = nof; this.nameOfSection = nameOfSection; this.lsq = lsq; - this.chs = checksum; + chs = checksum; } public override void Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) @@ -652,7 +649,7 @@ public NameOfFile NOF { get { - return this.nof; + return nof; } set { @@ -664,7 +661,7 @@ public byte NameOfSection { get { - return this.nameOfSection; + return nameOfSection; } set { @@ -680,7 +677,7 @@ public AcknowledgeQualifier AckQualifier { get { - return (AcknowledgeQualifier)(this.afq & 0x0f); + return (AcknowledgeQualifier)(afq & 0x0f); } set { @@ -741,8 +738,8 @@ public FileACK(int objectAddress, NameOfFile nof, byte nameOfSection, Acknowledg { this.nof = nof; this.nameOfSection = nameOfSection; - this.AckQualifier = qualifier; - this.ErrorCode = errorCode; + AckQualifier = qualifier; + ErrorCode = errorCode; } public override void Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) @@ -795,7 +792,7 @@ public NameOfFile NOF { get { - return this.nof; + return nof; } set { @@ -807,11 +804,11 @@ public int LengthOfFile { get { - return this.lengthOfFile; + return lengthOfFile; } set { - this.lengthOfFile = value; + lengthOfFile = value; } } @@ -823,7 +820,7 @@ public byte SOF { get { - return this.sof; + return sof; } set { @@ -835,7 +832,7 @@ public int STATUS { get { - return (int)(sof & 0x1f); + return sof & 0x1f; } } @@ -935,7 +932,7 @@ public override void Encode(Frame frame, ApplicationLayerParameters parameters, frame.SetNextByte((byte)((lengthOfFile / 0x100) % 0x100)); frame.SetNextByte((byte)((lengthOfFile / 0x10000) % 0x100)); - frame.SetNextByte((byte)sof); + frame.SetNextByte(sof); frame.AppendBytes(creationTime.GetEncodedValue()); } @@ -981,7 +978,7 @@ public NameOfFile NOF { get { - return this.nof; + return nof; } set { @@ -993,7 +990,7 @@ public byte NameOfSection { get { - return this.nameOfSection; + return nameOfSection; } set { @@ -1051,7 +1048,7 @@ internal FileSegment(ApplicationLayerParameters parameters, byte[] msg, int star for (int i = 0; i < los; i++) data[i] = msg[startIndex++]; - + } public FileSegment(int objectAddress, NameOfFile nof, byte nameOfSection, byte[] data) @@ -1060,7 +1057,7 @@ public FileSegment(int objectAddress, NameOfFile nof, byte nameOfSection, byte[] this.nof = nof; this.nameOfSection = nameOfSection; this.data = data; - this.los = (byte)data.Length; + los = (byte)data.Length; } public override void Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) @@ -1090,7 +1087,7 @@ public static int GetMaxDataSize(ApplicationLayerParameters parameters) - parameters.SizeOfCOT - parameters.SizeOfIOA - ENCODED_SIZE; - + return maxSize; } } diff --git a/lib60870/CS101/FileServices.cs b/lib60870/CS101/FileServices.cs index 313fb18..43ba5c8 100644 --- a/lib60870/CS101/FileServices.cs +++ b/lib60870/CS101/FileServices.cs @@ -103,7 +103,7 @@ public interface IFileProvider /// /// File ready handler. Will be called by the FileServer when a master sends a FILE READY (file download announcement) message to the slave. /// - public delegate IFileReceiver FileReadyHandler(object parameter,int ca,int ioa,NameOfFile nof,int lengthOfFile); + public delegate IFileReceiver FileReadyHandler(object parameter, int ca, int ioa, NameOfFile nof, int lengthOfFile); /// /// Simple implementation of IFileProvider that can be used to provide transparent files. Derived classed should override the @@ -197,7 +197,7 @@ internal enum FileClientState IDLE, /* states for file upload (monitor direction) */ - + WAITING_FOR_FILE_READY, WAITING_FOR_SECTION_READY, /* or for LAST_SECTION */ @@ -248,18 +248,21 @@ public FileClient(Master master, DebugLogger debugLog) { this.master = master; DebugLog = debugLog; - maxSegmentSize = FileSegment.GetMaxDataSize (master.GetApplicationLayerParameters()); + maxSegmentSize = FileSegment.GetMaxDataSize(master.GetApplicationLayerParameters()); } /// /// Gets or sets the timeout for file transfers /// /// timeout in ms - public long Timeout { - get { + public long Timeout + { + get + { return timeout; } - set { + set + { timeout = value; } } @@ -273,59 +276,62 @@ private ASDU NewAsdu(InformationObject io) return asdu; } - private void SendLastSegment () + private void SendLastSegment() { - ASDU fileAsdu = NewAsdu(new FileLastSegmentOrSection (ioa, nof, (byte)numberOfSection, + ASDU fileAsdu = NewAsdu(new FileLastSegmentOrSection(ioa, nof, (byte)numberOfSection, LastSectionOrSegmentQualifier.SECTION_TRANSFER_WITHOUT_DEACT, sectionChecksum)); fileChecksum += sectionChecksum; sectionChecksum = 0; - DebugLog ("Send LAST SEGMENT (NoS=" + numberOfSection + ")"); + DebugLog("Send LAST SEGMENT (NoS=" + numberOfSection + ")"); - master.SendASDU (fileAsdu); + master.SendASDU(fileAsdu); } - private byte CalculateChecksum (byte [] data) + private byte CalculateChecksum(byte[] data) { byte checksum = 0; - foreach (byte octet in data) { + foreach (byte octet in data) + { checksum += octet; } return checksum; } - private bool SendSegment () + private bool SendSegment() { int currentSegmentSize = currentSectionSize - currentSectionOffset; - if (currentSegmentSize > 0) { + if (currentSegmentSize > 0) + { if (currentSegmentSize > maxSegmentSize) currentSegmentSize = maxSegmentSize; - byte [] segmentData = new byte [currentSegmentSize]; + byte[] segmentData = new byte[currentSegmentSize]; - fileProvider.GetSegmentData (numberOfSection - 1, + fileProvider.GetSegmentData(numberOfSection - 1, currentSectionOffset, currentSegmentSize, segmentData); - ASDU fileAsdu = NewAsdu (new FileSegment (ioa, nof, (byte)numberOfSection, segmentData)); + ASDU fileAsdu = NewAsdu(new FileSegment(ioa, nof, (byte)numberOfSection, segmentData)); - lastSentTime = SystemUtils.currentTimeMillis (); + lastSentTime = SystemUtils.currentTimeMillis(); - master.SendASDU (fileAsdu); + master.SendASDU(fileAsdu); - sectionChecksum += CalculateChecksum (segmentData); + sectionChecksum += CalculateChecksum(segmentData); - DebugLog ("Send SEGMENT (NoS=" + numberOfSection + ", CHS=" + sectionChecksum + ")"); + DebugLog("Send SEGMENT (NoS=" + numberOfSection + ", CHS=" + sectionChecksum + ")"); currentSectionOffset += currentSegmentSize; return true; - } else + } + else return false; } @@ -344,7 +350,7 @@ private void AbortFileTransfer(FileErrorCode errorCode) master.SendASDU(deactivateFile); - lastSentTime = SystemUtils.currentTimeMillis (); + lastSentTime = SystemUtils.currentTimeMillis(); if (fileReceiver != null) fileReceiver.Finished(errorCode); @@ -352,11 +358,11 @@ private void AbortFileTransfer(FileErrorCode errorCode) ResetStateToIdle(); } - private void FileUploadFailed () + private void FileUploadFailed() { if (fileProvider != null) - fileProvider.TransferComplete (false); - ResetStateToIdle (); + fileProvider.TransferComplete(false); + ResetStateToIdle(); } public bool HandleFileAsdu(ASDU asdu) @@ -366,318 +372,388 @@ public bool HandleFileAsdu(ASDU asdu) switch (asdu.TypeId) { - case TypeID.F_SC_NA_1: /* File/Section/Directory Call/Select */ + case TypeID.F_SC_NA_1: /* File/Section/Directory Call/Select */ - DebugLog ("Received F_SC_NA_1 (select/call)"); + DebugLog("Received F_SC_NA_1 (select/call)"); - if (state == FileClientState.WAITING_FOR_FILE_READY) /* file download */ - { - FileErrorCode errCode = FileErrorCode.PROTOCOL_ERROR; + if (state == FileClientState.WAITING_FOR_FILE_READY) /* file download */ + { + FileErrorCode errCode = FileErrorCode.PROTOCOL_ERROR; - if (asdu.Cot == CauseOfTransmission.UNKNOWN_TYPE_ID) - errCode = FileErrorCode.UNKNOWN_SERVICE; - else if (asdu.Cot == CauseOfTransmission.UNKNOWN_COMMON_ADDRESS_OF_ASDU) - errCode = FileErrorCode.UNKNOWN_CA; - else if (asdu.Cot == CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS) - errCode = FileErrorCode.UNKNOWN_IOA; + if (asdu.Cot == CauseOfTransmission.UNKNOWN_TYPE_ID) + errCode = FileErrorCode.UNKNOWN_SERVICE; + else if (asdu.Cot == CauseOfTransmission.UNKNOWN_COMMON_ADDRESS_OF_ASDU) + errCode = FileErrorCode.UNKNOWN_CA; + else if (asdu.Cot == CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS) + errCode = FileErrorCode.UNKNOWN_IOA; - if (fileReceiver != null) - fileReceiver.Finished (errCode); + if (fileReceiver != null) + fileReceiver.Finished(errCode); - ResetStateToIdle (); - } else if (state == FileClientState.WAITING_FOR_REQUEST_FILE) /* file upload */ - { - if ((asdu.Ca == ca)) { + ResetStateToIdle(); + } + else if (state == FileClientState.WAITING_FOR_REQUEST_FILE) /* file upload */ + { + if ((asdu.Ca == ca)) + { - numberOfSection = 1; - currentSectionSize = fileProvider.GetSectionSize (0); + numberOfSection = 1; + currentSectionSize = fileProvider.GetSectionSize(0); - ASDU sectionReady = NewAsdu (new SectionReady (ioa, nof, 1, currentSectionSize, false)); - master.SendASDU (sectionReady); + ASDU sectionReady = NewAsdu(new SectionReady(ioa, nof, 1, currentSectionSize, false)); + master.SendASDU(sectionReady); - lastSentTime = SystemUtils.currentTimeMillis (); + lastSentTime = SystemUtils.currentTimeMillis(); - state = FileClientState.SECTION_READY; - } else { - fileProvider.TransferComplete (false); - ResetStateToIdle (); + state = FileClientState.SECTION_READY; + } + else + { + fileProvider.TransferComplete(false); + ResetStateToIdle(); + } } - } else if (state == FileClientState.SECTION_READY) { + else if (state == FileClientState.SECTION_READY) + { + + if ((asdu.Ca == ca)) + { - if ((asdu.Ca == ca)) { + // send first segment - // send first segment + currentSectionOffset = 0; - currentSectionOffset = 0; + SendSegment(); + + state = FileClientState.SEND_SECTION; + } - SendSegment (); + } + else + { + if (fileReceiver != null) + fileReceiver.Finished(FileErrorCode.PROTOCOL_ERROR); - state = FileClientState.SEND_SECTION; + ResetStateToIdle(); } - } else { - if (fileReceiver != null) - fileReceiver.Finished (FileErrorCode.PROTOCOL_ERROR); + break; - ResetStateToIdle (); - } + case TypeID.F_FR_NA_1: /* File ready */ - break; + DebugLog("Received F_FR_NA_1 (file ready)"); - case TypeID.F_FR_NA_1: /* File ready */ + if (state == FileClientState.WAITING_FOR_FILE_READY) + { - DebugLog("Received F_FR_NA_1 (file ready)"); + FileReady fileReady = (FileReady)asdu.GetElement(0); - if (state == FileClientState.WAITING_FOR_FILE_READY) { + if ((asdu.Ca == ca) && (fileReady.ObjectAddress == ioa) && (fileReady.NOF == nof)) + { - FileReady fileReady = (FileReady)asdu.GetElement (0); + if (fileReady.Positive) + { - if ((asdu.Ca == ca) && (fileReady.ObjectAddress == ioa) && (fileReady.NOF == nof)) { + /* send call file */ - if (fileReady.Positive) { + ASDU callFile = NewAsdu(new FileCallOrSelect(ioa, nof, 0, SelectAndCallQualifier.REQUEST_FILE)); + master.SendASDU(callFile); - /* send call file */ + lastSentTime = SystemUtils.currentTimeMillis(); - ASDU callFile = NewAsdu (new FileCallOrSelect (ioa, nof, 0, SelectAndCallQualifier.REQUEST_FILE)); - master.SendASDU (callFile); + DebugLog("Send CALL FILE"); - lastSentTime = SystemUtils.currentTimeMillis (); + state = FileClientState.WAITING_FOR_SECTION_READY; - DebugLog ("Send CALL FILE"); + } + else + { + if (fileReceiver != null) + fileReceiver.Finished(FileErrorCode.FILE_NOT_READY); - state = FileClientState.WAITING_FOR_SECTION_READY; + ResetStateToIdle(); + } + + } + else + { + DebugLog("Unexpected CA, IOA, or NOF"); - } else { if (fileReceiver != null) - fileReceiver.Finished (FileErrorCode.FILE_NOT_READY); + fileReceiver.Finished(FileErrorCode.PROTOCOL_ERROR); - ResetStateToIdle (); + ResetStateToIdle(); } - } else { - DebugLog ("Unexpected CA, IOA, or NOF"); - - if (fileReceiver != null) - fileReceiver.Finished (FileErrorCode.PROTOCOL_ERROR); - ResetStateToIdle (); } + else if (state == FileClientState.IDLE) + { + state = FileClientState.WAITING_FOR_SECTION_READY; - } else if (state == FileClientState.IDLE) { - - state = FileClientState.WAITING_FOR_SECTION_READY; + } + else if (state == FileClientState.WAITING_FOR_REQUEST_FILE) + { - } else if (state == FileClientState.WAITING_FOR_REQUEST_FILE) { + if (asdu.IsNegative) + { + DebugLog("Slave rejected file download: " + asdu.Cot.ToString()); + } + else + { + DebugLog("Unexpected file ready while trying to start file download"); + } + + if (fileProvider != null) + fileProvider.TransferComplete(false); - if (asdu.IsNegative) { - DebugLog ("Slave rejected file download: " + asdu.Cot.ToString ()); - } else { - DebugLog ("Unexpected file ready while trying to start file download"); + } + else + { + AbortFileTransfer(FileErrorCode.PROTOCOL_ERROR); } - if (fileProvider != null) - fileProvider.TransferComplete (false); + break; - } else { - AbortFileTransfer (FileErrorCode.PROTOCOL_ERROR); - } + case TypeID.F_SR_NA_1: /* Section ready */ - break; + DebugLog("Received F_SR_NA_1 (section ready)"); - case TypeID.F_SR_NA_1: /* Section ready */ + if (state == FileClientState.WAITING_FOR_SECTION_READY) + { - DebugLog ("Received F_SR_NA_1 (section ready)"); + SectionReady sc = (SectionReady)asdu.GetElement(0); - if (state == FileClientState.WAITING_FOR_SECTION_READY) { + if (sc.NotReady == false) + { + DebugLog("Received SECTION READY(NoF=" + sc.NOF + ", NoS=" + sc.NameOfSection + ")"); - SectionReady sc = (SectionReady)asdu.GetElement (0); + ASDU callSection = NewAsdu(new FileCallOrSelect(ioa, nof, sc.NameOfSection, SelectAndCallQualifier.REQUEST_SECTION)); + master.SendASDU(callSection); - if (sc.NotReady == false) { - DebugLog ("Received SECTION READY(NoF=" + sc.NOF + ", NoS=" + sc.NameOfSection + ")"); + lastSentTime = SystemUtils.currentTimeMillis(); - ASDU callSection = NewAsdu (new FileCallOrSelect (ioa, nof, sc.NameOfSection, SelectAndCallQualifier.REQUEST_SECTION)); - master.SendASDU (callSection); + DebugLog("Send CALL SECTION(NoF=" + sc.NOF + ", NoS=" + sc.NameOfSection + ")"); - lastSentTime = SystemUtils.currentTimeMillis (); + currentSectionOffset = 0; + sectionChecksum = 0; + state = FileClientState.RECEIVING_SECTION; - DebugLog ("Send CALL SECTION(NoF=" + sc.NOF + ", NoS=" + sc.NameOfSection + ")"); + } + else + { + AbortFileTransfer(FileErrorCode.SECTION_NOT_READY); + } - currentSectionOffset = 0; - sectionChecksum = 0; - state = FileClientState.RECEIVING_SECTION; + } + else if (state == FileClientState.IDLE) + { + } + else + { + if (fileReceiver != null) + fileReceiver.Finished(FileErrorCode.PROTOCOL_ERROR); - } else { - AbortFileTransfer (FileErrorCode.SECTION_NOT_READY); + ResetStateToIdle(); } - } else if (state == FileClientState.IDLE) { - } else { - if (fileReceiver != null) - fileReceiver.Finished (FileErrorCode.PROTOCOL_ERROR); + break; - ResetStateToIdle (); - } + case TypeID.F_SG_NA_1: /* Segment */ - break; + DebugLog("Received F_SG_NA_1 (segment)"); - case TypeID.F_SG_NA_1: /* Segment */ + if (state == FileClientState.RECEIVING_SECTION) + { - DebugLog ("Received F_SG_NA_1 (segment)"); + FileSegment segment = (FileSegment)asdu.GetElement(0); - if (state == FileClientState.RECEIVING_SECTION) { + DebugLog("Received segment (NoS=" + segment.NameOfSection + ", LoS=" + segment.LengthOfSegment + ")"); - FileSegment segment = (FileSegment)asdu.GetElement (0); + sectionChecksum += CalculateChecksum(segment.SegmentData); - DebugLog ("Received segment (NoS=" + segment.NameOfSection + ", LoS=" + segment.LengthOfSegment + ")"); + if (fileReceiver != null) + { + fileReceiver.SegmentReceived(segment.NameOfSection, currentSectionOffset, segment.LengthOfSegment, segment.SegmentData); + } - sectionChecksum += CalculateChecksum (segment.SegmentData); + currentSectionOffset += segment.LengthOfSegment; - if (fileReceiver != null) { - fileReceiver.SegmentReceived (segment.NameOfSection, currentSectionOffset, segment.LengthOfSegment, segment.SegmentData); + } + else if (state == FileClientState.IDLE) + { + } + else + { + AbortFileTransfer(FileErrorCode.PROTOCOL_ERROR); } - currentSectionOffset += segment.LengthOfSegment; + break; - } else if (state == FileClientState.IDLE) { - } else { - AbortFileTransfer (FileErrorCode.PROTOCOL_ERROR); - } - break; + case TypeID.F_LS_NA_1: /* Last segment or section */ + + DebugLog("Received F_LS_NA_1 (last segment/section)"); + if (state != FileClientState.IDLE) + { - case TypeID.F_LS_NA_1: /* Last segment or section */ + FileLastSegmentOrSection lastSection = (FileLastSegmentOrSection)asdu.GetElement(0); - DebugLog ("Received F_LS_NA_1 (last segment/section)"); + if (lastSection.LSQ == LastSectionOrSegmentQualifier.SECTION_TRANSFER_WITHOUT_DEACT) + { - if (state != FileClientState.IDLE) { + if (state == FileClientState.RECEIVING_SECTION) + { - FileLastSegmentOrSection lastSection = (FileLastSegmentOrSection)asdu.GetElement (0); + ASDU segmentAck; - if (lastSection.LSQ == LastSectionOrSegmentQualifier.SECTION_TRANSFER_WITHOUT_DEACT) { + if (lastSection.CHS == sectionChecksum) + { + segmentAck = NewAsdu(new FileACK(ioa, nof, lastSection.NameOfSection, AcknowledgeQualifier.POS_ACK_SECTION, FileError.DEFAULT)); + DebugLog("Send SEGMENT ACK"); + } + else + { + segmentAck = NewAsdu(new FileACK(ioa, nof, lastSection.NameOfSection, AcknowledgeQualifier.NEG_ACK_SECTION, FileError.CHECKSUM_FAILED)); + DebugLog("checksum check failed! Send SEGMENT NACK"); + } - if (state == FileClientState.RECEIVING_SECTION) { + master.SendASDU(segmentAck); - ASDU segmentAck; + lastSentTime = SystemUtils.currentTimeMillis(); - if (lastSection.CHS == sectionChecksum) { - segmentAck = NewAsdu (new FileACK (ioa, nof, lastSection.NameOfSection, AcknowledgeQualifier.POS_ACK_SECTION, FileError.DEFAULT)); - DebugLog ("Send SEGMENT ACK"); + state = FileClientState.WAITING_FOR_SECTION_READY; } else { - segmentAck = NewAsdu (new FileACK (ioa, nof, lastSection.NameOfSection, AcknowledgeQualifier.NEG_ACK_SECTION, FileError.CHECKSUM_FAILED)); - DebugLog ("checksum check failed! Send SEGMENT NACK"); + AbortFileTransfer(FileErrorCode.PROTOCOL_ERROR); } - - master.SendASDU (segmentAck); - - lastSentTime = SystemUtils.currentTimeMillis (); - - state = FileClientState.WAITING_FOR_SECTION_READY; - } else { - AbortFileTransfer (FileErrorCode.PROTOCOL_ERROR); } - } else if (lastSection.LSQ == LastSectionOrSegmentQualifier.FILE_TRANSFER_WITH_DEACT) { - /* slave aborted transfer */ + else if (lastSection.LSQ == LastSectionOrSegmentQualifier.FILE_TRANSFER_WITH_DEACT) + { + /* slave aborted transfer */ - if (fileReceiver != null) - fileReceiver.Finished (FileErrorCode.ABORTED_BY_REMOTE); + if (fileReceiver != null) + fileReceiver.Finished(FileErrorCode.ABORTED_BY_REMOTE); - ResetStateToIdle (); - } else if (lastSection.LSQ == LastSectionOrSegmentQualifier.FILE_TRANSFER_WITHOUT_DEACT) { + ResetStateToIdle(); + } + else if (lastSection.LSQ == LastSectionOrSegmentQualifier.FILE_TRANSFER_WITHOUT_DEACT) + { - if (state == FileClientState.WAITING_FOR_SECTION_READY) { - ASDU fileAck = NewAsdu (new FileACK (ioa, nof, lastSection.NameOfSection, AcknowledgeQualifier.POS_ACK_FILE, FileError.DEFAULT)); + if (state == FileClientState.WAITING_FOR_SECTION_READY) + { + ASDU fileAck = NewAsdu(new FileACK(ioa, nof, lastSection.NameOfSection, AcknowledgeQualifier.POS_ACK_FILE, FileError.DEFAULT)); - master.SendASDU (fileAck); + master.SendASDU(fileAck); - lastSentTime = SystemUtils.currentTimeMillis (); + lastSentTime = SystemUtils.currentTimeMillis(); - DebugLog ("Send FILE ACK"); + DebugLog("Send FILE ACK"); - if (fileReceiver != null) - fileReceiver.Finished (FileErrorCode.SUCCESS); + if (fileReceiver != null) + fileReceiver.Finished(FileErrorCode.SUCCESS); - ResetStateToIdle (); - } else { + ResetStateToIdle(); + } + else + { - DebugLog ("Illegal state: " + state.ToString ()); + DebugLog("Illegal state: " + state.ToString()); - AbortFileTransfer (FileErrorCode.PROTOCOL_ERROR); + AbortFileTransfer(FileErrorCode.PROTOCOL_ERROR); + } } } - } - break; + break; - case TypeID.F_AF_NA_1: /* Section or File ACK */ + case TypeID.F_AF_NA_1: /* Section or File ACK */ - DebugLog ("Received F_AF_NA_1 (section/file ACK)"); + DebugLog("Received F_AF_NA_1 (section/file ACK)"); - FileACK ack = (FileACK)asdu.GetElement (0); + FileACK ack = (FileACK)asdu.GetElement(0); - if (state == FileClientState.WAITING_FOR_SECTION_ACK) { - if ((asdu.Ca == ca) && (asdu.Cot == CauseOfTransmission.FILE_TRANSFER)) { + if (state == FileClientState.WAITING_FOR_SECTION_ACK) + { + if ((asdu.Ca == ca) && (asdu.Cot == CauseOfTransmission.FILE_TRANSFER)) + { - if (ack.AckQualifier == AcknowledgeQualifier.POS_ACK_SECTION) { + if (ack.AckQualifier == AcknowledgeQualifier.POS_ACK_SECTION) + { - numberOfSection++; + numberOfSection++; - int nextSectionSize = fileProvider.GetSectionSize (numberOfSection - 1); + int nextSectionSize = fileProvider.GetSectionSize(numberOfSection - 1); - if (nextSectionSize > 0) { - currentSectionSize = nextSectionSize; - currentSectionOffset = 0; + if (nextSectionSize > 0) + { + currentSectionSize = nextSectionSize; + currentSectionOffset = 0; - ASDU sectionReady = NewAsdu (new SectionReady (ioa, nof, (byte)numberOfSection, currentSectionSize, false)); - master.SendASDU (sectionReady); + ASDU sectionReady = NewAsdu(new SectionReady(ioa, nof, (byte)numberOfSection, currentSectionSize, false)); + master.SendASDU(sectionReady); - lastSentTime = SystemUtils.currentTimeMillis (); + lastSentTime = SystemUtils.currentTimeMillis(); + + state = FileClientState.SECTION_READY; + } + else + { - state = FileClientState.SECTION_READY; - } else { + ASDU lastSection = NewAsdu(new FileLastSegmentOrSection(ioa, nof, (byte)numberOfSection, LastSectionOrSegmentQualifier.FILE_TRANSFER_WITHOUT_DEACT, fileChecksum)); + master.SendASDU(lastSection); - ASDU lastSection = NewAsdu (new FileLastSegmentOrSection (ioa, nof, (byte)numberOfSection, LastSectionOrSegmentQualifier.FILE_TRANSFER_WITHOUT_DEACT, fileChecksum)); - master.SendASDU (lastSection); + lastSentTime = SystemUtils.currentTimeMillis(); - lastSentTime = SystemUtils.currentTimeMillis (); + state = FileClientState.WAITING_FOR_FILE_ACK; + } - state = FileClientState.WAITING_FOR_FILE_ACK; + } + else + { + FileUploadFailed(); } - } else { - FileUploadFailed (); } - - } else { - FileUploadFailed (); + else + { + FileUploadFailed(); + } } - } else if (state == FileClientState.WAITING_FOR_FILE_ACK) { - if ((asdu.Ca == ca) && (asdu.Cot == CauseOfTransmission.FILE_TRANSFER)) { + else if (state == FileClientState.WAITING_FOR_FILE_ACK) + { + if ((asdu.Ca == ca) && (asdu.Cot == CauseOfTransmission.FILE_TRANSFER)) + { - if (ack.AckQualifier == AcknowledgeQualifier.POS_ACK_FILE) { - if (fileProvider != null) - fileProvider.TransferComplete (true); + if (ack.AckQualifier == AcknowledgeQualifier.POS_ACK_FILE) + { + if (fileProvider != null) + fileProvider.TransferComplete(true); - ResetStateToIdle (); + ResetStateToIdle(); - } else { - FileUploadFailed (); - } + } + else + { + FileUploadFailed(); + } - } else { - FileUploadFailed (); + } + else + { + FileUploadFailed(); + } } - } - break; + break; - default: + default: - asduHandled = false; - break; + asduHandled = false; + break; } @@ -687,28 +763,29 @@ public bool HandleFileAsdu(ASDU asdu) public void HandleFileService() { - if (state == FileClientState.SEND_SECTION) + if (state == FileClientState.SEND_SECTION) { - if (SendSegment () == false) { - SendLastSegment (); + if (SendSegment() == false) + { + SendLastSegment(); state = FileClientState.WAITING_FOR_SECTION_ACK; } } // Check for timeout - if (state != FileClientState.IDLE) + if (state != FileClientState.IDLE) { - if (SystemUtils.currentTimeMillis () > lastSentTime + timeout) + if (SystemUtils.currentTimeMillis() > lastSentTime + timeout) { - DebugLog ("Abort file transfer due to timeout"); + DebugLog("Abort file transfer due to timeout"); if (fileProvider != null) - fileProvider.TransferComplete (false); + fileProvider.TransferComplete(false); if (fileReceiver != null) - fileReceiver.Finished (FileErrorCode.TIMEOUT); + fileReceiver.Finished(FileErrorCode.TIMEOUT); - ResetStateToIdle (); + ResetStateToIdle(); } } @@ -725,23 +802,23 @@ public void RequestFile(int ca, int ioa, NameOfFile nof, IFileReceiver fileRecei master.SendASDU(selectFile); - lastSentTime = SystemUtils.currentTimeMillis (); + lastSentTime = SystemUtils.currentTimeMillis(); state = FileClientState.WAITING_FOR_FILE_READY; } - public void SendFile (int ca, int ioa, NameOfFile nof, IFileProvider fileProvider) + public void SendFile(int ca, int ioa, NameOfFile nof, IFileProvider fileProvider) { this.ca = ca; this.ioa = ioa; this.nof = nof; this.fileProvider = fileProvider; - ASDU fileReady = NewAsdu (new FileReady (ioa, nof, fileProvider.GetFileSize (), true)); + ASDU fileReady = NewAsdu(new FileReady(ioa, nof, fileProvider.GetFileSize(), true)); - master.SendASDU (fileReady); + master.SendASDU(fileReady); - lastSentTime = SystemUtils.currentTimeMillis (); + lastSentTime = SystemUtils.currentTimeMillis(); state = FileClientState.WAITING_FOR_REQUEST_FILE; } @@ -770,7 +847,7 @@ internal class CS101n104File public CS101n104File(IFileProvider file) { - this.provider = file; + provider = file; } public IFileProvider provider = null; @@ -829,11 +906,11 @@ internal void SendDirectoy(IMasterConnection masterConnection, bool spontaneous) int currentCa = -1; int currentIOA = -1; - ASDU directoryAsdu = null; + ASDU directoryAsdu = null; foreach (CS101n104File file in availableFiles) { - + bool newAsdu = false; if (file.provider.GetCA() != currentCa) @@ -902,7 +979,7 @@ public void AddFile(IFileProvider file) availableFiles.Add(new CS101n104File(file)); } - + } /// @@ -931,12 +1008,13 @@ public void RemoveFile(IFileProvider file) /// Gets the list of available files /// /// the list of available files - public List GetFiles () + public List GetFiles() { - List files = new List (); + List files = new List(); - foreach (CS101n104File file in availableFiles) { - files.Add (file.provider); + foreach (CS101n104File file in availableFiles) + { + files.Add(file.provider); } return files; @@ -956,7 +1034,7 @@ public FileServer(IMasterConnection masterConnection, FilesAvailable availableFi maxSegmentSize = FileSegment.GetMaxDataSize(alParameters); this.availableFiles = availableFiles; this.logger = logger; - this.connection = masterConnection; + connection = masterConnection; } private FilesAvailable availableFiles; @@ -1001,13 +1079,13 @@ public void SetFileReadyHandler(FileReadyHandler handler, object parameter) /// Gets or sets the timeout for file transfers /// /// timeout in ms - public long Timeout + public long Timeout { - get + get { return timeout; } - set + set { timeout = value; } @@ -1019,559 +1097,592 @@ public bool HandleFileAsdu(ASDU asdu) switch (asdu.TypeId) { - case TypeID.F_FR_NA_1: /* File Ready */ + case TypeID.F_FR_NA_1: /* File Ready */ - logger ("Received file ready F_FR_NA_1"); + logger("Received file ready F_FR_NA_1"); - if (fileReadyHandler != null) { + if (fileReadyHandler != null) + { - FileReady fileReady = (FileReady)asdu.GetElement (0); + FileReady fileReady = (FileReady)asdu.GetElement(0); - fileReceiver = fileReadyHandler (fileReadyHandlerParameter, asdu.Ca, fileReady.ObjectAddress, fileReady.NOF, fileReady.LengthOfFile); + fileReceiver = fileReadyHandler(fileReadyHandlerParameter, asdu.Ca, fileReady.ObjectAddress, fileReady.NOF, fileReady.LengthOfFile); - if (fileReceiver == null) { - asdu.IsNegative = true; - asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; - connection.SendASDU (asdu); - } else { + if (fileReceiver == null) + { + asdu.IsNegative = true; + asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; + connection.SendASDU(asdu); + } + else + { - ca = asdu.Ca; - ioa = fileReady.ObjectAddress; - nof = fileReady.NOF; + ca = asdu.Ca; + ioa = fileReady.ObjectAddress; + nof = fileReady.NOF; - // send call file + // send call file - ASDU callFile = new ASDU (alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, asdu.Ca, false); + ASDU callFile = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, asdu.Ca, false); - callFile.AddInformationObject (new FileCallOrSelect (fileReady.ObjectAddress, fileReady.NOF, 0, SelectAndCallQualifier.REQUEST_FILE)); + callFile.AddInformationObject(new FileCallOrSelect(fileReady.ObjectAddress, fileReady.NOF, 0, SelectAndCallQualifier.REQUEST_FILE)); - connection.SendASDU (callFile); + connection.SendASDU(callFile); + + lastSentTime = SystemUtils.currentTimeMillis(); + transferState = FileServerState.WAITING_FOR_SECTION_READY; + } - lastSentTime = SystemUtils.currentTimeMillis (); - transferState = FileServerState.WAITING_FOR_SECTION_READY; + } + else + { + asdu.IsNegative = true; + asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; + connection.SendASDU(asdu); } - } else { - asdu.IsNegative = true; - asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; - connection.SendASDU (asdu); - } + break; - break; + case TypeID.F_SR_NA_1: /* Section Ready */ - case TypeID.F_SR_NA_1: /* Section Ready */ + if (transferState == FileServerState.WAITING_FOR_SECTION_READY) + { - if (transferState == FileServerState.WAITING_FOR_SECTION_READY) { + SectionReady sectionReady = (SectionReady)asdu.GetElement(0); - SectionReady sectionReady = (SectionReady)asdu.GetElement (0); + currentSectionNumber = sectionReady.NameOfSection; + currentSectionOffset = 0; + currentSectionSize = sectionReady.LengthOfSection; - currentSectionNumber = sectionReady.NameOfSection; - currentSectionOffset = 0; - currentSectionSize = sectionReady.LengthOfSection; + // send call section - // send call section + ASDU callSection = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, ca, false); - ASDU callSection = new ASDU (alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, ca, false); + callSection.AddInformationObject(new FileCallOrSelect(ioa, nof, currentSectionNumber, SelectAndCallQualifier.REQUEST_SECTION)); - callSection.AddInformationObject (new FileCallOrSelect (ioa, nof, (byte)currentSectionNumber, SelectAndCallQualifier.REQUEST_SECTION)); + connection.SendASDU(callSection); + lastSentTime = SystemUtils.currentTimeMillis(); - connection.SendASDU (callSection); - lastSentTime = SystemUtils.currentTimeMillis (); + transferState = FileServerState.RECEIVE_SECTION; + } + else + { - transferState = FileServerState.RECEIVE_SECTION; - } else { + } - } + break; - break; + case TypeID.F_SG_NA_1: /* Segment */ - case TypeID.F_SG_NA_1: /* Segment */ + if (transferState == FileServerState.RECEIVE_SECTION) + { - if (transferState == FileServerState.RECEIVE_SECTION) { + FileSegment segment = (FileSegment)asdu.GetElement(0); - FileSegment segment = (FileSegment)asdu.GetElement (0); + logger("Received F_SG_NA_1(segment) (NoS=" + segment.NameOfSection + ", LoS=" + segment.LengthOfSegment + ")"); - logger ("Received F_SG_NA_1(segment) (NoS=" + segment.NameOfSection + ", LoS=" + segment.LengthOfSegment + ")"); + if (fileReceiver != null) + { + fileReceiver.SegmentReceived(segment.NameOfSection, currentSectionOffset, segment.LengthOfSegment, segment.SegmentData); + } - if (fileReceiver != null) { - fileReceiver.SegmentReceived (segment.NameOfSection, currentSectionOffset, segment.LengthOfSegment, segment.SegmentData); + currentSectionOffset += segment.LengthOfSegment; + } + else + { + logger("Unexpected F_SG_NA_1(file segment)"); } - currentSectionOffset += segment.LengthOfSegment; - } else { - logger ("Unexpected F_SG_NA_1(file segment)"); - } + break; - break; + case TypeID.F_LS_NA_1: /* Last Segment/Section */ - case TypeID.F_LS_NA_1: /* Last Segment/Section */ + logger("Received F_LS_NA_1 (last segment/section)"); - logger ("Received F_LS_NA_1 (last segment/section)"); + if (transferState == FileServerState.RECEIVE_SECTION) + { - if (transferState == FileServerState.RECEIVE_SECTION) { + FileLastSegmentOrSection lastSection = (FileLastSegmentOrSection)asdu.GetElement(0); - FileLastSegmentOrSection lastSection = (FileLastSegmentOrSection)asdu.GetElement (0); + if (lastSection.LSQ == LastSectionOrSegmentQualifier.SECTION_TRANSFER_WITHOUT_DEACT) + { - if (lastSection.LSQ == LastSectionOrSegmentQualifier.SECTION_TRANSFER_WITHOUT_DEACT) { + ASDU sectionAck = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, asdu.Ca, false); - ASDU sectionAck = new ASDU (alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, asdu.Ca, false); + sectionAck.AddInformationObject(new FileACK(ioa, nof, lastSection.NameOfSection, AcknowledgeQualifier.POS_ACK_SECTION, FileError.DEFAULT)); - sectionAck.AddInformationObject (new FileACK (ioa, nof, lastSection.NameOfSection, AcknowledgeQualifier.POS_ACK_SECTION, FileError.DEFAULT)); + connection.SendASDU(sectionAck); + lastSentTime = SystemUtils.currentTimeMillis(); - connection.SendASDU (sectionAck); - lastSentTime = SystemUtils.currentTimeMillis (); + logger("Send section ACK"); - logger ("Send section ACK"); + transferState = FileServerState.WAITING_FOR_SECTION_READY; - transferState = FileServerState.WAITING_FOR_SECTION_READY; + } + else if (lastSection.LSQ == LastSectionOrSegmentQualifier.FILE_TRANSFER_WITH_DEACT) + { + /* master aborted transfer */ - } else if (lastSection.LSQ == LastSectionOrSegmentQualifier.FILE_TRANSFER_WITH_DEACT) { - /* master aborted transfer */ + if (fileReceiver != null) + fileReceiver.Finished(FileErrorCode.ABORTED_BY_REMOTE); - if (fileReceiver != null) - fileReceiver.Finished (FileErrorCode.ABORTED_BY_REMOTE); + transferState = FileServerState.UNSELECTED_IDLE; + } + else + { + + } - transferState = FileServerState.UNSELECTED_IDLE; - } else { } + else if (transferState == FileServerState.WAITING_FOR_SECTION_READY) + { + FileLastSegmentOrSection lastSection = (FileLastSegmentOrSection)asdu.GetElement(0); - } else if (transferState == FileServerState.WAITING_FOR_SECTION_READY) { + if (lastSection.LSQ == LastSectionOrSegmentQualifier.FILE_TRANSFER_WITHOUT_DEACT) + { - FileLastSegmentOrSection lastSection = (FileLastSegmentOrSection)asdu.GetElement (0); + ASDU fileAck = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, asdu.Ca, false); - if (lastSection.LSQ == LastSectionOrSegmentQualifier.FILE_TRANSFER_WITHOUT_DEACT) { + fileAck.AddInformationObject(new FileACK(ioa, nof, lastSection.NameOfSection, AcknowledgeQualifier.POS_ACK_FILE, FileError.DEFAULT)); - ASDU fileAck = new ASDU (alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, asdu.Ca, false); + connection.SendASDU(fileAck); + lastSentTime = SystemUtils.currentTimeMillis(); - fileAck.AddInformationObject(new FileACK (ioa, nof, lastSection.NameOfSection, AcknowledgeQualifier.POS_ACK_FILE, FileError.DEFAULT)); + logger("Send file ACK"); - connection.SendASDU (fileAck); - lastSentTime = SystemUtils.currentTimeMillis (); + if (fileReceiver != null) + fileReceiver.Finished(FileErrorCode.SUCCESS); - logger ("Send file ACK"); + transferState = FileServerState.UNSELECTED_IDLE; - if (fileReceiver != null) - fileReceiver.Finished (FileErrorCode.SUCCESS); + logger("Received file success"); + } + else if (lastSection.LSQ == LastSectionOrSegmentQualifier.FILE_TRANSFER_WITH_DEACT) + { + /* master aborted transfer */ - transferState = FileServerState.UNSELECTED_IDLE; + if (fileReceiver != null) + fileReceiver.Finished(FileErrorCode.ABORTED_BY_REMOTE); - logger ("Received file success"); + transferState = FileServerState.UNSELECTED_IDLE; + } + else + { + logger("F_LS_NA_1 with unexpected LSQ: " + lastSection.LSQ.ToString()); + } } - else if (lastSection.LSQ == LastSectionOrSegmentQualifier.FILE_TRANSFER_WITH_DEACT) { - /* master aborted transfer */ - if (fileReceiver != null) - fileReceiver.Finished (FileErrorCode.ABORTED_BY_REMOTE); + break; - transferState = FileServerState.UNSELECTED_IDLE; - } else { - logger ("F_LS_NA_1 with unexpected LSQ: " + lastSection.LSQ.ToString ()); - } - } + case TypeID.F_AF_NA_1: /* 124 - ACK file, ACK section */ - break; + logger("Received file/section ACK F_AF_NA_1"); - case TypeID.F_AF_NA_1: /* 124 - ACK file, ACK section */ + //TODO move COT check to beginning of function! + if (asdu.Cot == CauseOfTransmission.FILE_TRANSFER) + { - logger("Received file/section ACK F_AF_NA_1"); + if (transferState != FileServerState.UNSELECTED_IDLE) + { - //TODO move COT check to beginning of function! - if (asdu.Cot == CauseOfTransmission.FILE_TRANSFER) - { + IFileProvider file = selectedFile.provider; - if (transferState != FileServerState.UNSELECTED_IDLE) - { + FileACK ack = (FileACK)asdu.GetElement(0); - IFileProvider file = selectedFile.provider; + if (ack.AckQualifier == AcknowledgeQualifier.POS_ACK_FILE) + { - FileACK ack = (FileACK)asdu.GetElement(0); + logger("Received positive file ACK"); - if (ack.AckQualifier == AcknowledgeQualifier.POS_ACK_FILE) - { + if (transferState == FileServerState.WAITING_FOR_FILE_ACK) + { - logger("Received positive file ACK"); + selectedFile.provider.TransferComplete(true); + selectedFile.selectedBy = null; - if (transferState == FileServerState.WAITING_FOR_FILE_ACK) - { + availableFiles.RemoveFile(selectedFile.provider); + + selectedFile = null; - selectedFile.provider.TransferComplete(true); - selectedFile.selectedBy = null; + transferState = FileServerState.UNSELECTED_IDLE; + } + else + { + logger("Unexpected file transfer state --> abort file transfer"); - availableFiles.RemoveFile(selectedFile.provider); + transferState = FileServerState.SEND_ABORT; + } - selectedFile = null; - transferState = FileServerState.UNSELECTED_IDLE; } - else + else if (ack.AckQualifier == AcknowledgeQualifier.NEG_ACK_FILE) { - logger("Unexpected file transfer state --> abort file transfer"); - - transferState = FileServerState.SEND_ABORT; - } + logger("Received negative file ACK - stop transfer"); - } - else if (ack.AckQualifier == AcknowledgeQualifier.NEG_ACK_FILE) - { + if (transferState == FileServerState.WAITING_FOR_FILE_ACK) + { - logger("Received negative file ACK - stop transfer"); + selectedFile.provider.TransferComplete(false); - if (transferState == FileServerState.WAITING_FOR_FILE_ACK) - { + selectedFile.selectedBy = null; + selectedFile = null; - selectedFile.provider.TransferComplete(false); + transferState = FileServerState.UNSELECTED_IDLE; + } + else + { + logger("Unexpected file transfer state --> abort file transfer"); - selectedFile.selectedBy = null; - selectedFile = null; + transferState = FileServerState.SEND_ABORT; + } - transferState = FileServerState.UNSELECTED_IDLE; } - else + else if (ack.AckQualifier == AcknowledgeQualifier.NEG_ACK_SECTION) { - logger("Unexpected file transfer state --> abort file transfer"); - transferState = FileServerState.SEND_ABORT; - } + logger("Received negative file section ACK - repeat section"); - } - else if (ack.AckQualifier == AcknowledgeQualifier.NEG_ACK_SECTION) - { + if (transferState == FileServerState.WAITING_FOR_SECTION_ACK) + { + currentSectionOffset = 0; + sectionChecksum = 0; - logger("Received negative file section ACK - repeat section"); + ASDU sectionReady = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, file.GetCA(), false); - if (transferState == FileServerState.WAITING_FOR_SECTION_ACK) - { - currentSectionOffset = 0; - sectionChecksum = 0; + sectionReady.AddInformationObject( + new SectionReady(selectedFile.provider.GetIOA(), selectedFile.provider.GetNameOfFile(), currentSectionNumber, currentSectionSize, false)); - ASDU sectionReady = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, file.GetCA(), false); + connection.SendASDU(sectionReady); - sectionReady.AddInformationObject( - new SectionReady(selectedFile.provider.GetIOA(), selectedFile.provider.GetNameOfFile(), currentSectionNumber, currentSectionSize, false)); - connection.SendASDU(sectionReady); + transferState = FileServerState.TRANSMIT_SECTION; + } + else + { + logger("Unexpected file transfer state --> abort file transfer"); + transferState = FileServerState.SEND_ABORT; + } - transferState = FileServerState.TRANSMIT_SECTION; } - else + else if (ack.AckQualifier == AcknowledgeQualifier.POS_ACK_SECTION) { - logger("Unexpected file transfer state --> abort file transfer"); - transferState = FileServerState.SEND_ABORT; - } - - } - else if (ack.AckQualifier == AcknowledgeQualifier.POS_ACK_SECTION) - { - - if (transferState == FileServerState.WAITING_FOR_SECTION_ACK) - { - currentSectionNumber++; + if (transferState == FileServerState.WAITING_FOR_SECTION_ACK) + { + currentSectionNumber++; - int nextSectionSize = - selectedFile.provider.GetSectionSize(currentSectionNumber - 1); + int nextSectionSize = + selectedFile.provider.GetSectionSize(currentSectionNumber - 1); - currentSectionOffset = 0; + currentSectionOffset = 0; - ASDU responseAsdu = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, file.GetCA(), false); + ASDU responseAsdu = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, file.GetCA(), false); - if (nextSectionSize == -1) - { - logger("Received positive file section ACK - send last section indication"); + if (nextSectionSize == -1) + { + logger("Received positive file section ACK - send last section indication"); - responseAsdu.AddInformationObject( - new FileLastSegmentOrSection(file.GetIOA(), file.GetNameOfFile(), - (byte)currentSectionNumber, - LastSectionOrSegmentQualifier.FILE_TRANSFER_WITHOUT_DEACT, - fileChecksum)); + responseAsdu.AddInformationObject( + new FileLastSegmentOrSection(file.GetIOA(), file.GetNameOfFile(), + currentSectionNumber, + LastSectionOrSegmentQualifier.FILE_TRANSFER_WITHOUT_DEACT, + fileChecksum)); - transferState = FileServerState.WAITING_FOR_FILE_ACK; - } - else - { - logger("Received positive file section ACK - send next section ready indication"); + transferState = FileServerState.WAITING_FOR_FILE_ACK; + } + else + { + logger("Received positive file section ACK - send next section ready indication"); - currentSectionSize = nextSectionSize; + currentSectionSize = nextSectionSize; - responseAsdu.AddInformationObject( - new SectionReady(selectedFile.provider.GetIOA(), selectedFile.provider.GetNameOfFile(), currentSectionNumber, currentSectionSize, false)); + responseAsdu.AddInformationObject( + new SectionReady(selectedFile.provider.GetIOA(), selectedFile.provider.GetNameOfFile(), currentSectionNumber, currentSectionSize, false)); - transferState = FileServerState.WAITING_FOR_SECTION_CALL; - } + transferState = FileServerState.WAITING_FOR_SECTION_CALL; + } - connection.SendASDU(responseAsdu); + connection.SendASDU(responseAsdu); - lastSentTime = SystemUtils.currentTimeMillis (); + lastSentTime = SystemUtils.currentTimeMillis(); - sectionChecksum = 0; - } - else - { - logger("Unexpected file transfer state --> abort file transfer"); + sectionChecksum = 0; + } + else + { + logger("Unexpected file transfer state --> abort file transfer"); - transferState = FileServerState.SEND_ABORT; + transferState = FileServerState.SEND_ABORT; + } } } + else + { + // No file transmission in progress --> what to do? + logger("Unexpected File ACK message -> ignore"); + } + } else { - // No file transmission in progress --> what to do? - logger("Unexpected File ACK message -> ignore"); + asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; + connection.SendASDU(asdu); } + break; - } - else - { - asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; - connection.SendASDU(asdu); - } - break; - - case TypeID.F_SC_NA_1: /* 122 - Call/Select directory/file/section */ - - logger("Received call/select F_SC_NA_1"); - - if (asdu.Cot == CauseOfTransmission.FILE_TRANSFER) - { - - FileCallOrSelect sc = (FileCallOrSelect)asdu.GetElement(0); + case TypeID.F_SC_NA_1: /* 122 - Call/Select directory/file/section */ + logger("Received call/select F_SC_NA_1"); - if (sc.SCQ == SelectAndCallQualifier.SELECT_FILE) + if (asdu.Cot == CauseOfTransmission.FILE_TRANSFER) { - if (transferState == FileServerState.UNSELECTED_IDLE) - { + FileCallOrSelect sc = (FileCallOrSelect)asdu.GetElement(0); - logger("Received SELECT FILE"); - CS101n104File file = availableFiles.GetFile(asdu.Ca, sc.ObjectAddress, sc.NOF); + if (sc.SCQ == SelectAndCallQualifier.SELECT_FILE) + { - if (file == null) - { - asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; - connection.SendASDU(asdu); - } - else + if (transferState == FileServerState.UNSELECTED_IDLE) { - ASDU fileReady = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, asdu.Ca, false); - - // check if already selected - if (file.selectedBy == null) - { - file.selectedBy = this; - - fileReady.AddInformationObject(new FileReady(sc.ObjectAddress, sc.NOF, file.provider.GetFileSize(), true)); - - lastSentTime = SystemUtils.currentTimeMillis (); - - selectedFile = file; + logger("Received SELECT FILE"); - transferState = FileServerState.WAITING_FOR_FILE_CALL; + CS101n104File file = availableFiles.GetFile(asdu.Ca, sc.ObjectAddress, sc.NOF); + if (file == null) + { + asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; + connection.SendASDU(asdu); } else { - fileReady.AddInformationObject(new FileReady(sc.ObjectAddress, sc.NOF, 0, false)); - transferState = FileServerState.UNSELECTED_IDLE; - } + ASDU fileReady = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, asdu.Ca, false); - connection.SendASDU(fileReady); + // check if already selected + if (file.selectedBy == null) + { + file.selectedBy = this; + fileReady.AddInformationObject(new FileReady(sc.ObjectAddress, sc.NOF, file.provider.GetFileSize(), true)); - } + lastSentTime = SystemUtils.currentTimeMillis(); - } - else - { - logger("Unexpected SELECT FILE message"); - } + selectedFile = file; - } - else if (sc.SCQ == SelectAndCallQualifier.DEACTIVATE_FILE) - { + transferState = FileServerState.WAITING_FOR_FILE_CALL; - logger("Received DEACTIVATE FILE"); + } + else + { + fileReady.AddInformationObject(new FileReady(sc.ObjectAddress, sc.NOF, 0, false)); + + transferState = FileServerState.UNSELECTED_IDLE; + } + + connection.SendASDU(fileReady); - if (transferState != FileServerState.UNSELECTED_IDLE) - { - if (selectedFile != null) + } + + } + else { - selectedFile.selectedBy = null; - selectedFile = null; + logger("Unexpected SELECT FILE message"); } - transferState = FileServerState.UNSELECTED_IDLE; - } - else + else if (sc.SCQ == SelectAndCallQualifier.DEACTIVATE_FILE) { - logger("Unexpected DEACTIVATE FILE message"); - } - } - else if (sc.SCQ == SelectAndCallQualifier.REQUEST_FILE) - { + logger("Received DEACTIVATE FILE"); - logger("Received CALL FILE"); + if (transferState != FileServerState.UNSELECTED_IDLE) + { - if (transferState == FileServerState.WAITING_FOR_FILE_CALL) - { + if (selectedFile != null) + { + selectedFile.selectedBy = null; + selectedFile = null; + } + + transferState = FileServerState.UNSELECTED_IDLE; - if (selectedFile.provider.GetIOA() != sc.ObjectAddress) - { - logger("Unkown IOA"); - asdu.IsNegative = true; - asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; - connection.SendASDU(asdu); } else { + logger("Unexpected DEACTIVATE FILE message"); + } - ASDU sectionReady = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, asdu.Ca, false); - - currentSectionNumber = 1; - currentSectionOffset = 0; - currentSectionSize = selectedFile.provider.GetSectionSize (0); + } + else if (sc.SCQ == SelectAndCallQualifier.REQUEST_FILE) + { - sectionReady.AddInformationObject(new SectionReady(sc.ObjectAddress, selectedFile.provider.GetNameOfFile(), currentSectionNumber, currentSectionSize, false)); + logger("Received CALL FILE"); - connection.SendASDU(sectionReady); + if (transferState == FileServerState.WAITING_FOR_FILE_CALL) + { - lastSentTime = SystemUtils.currentTimeMillis (); + if (selectedFile.provider.GetIOA() != sc.ObjectAddress) + { + logger("Unkown IOA"); + asdu.IsNegative = true; + asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; + connection.SendASDU(asdu); + } + else + { - logger ("Send SECTION READY"); + ASDU sectionReady = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, asdu.Ca, false); - transferState = FileServerState.WAITING_FOR_SECTION_CALL; - } + currentSectionNumber = 1; + currentSectionOffset = 0; + currentSectionSize = selectedFile.provider.GetSectionSize(0); - } - else - { - logger("Unexpected FILE CALL message"); - } + sectionReady.AddInformationObject(new SectionReady(sc.ObjectAddress, selectedFile.provider.GetNameOfFile(), currentSectionNumber, currentSectionSize, false)); + connection.SendASDU(sectionReady); - } - else if (sc.SCQ == SelectAndCallQualifier.REQUEST_SECTION) - { + lastSentTime = SystemUtils.currentTimeMillis(); - logger ("Received CALL SECTION (NoS=" + sc.NameOfSection + ") current section: " + currentSectionNumber); + logger("Send SECTION READY"); - if (transferState == FileServerState.WAITING_FOR_SECTION_CALL) - { + transferState = FileServerState.WAITING_FOR_SECTION_CALL; + } - if (selectedFile.provider.GetIOA() != sc.ObjectAddress) - { - logger("Unkown IOA"); - asdu.IsNegative = true; - asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; - connection.SendASDU(asdu); } else { - if (asdu.IsNegative) { + logger("Unexpected FILE CALL message"); + } - currentSectionNumber++; - currentSectionOffset = 0; - currentSectionSize = selectedFile.provider.GetSectionSize (currentSectionNumber - 1); + } + else if (sc.SCQ == SelectAndCallQualifier.REQUEST_SECTION) + { - if (currentSectionSize > 0) { + logger("Received CALL SECTION (NoS=" + sc.NameOfSection + ") current section: " + currentSectionNumber); - // send section ready with new section number + if (transferState == FileServerState.WAITING_FOR_SECTION_CALL) + { - ASDU sectionReady = new ASDU (alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, asdu.Ca, false); + if (selectedFile.provider.GetIOA() != sc.ObjectAddress) + { + logger("Unkown IOA"); + asdu.IsNegative = true; + asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; + connection.SendASDU(asdu); + } + else + { + if (asdu.IsNegative) + { - currentSectionSize = selectedFile.provider.GetSectionSize (0); + currentSectionNumber++; + currentSectionOffset = 0; - sectionReady.AddInformationObject (new SectionReady (sc.ObjectAddress, selectedFile.provider.GetNameOfFile (), currentSectionNumber, currentSectionSize, false)); + currentSectionSize = selectedFile.provider.GetSectionSize(currentSectionNumber - 1); - connection.SendASDU (sectionReady); + if (currentSectionSize > 0) + { - lastSentTime = SystemUtils.currentTimeMillis (); + // send section ready with new section number - logger ("Send F_SR_NA_1 (section ready) (NoS = " + currentSectionNumber + ")"); + ASDU sectionReady = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, asdu.Ca, false); - transferState = FileServerState.WAITING_FOR_SECTION_CALL; + currentSectionSize = selectedFile.provider.GetSectionSize(0); - } else { - // send last section PDU + sectionReady.AddInformationObject(new SectionReady(sc.ObjectAddress, selectedFile.provider.GetNameOfFile(), currentSectionNumber, currentSectionSize, false)); - ASDU lastSection = new ASDU (alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, asdu.Ca, false); + connection.SendASDU(sectionReady); + lastSentTime = SystemUtils.currentTimeMillis(); - lastSection.AddInformationObject ( - new FileLastSegmentOrSection (selectedFile.provider.GetIOA (), selectedFile.provider.GetNameOfFile (), - (byte)currentSectionNumber, - LastSectionOrSegmentQualifier.FILE_TRANSFER_WITHOUT_DEACT, - fileChecksum)); + logger("Send F_SR_NA_1 (section ready) (NoS = " + currentSectionNumber + ")"); - connection.SendASDU (lastSection); + transferState = FileServerState.WAITING_FOR_SECTION_CALL; - logger ("Send F_LS_NA_1 (last section))"); + } + else + { + // send last section PDU - lastSentTime = SystemUtils.currentTimeMillis (); + ASDU lastSection = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, asdu.Ca, false); - transferState = FileServerState.WAITING_FOR_FILE_ACK; - } - } - else { - currentSectionSize = selectedFile.provider.GetSectionSize (sc.NameOfSection - 1); + lastSection.AddInformationObject( + new FileLastSegmentOrSection(selectedFile.provider.GetIOA(), selectedFile.provider.GetNameOfFile(), + currentSectionNumber, + LastSectionOrSegmentQualifier.FILE_TRANSFER_WITHOUT_DEACT, + fileChecksum)); - if (currentSectionSize > 0) { - currentSectionNumber = sc.NameOfSection; - currentSectionOffset = 0; + connection.SendASDU(lastSection); - transferState = FileServerState.TRANSMIT_SECTION; - } else { - logger ("Unexpected number of section"); - logger ("Send negative confirm"); - asdu.IsNegative = true; + logger("Send F_LS_NA_1 (last section))"); - lastSentTime = SystemUtils.currentTimeMillis (); + lastSentTime = SystemUtils.currentTimeMillis(); + + transferState = FileServerState.WAITING_FOR_FILE_ACK; + } - connection.SendASDU (asdu); } - } + else + { + currentSectionSize = selectedFile.provider.GetSectionSize(sc.NameOfSection - 1); + + if (currentSectionSize > 0) + { + currentSectionNumber = sc.NameOfSection; + currentSectionOffset = 0; + + transferState = FileServerState.TRANSMIT_SECTION; + } + else + { + logger("Unexpected number of section"); + logger("Send negative confirm"); + asdu.IsNegative = true; + + lastSentTime = SystemUtils.currentTimeMillis(); + + connection.SendASDU(asdu); + } + } - + + } + } + else + { + logger("Unexpected SECTION CALL message"); } } - else - { - logger("Unexpected SECTION CALL message"); - } - } - } - else if (asdu.Cot == CauseOfTransmission.REQUEST) - { - logger("Call directory received"); + } + else if (asdu.Cot == CauseOfTransmission.REQUEST) + { + logger("Call directory received"); - availableFiles.SendDirectoy(connection, false); + availableFiles.SendDirectoy(connection, false); - } - else - { - asdu.IsNegative = true; - asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; - connection.SendASDU(asdu); - } - break; + } + else + { + asdu.IsNegative = true; + asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; + connection.SendASDU(asdu); + } + break; - default: - handled = false; - break; + default: + handled = false; + break; } return handled; @@ -1601,8 +1712,8 @@ public void HandleFileTransmission() // send last segment fileAsdu.AddInformationObject( - new FileLastSegmentOrSection(file.GetIOA(), file.GetNameOfFile(), - currentSectionNumber, + new FileLastSegmentOrSection(file.GetIOA(), file.GetNameOfFile(), + currentSectionNumber, LastSectionOrSegmentQualifier.SECTION_TRANSFER_WITHOUT_DEACT, sectionChecksum)); @@ -1614,7 +1725,7 @@ public void HandleFileTransmission() connection.SendASDU(fileAsdu); - lastSentTime = SystemUtils.currentTimeMillis (); + lastSentTime = SystemUtils.currentTimeMillis(); transferState = FileServerState.WAITING_FOR_SECTION_ACK; @@ -1635,7 +1746,7 @@ public void HandleFileTransmission() segmentData); fileAsdu.AddInformationObject( - new FileSegment(file.GetIOA(), file.GetNameOfFile(), currentSectionNumber, + new FileSegment(file.GetIOA(), file.GetNameOfFile(), currentSectionNumber, segmentData)); byte checksum = 0; @@ -1647,11 +1758,11 @@ public void HandleFileTransmission() connection.SendASDU(fileAsdu); - lastSentTime = SystemUtils.currentTimeMillis (); + lastSentTime = SystemUtils.currentTimeMillis(); sectionChecksum += checksum; - logger("Send SEGMENT (NoS=" + currentSectionNumber + ", CHS=" + sectionChecksum + ")"); + logger("Send SEGMENT (NoS=" + currentSectionNumber + ", CHS=" + sectionChecksum + ")"); currentSectionOffset += currentSegmentSize; } @@ -1659,10 +1770,12 @@ public void HandleFileTransmission() } // check for timeout - if (SystemUtils.currentTimeMillis () > lastSentTime + timeout) { - logger ("Abort file transfer due to timeout"); + if (SystemUtils.currentTimeMillis() > lastSentTime + timeout) + { + logger("Abort file transfer due to timeout"); - if (selectedFile != null) { + if (selectedFile != null) + { selectedFile.selectedBy = null; selectedFile = null; } diff --git a/lib60870/CS101/InformationObject.cs b/lib60870/CS101/InformationObject.cs index 55825af..91fa690 100644 --- a/lib60870/CS101/InformationObject.cs +++ b/lib60870/CS101/InformationObject.cs @@ -21,7 +21,6 @@ * See COPYING file for the complete license text. */ -using System; using System.Collections.Generic; namespace lib60870.CS101 @@ -38,7 +37,7 @@ public override string ToString() ret += " Type: " + Type.ToString(); - + return ret; } @@ -79,7 +78,7 @@ public int ObjectAddress { get { - return this.objectAddress; + return objectAddress; } internal set { @@ -118,7 +117,7 @@ public virtual void Encode(Frame frame, ApplicationLayerParameters parameters, b frame.SetNextByte((byte)((objectAddress / 0x10000) & 0xff)); } } - + } public interface IPrivateIOFactory @@ -149,18 +148,18 @@ public class PrivateInformationObjectTypes public void AddPrivateInformationObjectType(TypeID typeId, IPrivateIOFactory iot) { - privateTypes.Add(typeId, iot); + privateTypes.Add(typeId, iot); } internal IPrivateIOFactory GetFactory(TypeID typeId) { IPrivateIOFactory factory = null; - privateTypes.TryGetValue(typeId, out factory); + privateTypes.TryGetValue(typeId, out factory); return factory; } } - + } diff --git a/lib60870/CS101/IntegratedTotals.cs b/lib60870/CS101/IntegratedTotals.cs index f3d45a3..1cc068a 100644 --- a/lib60870/CS101/IntegratedTotals.cs +++ b/lib60870/CS101/IntegratedTotals.cs @@ -70,7 +70,7 @@ public IntegratedTotals(int ioa, BinaryCounterReading bcr) public IntegratedTotals(IntegratedTotals original) : base(original.ObjectAddress) { - this.bcr = new BinaryCounterReading(original.bcr); + bcr = new BinaryCounterReading(original.bcr); } internal IntegratedTotals(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSquence) @@ -125,7 +125,7 @@ public CP24Time2a Timestamp { get { - return this.timestamp; + return timestamp; } } @@ -136,15 +136,15 @@ public IntegratedTotalsWithCP24Time2a(int ioa, BinaryCounterReading bcr, CP24Tim } public IntegratedTotalsWithCP24Time2a(IntegratedTotalsWithCP24Time2a original) - : base (original) + : base(original) { - this.timestamp = new CP24Time2a(timestamp); + timestamp = new CP24Time2a(timestamp); } public IntegratedTotalsWithCP24Time2a(IntegratedTotals original) : base(original) { - this.timestamp = new CP24Time2a(); + timestamp = new CP24Time2a(); } internal IntegratedTotalsWithCP24Time2a(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) @@ -201,7 +201,7 @@ public CP56Time2a Timestamp { get { - return this.timestamp; + return timestamp; } } @@ -212,15 +212,15 @@ public IntegratedTotalsWithCP56Time2a(int ioa, BinaryCounterReading bcr, CP56Tim } public IntegratedTotalsWithCP56Time2a(IntegratedTotalsWithCP56Time2a original) - : base (original) + : base(original) { - this.timestamp = new CP56Time2a(original.timestamp); + timestamp = new CP56Time2a(original.timestamp); } public IntegratedTotalsWithCP56Time2a(IntegratedTotals original) : base(original) { - this.timestamp = new CP56Time2a(DateTime.Now); + timestamp = new CP56Time2a(DateTime.Now); } public IntegratedTotalsWithCP56Time2a(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) diff --git a/lib60870/CS101/Master.cs b/lib60870/CS101/Master.cs index 1ad8ec6..395b857 100644 --- a/lib60870/CS101/Master.cs +++ b/lib60870/CS101/Master.cs @@ -21,14 +21,12 @@ * See COPYING file for the complete license text. */ -using System; - namespace lib60870.CS101 { /// /// Handler that is called when a new ASDU is received /// - public delegate bool ASDUReceivedHandler(object parameter,int slaveAddress,ASDU asdu); + public delegate bool ASDUReceivedHandler(object parameter, int slaveAddress, ASDU asdu); /// /// Common interface for CS104 and CS101 balanced and unbalanced master @@ -42,7 +40,7 @@ public bool DebugOutput { get { - return this.debugOutput; + return debugOutput; } set { @@ -169,7 +167,7 @@ public bool DebugOutput /// IOA /// Name of file (file type) /// File provider instance - public abstract void SendFile (int ca, int ioa, NameOfFile nof, IFileProvider fileProvider); + public abstract void SendFile(int ca, int ioa, NameOfFile nof, IFileProvider fileProvider); /// /// Get the application layer parameters used by this master instance @@ -191,6 +189,6 @@ public bool DebugOutput /// will be passed to the delegate public abstract void SetSentRawMessageHandler(RawMessageHandler handler, object parameter); } - + } diff --git a/lib60870/CS101/MeasuredValueNormalized.cs b/lib60870/CS101/MeasuredValueNormalized.cs index 3b9eca0..744285d 100644 --- a/lib60870/CS101/MeasuredValueNormalized.cs +++ b/lib60870/CS101/MeasuredValueNormalized.cs @@ -21,8 +21,6 @@ * See COPYING file for the complete license text. */ -using System; - namespace lib60870.CS101 { /// @@ -79,27 +77,27 @@ public float NormalizedValue else if (value < -1.0f) value = -1.0f; - this.scaledValue.Value = (int)((value * 32767.5) - 0.5); + scaledValue.Value = (int)((value * 32767.5) - 0.5); } } public MeasuredValueNormalizedWithoutQuality(int objectAddress, float normalizedValue) : base(objectAddress) { - this.scaledValue = new ScaledValue(); - this.NormalizedValue = normalizedValue; + scaledValue = new ScaledValue(); + NormalizedValue = normalizedValue; } public MeasuredValueNormalizedWithoutQuality(MeasuredValueNormalizedWithoutQuality original) : base(original.ObjectAddress) { - this.scaledValue = new ScaledValue(original.scaledValue); + scaledValue = new ScaledValue(original.scaledValue); } public MeasuredValueNormalizedWithoutQuality(int objectAddress, short rawValue) : base(objectAddress) { - this.scaledValue = new ScaledValue(rawValue); + scaledValue = new ScaledValue(rawValue); } internal MeasuredValueNormalizedWithoutQuality(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) @@ -154,7 +152,7 @@ public QualityDescriptor Quality { get { - return this.quality; + return quality; } } @@ -173,7 +171,7 @@ public MeasuredValueNormalized(int objectAddress, short value, QualityDescriptor public MeasuredValueNormalized(MeasuredValueNormalized original) : base(original) { - this.quality = new QualityDescriptor(original.quality); + quality = new QualityDescriptor(original.quality); } internal MeasuredValueNormalized(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) @@ -231,7 +229,7 @@ public CP24Time2a Timestamp { get { - return this.timestamp; + return timestamp; } } @@ -251,7 +249,7 @@ public MeasuredValueNormalizedWithCP24Time2a(int objectAddress, short value, Qua public MeasuredValueNormalizedWithCP24Time2a(MeasuredValueNormalizedWithCP24Time2a original) : base(original) { - this.timestamp = new CP24Time2a(original.timestamp); + timestamp = new CP24Time2a(original.timestamp); } internal MeasuredValueNormalizedWithCP24Time2a(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) @@ -309,7 +307,7 @@ public CP56Time2a Timestamp { get { - return this.timestamp; + return timestamp; } } @@ -328,7 +326,7 @@ public MeasuredValueNormalizedWithCP56Time2a(int objectAddress, short value, Qua public MeasuredValueNormalizedWithCP56Time2a(MeasuredValueNormalizedWithCP56Time2a original) : base(original) { - this.timestamp = new CP56Time2a(original.timestamp); + timestamp = new CP56Time2a(original.timestamp); } internal MeasuredValueNormalizedWithCP56Time2a(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) diff --git a/lib60870/CS101/MeasuredValueScaled.cs b/lib60870/CS101/MeasuredValueScaled.cs index e9a720c..f22bfee 100644 --- a/lib60870/CS101/MeasuredValueScaled.cs +++ b/lib60870/CS101/MeasuredValueScaled.cs @@ -21,8 +21,6 @@ * See COPYING file for the complete license text. */ -using System; - namespace lib60870.CS101 { public class MeasuredValueScaled : InformationObject @@ -54,7 +52,7 @@ public ScaledValue ScaledValue { get { - return this.scaledValue; + return scaledValue; } } @@ -64,7 +62,7 @@ public QualityDescriptor Quality { get { - return this.quality; + return quality; } } @@ -77,7 +75,7 @@ public QualityDescriptor Quality public MeasuredValueScaled(int objectAddress, int value, QualityDescriptor quality) : base(objectAddress) { - this.scaledValue = new ScaledValue(value); + scaledValue = new ScaledValue(value); this.quality = quality; } @@ -100,8 +98,8 @@ internal MeasuredValueScaled(ApplicationLayerParameters parameters, byte[] msg, public MeasuredValueScaled(MeasuredValueScaled original) : base(original.ObjectAddress) { - this.scaledValue = new ScaledValue(original.ScaledValue); - this.quality = new QualityDescriptor(original.quality); + scaledValue = new ScaledValue(original.ScaledValue); + quality = new QualityDescriptor(original.quality); } public override void Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) @@ -144,7 +142,7 @@ public CP24Time2a Timestamp { get { - return this.timestamp; + return timestamp; } } @@ -157,7 +155,7 @@ public MeasuredValueScaledWithCP24Time2a(int objectAddress, int value, QualityDe public MeasuredValueScaledWithCP24Time2a(MeasuredValueScaledWithCP24Time2a original) : base(original) { - this.timestamp = new CP24Time2a(timestamp); + timestamp = new CP24Time2a(timestamp); } internal MeasuredValueScaledWithCP24Time2a(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) @@ -213,7 +211,7 @@ public CP56Time2a Timestamp { get { - return this.timestamp; + return timestamp; } } @@ -226,7 +224,7 @@ public MeasuredValueScaledWithCP56Time2a(int objectAddress, int value, QualityDe public MeasuredValueScaledWithCP56Time2a(MeasuredValueScaledWithCP56Time2a original) : base(original) { - this.timestamp = new CP56Time2a(original.timestamp); + timestamp = new CP56Time2a(original.timestamp); } internal MeasuredValueScaledWithCP56Time2a(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) @@ -252,6 +250,6 @@ public override void Encode(Frame frame, ApplicationLayerParameters parameters, } } - + } diff --git a/lib60870/CS101/MeasuredValueShort.cs b/lib60870/CS101/MeasuredValueShort.cs index 61c64e2..65cc0ec 100644 --- a/lib60870/CS101/MeasuredValueShort.cs +++ b/lib60870/CS101/MeasuredValueShort.cs @@ -54,7 +54,7 @@ public float Value { get { - return this.value; + return value; } set { @@ -68,7 +68,7 @@ public QualityDescriptor Quality { get { - return this.quality; + return quality; } } @@ -82,8 +82,8 @@ public MeasuredValueShort(int objectAddress, float value, QualityDescriptor qual public MeasuredValueShort(MeasuredValueShort original) : base(original.ObjectAddress) { - this.value = original.value; - this.quality = new QualityDescriptor(original.Quality); + value = original.value; + quality = new QualityDescriptor(original.Quality); } internal MeasuredValueShort(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) @@ -147,7 +147,7 @@ public CP24Time2a Timestamp { get { - return this.timestamp; + return timestamp; } } @@ -160,7 +160,7 @@ public MeasuredValueShortWithCP24Time2a(int objectAddress, float value, QualityD public MeasuredValueShortWithCP24Time2a(MeasuredValueShortWithCP24Time2a original) : base(original) { - this.timestamp = new CP24Time2a(original.timestamp); + timestamp = new CP24Time2a(original.timestamp); } internal MeasuredValueShortWithCP24Time2a(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) @@ -216,7 +216,7 @@ public CP56Time2a Timestamp { get { - return this.timestamp; + return timestamp; } } @@ -229,7 +229,7 @@ public MeasuredValueShortWithCP56Time2a(int objectAddress, float value, QualityD public MeasuredValueShortWithCP56Time2a(MeasuredValueShortWithCP56Time2a original) : base(original) { - this.timestamp = new CP56Time2a(original.timestamp); + timestamp = new CP56Time2a(original.timestamp); } internal MeasuredValueShortWithCP56Time2a(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) diff --git a/lib60870/CS101/OutputCircuitInfo.cs b/lib60870/CS101/OutputCircuitInfo.cs index b32709d..c67440c 100644 --- a/lib60870/CS101/OutputCircuitInfo.cs +++ b/lib60870/CS101/OutputCircuitInfo.cs @@ -21,7 +21,6 @@ * See COPYING file for the complete license text. */ -using System; using System.Text; namespace lib60870.CS101 @@ -40,7 +39,7 @@ public byte EncodedValue { get { - return this.encodedValue; + return encodedValue; } set { @@ -50,12 +49,12 @@ public byte EncodedValue public OutputCircuitInfo() { - this.encodedValue = 0; + encodedValue = 0; } public OutputCircuitInfo(OutputCircuitInfo original) { - this.encodedValue = original.encodedValue; + encodedValue = original.encodedValue; } public override bool Equals(object obj) @@ -66,12 +65,12 @@ public override bool Equals(object obj) if (!(obj is OutputCircuitInfo)) return false; - return (this.encodedValue == ((OutputCircuitInfo)obj).encodedValue); + return (encodedValue == ((OutputCircuitInfo)obj).encodedValue); } public override int GetHashCode() { - return this.encodedValue.GetHashCode(); + return encodedValue.GetHashCode(); } public OutputCircuitInfo(byte encodedValue) diff --git a/lib60870/CS101/PackedOutputCircuitInfo.cs b/lib60870/CS101/PackedOutputCircuitInfo.cs index 1919646..9e5d848 100644 --- a/lib60870/CS101/PackedOutputCircuitInfo.cs +++ b/lib60870/CS101/PackedOutputCircuitInfo.cs @@ -19,8 +19,6 @@ * See COPYING file for the complete license text. */ -using System; - namespace lib60870.CS101 { @@ -53,7 +51,7 @@ public OutputCircuitInfo OCI { get { - return this.oci; + return oci; } } @@ -63,7 +61,7 @@ public QualityDescriptorP QDP { get { - return this.qdp; + return qdp; } } @@ -73,7 +71,7 @@ public CP16Time2a OperatingTime { get { - return this.operatingTime; + return operatingTime; } } @@ -83,7 +81,7 @@ public CP24Time2a Timestamp { get { - return this.timestamp; + return timestamp; } } @@ -99,10 +97,10 @@ public PackedOutputCircuitInfo(int objectAddress, OutputCircuitInfo oci, Quality public PackedOutputCircuitInfo(PackedOutputCircuitInfo original) : base(original.ObjectAddress) { - this.oci = new OutputCircuitInfo(original.oci); - this.qdp = new QualityDescriptorP(original.qdp); - this.operatingTime = new CP16Time2a(operatingTime); - this.timestamp = new CP24Time2a(timestamp); + oci = new OutputCircuitInfo(original.oci); + qdp = new QualityDescriptorP(original.qdp); + operatingTime = new CP16Time2a(operatingTime); + timestamp = new CP24Time2a(timestamp); } internal PackedOutputCircuitInfo(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) @@ -168,7 +166,7 @@ public OutputCircuitInfo OCI { get { - return this.oci; + return oci; } } @@ -178,7 +176,7 @@ public QualityDescriptorP QDP { get { - return this.qdp; + return qdp; } } @@ -188,7 +186,7 @@ public CP16Time2a OperatingTime { get { - return this.operatingTime; + return operatingTime; } } @@ -198,7 +196,7 @@ public CP56Time2a Timestamp { get { - return this.timestamp; + return timestamp; } } @@ -215,10 +213,10 @@ public PackedOutputCircuitInfoWithCP56Time2a(int objectAddress, OutputCircuitInf public PackedOutputCircuitInfoWithCP56Time2a(PackedOutputCircuitInfoWithCP56Time2a original) : base(original.ObjectAddress) { - this.oci = new OutputCircuitInfo(original.oci); - this.qdp = new QualityDescriptorP(original.qdp); - this.operatingTime = new CP16Time2a(operatingTime); - this.timestamp = new CP56Time2a(timestamp); + oci = new OutputCircuitInfo(original.oci); + qdp = new QualityDescriptorP(original.qdp); + operatingTime = new CP16Time2a(operatingTime); + timestamp = new CP56Time2a(timestamp); } internal PackedOutputCircuitInfoWithCP56Time2a(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) diff --git a/lib60870/CS101/PackedStartEventsOfProtectionEquipment.cs b/lib60870/CS101/PackedStartEventsOfProtectionEquipment.cs index 616d051..c585134 100644 --- a/lib60870/CS101/PackedStartEventsOfProtectionEquipment.cs +++ b/lib60870/CS101/PackedStartEventsOfProtectionEquipment.cs @@ -21,9 +21,6 @@ * See COPYING file for the complete license text. */ -using System; -using System.Collections.Generic; - namespace lib60870.CS101 { @@ -76,7 +73,7 @@ public CP16Time2a ElapsedTime { get { - return this.elapsedTime; + return elapsedTime; } } @@ -86,7 +83,7 @@ public CP24Time2a Timestamp { get { - return this.timestamp; + return timestamp; } } @@ -102,10 +99,10 @@ public PackedStartEventsOfProtectionEquipment(int objectAddress, StartEvent spe, public PackedStartEventsOfProtectionEquipment(PackedStartEventsOfProtectionEquipment original) : base(original.ObjectAddress) { - this.spe = new StartEvent(original.spe); - this.qdp = new QualityDescriptorP(original.qdp); - this.elapsedTime = new CP16Time2a(original.elapsedTime); - this.timestamp = new CP24Time2a(original.timestamp); + spe = new StartEvent(original.spe); + qdp = new QualityDescriptorP(original.qdp); + elapsedTime = new CP16Time2a(original.elapsedTime); + timestamp = new CP24Time2a(original.timestamp); } internal PackedStartEventsOfProtectionEquipment(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) @@ -190,7 +187,7 @@ public CP16Time2a ElapsedTime { get { - return this.elapsedTime; + return elapsedTime; } } @@ -200,7 +197,7 @@ public CP56Time2a Timestamp { get { - return this.timestamp; + return timestamp; } } @@ -216,10 +213,10 @@ public PackedStartEventsOfProtectionEquipmentWithCP56Time2a(int objectAddress, S public PackedStartEventsOfProtectionEquipmentWithCP56Time2a(PackedStartEventsOfProtectionEquipmentWithCP56Time2a original) : base(original.ObjectAddress) { - this.spe = new StartEvent(original.spe); - this.qdp = new QualityDescriptorP(original.qdp); - this.elapsedTime = new CP16Time2a(original.elapsedTime); - this.timestamp = new CP56Time2a(original.timestamp); + spe = new StartEvent(original.spe); + qdp = new QualityDescriptorP(original.qdp); + elapsedTime = new CP16Time2a(original.elapsedTime); + timestamp = new CP56Time2a(original.timestamp); } internal PackedStartEventsOfProtectionEquipmentWithCP56Time2a(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) diff --git a/lib60870/CS101/ParameterMeasuredValues.cs b/lib60870/CS101/ParameterMeasuredValues.cs index 014ef34..a11a9e0 100644 --- a/lib60870/CS101/ParameterMeasuredValues.cs +++ b/lib60870/CS101/ParameterMeasuredValues.cs @@ -75,7 +75,7 @@ public float NormalizedValue else if (value < -1.0f) value = -1.0f; - this.scaledValue.Value = (int)((value * 32767.5) - 0.5); + scaledValue.Value = (int)((value * 32767.5) - 0.5); } } @@ -94,7 +94,7 @@ public ParameterNormalizedValue(int objectAddress, float normalizedValue, byte q { scaledValue = new ScaledValue(); - this.NormalizedValue = normalizedValue; + NormalizedValue = normalizedValue; this.qpm = qpm; } @@ -240,7 +240,7 @@ public float Value { get { - return this.value; + return value; } } diff --git a/lib60870/CS101/QualityDescriptor.cs b/lib60870/CS101/QualityDescriptor.cs index 436829b..3a62085 100644 --- a/lib60870/CS101/QualityDescriptor.cs +++ b/lib60870/CS101/QualityDescriptor.cs @@ -19,8 +19,6 @@ * See COPYING file for the complete license text. */ -using System; - namespace lib60870.CS101 { public class QualityDescriptor @@ -41,12 +39,12 @@ public static QualityDescriptor INVALID() public QualityDescriptor() { - this.encodedValue = 0; + encodedValue = 0; } public QualityDescriptor(QualityDescriptor original) { - this.encodedValue = original.encodedValue; + encodedValue = original.encodedValue; } public QualityDescriptor(byte encodedValue) @@ -62,12 +60,12 @@ public override bool Equals(object obj) if (!(obj is QualityDescriptor)) return false; - return (this.encodedValue == ((QualityDescriptor)obj).encodedValue); + return (encodedValue == ((QualityDescriptor)obj).encodedValue); } public override int GetHashCode() { - return this.encodedValue.GetHashCode(); + return encodedValue.GetHashCode(); } public bool Overflow @@ -171,7 +169,7 @@ public byte EncodedValue { get { - return this.encodedValue; + return encodedValue; } set { @@ -184,6 +182,6 @@ public override string ToString() return string.Format("[QualityDescriptor: Overflow={0}, Blocked={1}, Substituted={2}, NonTopical={3}, Invalid={4}]", Overflow, Blocked, Substituted, NonTopical, Invalid); } } - + } diff --git a/lib60870/CS101/QualityDescriptorP.cs b/lib60870/CS101/QualityDescriptorP.cs index 81db218..f7e90c5 100644 --- a/lib60870/CS101/QualityDescriptorP.cs +++ b/lib60870/CS101/QualityDescriptorP.cs @@ -19,8 +19,6 @@ * See COPYING file for the complete license text. */ -using System; - namespace lib60870.CS101 { @@ -34,7 +32,7 @@ public class QualityDescriptorP public QualityDescriptorP() { - this.encodedValue = 0; + encodedValue = 0; } public QualityDescriptorP(byte encodedValue) @@ -44,7 +42,7 @@ public QualityDescriptorP(byte encodedValue) public QualityDescriptorP(QualityDescriptorP original) { - this.encodedValue = original.encodedValue; + encodedValue = original.encodedValue; } public override bool Equals(object obj) @@ -55,12 +53,12 @@ public override bool Equals(object obj) if (!(obj is QualityDescriptorP)) return false; - return (this.encodedValue == ((QualityDescriptorP)obj).encodedValue); + return (encodedValue == ((QualityDescriptorP)obj).encodedValue); } public override int GetHashCode() { - return this.encodedValue.GetHashCode(); + return encodedValue.GetHashCode(); } public bool Reserved @@ -175,7 +173,7 @@ public byte EncodedValue { get { - return this.encodedValue; + return encodedValue; } set { diff --git a/lib60870/CS101/ScaledValue.cs b/lib60870/CS101/ScaledValue.cs index 2e99ab9..13e8e07 100644 --- a/lib60870/CS101/ScaledValue.cs +++ b/lib60870/CS101/ScaledValue.cs @@ -42,17 +42,17 @@ public ScaledValue() public ScaledValue(int value) { - this.Value = value; + Value = value; } public ScaledValue(short value) { - this.ShortValue = value; + ShortValue = value; } public ScaledValue(ScaledValue original) { - this.ShortValue = original.ShortValue; + ShortValue = original.ShortValue; } public byte[] GetEncodedValue() @@ -114,5 +114,5 @@ public override string ToString() return "" + Value; } } - + } diff --git a/lib60870/CS101/SetpointCommandQualifier.cs b/lib60870/CS101/SetpointCommandQualifier.cs index 3d45ce0..be4716b 100644 --- a/lib60870/CS101/SetpointCommandQualifier.cs +++ b/lib60870/CS101/SetpointCommandQualifier.cs @@ -19,8 +19,6 @@ * See COPYING file for the complete license text. */ -using System; - namespace lib60870.CS101 { public class SetpointCommandQualifier diff --git a/lib60870/CS101/SetpointCommands.cs b/lib60870/CS101/SetpointCommands.cs index 1f3463f..5b28e82 100644 --- a/lib60870/CS101/SetpointCommands.cs +++ b/lib60870/CS101/SetpointCommands.cs @@ -75,7 +75,7 @@ public float NormalizedValue else if (value < -1.0f) value = -1.0f; - this.scaledValue.Value = (int)((value * 32767.5) - 0.5); + scaledValue.Value = (int)((value * 32767.5) - 0.5); } } @@ -92,14 +92,14 @@ public SetpointCommandQualifier QOS public SetpointCommandNormalized(int objectAddress, float value, SetpointCommandQualifier qos) : base(objectAddress) { - this.scaledValue = new ScaledValue((int)((value * 32767.5) - 0.5)); + scaledValue = new ScaledValue((int)((value * 32767.5) - 0.5)); this.qos = qos; } public SetpointCommandNormalized(int ObjectAddress, short value, SetpointCommandQualifier qos) : base(ObjectAddress) { - this.scaledValue = new ScaledValue(value); + scaledValue = new ScaledValue(value); this.qos = qos; } @@ -114,7 +114,7 @@ internal SetpointCommandNormalized(ApplicationLayerParameters parameters, byte[] scaledValue = new ScaledValue(msg, startIndex); startIndex += 2; - this.qos = new SetpointCommandQualifier(msg[startIndex++]); + qos = new SetpointCommandQualifier(msg[startIndex++]); } public override void Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) @@ -123,7 +123,7 @@ public override void Encode(Frame frame, ApplicationLayerParameters parameters, frame.AppendBytes(scaledValue.GetEncodedValue()); - frame.SetNextByte(this.qos.GetEncodedValue()); + frame.SetNextByte(qos.GetEncodedValue()); } } @@ -182,14 +182,14 @@ internal SetpointCommandNormalizedWithCP56Time2a(ApplicationLayerParameters para startIndex += 3; /* normalized value + qualifier */ - this.timestamp = new CP56Time2a(msg, startIndex); + timestamp = new CP56Time2a(msg, startIndex); } public override void Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) { base.Encode(frame, parameters, isSequence); - frame.AppendBytes(this.timestamp.GetEncodedValue()); + frame.AppendBytes(timestamp.GetEncodedValue()); } } @@ -239,7 +239,7 @@ public SetpointCommandQualifier QOS public SetpointCommandScaled(int objectAddress, ScaledValue value, SetpointCommandQualifier qos) : base(objectAddress) { - this.scaledValue = value; + scaledValue = value; this.qos = qos; } @@ -254,16 +254,16 @@ internal SetpointCommandScaled(ApplicationLayerParameters parameters, byte[] msg scaledValue = new ScaledValue(msg, startIndex); startIndex += 2; - this.qos = new SetpointCommandQualifier(msg[startIndex++]); + qos = new SetpointCommandQualifier(msg[startIndex++]); } public override void Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) { base.Encode(frame, parameters, isSequence); - frame.AppendBytes(this.scaledValue.GetEncodedValue()); + frame.AppendBytes(scaledValue.GetEncodedValue()); - frame.SetNextByte(this.qos.GetEncodedValue()); + frame.SetNextByte(qos.GetEncodedValue()); } } @@ -316,14 +316,14 @@ internal SetpointCommandScaledWithCP56Time2a(ApplicationLayerParameters paramete startIndex += 3; /* scaled value + qualifier */ - this.timestamp = new CP56Time2a(msg, startIndex); + timestamp = new CP56Time2a(msg, startIndex); } public override void Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) { base.Encode(frame, parameters, isSequence); - frame.AppendBytes(this.timestamp.GetEncodedValue()); + frame.AppendBytes(timestamp.GetEncodedValue()); } } @@ -389,7 +389,7 @@ internal SetpointCommandShort(ApplicationLayerParameters parameters, byte[] msg, value = System.BitConverter.ToSingle(msg, startIndex); startIndex += 4; - this.qos = new SetpointCommandQualifier(msg[startIndex++]); + qos = new SetpointCommandQualifier(msg[startIndex++]); } public override void Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) @@ -398,7 +398,7 @@ public override void Encode(Frame frame, ApplicationLayerParameters parameters, frame.AppendBytes(System.BitConverter.GetBytes(value)); - frame.SetNextByte(this.qos.GetEncodedValue()); + frame.SetNextByte(qos.GetEncodedValue()); } } @@ -451,14 +451,14 @@ internal SetpointCommandShortWithCP56Time2a(ApplicationLayerParameters parameter startIndex += 5; /* skip IOA + float + QOS*/ - this.timestamp = new CP56Time2a(msg, startIndex); + timestamp = new CP56Time2a(msg, startIndex); } public override void Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) { base.Encode(frame, parameters, isSequence); - frame.AppendBytes(this.timestamp.GetEncodedValue()); + frame.AppendBytes(timestamp.GetEncodedValue()); } } @@ -492,14 +492,14 @@ public UInt32 Value { get { - return this.value; + return value; } } public Bitstring32Command(int objectAddress, UInt32 bitstring) : base(objectAddress) { - this.value = bitstring; + value = bitstring; } internal Bitstring32Command(ApplicationLayerParameters parameters, byte[] msg, int startIndex) @@ -576,14 +576,14 @@ internal Bitstring32CommandWithCP56Time2a(ApplicationLayerParameters parameters, startIndex += 4; /* bitstring */ - this.timestamp = new CP56Time2a(msg, startIndex); + timestamp = new CP56Time2a(msg, startIndex); } public override void Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) { base.Encode(frame, parameters, isSequence); - frame.AppendBytes(this.timestamp.GetEncodedValue()); + frame.AppendBytes(timestamp.GetEncodedValue()); } } } diff --git a/lib60870/CS101/SingleCommand.cs b/lib60870/CS101/SingleCommand.cs index 91a4c04..415f6c6 100644 --- a/lib60870/CS101/SingleCommand.cs +++ b/lib60870/CS101/SingleCommand.cs @@ -19,8 +19,6 @@ * See COPYING file for the complete license text. */ -using System; - namespace lib60870.CS101 { @@ -76,7 +74,7 @@ public SingleCommand(int ioa, bool command, bool selectCommand, int qu) public SingleCommand(SingleCommand original) : base(original.ObjectAddress) { - this.sco = original.sco; + sco = original.sco; } internal SingleCommand(ApplicationLayerParameters parameters, byte[] msg, int startIndex) @@ -152,7 +150,7 @@ public override string ToString() { return string.Format("[SingleCommand: QU={0}, State={1}, Select={2}]", QU, State, Select); } - + } public class SingleCommandWithCP56Time2a : SingleCommand @@ -192,7 +190,7 @@ public SingleCommandWithCP56Time2a(int ioa, bool command, bool selectCommand, in public SingleCommandWithCP56Time2a(SingleCommandWithCP56Time2a original) : base(original) { - this.timestamp = new CP56Time2a(original.timestamp); + timestamp = new CP56Time2a(original.timestamp); } internal SingleCommandWithCP56Time2a(ApplicationLayerParameters parameters, byte[] msg, int startIndex) @@ -257,7 +255,7 @@ public DoubleCommand(int ioa, int command, bool select, int quality) public DoubleCommand(DoubleCommand original) : base(original.ObjectAddress) { - this.dcq = original.dcq; + dcq = original.dcq; } internal DoubleCommand(ApplicationLayerParameters parameters, byte[] msg, int startIndex) @@ -340,7 +338,7 @@ public DoubleCommandWithCP56Time2a(int ioa, int command, bool select, int qualit public DoubleCommandWithCP56Time2a(DoubleCommandWithCP56Time2a original) : base(original) { - this.timestamp = new CP56Time2a(original.timestamp); + timestamp = new CP56Time2a(original.timestamp); } internal DoubleCommandWithCP56Time2a(ApplicationLayerParameters parameters, byte[] msg, int startIndex) @@ -362,7 +360,7 @@ public override void Encode(Frame frame, ApplicationLayerParameters parameters, frame.AppendBytes(timestamp.GetEncodedValue()); } - + } public class StepCommand : DoubleCommand @@ -444,7 +442,7 @@ public StepCommandWithCP56Time2a(int ioa, StepCommandValue command, bool select, public StepCommandWithCP56Time2a(StepCommandWithCP56Time2a original) : base(original) { - this.timestamp = new CP56Time2a(original.timestamp); + timestamp = new CP56Time2a(original.timestamp); } internal StepCommandWithCP56Time2a(ApplicationLayerParameters parameters, byte[] msg, int startIndex) @@ -466,7 +464,7 @@ public override void Encode(Frame frame, ApplicationLayerParameters parameters, frame.AppendBytes(timestamp.GetEncodedValue()); } - + } diff --git a/lib60870/CS101/SingleCommandQualifier.cs b/lib60870/CS101/SingleCommandQualifier.cs index 1f93e88..9d819ff 100644 --- a/lib60870/CS101/SingleCommandQualifier.cs +++ b/lib60870/CS101/SingleCommandQualifier.cs @@ -19,8 +19,6 @@ * See COPYING file for the complete license text. */ -using System; - namespace lib60870 { public class SingleCommandQualifier diff --git a/lib60870/CS101/SingleEvent.cs b/lib60870/CS101/SingleEvent.cs index 1c32b4a..c785bab 100644 --- a/lib60870/CS101/SingleEvent.cs +++ b/lib60870/CS101/SingleEvent.cs @@ -19,8 +19,6 @@ * See COPYING file for the complete license text. */ -using System; - namespace lib60870.CS101 { @@ -41,14 +39,14 @@ public class SingleEvent public SingleEvent() { - this.eventState = EventState.INDETERMINATE_0; - this.qdp = new QualityDescriptorP(); + eventState = EventState.INDETERMINATE_0; + qdp = new QualityDescriptorP(); } public SingleEvent(SingleEvent orignal) { - this.eventState = orignal.eventState; - this.qdp = new QualityDescriptorP(orignal.qdp); + eventState = orignal.eventState; + qdp = new QualityDescriptorP(orignal.qdp); } public override bool Equals(object obj) @@ -59,19 +57,19 @@ public override bool Equals(object obj) if (!(obj is SingleEvent)) return false; - return (this.EncodedValue == ((SingleEvent)obj).EncodedValue); + return (EncodedValue == ((SingleEvent)obj).EncodedValue); } public override int GetHashCode() { - return this.EncodedValue.GetHashCode(); + return EncodedValue.GetHashCode(); } public SingleEvent(byte encodedValue) { - this.eventState = (EventState)(encodedValue & 0x03); + eventState = (EventState)(encodedValue & 0x03); - this.qdp = new QualityDescriptorP(encodedValue); + qdp = new QualityDescriptorP(encodedValue); } public EventState State diff --git a/lib60870/CS101/SinglePointInformation.cs b/lib60870/CS101/SinglePointInformation.cs index cd941de..0d61e20 100644 --- a/lib60870/CS101/SinglePointInformation.cs +++ b/lib60870/CS101/SinglePointInformation.cs @@ -19,8 +19,6 @@ * See COPYING file for the complete license text. */ -using System; - namespace lib60870.CS101 { public class SinglePointInformation : InformationObject @@ -52,7 +50,7 @@ public bool Value { get { - return this.value; + return value; } set { @@ -66,7 +64,7 @@ public QualityDescriptor Quality { get { - return this.quality; + return quality; } } @@ -98,8 +96,8 @@ public SinglePointInformation(int objectAddress, bool value, QualityDescriptor q public SinglePointInformation(SinglePointInformation original) : base(original.ObjectAddress) { - this.value = original.Value; - this.quality = original.Quality; + value = original.Value; + quality = original.Quality; } public override void Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) @@ -145,7 +143,7 @@ public CP24Time2a Timestamp { get { - return this.timestamp; + return timestamp; } } @@ -157,7 +155,7 @@ internal SinglePointWithCP24Time2a(ApplicationLayerParameters parameters, byte[] if ((msg.Length - startIndex) < GetEncodedSize()) throw new ASDUParsingException("Message too small"); - + startIndex += 1; /* skip SIQ */ /* parse CP24Time2a (time stamp) */ @@ -173,7 +171,7 @@ public SinglePointWithCP24Time2a(int objectAddress, bool value, QualityDescripto public SinglePointWithCP24Time2a(SinglePointWithCP24Time2a original) : base(original) { - this.timestamp = new CP24Time2a(original.Timestamp); + timestamp = new CP24Time2a(original.Timestamp); } public override void Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) @@ -216,7 +214,7 @@ public CP56Time2a Timestamp { get { - return this.timestamp; + return timestamp; } } @@ -244,7 +242,7 @@ public SinglePointWithCP56Time2a(int objectAddress, bool value, QualityDescripto public SinglePointWithCP56Time2a(SinglePointWithCP56Time2a original) : base(original) { - this.timestamp = new CP56Time2a(original.timestamp); + timestamp = new CP56Time2a(original.timestamp); } public override void Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) @@ -286,7 +284,7 @@ public StatusAndStatusChangeDetection SCD { get { - return this.scd; + return scd; } set { @@ -298,7 +296,7 @@ public QualityDescriptor QDS { get { - return this.qds; + return qds; } set { @@ -325,14 +323,14 @@ public PackedSinglePointWithSCD(int objectAddress, StatusAndStatusChangeDetectio : base(objectAddress) { this.scd = scd; - this.qds = quality; + qds = quality; } public PackedSinglePointWithSCD(PackedSinglePointWithSCD original) : base(original.ObjectAddress) { - this.scd = new StatusAndStatusChangeDetection(original.SCD); - this.qds = new QualityDescriptor(original.QDS); + scd = new StatusAndStatusChangeDetection(original.SCD); + qds = new QualityDescriptor(original.QDS); } public override void Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) diff --git a/lib60870/CS101/Slave.cs b/lib60870/CS101/Slave.cs index acc84a6..38ccc12 100644 --- a/lib60870/CS101/Slave.cs +++ b/lib60870/CS101/Slave.cs @@ -58,38 +58,38 @@ public interface IMasterConnection /// /// Handler for interrogation command (C_IC_NA_1 - 100). /// - public delegate bool InterrogationHandler(object parameter,IMasterConnection connection,ASDU asdu,byte qoi); + public delegate bool InterrogationHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qoi); /// /// Handler for counter interrogation command (C_CI_NA_1 - 101). /// - public delegate bool CounterInterrogationHandler(object parameter,IMasterConnection connection,ASDU asdu,byte qoi); + public delegate bool CounterInterrogationHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qoi); /// /// Handler for read command (C_RD_NA_1 - 102) /// - public delegate bool ReadHandler(object parameter,IMasterConnection connection,ASDU asdu,int ioa); + public delegate bool ReadHandler(object parameter, IMasterConnection connection, ASDU asdu, int ioa); /// /// Handler for clock synchronization command (C_CS_NA_1 - 103) /// - public delegate bool ClockSynchronizationHandler(object parameter,IMasterConnection connection,ASDU asdu,CP56Time2a newTime); + public delegate bool ClockSynchronizationHandler(object parameter, IMasterConnection connection, ASDU asdu, CP56Time2a newTime); /// /// Handler for reset process command (C_RP_NA_1 - 105) /// - public delegate bool ResetProcessHandler(object parameter,IMasterConnection connection,ASDU asdu,byte qrp); + public delegate bool ResetProcessHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qrp); /// /// Handler for delay acquisition command (C_CD_NA:1 - 106) /// - public delegate bool DelayAcquisitionHandler(object parameter,IMasterConnection connection,ASDU asdu,CP16Time2a delayTime); + public delegate bool DelayAcquisitionHandler(object parameter, IMasterConnection connection, ASDU asdu, CP16Time2a delayTime); /// /// Handler for ASDUs that are not handled by other handlers (default handler) /// - public delegate bool ASDUHandler(object parameter,IMasterConnection connection,ASDU asdu); + public delegate bool ASDUHandler(object parameter, IMasterConnection connection, ASDU asdu); public abstract class Slave { @@ -99,7 +99,7 @@ public bool DebugOutput { get { - return this.debugOutput; + return debugOutput; } set { @@ -125,7 +125,7 @@ public bool DebugOutput public DelayAcquisitionHandler delayAcquisitionHandler = null; public object delayAcquisitionHandlerParameter = null; - public ASDUHandler asduHandler = null; + public ASDUHandler asduHandler = null; public object asduHandlerParameter = null; internal FileReadyHandler fileReadyHandler = null; @@ -138,8 +138,8 @@ public bool DebugOutput /// user provided parameter that is passed to the callback public void SetInterrogationHandler(InterrogationHandler handler, object parameter) { - this.interrogationHandler = handler; - this.InterrogationHandlerParameter = parameter; + interrogationHandler = handler; + InterrogationHandlerParameter = parameter; } /// @@ -149,8 +149,8 @@ public void SetInterrogationHandler(InterrogationHandler handler, object paramet /// user provided parameter that is passed to the callback public void SetCounterInterrogationHandler(CounterInterrogationHandler handler, object parameter) { - this.counterInterrogationHandler = handler; - this.counterInterrogationHandlerParameter = parameter; + counterInterrogationHandler = handler; + counterInterrogationHandlerParameter = parameter; } /// @@ -160,8 +160,8 @@ public void SetCounterInterrogationHandler(CounterInterrogationHandler handler, /// user provided parameter that is passed to the callback public void SetReadHandler(ReadHandler handler, object parameter) { - this.readHandler = handler; - this.readHandlerParameter = parameter; + readHandler = handler; + readHandlerParameter = parameter; } /// @@ -171,20 +171,20 @@ public void SetReadHandler(ReadHandler handler, object parameter) /// user provided parameter that is passed to the callback public void SetClockSynchronizationHandler(ClockSynchronizationHandler handler, object parameter) { - this.clockSynchronizationHandler = handler; - this.clockSynchronizationHandlerParameter = parameter; + clockSynchronizationHandler = handler; + clockSynchronizationHandlerParameter = parameter; } public void SetResetProcessHandler(ResetProcessHandler handler, object parameter) { - this.resetProcessHandler = handler; - this.resetProcessHandlerParameter = parameter; + resetProcessHandler = handler; + resetProcessHandlerParameter = parameter; } public void SetDelayAcquisitionHandler(DelayAcquisitionHandler handler, object parameter) { - this.delayAcquisitionHandler = handler; - this.delayAcquisitionHandlerParameter = parameter; + delayAcquisitionHandler = handler; + delayAcquisitionHandlerParameter = parameter; } /// @@ -195,8 +195,8 @@ public void SetDelayAcquisitionHandler(DelayAcquisitionHandler handler, object p /// user provided parameter that is passed to the callback public void SetASDUHandler(ASDUHandler handler, object parameter) { - this.asduHandler = handler; - this.asduHandlerParameter = parameter; + asduHandler = handler; + asduHandlerParameter = parameter; } /// diff --git a/lib60870/CS101/StartEvent.cs b/lib60870/CS101/StartEvent.cs index dadeb99..c3b9471 100644 --- a/lib60870/CS101/StartEvent.cs +++ b/lib60870/CS101/StartEvent.cs @@ -19,8 +19,6 @@ * See COPYING file for the complete license text. */ -using System; -using System.Collections.Generic; using System.Text; namespace lib60870.CS101 @@ -35,7 +33,7 @@ public class StartEvent public StartEvent() { - this.encodedValue = 0; + encodedValue = 0; } public StartEvent(byte encodedValue) @@ -45,7 +43,7 @@ public StartEvent(byte encodedValue) public StartEvent(StartEvent orignal) { - this.encodedValue = orignal.encodedValue; + encodedValue = orignal.encodedValue; } public override bool Equals(object obj) @@ -56,12 +54,12 @@ public override bool Equals(object obj) if (!(obj is StartEvent)) return false; - return (this.EncodedValue == ((StartEvent)obj).EncodedValue); + return (EncodedValue == ((StartEvent)obj).EncodedValue); } public override int GetHashCode() { - return this.EncodedValue.GetHashCode(); + return EncodedValue.GetHashCode(); } /// @@ -244,7 +242,7 @@ public byte EncodedValue { get { - return this.encodedValue; + return encodedValue; } set { @@ -276,5 +274,5 @@ public override string ToString() return sb.ToString(); } } - + } diff --git a/lib60870/CS101/StatusAndStatusChangeDetection.cs b/lib60870/CS101/StatusAndStatusChangeDetection.cs index c23fc5a..291bd59 100644 --- a/lib60870/CS101/StatusAndStatusChangeDetection.cs +++ b/lib60870/CS101/StatusAndStatusChangeDetection.cs @@ -58,7 +58,7 @@ public UInt16 CDn public bool ST(int i) { if ((i >= 0) && (i < 16)) - return ((int)(STn & (1 << i)) != 0); + return ((STn & (1 << i)) != 0); else return false; } @@ -77,7 +77,7 @@ public void ST(int i, bool value) public bool CD(int i) { if ((i >= 0) && (i < 16)) - return ((int)(CDn & (1 << i)) != 0); + return ((CDn & (1 << i)) != 0); else return false; } @@ -99,8 +99,8 @@ public StatusAndStatusChangeDetection() public StatusAndStatusChangeDetection(StatusAndStatusChangeDetection original) { - this.STn = original.STn; - this.CDn = original.CDn; + STn = original.STn; + CDn = original.CDn; } public StatusAndStatusChangeDetection(byte[] msg, int startIndex) diff --git a/lib60870/CS101/StepPositionInformation.cs b/lib60870/CS101/StepPositionInformation.cs index 3257099..8b054de 100644 --- a/lib60870/CS101/StepPositionInformation.cs +++ b/lib60870/CS101/StepPositionInformation.cs @@ -59,7 +59,7 @@ public int Value { get { - return this.value; + return value; } set { @@ -82,11 +82,11 @@ public bool Transient { get { - return this.isTransient; + return isTransient; } set { - this.isTransient = value; + isTransient = value; } } @@ -96,7 +96,7 @@ public QualityDescriptor Quality { get { - return this.quality; + return quality; } } @@ -112,11 +112,11 @@ public StepPositionInformation(int ioa, int value, bool isTransient, QualityDesc } public StepPositionInformation(StepPositionInformation original) - : base (original.ObjectAddress) + : base(original.ObjectAddress) { - this.Value = original.Value; - this.Transient = original.Transient; - this.quality = new QualityDescriptor(original.quality); + Value = original.Value; + Transient = original.Transient; + quality = new QualityDescriptor(original.quality); } internal StepPositionInformation(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) @@ -156,7 +156,7 @@ public override void Encode(Frame frame, ApplicationLayerParameters parameters, vti += 0x80; frame.SetNextByte(vti); - + frame.SetNextByte(quality.EncodedValue); } @@ -194,11 +194,11 @@ public CP24Time2a Timestamp { get { - return this.timestamp; + return timestamp; } set { - this.timestamp = value; + timestamp = value; } } @@ -211,7 +211,7 @@ public StepPositionWithCP24Time2a(int ioa, int value, bool isTransient, QualityD public StepPositionWithCP24Time2a(StepPositionWithCP24Time2a original) : base(original) { - this.timestamp = new CP24Time2a(original.timestamp); + timestamp = new CP24Time2a(original.timestamp); } internal StepPositionWithCP24Time2a(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) @@ -270,11 +270,11 @@ public CP56Time2a Timestamp { get { - return this.timestamp; + return timestamp; } set { - this.timestamp = value; + timestamp = value; } } @@ -287,7 +287,7 @@ public StepPositionWithCP56Time2a(int ioa, int value, bool isTransient, QualityD public StepPositionWithCP56Time2a(StepPositionWithCP56Time2a original) : base(original) { - this.timestamp = new CP56Time2a(original.timestamp); + timestamp = new CP56Time2a(original.timestamp); } internal StepPositionWithCP56Time2a(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) @@ -312,6 +312,6 @@ public override void Encode(Frame frame, ApplicationLayerParameters parameters, frame.AppendBytes(timestamp.GetEncodedValue()); } } - + } diff --git a/lib60870/CS101/SystemInformationCommands.cs b/lib60870/CS101/SystemInformationCommands.cs index e3a0d46..714bfb0 100644 --- a/lib60870/CS101/SystemInformationCommands.cs +++ b/lib60870/CS101/SystemInformationCommands.cs @@ -19,8 +19,6 @@ * See COPYING file for the complete license text. */ -using System; - namespace lib60870.CS101 { @@ -74,7 +72,7 @@ public byte QOI { get { - return this.qoi; + return qoi; } set { @@ -141,7 +139,7 @@ public byte QCC { get { - return this.qcc; + return qcc; } set { @@ -152,7 +150,7 @@ public byte QCC public CounterInterrogationCommand(int ioa, byte qoi) : base(ioa) { - this.qcc = qoi; + qcc = qoi; } internal CounterInterrogationCommand(ApplicationLayerParameters parameters, byte[] msg, int startIndex) @@ -399,7 +397,7 @@ public CP56Time2a NewTime { get { - return this.newTime; + return newTime; } set { @@ -466,7 +464,7 @@ public byte QRP { get { - return this.qrp; + return qrp; } set { @@ -529,7 +527,7 @@ public CP16Time2a Delay { get { - return this.delay; + return delay; } set { diff --git a/lib60870/CS101/TypeID.cs b/lib60870/CS101/TypeID.cs index 2d0b5f1..553b8c3 100644 --- a/lib60870/CS101/TypeID.cs +++ b/lib60870/CS101/TypeID.cs @@ -19,13 +19,6 @@ * See COPYING file for the complete license text. */ -using System; - -using System.Net; -using System.Net.Sockets; -using System.Text; -using System.Threading; - namespace lib60870.CS101 { @@ -103,5 +96,5 @@ public enum TypeID F_DR_TA_1 = 126, F_SC_NB_1 = 127 } - + } diff --git a/lib60870/CS104/APCIParameters.cs b/lib60870/CS104/APCIParameters.cs index 780bf5f..de83c17 100644 --- a/lib60870/CS104/APCIParameters.cs +++ b/lib60870/CS104/APCIParameters.cs @@ -21,8 +21,6 @@ * See COPYING file for the complete license text. */ -using System; - namespace lib60870.CS104 { /// @@ -69,7 +67,7 @@ public int K { get { - return this.k; + return k; } set { @@ -86,7 +84,7 @@ public int W { get { - return this.w; + return w; } set { @@ -102,7 +100,7 @@ public int T0 { get { - return this.t0; + return t0; } set { @@ -120,7 +118,7 @@ public int T1 { get { - return this.t1; + return t1; } set { @@ -136,7 +134,7 @@ public int T2 { get { - return this.t2; + return t2; } set { @@ -152,7 +150,7 @@ public int T3 { get { - return this.t3; + return t3; } set { diff --git a/lib60870/CS104/ClientConnection.cs b/lib60870/CS104/ClientConnection.cs index 8c822db..ffcd5fe 100644 --- a/lib60870/CS104/ClientConnection.cs +++ b/lib60870/CS104/ClientConnection.cs @@ -19,19 +19,15 @@ * See COPYING file for the complete license text. */ +using lib60870.CS101; using System; - +using System.Collections.Concurrent; +using System.IO; using System.Net; -using System.Net.Sockets; -using System.Threading; -using System.Collections.Generic; using System.Net.Security; +using System.Net.Sockets; using System.Security.Cryptography.X509Certificates; -using System.IO; - -using lib60870; -using lib60870.CS101; -using System.Collections.Concurrent; +using System.Threading; namespace lib60870.CS104 { @@ -69,7 +65,7 @@ private void DebugLog(string msg) static byte[] TESTFR_ACT_MSG = new byte[] { 0x68, 0x04, 0x43, 0x00, 0x00, 0x00 }; - + private MasterConnectionState state; private int sendCount = 0; private int receiveCount = 0; @@ -89,7 +85,7 @@ private void DebugLog(string msg) /* timestamp when the last confirmation message was sent */ private UInt64 lastConfirmationTime = System.UInt64.MaxValue; - + private TlsSecurityInformation tlsSecInfo = null; private APCIParameters apciParameters; @@ -104,8 +100,6 @@ private void DebugLog(string msg) private Thread callbackThread = null; private bool callbackThreadRunning = false; - private Queue waitingASDUsHighPrio = null; - /* data structure for k-size sent ASDU buffer */ private struct SentASDU { @@ -127,13 +121,15 @@ private struct SentASDU private int newestSentASDU = -1; private SentASDU[] sentASDUs = null; - private ASDUQueue asduQueue = null; + private ASDUQueue lowPrioQueue = null; + + private ASDUQueue highPrioQueue = null; private FileServer fileServer; internal ASDUQueue GetASDUQueue() { - return asduQueue; + return lowPrioQueue; } private void ProcessASDUs() @@ -147,14 +143,14 @@ private void ProcessASDUs() { while ((receivedASDUs.Count > 0) && (callbackThreadRunning) && (running)) { - + ASDU asdu; if (receivedASDUs.TryDequeue(out asdu)) { HandleASDU(asdu); } - + } Thread.Sleep(50); @@ -190,32 +186,33 @@ internal ClientConnection(Socket socket, TlsSecurityInformation tlsSecInfo, APCI connectionsCounter++; connectionID = connectionsCounter; - this.remoteEndpoint = (IPEndPoint)socket.RemoteEndPoint; + remoteEndpoint = (IPEndPoint)socket.RemoteEndPoint; this.apciParameters = apciParameters; - this.alParameters = parameters; + alParameters = parameters; this.server = server; - this.asduQueue = asduQueue; + lowPrioQueue = asduQueue; this.debugOutput = debugOutput; ResetT3Timeout((UInt64)SystemUtils.currentTimeMillis()); maxSentASDUs = apciParameters.K; - this.sentASDUs = new SentASDU[maxSentASDUs]; + sentASDUs = new SentASDU[maxSentASDUs]; receivedASDUs = new ConcurrentQueue(); - waitingASDUsHighPrio = new Queue(); + highPrioQueue = new ASDUQueue(server.MaxHighPrioQueueSize, server.EnqueueMode, alParameters, DebugLog); + //highPrioQueue = new Queue(); socketStream = new NetworkStream(socket); this.socket = socket; this.tlsSecInfo = tlsSecInfo; - this.fileServer = new FileServer(this, server.GetAvailableFiles(), DebugLog); + fileServer = new FileServer(this, server.GetAvailableFiles(), DebugLog); if (server.fileTimeout != null) - this.fileServer.Timeout = (long) server.fileTimeout; + fileServer.Timeout = (long)server.fileTimeout; - this.fileServer.SetFileReadyHandler (server.fileReadyHandler, server.fileReadyHandlerParameter); + fileServer.SetFileReadyHandler(server.fileReadyHandler, server.fileReadyHandlerParameter); Thread workerThread = new Thread(HandleConnection); @@ -289,7 +286,7 @@ public bool IsActive { get { - return this.isActive; + return isActive; } set { @@ -303,7 +300,7 @@ public bool IsActive { DebugLog("is active"); state = MasterConnectionState.M_CON_STATE_STARTED; - } + } else DebugLog("is not active"); } @@ -446,7 +443,7 @@ private int SendIMessage(BufferFrame asdu) lock (socketStream) { socketStream.Write(buffer, 0, msgSize); - DebugLog("SEND I (size = " + msgSize + ") : " + BitConverter.ToString(buffer, 0, msgSize)); + DebugLog("SEND I (size = " + msgSize + ") : " + BitConverter.ToString(buffer, 0, msgSize)); sendCount = (sendCount + 1) % 32768; unconfirmedReceivedIMessages = 0; timeoutT2Triggered = false; @@ -461,17 +458,18 @@ private int SendIMessage(BufferFrame asdu) return sendCount; } + public bool MasterConnection_hasUnconfirmedMessages() { bool retVal = false; - if(asduQueue != null) + if (lowPrioQueue != null) { - if (asduQueue.MessageQueue_hasUnconfirmedIMessages(asduQueue)) + if (lowPrioQueue.MessageQueue_hasUnconfirmedIMessages()) return true; - if (asduQueue.HighPriorityASDUQueue_hasUnconfirmedIMessages(waitingASDUsHighPrio)) - return true; + if (highPrioQueue.MessageQueue_hasUnconfirmedIMessages()) + return true; } return retVal; @@ -517,7 +515,7 @@ private void PrintSendBuffer() } while (nextIndex != -1); DebugLog("--------------------"); - + } } } @@ -532,8 +530,8 @@ private void sendNextAvailableASDU() long timestamp; int index; - asduQueue.LockASDUQueue(); - BufferFrame asdu = asduQueue.GetNextWaitingASDU(out timestamp, out index); + lowPrioQueue.LockASDUQueue(); + BufferFrame asdu = lowPrioQueue.GetNextWaitingASDU(out timestamp, out index); try { @@ -551,7 +549,7 @@ private void sendNextAvailableASDU() { currentIndex = (newestSentASDU + 1) % maxSentASDUs; } - + sentASDUs[currentIndex].entryTime = timestamp; sentASDUs[currentIndex].queueIndex = index; sentASDUs[currentIndex].seqNo = SendIMessage(asdu); @@ -564,7 +562,7 @@ private void sendNextAvailableASDU() } finally { - asduQueue.UnlockASDUQueue(); + lowPrioQueue.UnlockASDUQueue(); } } } @@ -576,12 +574,14 @@ private bool sendNextHighPriorityASDU() if (isSentBufferFull()) return false; - BufferFrame asdu = waitingASDUsHighPrio.Dequeue(); + int currentIndex = 0; + long timestamp; + + BufferFrame asdu = highPrioQueue.GetNextWaitingASDU(out timestamp, out currentIndex); if (asdu != null) { - int currentIndex = 0; if (oldestSentASDU == -1) { @@ -593,8 +593,9 @@ private bool sendNextHighPriorityASDU() { currentIndex = (newestSentASDU + 1) % maxSentASDUs; } - + sentASDUs[currentIndex].queueIndex = -1; + sentASDUs[currentIndex].entryTime = timestamp; sentASDUs[currentIndex].seqNo = SendIMessage(asdu); sentASDUs[currentIndex].sentTime = SystemUtils.currentTimeMillis(); @@ -612,10 +613,10 @@ private bool sendNextHighPriorityASDU() private void SendWaitingASDUs() { - lock (waitingASDUsHighPrio) + lock (highPrioQueue) { - while (waitingASDUsHighPrio.Count > 0) + while (highPrioQueue.IsAsduAvailable()) { if (sendNextHighPriorityASDU() == false) @@ -626,7 +627,6 @@ private void SendWaitingASDUs() } } - // send messages from low-priority queue sendNextAvailableASDU(); } @@ -634,18 +634,18 @@ private void SendASDUInternal(ASDU asdu) { if (isActive) { - lock (waitingASDUsHighPrio) + lock (highPrioQueue) { BufferFrame frame = new BufferFrame(new byte[256], 6); asdu.Encode(frame, alParameters); - waitingASDUsHighPrio.Enqueue(frame); + highPrioQueue.EnqueueAsdu(asdu); } SendWaitingASDUs(); - } + } } /// @@ -678,7 +678,7 @@ public void SendACT_TERM(ASDU asdu) } private void HandleASDU(ASDU asdu) - { + { DebugLog("Handle received ASDU"); bool messageHandled = false; @@ -718,7 +718,7 @@ private void HandleASDU(ASDU asdu) { asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; asdu.IsNegative = true; - this.SendASDUInternal(asdu); + SendASDUInternal(asdu); messageHandled = true; } @@ -756,7 +756,7 @@ private void HandleASDU(ASDU asdu) { asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; asdu.IsNegative = true; - this.SendASDUInternal(asdu); + SendASDUInternal(asdu); messageHandled = true; } @@ -779,14 +779,14 @@ private void HandleASDU(ASDU asdu) { if (server.readHandler(server.readHandlerParameter, this, asdu, rc.ObjectAddress)) messageHandled = true; - } + } } } else { asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; asdu.IsNegative = true; - this.SendASDUInternal(asdu); + SendASDUInternal(asdu); messageHandled = true; } @@ -820,15 +820,15 @@ private void HandleASDU(ASDU asdu) csc.ObjectAddress = 0; asdu.AddInformationObject(csc); asdu.Cot = CauseOfTransmission.ACTIVATION_CON; - this.SendASDUInternal(asdu); + SendASDUInternal(asdu); } else { asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; asdu.IsNegative = true; - this.SendASDUInternal(asdu); + SendASDUInternal(asdu); } - + } messageHandled = true; @@ -840,7 +840,7 @@ private void HandleASDU(ASDU asdu) { asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; asdu.IsNegative = true; - this.SendASDUInternal(asdu); + SendASDUInternal(asdu); messageHandled = true; } @@ -865,7 +865,7 @@ private void HandleASDU(ASDU asdu) else { asdu.Cot = CauseOfTransmission.ACTIVATION_CON; - this.SendASDUInternal(asdu); + SendASDUInternal(asdu); } messageHandled = true; @@ -875,7 +875,7 @@ private void HandleASDU(ASDU asdu) asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; asdu.IsNegative = true; messageHandled = true; - this.SendASDUInternal(asdu); + SendASDUInternal(asdu); } } else @@ -884,7 +884,7 @@ private void HandleASDU(ASDU asdu) DebugLog("CS104 SLAVE: Rcvd test command C_TS_NA_1 -> not allowed\n"); messageHandled = false; } - + break; case TypeID.C_RP_NA_1: /* 105 - Reset process command */ @@ -921,8 +921,8 @@ private void HandleASDU(ASDU asdu) { asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; asdu.IsNegative = true; - this.SendASDUInternal(asdu); - messageHandled = true; + SendASDUInternal(asdu); + messageHandled = true; } break; @@ -963,7 +963,7 @@ private void HandleASDU(ASDU asdu) asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; asdu.IsNegative = true; messageHandled = true; - this.SendASDUInternal(asdu); + SendASDUInternal(asdu); } } else @@ -1000,7 +1000,7 @@ private void HandleASDU(ASDU asdu) asdu.Cot = CauseOfTransmission.ACTIVATION_CON; messageHandled = true; - this.SendASDUInternal(asdu); + SendASDUInternal(asdu); break; @@ -1019,7 +1019,7 @@ private void HandleASDU(ASDU asdu) { asdu.Cot = CauseOfTransmission.UNKNOWN_TYPE_ID; asdu.IsNegative = true; - this.SendASDUInternal(asdu); + SendASDUInternal(asdu); } } @@ -1069,13 +1069,13 @@ private bool CheckSequenceNumber(int seqNo) if (oldestValidSeqNo == seqNo) seqNoIsValid = true; } - + if (seqNoIsValid == false) { DebugLog("Received sequence number out of range"); return false; } - + if (oldestSentASDU != -1) { /* remove confirmed messages from list */ @@ -1094,7 +1094,7 @@ private bool CheckSequenceNumber(int seqNo) /* remove from server (low-priority) queue if required */ if (sentASDUs[oldestSentASDU].queueIndex != -1) { - asduQueue.MarkASDUAsConfirmed(sentASDUs[oldestSentASDU].queueIndex, + lowPrioQueue.MarkASDUAsConfirmed(sentASDUs[oldestSentASDU].queueIndex, sentASDUs[oldestSentASDU].entryTime); } @@ -1224,11 +1224,11 @@ private bool HandleMessage(byte[] buffer, int msgSize) // Check for STARTDT_ACT message else if ((buffer[2] & 0x07) == 0x07) { - if (this.isActive == false) + if (isActive == false) { - this.isActive = true; + isActive = true; - this.server.Activated(this); + server.Activated(this); } DebugLog("Send STARTDT_CON"); @@ -1241,11 +1241,11 @@ private bool HandleMessage(byte[] buffer, int msgSize) { DebugLog("Received STARTDT_ACT"); - if (this.isActive == true) + if (isActive == true) { - this.isActive = false; + isActive = false; - this.server.Deactivated(this); + server.Deactivated(this); } /* Send S-Message to confirm all outstanding messages */ @@ -1258,7 +1258,7 @@ private bool HandleMessage(byte[] buffer, int msgSize) SendSMessage(); } - if(MasterConnection_hasUnconfirmedMessages()) + if (MasterConnection_hasUnconfirmedMessages()) { DebugLog("CS104 SLAVE: Unconfirmed messages after STOPDT_ACT -> pending unconfirmed stopped state\n"); } @@ -1277,7 +1277,7 @@ private bool HandleMessage(byte[] buffer, int msgSize) DebugLog("Failed to send STOPDT_CON"); return false; } - } + } } // Check for TESTFR_CON message @@ -1366,7 +1366,7 @@ private bool handleTimeouts() waitingForTestFRcon = true; - ResetTestFRConTimeout(currentTime); + ResetTestFRConTimeout(currentTime); } /* Check for TEST FR con timeout */ @@ -1393,7 +1393,7 @@ private bool handleTimeouts() SendSMessage(); } } - + /* check if counterpart confirmed I messages */ lock (sentASDUs) { @@ -1445,7 +1445,7 @@ public bool CertificateValidationCallback(object sender, X509Certificate cert, X foreach (X509Certificate2 caCert in tlsSecInfo.CaCertificates) newChain.ChainPolicy.ExtraStore.Add(caCert); - + bool certificateStatus = newChain.Build(new X509Certificate2(cert.GetRawCertData())); if (certificateStatus == false) @@ -1493,7 +1493,7 @@ private void HandleConnection() SslStream sslStream = new SslStream(socketStream, true, validationCallback); bool authenticationSuccess = false; - + try { System.Security.Authentication.SslProtocols tlsVersion = System.Security.Authentication.SslProtocols.None; @@ -1504,13 +1504,13 @@ private void HandleConnection() DebugLog("Using TLS version: " + tlsVersion.ToString()); sslStream.AuthenticateAsServer(tlsSecInfo.OwnCertificate, true, tlsVersion, false); - + if (sslStream.IsAuthenticated == true) { socketStream = sslStream; authenticationSuccess = true; } - + } catch (IOException e) { @@ -1523,7 +1523,7 @@ private void HandleConnection() DebugLog("TLS authentication error: " + e.Message); } } - + if (authenticationSuccess == true) socketStream = sslStream; else @@ -1553,8 +1553,8 @@ private void HandleConnection() if (bytesRec > 0) { - - DebugLog("RCVD: " + BitConverter.ToString(bytes, 0, bytesRec)); + + DebugLog("RCVD: " + BitConverter.ToString(bytes, 0, bytesRec)); if (HandleMessage(bytes, bytesRec) == false) { @@ -1568,11 +1568,11 @@ private void HandleConnection() unconfirmedReceivedIMessages = 0; timeoutT2Triggered = false; SendSMessage(); - } + } } else if (bytesRec == -1) { - running = false; + running = false; } } catch (System.IO.IOException) @@ -1631,7 +1631,7 @@ private void HandleConnection() // unmark unconfirmed messages in queue if k-buffer not empty if (oldestSentASDU != -1) - asduQueue.UnmarkAllASDUs(); + lowPrioQueue.UnmarkAllASDUs(); server.Remove(this); @@ -1644,7 +1644,7 @@ private void HandleConnection() DebugLog("Connection thread finished"); } - void HandleRemoteCertificateValidationCallback (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) + void HandleRemoteCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { } @@ -1661,5 +1661,5 @@ public void ASDUReadyToSend() } } - + } diff --git a/lib60870/CS104/Connection.cs b/lib60870/CS104/Connection.cs index 4c2bf24..f2671d1 100644 --- a/lib60870/CS104/Connection.cs +++ b/lib60870/CS104/Connection.cs @@ -21,19 +21,15 @@ * See COPYING file for the complete license text. */ +using lib60870.CS101; using System; - -using System.Net; -using System.Net.Sockets; -using System.Text; -using System.Threading; using System.Collections.Generic; using System.IO; -using System.Security.Cryptography.X509Certificates; +using System.Net; using System.Net.Security; - -using lib60870.CS101; -using System.Net.Http; +using System.Net.Sockets; +using System.Security.Cryptography.X509Certificates; +using System.Threading; namespace lib60870.CS104 { @@ -61,7 +57,7 @@ public enum ConnectionEvent /// Conformation of STOP DT command received (server will no longer send or accept application layer messages) /// STOPDT_CON_RECEIVED = 3, - + /// /// The connect attempt has failed /// @@ -104,11 +100,11 @@ public int SentMsgCounter { get { - return this.sentMsgCounter; + return sentMsgCounter; } internal set { - this.sentMsgCounter = value; + sentMsgCounter = value; } } @@ -120,11 +116,11 @@ public int RcvdMsgCounter { get { - return this.rcvdMsgCounter; + return rcvdMsgCounter; } internal set { - this.rcvdMsgCounter = value; + rcvdMsgCounter = value; } } @@ -136,11 +132,11 @@ public int RcvdTestFrActCounter { get { - return this.rcvdTestFrActCounter; + return rcvdTestFrActCounter; } internal set { - this.rcvdTestFrActCounter = value; + rcvdTestFrActCounter = value; } } @@ -152,11 +148,11 @@ public int RcvdTestFrConCounter { get { - return this.rcvdTestFrConCounter; + return rcvdTestFrConCounter; } internal set { - this.rcvdTestFrConCounter = value; + rcvdTestFrConCounter = value; } } } @@ -164,12 +160,12 @@ internal set /// /// ASDU received handler. /// - public delegate bool ASDUReceivedHandler(object parameter,ASDU asdu); + public delegate bool ASDUReceivedHandler(object parameter, ASDU asdu); /// /// Callback handler for connection events /// - public delegate void ConnectionHandler(object parameter,ConnectionEvent connectionEvent); + public delegate void ConnectionHandler(object parameter, ConnectionEvent connectionEvent); /// /// A single connection to a CS 104 (IEC 60870-5-104) server. Implements the \ref Master interface. @@ -257,7 +253,7 @@ private struct SentASDU private string localIpAddress = null; private int localTcpPort = 0; - + /// /// Set the local IP address for the local connection endpoint /// @@ -290,7 +286,7 @@ public bool UseSendMessageQueue { get { - return this.useSendMessageQueue; + return useSendMessageQueue; } set { @@ -307,11 +303,11 @@ public int SendSequenceNumber { get { - return this.sendSequenceNumber; + return sendSequenceNumber; } set { - this.sendSequenceNumber = value; + sendSequenceNumber = value; } } @@ -336,11 +332,11 @@ public int ReceiveSequenceNumber { get { - return this.receiveSequenceNumber; + return receiveSequenceNumber; } set { - this.receiveSequenceNumber = value; + receiveSequenceNumber = value; } } @@ -353,11 +349,11 @@ public bool Autostart { get { - return this.autostart; + return autostart; } set { - this.autostart = value; + autostart = value; } } @@ -403,7 +399,7 @@ public ApplicationLayerParameters Parameters { get { - return this.alParameters; + return alParameters; } } @@ -724,7 +720,7 @@ private void Setup(string hostname, APCIParameters apciParameters, ApplicationLa this.alParameters = alParameters; this.apciParameters = apciParameters; this.tcpPort = tcpPort; - this.connectTimeoutInMs = apciParameters.T0 * 1000; + connectTimeoutInMs = apciParameters.T0 * 1000; connectionCounter++; connectionID = connectionCounter; @@ -804,7 +800,7 @@ public void SetTlsSecurity(TlsSecurityInformation securityInfo) /// The connection statistics. public ConnectionStatistics GetStatistics() { - return this.statistics; + return statistics; } /// @@ -813,7 +809,7 @@ public ConnectionStatistics GetStatistics() /// timeout value in milliseconds (ms) public void SetConnectTimeout(int millies) { - this.connectTimeoutInMs = millies; + connectTimeoutInMs = millies; } /// @@ -823,11 +819,11 @@ public int ConnectTimeout { get { - return this.connectTimeoutInMs; + return connectTimeoutInMs; } set { - this.connectTimeoutInMs = value; + connectTimeoutInMs = value; } } @@ -838,11 +834,11 @@ public int ReceiveTimeout { get { - return this.receiveTimeoutInMs; + return receiveTimeoutInMs; } set { - this.receiveTimeoutInMs = value; + receiveTimeoutInMs = value; } } @@ -1083,7 +1079,7 @@ public void SendStopDT() { throw new ConnectionException("Failed to write to socket", ex); } - + statistics.SentMsgCounter++; if (sentMessageHandler != null) { @@ -1114,7 +1110,7 @@ protected void SendStartDT_CON() { throw new ConnectionException("Failed to write to socket", ex); } - + statistics.SentMsgCounter++; if (sentMessageHandler != null) { @@ -1170,7 +1166,7 @@ protected void SendTestFR_ACT() { throw new ConnectionException("Failed to write to socket", ex); } - + statistics.SentMsgCounter++; if (sentMessageHandler != null) { @@ -1198,7 +1194,7 @@ protected void SendTestFR_CON() { throw new ConnectionException("Failed to write to socket", ex); } - + statistics.SentMsgCounter++; if (sentMessageHandler != null) { @@ -1334,7 +1330,7 @@ private int receiveMessage(byte[] buffer) if (currentReadTimeout == 0) { - currentReadTimeout = SystemUtils.currentTimeMillis() + this.receiveTimeoutInMs; + currentReadTimeout = SystemUtils.currentTimeMillis() + receiveTimeoutInMs; } } @@ -1589,7 +1585,7 @@ private void ConnectSocketWithTimeout() socket.Disconnect(true); } - + socket.Close(0); socket = null; @@ -1618,7 +1614,7 @@ private bool handleTimeouts() statistics.SentMsgCounter++; DebugLog("U message T3 timeout"); - uMessageTimeout = (UInt64)currentTime + (UInt64)(apciParameters.T1 * 1000); + uMessageTimeout = currentTime + (UInt64)(apciParameters.T1 * 1000); outStandingTestFRConMessages++; ResetT3Timeout(); if (sentMessageHandler != null) @@ -1683,7 +1679,7 @@ private bool AreByteArraysEqual(byte[] array1, byte[] array2) return false; } - private bool CertificateValidationCallback (Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) + private bool CertificateValidationCallback(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { if (certificate != null) { @@ -1873,7 +1869,7 @@ private void HandleConnection() if (recvRawMessageHandler != null) handleMessage = recvRawMessageHandler(recvRawMessageHandlerParameter, bytes, bytesRec); - + if (handleMessage) { if (checkMessage(bytes, bytesRec) == false) @@ -1913,7 +1909,7 @@ private void HandleConnection() loopRunning = false; if (fileClient != null) - fileClient.HandleFileService (); + fileClient.HandleFileService(); if (isConnected() == false) loopRunning = false; @@ -1949,7 +1945,7 @@ private void HandleConnection() DebugLog("CLOSE CONNECTION!"); // Release the socket. - + running = false; socketError = true; @@ -1968,7 +1964,7 @@ private void HandleConnection() socket.Disconnect(true); } - + socket.Close(0); @@ -2033,7 +2029,7 @@ public bool IsRunning { get { - return this.running; + return running; } } @@ -2056,11 +2052,11 @@ public void Cancel() socket.Disconnect(true); } - + socket.Close(0); } - + } public void Close() @@ -2137,13 +2133,23 @@ public override void GetFile(int ca, int ioa, NameOfFile nof, IFileReceiver rece fileClient.RequestFile(ca, ioa, nof, receiver); } + public void GetFile(int ca, int ioa, NameOfFile nof, IFileReceiver receiver, int timeout) + { + if (fileClient == null) + fileClient = new FileClient(this, DebugLog); + + fileClient.Timeout = timeout; + + fileClient.RequestFile(ca, ioa, nof, receiver); + } - public override void SendFile (int ca, int ioa, NameOfFile nof, IFileProvider fileProvider) + + public override void SendFile(int ca, int ioa, NameOfFile nof, IFileProvider fileProvider) { if (fileClient == null) - fileClient = new FileClient (this, DebugLog); + fileClient = new FileClient(this, DebugLog); - fileClient.SendFile (ca, ioa, nof, fileProvider); + fileClient.SendFile(ca, ioa, nof, fileProvider); } public void GetDirectory(int ca) diff --git a/lib60870/CS104/Server.cs b/lib60870/CS104/Server.cs index 5d886a8..fc2c36d 100644 --- a/lib60870/CS104/Server.cs +++ b/lib60870/CS104/Server.cs @@ -19,18 +19,12 @@ * See COPYING file for the complete license text. */ #define CONFIG_USE_SEMAPHORES +using lib60870.CS101; using System; +using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Threading; -using System.Collections.Generic; -using System.Collections.Concurrent; - -using lib60870.CS101; -using System.Runtime.InteropServices; -using System.Collections; -using System.Security.Cryptography; -using System.Collections.ObjectModel; namespace lib60870.CS104 { @@ -41,7 +35,7 @@ namespace lib60870.CS104 /// User provided parameter /// IP address of the connecting client /// true if the connection has to be accepted, false otherwise - public delegate bool ConnectionRequestHandler(object parameter,IPAddress ipAddress); + public delegate bool ConnectionRequestHandler(object parameter, IPAddress ipAddress); /// /// Connection events for the Server @@ -72,7 +66,7 @@ public enum ClientConnectionEvent } - public delegate void ConnectionEventHandler(object parameter,ClientConnection connection,ClientConnectionEvent eventType); + public delegate void ConnectionEventHandler(object parameter, ClientConnection connection, ClientConnectionEvent eventType); /// /// Server mode (redundancy group support) @@ -162,9 +156,9 @@ public ASDUQueue(int maxQueueSize, EnqueueMode enqueueMode, ApplicationLayerPara } this.enqueueMode = enqueueMode; - this.oldestQueueEntry = -1; - this.latestQueueEntry = -1; - this.NumberOfAsduInQueue = 0; + oldestQueueEntry = -1; + latestQueueEntry = -1; + NumberOfAsduInQueue = 0; this.maxQueueSize = maxQueueSize; this.parameters = parameters; this.DebugLog = DebugLog; @@ -229,11 +223,10 @@ public void EnqueueAsdu(ASDU asdu) } - DebugLog("Queue contains " + NumberOfAsduInQueue + " messages (oldest: " + oldestQueueEntry + " latest: " + latestQueueEntry + ")"); - + } - + public void LockASDUQueue() { Monitor.Enter(enqueuedASDUs); @@ -244,7 +237,7 @@ public void UnlockASDUQueue() Monitor.Exit(enqueuedASDUs); } - public bool MessageQueue_hasUnconfirmedIMessages(ASDUQueue queue) + public bool MessageQueue_hasUnconfirmedIMessages() { bool retVal = false; @@ -260,35 +253,29 @@ public bool MessageQueue_hasUnconfirmedIMessages(ASDUQueue queue) break; } - // break if we reached the latest entry if (currentIndex == latestQueueEntry) break; if (enqueuedASDUs[currentIndex].state == QueueEntryState.NOT_USED) break; - currentIndex = (currentIndex + 1) % maxQueueSize; + currentIndex = (currentIndex + 1) % maxQueueSize; } } return retVal; } - public bool HighPriorityASDUQueue_hasUnconfirmedIMessages(Queue queue) + internal bool IsAsduAvailable() { - bool retVal = false; + if (enqueuedASDUs == null) + return false; - if (NumberOfAsduInQueue != 0) + if (NumberOfAsduInQueue > 0) { int currentIndex = oldestQueueEntry; - while (currentIndex > 0) + while (enqueuedASDUs[currentIndex].state != QueueEntryState.WAITING_FOR_TRANSMISSION) { - if (enqueuedASDUs[currentIndex].state == QueueEntryState.SENT_BUT_NOT_CONFIRMED) - { - retVal = true; - break; - } - // break if we reached the latest entry if (currentIndex == latestQueueEntry) break; @@ -297,11 +284,20 @@ public bool HighPriorityASDUQueue_hasUnconfirmedIMessages(Queue que break; currentIndex = (currentIndex + 1) % maxQueueSize; + } - } - return retVal; - } + if (enqueuedASDUs[currentIndex].state == QueueEntryState.WAITING_FOR_TRANSMISSION) + { + enqueuedASDUs[currentIndex].state = QueueEntryState.SENT_BUT_NOT_CONFIRMED; + return true; + } + + return false; + } + + return false; + } internal BufferFrame GetNextWaitingASDU(out long timestamp, out int index) { @@ -325,7 +321,7 @@ internal BufferFrame GetNextWaitingASDU(out long timestamp, out int index) break; currentIndex = (currentIndex + 1) % maxQueueSize; - + } if (enqueuedASDUs[currentIndex].state == QueueEntryState.WAITING_FOR_TRANSMISSION) @@ -387,7 +383,7 @@ public void MarkASDUAsConfirmed(int index, long timestamp) { oldestQueueEntry = -1; latestQueueEntry = -1; - + break; } @@ -529,7 +525,7 @@ internal bool Matches(IPAddress ipAddress) } } } - + return matches; } @@ -596,6 +592,7 @@ public class Server : CS101.Slave private Socket listeningSocket; private int maxQueueSize = 1000; + private int maxHighPrioQueueSize = 1000; private int maxOpenConnections = 10; private static readonly SemaphoreSlim queueLock = new SemaphoreSlim(1, 1); @@ -653,7 +650,7 @@ public int MaxQueueSize { get { - return this.maxQueueSize; + return maxQueueSize; } set { @@ -661,6 +658,23 @@ public int MaxQueueSize } } + /// + /// Gets or sets the maximum size of the ASDU high priotity queue. Setting this property has no + /// effect after calling the Start method. + /// + /// The size of the max high priotity queue. + public int MaxHighPrioQueueSize + { + get + { + return maxHighPrioQueueSize; + } + set + { + maxHighPrioQueueSize = value; + } + } + /// /// Gets or sets the maximum number of open TCP connections /// @@ -669,7 +683,7 @@ public int MaxOpenConnections { get { - return this.maxOpenConnections; + return maxOpenConnections; } set { @@ -708,8 +722,8 @@ public APCIParameters GetAPCIParameters() /// public Server() { - this.apciParameters = new APCIParameters(); - this.alParameters = new ApplicationLayerParameters(); + apciParameters = new APCIParameters(); + alParameters = new ApplicationLayerParameters(); } @@ -719,13 +733,13 @@ public Server() /// TLS layer configuation, or null when not using TLS public Server(TlsSecurityInformation securityInfo) { - this.apciParameters = new APCIParameters(); - this.alParameters = new ApplicationLayerParameters(); + apciParameters = new APCIParameters(); + alParameters = new ApplicationLayerParameters(); this.securityInfo = securityInfo; if (securityInfo != null) - this.localPort = 19998; + localPort = 19998; } /// @@ -751,7 +765,7 @@ public Server(APCIParameters apciParameters, ApplicationLayerParameters alParame this.securityInfo = securityInfo; if (securityInfo != null) - this.localPort = 19998; + localPort = 19998; } /// @@ -774,8 +788,8 @@ public void AddRedundancyGroup(RedundancyGroup redundancyGroup) /// Parameter. public void SetConnectionRequestHandler(ConnectionRequestHandler handler, object parameter) { - this.connectionRequestHandler = handler; - this.connectionRequestHandlerParameter = parameter; + connectionRequestHandler = handler; + connectionRequestHandlerParameter = parameter; } private ConnectionEventHandler connectionEventHandler = null; @@ -789,8 +803,8 @@ public void SetConnectionRequestHandler(ConnectionRequestHandler handler, object /// Parameter. public void SetConnectionEventHandler(ConnectionEventHandler handler, object parameter) { - this.connectionEventHandler = handler; - this.connectionEventHandlerParameter = parameter; + connectionEventHandler = handler; + connectionEventHandlerParameter = parameter; } /// @@ -801,7 +815,7 @@ public int OpenConnections { get { - return this.allOpenConnections.Count; + return allOpenConnections.Count; } } @@ -812,11 +826,11 @@ public int ReceiveTimeout { get { - return this.receiveTimeoutInMs; + return receiveTimeoutInMs; } set { - this.receiveTimeoutInMs = value; + receiveTimeoutInMs = value; } } @@ -828,7 +842,7 @@ private int GetEntryCount(ASDUQueue queue) try { queueLock.Wait(); - count = queue.NumberOfAsduInQueue; + count = queue.NumberOfAsduInQueue; queueLock.Release(); } catch (Exception ex) @@ -840,7 +854,7 @@ private int GetEntryCount(ASDUQueue queue) return count; } - public int GetNumberOfQueueEntries(RedundancyGroup redundancyGroup = null) + public int GetNumberOfQueueEntries(RedundancyGroup redundancyGroup = null) { if (serverMode == ServerMode.CONNECTION_IS_REDUNDANCY_GROUP) { @@ -849,7 +863,7 @@ public int GetNumberOfQueueEntries(RedundancyGroup redundancyGroup = null) if (connection.IsActive) { return GetEntryCount(connection.GetASDUQueue()); - + } } } @@ -896,10 +910,10 @@ private void ServerAcceptThread() DebugLog("New connection"); IPEndPoint ipEndPoint = (IPEndPoint)newSocket.RemoteEndPoint; - + DebugLog(" from IP: " + ipEndPoint.Address.ToString()); - + bool acceptConnection = true; if (OpenConnections >= maxOpenConnections) @@ -965,7 +979,7 @@ private void ServerAcceptThread() CallConnectionEventHandler(connection, ClientConnectionEvent.OPENED); } - + } else newSocket.Close(); @@ -977,7 +991,7 @@ private void ServerAcceptThread() running = false; DebugLog("Exception: " + e.ToString()); } - + } } @@ -1003,7 +1017,7 @@ internal void Remove(ClientConnection connection) /// Local IP address or hostname to bind. public void SetLocalAddress(string localAddress) { - this.localHostname = localAddress; + localHostname = localAddress; } /// @@ -1012,7 +1026,7 @@ public void SetLocalAddress(string localAddress) /// Local TCP port to bind. public void SetLocalPort(int tcpPort) { - this.localPort = tcpPort; + localPort = tcpPort; } /// @@ -1024,7 +1038,7 @@ public void Start() IPEndPoint localEP = new IPEndPoint(ipAddress, localPort); // Create a TCP/IP socket. - listeningSocket = new Socket(AddressFamily.InterNetwork, + listeningSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); listeningSocket.Bind(localEP); @@ -1047,7 +1061,7 @@ public void Start() redGroups.Add(singleGroup); } } - + if (serverMode == ServerMode.SINGLE_REDUNDANCY_GROUP || serverMode == ServerMode.MULTIPLE_REDUNDANCY_GROUPS) { foreach (RedundancyGroup redGroup in redGroups) @@ -1114,7 +1128,7 @@ public bool IsRunning() public void EnqueueASDU(ASDU asdu) { /*ASDUQueue queue = new ASDUQueue(MaxQueueSize, enqueueMode, alParameters, DebugLog); - this.asduQueue = queue;*/ + this.lowPrioQueue = queue;*/ if (serverMode == ServerMode.CONNECTION_IS_REDUNDANCY_GROUP) { @@ -1141,7 +1155,7 @@ internal void CallConnectionEventHandler(ClientConnection connection, ClientConn { if (connectionEventHandler != null) connectionEventHandler(connectionEventHandlerParameter, connection, e); - } + } } internal void Activated(ClientConnection activeConnection) @@ -1169,18 +1183,21 @@ internal void Deactivated(ClientConnection activeConnection) activeConnection.State = MasterConnectionState.M_CON_STATE_UNCONFIRMED_STOPPED; } - public override int FileTimeout { - get { + public override int FileTimeout + { + get + { if (fileTimeout != null) return FileTimeout; else return -1; } - set { + set + { fileTimeout = value; } } } - + } diff --git a/lib60870/CS104/TlsSecurityInformation.cs b/lib60870/CS104/TlsSecurityInformation.cs index 6d84f56..f8b084f 100644 --- a/lib60870/CS104/TlsSecurityInformation.cs +++ b/lib60870/CS104/TlsSecurityInformation.cs @@ -19,11 +19,10 @@ * See COPYING file for the complete license text. */ -using System; -using System.Security.Cryptography.X509Certificates; using System.Collections.Generic; -using System.Security.Authentication; using System.Net.Security; +using System.Security.Authentication; +using System.Security.Cryptography.X509Certificates; namespace lib60870.CS104 { @@ -55,7 +54,7 @@ public bool ChainValidation { get { - return this.chainValidation; + return chainValidation; } set { @@ -71,7 +70,7 @@ public bool AllowOnlySpecificCertificates { get { - return this.allowOnlySpecificCertificates; + return allowOnlySpecificCertificates; } set { @@ -102,7 +101,7 @@ public X509Certificate2 OwnCertificate { get { - return this.ownCertificate; + return ownCertificate; } set { @@ -114,7 +113,7 @@ public List AllowedCertificates { get { - return this.otherCertificates; + return otherCertificates; } set { @@ -126,7 +125,7 @@ public List CaCertificates { get { - return this.caCertificates; + return caCertificates; } } @@ -134,7 +133,7 @@ public string TargetHostName { get { - return this.targetHostName; + return targetHostName; } } @@ -164,13 +163,13 @@ public SslProtocols TlsVersion /// Gets or sets the certificate validation callback. /// /// The certificate validation callback, or null to use the library internal certificate validation callbacks - public RemoteCertificateValidationCallback CertificateValidationCallback + public RemoteCertificateValidationCallback CertificateValidationCallback { - get + get { return certificateValidationCallback; } - set + set { certificateValidationCallback = value; } diff --git a/lib60870/Frame.cs b/lib60870/Frame.cs index f6b4a37..0dc6d17 100644 --- a/lib60870/Frame.cs +++ b/lib60870/Frame.cs @@ -21,12 +21,6 @@ * See COPYING file for the complete license text. */ -using System; -using System.Net; -using System.Net.Sockets; -using System.Text; -using System.Threading; - namespace lib60870 { /// diff --git a/lib60870/LibraryCommon.cs b/lib60870/LibraryCommon.cs index cab7589..e5cdc43 100644 --- a/lib60870/LibraryCommon.cs +++ b/lib60870/LibraryCommon.cs @@ -19,8 +19,6 @@ * See COPYING file for the complete license text. */ -using System; - namespace lib60870 { @@ -58,6 +56,6 @@ public static string GetLibraryVersionString() /// Raw message handler. Can be used to access the raw message. /// Returns true when message should be handled by the protocol stack, false, otherwise. /// - public delegate bool RawMessageHandler(object parameter,byte[] message,int messageSize); + public delegate bool RawMessageHandler(object parameter, byte[] message, int messageSize); } diff --git a/lib60870/LinkLayer/LinkLayer.cs b/lib60870/LinkLayer/LinkLayer.cs index 0e8fbf6..072b1fe 100644 --- a/lib60870/LinkLayer/LinkLayer.cs +++ b/lib60870/LinkLayer/LinkLayer.cs @@ -22,7 +22,6 @@ */ using System; -using System.IO.Ports; namespace lib60870.linklayer { @@ -30,7 +29,7 @@ namespace lib60870.linklayer /// Will be called by the stack when the state of a link layer connection changes /// /// Address of the slave (only used for unbalanced master mode) - public delegate void LinkLayerStateChanged(object parameter,int address,LinkLayerState newState); + public delegate void LinkLayerStateChanged(object parameter, int address, LinkLayerState newState); public enum LinkLayerState { @@ -104,7 +103,7 @@ public int AddressLength { get { - return this.addressLength; + return addressLength; } set { @@ -120,7 +119,7 @@ public int TimeoutForACK { get { - return this.timeoutForACK; + return timeoutForACK; } set { @@ -136,7 +135,7 @@ public long TimeoutRepeat { get { - return this.timeoutRepeat; + return timeoutRepeat; } set { @@ -152,11 +151,11 @@ public bool UseSingleCharACK { get { - return this.useSingleCharACK; + return useSingleCharACK; } set { - this.useSingleCharACK = value; + useSingleCharACK = value; } } @@ -168,11 +167,11 @@ public int TimeoutLinkState { get { - return this.timeoutLinkState; + return timeoutLinkState; } set { - this.timeoutLinkState = value; + timeoutLinkState = value; } } } @@ -192,7 +191,7 @@ internal enum PrimaryLinkLayerState internal class LinkLayer { protected Action DebugLog; - + protected byte[] buffer; /* byte buffer to receice and send frames */ @@ -217,9 +216,9 @@ internal class LinkLayer public LinkLayer(byte[] buffer, LinkLayerParameters parameters, SerialTransceiverFT12 transceiver, Action debugLog) { this.buffer = buffer; - this.linkLayerParameters = parameters; + linkLayerParameters = parameters; this.transceiver = transceiver; - this.DebugLog = debugLog; + DebugLog = debugLog; } public void SetReceivedRawMessageHandler(RawMessageHandler handler, object parameter) @@ -276,7 +275,7 @@ public bool DIR { get { - return this.dir; + return dir; } set { @@ -308,7 +307,7 @@ public LinkLayerMode LinkLayerMode { get { - return this.linkLayerMode; + return linkLayerMode; } set { @@ -361,14 +360,14 @@ public void SendFixedFrame(byte fc, int address, bool prm, bool dir, bool acd, b if (dfc) c += 0x10; - buffer[bufPos++] = (byte)c; + buffer[bufPos++] = c; if (linkLayerParameters.AddressLength > 0) { buffer[bufPos++] = (byte)(address % 0x100); if (linkLayerParameters.AddressLength > 1) - buffer[bufPos++] = (byte)((address / 0x100) % 0x100); + buffer[bufPos++] = (byte)((address / 0x100) % 0x100); } byte checksum = 0; @@ -414,7 +413,7 @@ public void SendVariableLengthFramePrimary(FunctionCodePrimary fc, int address, buffer[bufPos++] = (byte)(address % 0x100); if (linkLayerParameters.AddressLength > 1) - buffer[bufPos++] = (byte)((address / 0x100) % 0x100); + buffer[bufPos++] = (byte)((address / 0x100) % 0x100); } byte[] userData = frame.GetBuffer(); @@ -474,7 +473,7 @@ internal void SendVariableLengthFrameSecondary(FunctionCodeSecondary fc, int add buffer[bufPos++] = (byte)(address % 0x100); if (linkLayerParameters.AddressLength > 1) - buffer[bufPos++] = (byte)((address / 0x100) % 0x100); + buffer[bufPos++] = (byte)((address / 0x100) % 0x100); } byte[] userData = frame.GetBuffer(); @@ -508,7 +507,7 @@ internal void SendVariableLengthFrameSecondary(FunctionCodeSecondary fc, int add private void ParseHeaderSecondaryUnbalanced(byte[] msg, int msgSize) - { + { int userDataLength = 0; int userDataStart = 0; byte c; @@ -525,7 +524,7 @@ private void ParseHeaderSecondaryUnbalanced(byte[] msg, int msgSize) return; } - userDataLength = (int)msg[1] - linkLayerParameters.AddressLength - 1; + userDataLength = msg[1] - linkLayerParameters.AddressLength - 1; userDataStart = 5 + linkLayerParameters.AddressLength; csStart = 4; @@ -621,7 +620,7 @@ private void ParseHeaderSecondaryUnbalanced(byte[] msg, int msgSize) DebugLog("ERROR: Received secondary message in unbalanced slave mode!"); return; } - + bool fcb = ((c & 0x20) == 0x20); bool fcv = ((c & 0x10) == 0x10); @@ -657,7 +656,7 @@ public void HandleMessageBalancedAndPrimaryUnbalanced(byte[] msg, int msgSize) return; } - userDataLength = (int)msg[1] - linkLayerParameters.AddressLength - 1; + userDataLength = msg[1] - linkLayerParameters.AddressLength - 1; userDataStart = 5 + linkLayerParameters.AddressLength; csStart = 4; @@ -740,7 +739,7 @@ public void HandleMessageBalancedAndPrimaryUnbalanced(byte[] msg, int msgSize) } else - { /* we are primary link layer */ + { /* we are primary link layer */ bool dir = ((c & 0x80) == 0x80); /* DIR - direction for balanced transmission */ bool dfc = ((c & 0x10) == 0x10); /* DFC - Data flow control */ bool acd = ((c & 0x20) == 0x20); /* ACD - access demand for class 1 data - for unbalanced transmission */ @@ -762,7 +761,7 @@ public void HandleMessageBalancedAndPrimaryUnbalanced(byte[] msg, int msgSize) DebugLog("No primary link layer available!"); } - + } else { /* Single byte ACK */ @@ -821,15 +820,15 @@ public void Run() if (primaryLinkLayer != null) primaryLinkLayer.RunStateMachine(); else if (secondaryLinkLayer != null) - secondaryLinkLayer.RunStateMachine(); + secondaryLinkLayer.RunStateMachine(); } } - public void AddPortDeniedHandler (EventHandler eventHandler) - { + public void AddPortDeniedHandler(EventHandler eventHandler) + { transceiver.AddPortDeniedHandler(eventHandler); - } + } } } diff --git a/lib60870/LinkLayer/PrimaryLinkLayer.cs b/lib60870/LinkLayer/PrimaryLinkLayer.cs index c20828e..aaaca4a 100644 --- a/lib60870/LinkLayer/PrimaryLinkLayer.cs +++ b/lib60870/LinkLayer/PrimaryLinkLayer.cs @@ -22,7 +22,6 @@ */ using System; -using System.Collections.Generic; namespace lib60870.linklayer { @@ -67,7 +66,7 @@ internal interface IPrimaryLinkLayerCallbacks internal abstract class PrimaryLinkLayer { - public abstract void HandleMessage(FunctionCodeSecondary fcs, bool dir, bool dfc, + public abstract void HandleMessage(FunctionCodeSecondary fcs, bool dir, bool dfc, int address, byte[] msg, int userDataStart, int userDataLength); public abstract void RunStateMachine(); diff --git a/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs b/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs index 354f593..465bf22 100644 --- a/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs +++ b/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs @@ -49,8 +49,8 @@ internal class PrimaryLinkLayerBalanced : PrimaryLinkLayer public PrimaryLinkLayerBalanced(LinkLayer linkLayer, Func getUserData, Action debugLog) { - this.DebugLog = debugLog; - this.GetUserData = getUserData; + DebugLog = debugLog; + GetUserData = getUserData; this.linkLayer = linkLayer; } @@ -68,8 +68,8 @@ public LinkLayerState GetLinkLayerState() public int LinkLayerAddressOtherStation { set - { - linkLayerAddressOtherStation = value; + { + linkLayerAddressOtherStation = value; } get @@ -89,7 +89,7 @@ private void SetNewState(LinkLayerState newState) } } - public override void HandleMessage(FunctionCodeSecondary fcs, bool dir, bool dfc, + public override void HandleMessage(FunctionCodeSecondary fcs, bool dir, bool dfc, int address, byte[] msg, int userDataStart, int userDataLength) { PrimaryLinkLayerState newState = primaryState; @@ -132,16 +132,18 @@ public override void HandleMessage(FunctionCodeSecondary fcs, bool dir, bool dfc if (sendLinkLayerTestFunction) sendLinkLayerTestFunction = false; - + newState = PrimaryLinkLayerState.LINK_LAYERS_AVAILABLE; SetNewState(LinkLayerState.AVAILABLE); waitingForResponse = false; } - else if (primaryState == PrimaryLinkLayerState.EXECUTE_REQUEST_STATUS_OF_LINK) { + else if (primaryState == PrimaryLinkLayerState.EXECUTE_REQUEST_STATUS_OF_LINK) + { DebugLog("PLL - ACK (FC 0) unexpected -> expected status-of-link (FC 11)"); } - else { + else + { waitingForResponse = false; } @@ -167,14 +169,14 @@ public override void HandleMessage(FunctionCodeSecondary fcs, bool dir, bool dfc case FunctionCodeSecondary.RESP_NACK_NO_DATA: - DebugLog ("PLL - RECV FC 09 - RESP NACK - NO DATA\n"); + DebugLog("PLL - RECV FC 09 - RESP NACK - NO DATA\n"); newState = PrimaryLinkLayerState.IDLE; SetNewState(LinkLayerState.ERROR); break; - case FunctionCodeSecondary.STATUS_OF_LINK_OR_ACCESS_DEMAND: + case FunctionCodeSecondary.STATUS_OF_LINK_OR_ACCESS_DEMAND: DebugLog("PLL - RECV FC 11 - STATUS OF LINK"); if (primaryState == PrimaryLinkLayerState.EXECUTE_REQUEST_STATUS_OF_LINK) @@ -269,7 +271,7 @@ public override void RunStateMachine() lastSendTime = currentTime; waitingForResponse = true; - newState = PrimaryLinkLayerState.EXECUTE_RESET_REMOTE_LINK; + newState = PrimaryLinkLayerState.EXECUTE_RESET_REMOTE_LINK; } break; @@ -373,7 +375,7 @@ public override void RunStateMachine() break; case PrimaryLinkLayerState.SECONDARY_LINK_LAYER_BUSY: - //TODO - reject new requests from application layer? + //TODO - reject new requests from application layer? break; } diff --git a/lib60870/LinkLayer/PrimaryLinkLayerUnbalanced.cs b/lib60870/LinkLayer/PrimaryLinkLayerUnbalanced.cs index 3c2153f..870be94 100644 --- a/lib60870/LinkLayer/PrimaryLinkLayerUnbalanced.cs +++ b/lib60870/LinkLayer/PrimaryLinkLayerUnbalanced.cs @@ -113,7 +113,7 @@ public SlaveConnection(int address, LinkLayer linkLayer, Action debugLog { this.address = address; this.linkLayer = linkLayer; - this.DebugLog = debugLog; + DebugLog = debugLog; this.linkLayerUnbalanced = linkLayerUnbalanced; } @@ -125,7 +125,7 @@ public bool IsMessageWaitingToSend() return false; } - internal void HandleMessage(FunctionCodeSecondary fcs, bool acd, bool dfc, + internal void HandleMessage(FunctionCodeSecondary fcs, bool acd, bool dfc, int addr, byte[] msg, int userDataStart, int userDataLength) { PrimaryLinkLayerState newState = primaryState; @@ -143,7 +143,7 @@ internal void HandleMessage(FunctionCodeSecondary fcs, bool acd, bool dfc, newState = PrimaryLinkLayerState.EXECUTE_REQUEST_STATUS_OF_LINK; break; case PrimaryLinkLayerState.EXECUTE_SERVICE_SEND_CONFIRM: - //TODO message must be handled and switched to BUSY state later! + //TODO message must be handled and switched to BUSY state later! case PrimaryLinkLayerState.SECONDARY_LINK_LAYER_BUSY: newState = PrimaryLinkLayerState.SECONDARY_LINK_LAYER_BUSY; break; @@ -171,7 +171,7 @@ internal void HandleMessage(FunctionCodeSecondary fcs, bool acd, bool dfc, if (primaryState == PrimaryLinkLayerState.EXECUTE_RESET_REMOTE_LINK) { newState = PrimaryLinkLayerState.LINK_LAYERS_AVAILABLE; - + SetState(LinkLayerState.AVAILABLE); } else if (primaryState == PrimaryLinkLayerState.EXECUTE_SERVICE_SEND_CONFIRM) @@ -180,7 +180,7 @@ internal void HandleMessage(FunctionCodeSecondary fcs, bool acd, bool dfc, if (sendLinkLayerTestFunction) sendLinkLayerTestFunction = false; - SetState(LinkLayerState.AVAILABLE); + SetState(LinkLayerState.AVAILABLE); newState = PrimaryLinkLayerState.LINK_LAYERS_AVAILABLE; } @@ -200,14 +200,14 @@ internal void HandleMessage(FunctionCodeSecondary fcs, bool acd, bool dfc, break; case FunctionCodeSecondary.NACK: - + DebugLog("[SLAVE " + address + "] PLL - received NACK"); - + if (primaryState == PrimaryLinkLayerState.EXECUTE_SERVICE_SEND_CONFIRM) { - + SetState(LinkLayerState.BUSY); - + newState = PrimaryLinkLayerState.SECONDARY_LINK_LAYER_BUSY; } @@ -215,12 +215,12 @@ internal void HandleMessage(FunctionCodeSecondary fcs, bool acd, bool dfc, break; case FunctionCodeSecondary.STATUS_OF_LINK_OR_ACCESS_DEMAND: - + DebugLog("[SLAVE " + address + "] PLL - received STATUS OF LINK"); if (primaryState == PrimaryLinkLayerState.EXECUTE_REQUEST_STATUS_OF_LINK) { - + DebugLog("[SLAVE " + address + "] PLL - SEND RESET REMOTE LINK"); linkLayer.SendFixedFramePrimary(FunctionCodePrimary.RESET_REMOTE_LINK, address, false, false); @@ -235,7 +235,7 @@ internal void HandleMessage(FunctionCodeSecondary fcs, bool acd, bool dfc, else { /* illegal message */ newState = PrimaryLinkLayerState.IDLE; - + SetState(LinkLayerState.ERROR); waitingForResponse = false; @@ -244,7 +244,7 @@ internal void HandleMessage(FunctionCodeSecondary fcs, bool acd, bool dfc, break; case FunctionCodeSecondary.RESP_USER_DATA: - + DebugLog("[SLAVE " + address + "] PLL - received USER DATA"); if (primaryState == PrimaryLinkLayerState.EXECUTE_SERVICE_REQUEST_RESPOND) @@ -270,7 +270,7 @@ internal void HandleMessage(FunctionCodeSecondary fcs, bool acd, bool dfc, break; case FunctionCodeSecondary.RESP_NACK_NO_DATA: - + DebugLog("[SLAVE " + address + "] PLL - received RESP NO DATA"); if (primaryState == PrimaryLinkLayerState.EXECUTE_SERVICE_REQUEST_RESPOND) @@ -285,7 +285,7 @@ internal void HandleMessage(FunctionCodeSecondary fcs, bool acd, bool dfc, else { /* illegal message */ newState = PrimaryLinkLayerState.IDLE; - + SetState(LinkLayerState.ERROR); } @@ -295,7 +295,7 @@ internal void HandleMessage(FunctionCodeSecondary fcs, bool acd, bool dfc, case FunctionCodeSecondary.LINK_SERVICE_NOT_FUNCTIONING: case FunctionCodeSecondary.LINK_SERVICE_NOT_IMPLEMENTED: - + DebugLog("[SLAVE " + address + "] PLL - link layer service not functioning/not implemented in secondary station "); if (primaryState == PrimaryLinkLayerState.EXECUTE_SERVICE_SEND_CONFIRM) @@ -340,7 +340,8 @@ public void RunStateMachine() /* last sent time not plausible! */ lastSendTime = currentTime; - if (currentTime > (lastSendTime + linkLayer.linkLayerParameters.TimeoutLinkState)) { + if (currentTime > (lastSendTime + linkLayer.linkLayerParameters.TimeoutLinkState)) + { newState = PrimaryLinkLayerState.IDLE; } @@ -380,7 +381,7 @@ public void RunStateMachine() } else { - + DebugLog("[SLAVE " + address + "] PLL - SEND RESET REMOTE LINK"); linkLayer.SendFixedFramePrimary(FunctionCodePrimary.RESET_REMOTE_LINK, address, false, false); @@ -388,7 +389,7 @@ public void RunStateMachine() lastSendTime = currentTime; waitingForResponse = true; nextFcb = true; - newState = PrimaryLinkLayerState.EXECUTE_RESET_REMOTE_LINK; + newState = PrimaryLinkLayerState.EXECUTE_RESET_REMOTE_LINK; } break; @@ -521,7 +522,7 @@ public void RunStateMachine() DebugLog("[SLAVE " + address + "] PLL - SEND FC 02 - RESET REMOTE LINK [REPEAT]"); linkLayer.SendFixedFramePrimary(FunctionCodePrimary.TEST_FUNCTION_FOR_LINK, address, !nextFcb, true); - + } else { @@ -529,7 +530,7 @@ public void RunStateMachine() DebugLog("[SLAVE " + address + "] PLL - SEND FC 03 - USER DATA CONFIRMED [REPEAT]"); linkLayer.SendVariableLengthFramePrimary(FunctionCodePrimary.USER_DATA_CONFIRMED, address, !nextFcb, true, lastSentASDU); - + } lastSendTime = currentTime; @@ -574,7 +575,7 @@ public void RunStateMachine() linkLayer.SendFixedFramePrimary(FunctionCodePrimary.REQUEST_USER_DATA_CLASS_2, address, !nextFcb, true); } - + lastSendTime = currentTime; } } @@ -582,7 +583,7 @@ public void RunStateMachine() break; case PrimaryLinkLayerState.SECONDARY_LINK_LAYER_BUSY: - //TODO - reject new requests from application layer? + //TODO - reject new requests from application layer? break; } @@ -601,7 +602,7 @@ public void RunStateMachine() public void ResetCU(int slaveAddress) - { + { SlaveConnection slave = GetSlaveConnection(slaveAddress); if (slave != null) @@ -694,8 +695,8 @@ public PrimaryLinkLayerUnbalanced(LinkLayer linkLayer, IPrimaryLinkLayerCallback { this.linkLayer = linkLayer; this.callbacks = callbacks; - this.DebugLog = debugLog; - this.slaveConnections = new List(); + DebugLog = debugLog; + slaveConnections = new List(); } private SlaveConnection GetSlaveConnection(int slaveAddres) @@ -718,7 +719,7 @@ public void AddSlaveConnection(int slaveAddress) } public LinkLayerState GetStateOfSlave(int slaveAddress) - { + { SlaveConnection connection = GetSlaveConnection(slaveAddress); if (connection != null) @@ -727,7 +728,7 @@ public LinkLayerState GetStateOfSlave(int slaveAddress) throw new ArgumentException("No slave with this address found"); } - public override void HandleMessage(FunctionCodeSecondary fcs, bool acd, bool dfc, + public override void HandleMessage(FunctionCodeSecondary fcs, bool acd, bool dfc, int address, byte[] msg, int userDataStart, int userDataLength) { SlaveConnection slave = null; diff --git a/lib60870/LinkLayer/SecondaryLinkLayer.cs b/lib60870/LinkLayer/SecondaryLinkLayer.cs index a426f24..1ba2187 100644 --- a/lib60870/LinkLayer/SecondaryLinkLayer.cs +++ b/lib60870/LinkLayer/SecondaryLinkLayer.cs @@ -21,8 +21,6 @@ * See COPYING file for the complete license text. */ -using System; - namespace lib60870.linklayer { diff --git a/lib60870/LinkLayer/SecondaryLinkLayerBalanced.cs b/lib60870/LinkLayer/SecondaryLinkLayerBalanced.cs index a43fbe4..c3f6b68 100644 --- a/lib60870/LinkLayer/SecondaryLinkLayerBalanced.cs +++ b/lib60870/LinkLayer/SecondaryLinkLayerBalanced.cs @@ -38,9 +38,9 @@ public SecondaryLinkLayerBalanced(LinkLayer linkLayer, int address, Func handleApplicationLayer, Action debugLog) { this.linkLayer = linkLayer; - this.linkLayerAddress = address; - this.DebugLog = debugLog; - this.HandleApplicationLayer = handleApplicationLayer; + linkLayerAddress = address; + DebugLog = debugLog; + HandleApplicationLayer = handleApplicationLayer; } @@ -90,12 +90,12 @@ public override void HandleMessage(FunctionCodePrimary fcp, bool isBroadcast, in linkLayer.SendSingleCharACK(); else linkLayer.SendFixedFrameSecondary(FunctionCodeSecondary.ACK, linkLayerAddress, false, false); - + break; case FunctionCodePrimary.TEST_FUNCTION_FOR_LINK: DebugLog("SLL -TEST FUNCTION FOR LINK"); - // TODO check if DCF has to be sent + // TODO check if DCF has to be sent if (linkLayer.linkLayerParameters.UseSingleCharACK) linkLayer.SendSingleCharACK(); else diff --git a/lib60870/LinkLayer/SecondaryLinkLayerUnbalanced.cs b/lib60870/LinkLayer/SecondaryLinkLayerUnbalanced.cs index a6d7f2e..04f7ef2 100644 --- a/lib60870/LinkLayer/SecondaryLinkLayerUnbalanced.cs +++ b/lib60870/LinkLayer/SecondaryLinkLayerUnbalanced.cs @@ -37,8 +37,8 @@ internal class SecondaryLinkLayerUnbalanced : SecondaryLinkLayer public SecondaryLinkLayerUnbalanced(LinkLayer linkLayer, int address, ISecondaryApplicationLayer applicationLayer, Action debugLog) { this.linkLayer = linkLayer; - this.linkLayerAddress = address; - this.DebugLog = debugLog; + linkLayerAddress = address; + DebugLog = debugLog; this.applicationLayer = applicationLayer; } @@ -133,14 +133,11 @@ public override void HandleMessage(FunctionCodePrimary fcp, bool isBroadcast, in case FunctionCodePrimary.REQUEST_USER_DATA_CLASS_2: DebugLog("SLL - REQUEST USER DATA CLASS 2"); { - bool invalidFCB = false; - if (fcv) { if (CheckFCB(fcb) == false) { DebugLog("SLL - REQ UD2 - unexpected FCB\n"); - invalidFCB = true; } } @@ -164,14 +161,11 @@ public override void HandleMessage(FunctionCodePrimary fcp, bool isBroadcast, in case FunctionCodePrimary.REQUEST_USER_DATA_CLASS_1: DebugLog("SLL - REQUEST USER DATA CLASS 1"); { - bool invalidFCB = false; - if (fcv) { if (CheckFCB(fcb) == false) { DebugLog("SLL - REQ UD1 - unexpected FCB\n"); - invalidFCB = true; } } @@ -217,7 +211,7 @@ public override void HandleMessage(FunctionCodePrimary fcp, bool isBroadcast, in else linkLayer.SendFixedFrameSecondary(FunctionCodeSecondary.ACK, linkLayerAddress, false, false); - } + } break; case FunctionCodePrimary.USER_DATA_NO_REPLY: diff --git a/lib60870/LinkLayer/SerialTransceiverFT12.cs b/lib60870/LinkLayer/SerialTransceiverFT12.cs index 98e8ae8..2f16793 100644 --- a/lib60870/LinkLayer/SerialTransceiverFT12.cs +++ b/lib60870/LinkLayer/SerialTransceiverFT12.cs @@ -22,9 +22,8 @@ */ using System; -using System.IO.Ports; using System.IO; -using System.Threading; +using System.IO.Ports; namespace lib60870.linklayer { @@ -53,16 +52,16 @@ internal class SerialTransceiverFT12 public SerialTransceiverFT12(SerialPort port, LinkLayerParameters linkLayerParameters, Action debugLog) { this.port = port; - this.serialStream = port.BaseStream; - this.DebugLog = debugLog; + serialStream = port.BaseStream; + DebugLog = debugLog; this.linkLayerParameters = linkLayerParameters; } public SerialTransceiverFT12(Stream serialStream, LinkLayerParameters linkLayerParameters, Action debugLog) { - this.port = null; + port = null; this.serialStream = serialStream; - this.DebugLog = debugLog; + DebugLog = debugLog; this.linkLayerParameters = linkLayerParameters; } @@ -103,11 +102,11 @@ public void SendMessage(byte[] msg, int msgSize) serialStream.Write(msg, 0, msgSize); serialStream.Flush(); } - catch(UnauthorizedAccessException) + catch (UnauthorizedAccessException) { } - + } // read the next block of the message @@ -133,9 +132,9 @@ private int ReadBytesWithTimeout(byte[] buffer, int startIndex, int count, int t catch (TimeoutException) { } - catch(IOException ex) + catch (IOException ex) { - DebugLog("READ: IOException - " + ex.Message); + DebugLog("READ: IOException - " + ex.Message); } catch (UnauthorizedAccessException) { @@ -153,7 +152,7 @@ private int ReadBytesWithTimeout(byte[] buffer, int startIndex, int count, int t private event EventHandler accessDenied = null; - public void AddPortDeniedHandler (EventHandler eventHandler) + public void AddPortDeniedHandler(EventHandler eventHandler) { accessDenied += eventHandler; } diff --git a/lib60870/LinkLayer/TcpClientVirtualSerialPort.cs b/lib60870/LinkLayer/TcpClientVirtualSerialPort.cs index e3bc840..a996836 100644 --- a/lib60870/LinkLayer/TcpClientVirtualSerialPort.cs +++ b/lib60870/LinkLayer/TcpClientVirtualSerialPort.cs @@ -22,8 +22,8 @@ using System; using System.IO; -using System.Net.Sockets; using System.Net; +using System.Net.Sockets; using System.Threading; namespace lib60870.linklayer @@ -68,7 +68,7 @@ public bool Connected { get { - return this.connected; + return connected; } } @@ -76,7 +76,7 @@ public bool DebugOutput { get { - return this.debugOutput; + return debugOutput; } set { @@ -181,7 +181,7 @@ private void ConnectionThread() connected = false; - if (!this.running) + if (!running) return; if (socketStream != null) @@ -208,7 +208,7 @@ private void ConnectionThread() socketStream = null; conSocket = null; } - + if (running) Thread.Sleep(waitRetryConnect); } @@ -235,7 +235,7 @@ public void Stop() if (running == true) { running = false; - this.connected = false; + connected = false; if (socketStream != null) { @@ -246,10 +246,10 @@ public void Stop() if (conSocket != null) { - + try { - conSocket.Shutdown(SocketShutdown.Both); + conSocket.Shutdown(SocketShutdown.Both); } catch (SocketException) { @@ -289,7 +289,7 @@ public override int Read(byte[] buffer, int offset, int count) catch (Exception e) { DebugLog("Socket error: " + e.ToString()); - this.connected = false; + connected = false; return 0; } diff --git a/lib60870/LinkLayer/TcpServerVirtualSerialPort.cs b/lib60870/LinkLayer/TcpServerVirtualSerialPort.cs index 223a36a..638452f 100644 --- a/lib60870/LinkLayer/TcpServerVirtualSerialPort.cs +++ b/lib60870/LinkLayer/TcpServerVirtualSerialPort.cs @@ -21,8 +21,8 @@ using System; using System.IO; -using System.Net.Sockets; using System.Net; +using System.Net.Sockets; using System.Threading; namespace lib60870.linklayer @@ -68,7 +68,7 @@ public bool DebugOutput { get { - return this.debugOutput; + return debugOutput; } set { @@ -82,8 +82,8 @@ public TcpServerVirtualSerialPort() public void SetConnectionRequestHandler(TcpConnectionEventHandler handler, object parameter) { - this.connectionEventHandler = handler; - this.connectionEventHandlerParameter = parameter; + connectionEventHandler = handler; + connectionEventHandlerParameter = parameter; } /// @@ -176,7 +176,7 @@ public void Start() IPEndPoint localEP = new IPEndPoint(ipAddress, localPort); // Create a TCP/IP socket. - listeningSocket = new Socket(AddressFamily.InterNetwork, + listeningSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); listeningSocket.Bind(localEP); diff --git a/lib60870/SystemUtils.cs b/lib60870/SystemUtils.cs index 368287f..3759810 100644 --- a/lib60870/SystemUtils.cs +++ b/lib60870/SystemUtils.cs @@ -21,11 +21,6 @@ using System; -using System.Net; -using System.Net.Sockets; -using System.Text; -using System.Threading; - namespace lib60870 { /// diff --git a/tests/Test.cs b/tests/Test.cs index 9263699..6399aff 100644 --- a/tests/Test.cs +++ b/tests/Test.cs @@ -1,84 +1,88 @@ -using NUnit.Framework; -using System; -using System.Threading; -using System.Net.Sockets; -using lib60870; +using lib60870; using lib60870.CS101; using lib60870.CS104; -using System.Security.Cryptography; -using System.Runtime.Intrinsics.Arm; -using System.Net; -using System.Security.Cryptography.X509Certificates; +using NUnit.Framework; +using System; +using System.Net.Sockets; +using System.Threading; namespace tests { - class TestInteger32Object : InformationObject, IPrivateIOFactory - { - private int value = 0; - - public TestInteger32Object () - : base (0) - { - } - - public TestInteger32Object(int ioa, int value) - :base (ioa) - { - this.value = value; - } - - public int Value { - get { - return this.value; - } - set { - this.value = value; - } - } - - private TestInteger32Object (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) - :base(parameters, msg, startIndex, isSequence) - { - if (!isSequence) - startIndex += parameters.SizeOfIOA; /* skip IOA */ - - value = msg [startIndex++]; - value += ((int)msg [startIndex++] * 0x100); - value += ((int)msg [startIndex++] * 0x10000); - value += ((int)msg [startIndex++] * 0x1000000); - } - - public override bool SupportsSequence { - get { - return true; - } - } - - public override TypeID Type { - get { - return (TypeID)41; - } - } - - InformationObject IPrivateIOFactory.Decode (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) - { - return new TestInteger32Object (parameters, msg, startIndex, isSequence); - } - - public override int GetEncodedSize() - { - return 4; - } - - public override void Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) { - base.Encode(frame, parameters, isSequence); - - frame.SetNextByte((byte) (value % 0x100)); - frame.SetNextByte((byte) ((value / 0x100) % 0x100)); - frame.SetNextByte((byte) ((value / 0x10000) % 0x100)); - frame.SetNextByte((byte) (value / 0x1000000)); - } - } + class TestInteger32Object : InformationObject, IPrivateIOFactory + { + private int value = 0; + + public TestInteger32Object() + : base(0) + { + } + + public TestInteger32Object(int ioa, int value) + : base(ioa) + { + this.value = value; + } + + public int Value + { + get + { + return value; + } + set + { + this.value = value; + } + } + + private TestInteger32Object(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) + : base(parameters, msg, startIndex, isSequence) + { + if (!isSequence) + startIndex += parameters.SizeOfIOA; /* skip IOA */ + + value = msg[startIndex++]; + value += (msg[startIndex++] * 0x100); + value += (msg[startIndex++] * 0x10000); + value += (msg[startIndex++] * 0x1000000); + } + + public override bool SupportsSequence + { + get + { + return true; + } + } + + public override TypeID Type + { + get + { + return (TypeID)41; + } + } + + InformationObject IPrivateIOFactory.Decode(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) + { + return new TestInteger32Object(parameters, msg, startIndex, isSequence); + } + + public override int GetEncodedSize() + { + return 4; + } + + public override void Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) + { + base.Encode(frame, parameters, isSequence); + + frame.SetNextByte((byte)(value % 0x100)); + frame.SetNextByte((byte)((value / 0x100) % 0x100)); + frame.SetNextByte((byte)((value / 0x10000) % 0x100)); + frame.SetNextByte((byte)(value / 0x1000000)); + } + } @@ -215,7 +219,7 @@ public void TestTestCommand() { TestCommand tc = new TestCommand(); - Assert.IsTrue(tc.Valid); + Assert.IsTrue(tc.Valid); } @@ -755,9 +759,9 @@ public void TestAddUntilOverflow() int i = 0; - for(i = 0; i < 60; i++) + for (i = 0; i < 60; i++) { - SinglePointInformation sp = new SinglePointInformation(100 + i, true, new QualityDescriptor() ); + SinglePointInformation sp = new SinglePointInformation(100 + i, true, new QualityDescriptor()); bool added = asdu.AddInformationObject(sp); @@ -790,8 +794,6 @@ public void TestUnconfirmedStoppedState() server.DebugOutput = true; - ConnectionException se = null; - CS104SlaveEventQueue1 info = new CS104SlaveEventQueue1 { asduHandlerCalled = 0, @@ -872,7 +874,7 @@ public void TestUnconfirmedStoppedState() Assert.AreEqual(5, info.asduHandlerCalled); Assert.AreEqual(5, info.spontCount); - Assert.AreEqual(20, info.lastScaledValue); + Assert.AreEqual(20, info.lastScaledValue); server.Stop(); server = null; @@ -1814,7 +1816,7 @@ public void TestSendTestFR() Assert.AreEqual(1, connection.GetStatistics().SentMsgCounter); /* STARTDT + ASDU */ while (connection.GetStatistics().RcvdMsgCounter < 2) - Thread.Sleep(1); + Thread.Sleep(1); Assert.AreEqual(2, connection.GetStatistics().RcvdMsgCounter); /* STARTDT_CON + ASDU */ @@ -1826,7 +1828,7 @@ public void TestSendTestFR() { connection.SendASDU(asdu); } - catch (ConnectionException e) + catch (ConnectionException) { } @@ -1894,14 +1896,12 @@ public void TestSendTestFRTimeoutMaster() // Expect connection to be closed due to three missing TESTFR_CON responses Assert.IsFalse(connection.IsRunning); - ConnectionException ce = null; - // Connection is closed. SendASDU should fail try { connection.SendASDU(asdu); } - catch (ConnectionException e) + catch (ConnectionException) { } @@ -1912,9 +1912,9 @@ public void TestSendTestFRTimeoutMaster() connection.Close(); server.Stop(); - Assert.AreEqual(4, connection.GetStatistics().RcvdMsgCounter); /* STARTDT_CON + ASDU + TESTFR_CON */ + Assert.AreEqual(4, connection.GetStatistics().RcvdMsgCounter); /* STARTDT_CON + ASDU + TESTFR_CON */ - Assert.AreEqual(0, connection.GetStatistics().RcvdTestFrConCounter); + Assert.AreEqual(0, connection.GetStatistics().RcvdTestFrConCounter); } private static bool testSendTestFRTimeoutSlaveRawMessageHandler(object param, byte[] msg, int msgSize) @@ -2986,12 +2986,22 @@ public void TestFileUploadSingleSection() Connection con = new Connection("127.0.0.1", 2404); con.Connect(); + Thread.Sleep(2000); Receiver receiver = new Receiver(); - con.GetFile(1, 30000, NameOfFile.TRANSPARENT_FILE, receiver); + try + { - Thread.Sleep(3000); + con.GetFile(1, 30000, NameOfFile.TRANSPARENT_FILE, receiver, 10000); + } + catch (Exception ex) + { + Console.WriteLine($"[Test] GetFile threw an exception: {ex.Message}"); + Assert.Fail("GetFile failed!"); + } + + Thread.Sleep(15000); Assert.IsTrue(receiver.finishedCalled); Assert.AreEqual(100, receiver.recvdBytes); Assert.AreEqual(1, receiver.lastSection); @@ -3113,7 +3123,7 @@ public void TestFileUploadMultipleSegments() for (int i = 0; i < 1000; i++) fileData[i] = (byte)(i); - + file.AddSection(fileData); server.GetAvailableFiles().AddFile(file); @@ -3159,7 +3169,7 @@ public void TestFileDownloadSingleSection() return receiver; }, null); server.Start(); - + SimpleFile file = new SimpleFile(1, 30000, NameOfFile.TRANSPARENT_FILE); byte[] fileData = new byte[100]; @@ -3173,7 +3183,7 @@ public void TestFileDownloadSingleSection() Connection con = new Connection("127.0.0.1", 2404); con.Connect(); Thread.Sleep(2000); - + try { con.SendFile(1, 30000, NameOfFile.TRANSPARENT_FILE, file); @@ -3228,7 +3238,7 @@ public void TestFileDownloadMultipleSegments() file.AddSection(fileData); server.GetAvailableFiles().AddFile(file); - + Connection con = new Connection("127.0.0.1", 2404); con.Connect(); Thread.Sleep(2000); @@ -3290,7 +3300,7 @@ public void TestFileDownloadMultipleSegmentsMultipleSections() file.AddSection(fileData); file.AddSection(fileData2); - server.GetAvailableFiles().AddFile(file); + server.GetAvailableFiles().AddFile(file); Connection con = new Connection("127.0.0.1", 2404); con.Connect(); @@ -3431,7 +3441,7 @@ public void TestInformationObjectCopyConstructors() Assert.AreEqual(integratedTotalsOriginal.BCR.Invalid, integratedTotalsWithCP56Copy.BCR.Invalid); Assert.AreEqual(integratedTotalsOriginal.BCR.SequenceNumber, integratedTotalsWithCP56Copy.BCR.SequenceNumber); } - + [Test()] public void TestSingleRedundancyGroup() { @@ -3551,7 +3561,6 @@ public void TestMultipleRedundancyGroup() int waitTime = 1000; int enqueuedMessage = 0; int maxLoop = server.MaxQueueSize + 3; - int loopCount = 0; while (running && server.IsRunning()) { Thread.Sleep(100); From 32d36c1b46ce35c2844555d912b2d7079b2aacf9 Mon Sep 17 00:00:00 2001 From: Maxson Ramon dos Anjos Medeiros Date: Fri, 7 Mar 2025 17:36:38 +0100 Subject: [PATCH 53/83] -> Separet the ASDUQueue in another .cs file ->Manage high and low priorities queues ->Fix bug on sending ASDU in HighPriorityQueue --- lib60870/ASDUQueue.cs | 372 +++++++++++++++++++++++++++++ lib60870/CS104/ClientConnection.cs | 73 ++++-- lib60870/CS104/Server.cs | 307 ------------------------ lib60870/lib60870.csproj | 5 +- tests/Test.cs | 10 +- 5 files changed, 429 insertions(+), 338 deletions(-) create mode 100644 lib60870/ASDUQueue.cs diff --git a/lib60870/ASDUQueue.cs b/lib60870/ASDUQueue.cs new file mode 100644 index 0000000..b4d7dc7 --- /dev/null +++ b/lib60870/ASDUQueue.cs @@ -0,0 +1,372 @@ +/* + * Copyright 2016-2025 Michael Zillgith + * + * This file is part of lib60870.NET + * + * lib60870.NET is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * lib60870.NET is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with lib60870.NET. If not, see . + * + * See COPYING file for the complete license text. + */ + +using lib60870.CS101; +using lib60870.CS104; +using System; +using System.Threading; + +namespace lib60870 +{ + public class ASDUQueue + { + + private enum QueueEntryState + { + NOT_USED, + WAITING_FOR_TRANSMISSION, + SENT_BUT_NOT_CONFIRMED + } + + private struct ASDUQueueEntry + { + public long entryTimestamp; + public BufferFrame asdu; + public QueueEntryState state; + } + + private ASDUQueueEntry[] enqueuedASDUs = null; + private int oldestQueueEntry = -1; /* first entry in FIFO */ + private int latestQueueEntry = -1; /* last entry in FIFO */ + private int numberOfAsduInQueue = 0; /* number of messages (ASDU) in the queue */ + public SemaphoreSlim queueLock = new SemaphoreSlim(1, 1); + private int maxQueueSize; + + private EnqueueMode enqueueMode; + + private ApplicationLayerParameters parameters; + + private Action DebugLog = null; + + public int NumberOfAsduInQueue { get => numberOfAsduInQueue; set => numberOfAsduInQueue = value; } + + public ASDUQueue(int maxQueueSize, EnqueueMode enqueueMode, ApplicationLayerParameters parameters, Action DebugLog) + { + enqueuedASDUs = new ASDUQueueEntry[maxQueueSize]; + + for (int i = 0; i < maxQueueSize; i++) + { + enqueuedASDUs[i].asdu = new BufferFrame(new byte[260], 6); + enqueuedASDUs[i].state = QueueEntryState.NOT_USED; + } + + this.enqueueMode = enqueueMode; + oldestQueueEntry = -1; + latestQueueEntry = -1; + NumberOfAsduInQueue = 0; + this.maxQueueSize = maxQueueSize; + this.parameters = parameters; + this.DebugLog = DebugLog; + } + + public void EnqueueAsdu(ASDU asdu) + { + lock (enqueuedASDUs) + { + if (NumberOfAsduInQueue == 0) + { + oldestQueueEntry = 0; + latestQueueEntry = 0; + NumberOfAsduInQueue = 1; + + enqueuedASDUs[0].asdu.ResetFrame(); + asdu.Encode(enqueuedASDUs[0].asdu, parameters); + + enqueuedASDUs[0].entryTimestamp = SystemUtils.currentTimeMillis(); + enqueuedASDUs[0].state = QueueEntryState.WAITING_FOR_TRANSMISSION; + } + else + { + bool enqueue = true; + + if (NumberOfAsduInQueue == maxQueueSize) + { + if (enqueueMode == EnqueueMode.REMOVE_OLDEST) + { + } + else if (enqueueMode == EnqueueMode.IGNORE) + { + DebugLog("Queue is full. Ignore new ASDU."); + enqueue = false; + } + else if (enqueueMode == EnqueueMode.THROW_EXCEPTION) + { + throw new ASDUQueueException("Event queue is full."); + } + } + + if (enqueue) + { + latestQueueEntry = (latestQueueEntry + 1) % maxQueueSize; + + if (latestQueueEntry == oldestQueueEntry) + oldestQueueEntry = (oldestQueueEntry + 1) % maxQueueSize; + else + NumberOfAsduInQueue++; + + enqueuedASDUs[latestQueueEntry].asdu.ResetFrame(); + asdu.Encode(enqueuedASDUs[latestQueueEntry].asdu, parameters); + enqueuedASDUs[latestQueueEntry].entryTimestamp = SystemUtils.currentTimeMillis(); + enqueuedASDUs[latestQueueEntry].state = QueueEntryState.WAITING_FOR_TRANSMISSION; + + + } + + } + + } + + DebugLog("Queue contains " + NumberOfAsduInQueue + " messages (oldest: " + oldestQueueEntry + " latest: " + latestQueueEntry + ")"); + + } + + public void LockASDUQueue() + { + Monitor.Enter(enqueuedASDUs); + } + + public void UnlockASDUQueue() + { + Monitor.Exit(enqueuedASDUs); + } + + public bool MessageQueue_hasUnconfirmedIMessages() + { + bool retVal = false; + + if (NumberOfAsduInQueue != 0) + { + int currentIndex = oldestQueueEntry; + + while (currentIndex > 0) + { + if (enqueuedASDUs[currentIndex].state == QueueEntryState.SENT_BUT_NOT_CONFIRMED) + { + retVal = true; + break; + } + + if (currentIndex == latestQueueEntry) + break; + + if (enqueuedASDUs[currentIndex].state == QueueEntryState.NOT_USED) + break; + + currentIndex = (currentIndex + 1) % maxQueueSize; + } + } + return retVal; + } + + internal bool IsAsduAvailable() + { + if (enqueuedASDUs == null) + return false; + + if (NumberOfAsduInQueue > 0) + { + int currentIndex = oldestQueueEntry; + + while (enqueuedASDUs[currentIndex].state != QueueEntryState.WAITING_FOR_TRANSMISSION) + { + // break if we reached the latest entry + if (currentIndex == latestQueueEntry) + break; + + if (enqueuedASDUs[currentIndex].state == QueueEntryState.NOT_USED) + break; + + currentIndex = (currentIndex + 1) % maxQueueSize; + + } + + if (enqueuedASDUs[currentIndex].state == QueueEntryState.WAITING_FOR_TRANSMISSION) + { + enqueuedASDUs[currentIndex].state = QueueEntryState.SENT_BUT_NOT_CONFIRMED; + return true; + } + + return false; + } + + return false; + } + + internal bool IsHighPriorityAsduAvailable() + { + if (enqueuedASDUs == null) + return false; + + if (NumberOfAsduInQueue > 0) + { + return true; + } + else + { + return false; + } + } + + internal BufferFrame GetNextWaitingASDU(out long timestamp, out int index) + { + timestamp = 0; + index = -1; + + if (enqueuedASDUs == null) + return null; + + if (NumberOfAsduInQueue > 0) + { + int currentIndex = oldestQueueEntry; + + while (enqueuedASDUs[currentIndex].state != QueueEntryState.WAITING_FOR_TRANSMISSION) + { + // break if we reached the latest entry + if (currentIndex == latestQueueEntry) + break; + + if (enqueuedASDUs[currentIndex].state == QueueEntryState.NOT_USED) + break; + + currentIndex = (currentIndex + 1) % maxQueueSize; + + } + + if (enqueuedASDUs[currentIndex].state == QueueEntryState.WAITING_FOR_TRANSMISSION) + { + enqueuedASDUs[currentIndex].state = QueueEntryState.SENT_BUT_NOT_CONFIRMED; + timestamp = enqueuedASDUs[currentIndex].entryTimestamp; + index = currentIndex; + return enqueuedASDUs[currentIndex].asdu; + } + + return null; + } + + return null; + } + + internal BufferFrame GetNextHighPriorityWaitingASDU(out long timestamp, out int index) + { + timestamp = 0; + index = -1; + + if (enqueuedASDUs == null) + return null; + + if (NumberOfAsduInQueue > 0) + { + NumberOfAsduInQueue--; + + int currentIndex = oldestQueueEntry; + + BufferFrame bufferFrame = enqueuedASDUs[currentIndex].asdu; + + timestamp = enqueuedASDUs[currentIndex].entryTimestamp; + index = currentIndex; + + return bufferFrame; + } + + return null; + } + + public void UnmarkAllASDUs() + { + lock (enqueuedASDUs) + { + if (NumberOfAsduInQueue > 0) + { + for (int i = 0; i < enqueuedASDUs.Length; i++) + { + if (enqueuedASDUs[i].state == QueueEntryState.SENT_BUT_NOT_CONFIRMED) + enqueuedASDUs[i].state = QueueEntryState.WAITING_FOR_TRANSMISSION; + } + } + } + } + + public void MarkASDUAsConfirmed(int index, long timestamp) + { + if (enqueuedASDUs == null) + return; + + if ((index < 0) || (index > enqueuedASDUs.Length)) + return; + + lock (enqueuedASDUs) + { + if (numberOfAsduInQueue > 0) + { + if (enqueuedASDUs[index].state == QueueEntryState.SENT_BUT_NOT_CONFIRMED) + { + if (enqueuedASDUs[index].entryTimestamp == timestamp) + { + int currentIndex = index; + + while (enqueuedASDUs[currentIndex].state == QueueEntryState.SENT_BUT_NOT_CONFIRMED) + { + DebugLog("Remove from queue with index " + currentIndex); + + enqueuedASDUs[currentIndex].state = QueueEntryState.NOT_USED; + enqueuedASDUs[currentIndex].entryTimestamp = 0; + NumberOfAsduInQueue -= 1; + + if (NumberOfAsduInQueue == 0) + { + oldestQueueEntry = -1; + latestQueueEntry = -1; + + break; + } + + if (currentIndex == oldestQueueEntry) + { + oldestQueueEntry = (index + 1) % maxQueueSize; + + if (NumberOfAsduInQueue == 1) + latestQueueEntry = oldestQueueEntry; + + break; + } + + currentIndex = currentIndex - 1; + + if (currentIndex < 0) + currentIndex = maxQueueSize - 1; + + // break if we reached the first deleted entry again + if (currentIndex == index) + break; + + } + + DebugLog("queue state: noASDUs: " + NumberOfAsduInQueue + " oldest: " + oldestQueueEntry + " latest: " + latestQueueEntry); + } + } + } + } + + } + + } + +} diff --git a/lib60870/CS104/ClientConnection.cs b/lib60870/CS104/ClientConnection.cs index ffcd5fe..94237b6 100644 --- a/lib60870/CS104/ClientConnection.cs +++ b/lib60870/CS104/ClientConnection.cs @@ -26,6 +26,7 @@ using System.Net; using System.Net.Security; using System.Net.Sockets; +using System.Reflection; using System.Security.Cryptography.X509Certificates; using System.Threading; @@ -574,60 +575,80 @@ private bool sendNextHighPriorityASDU() if (isSentBufferFull()) return false; - int currentIndex = 0; long timestamp; + int index; - BufferFrame asdu = highPrioQueue.GetNextWaitingASDU(out timestamp, out currentIndex); - - if (asdu != null) - { + highPrioQueue.LockASDUQueue(); + BufferFrame asdu = highPrioQueue.GetNextHighPriorityWaitingASDU(out timestamp, out index); - if (oldestSentASDU == -1) + try + { + if (asdu != null) { - oldestSentASDU = 0; - newestSentASDU = 0; + int currentIndex = 0; - } - else - { - currentIndex = (newestSentASDU + 1) % maxSentASDUs; - } + if (oldestSentASDU == -1) + { + oldestSentASDU = 0; + newestSentASDU = 0; + + } + else + { + currentIndex = (newestSentASDU + 1) % maxSentASDUs; + } - sentASDUs[currentIndex].queueIndex = -1; - sentASDUs[currentIndex].entryTime = timestamp; - sentASDUs[currentIndex].seqNo = SendIMessage(asdu); - sentASDUs[currentIndex].sentTime = SystemUtils.currentTimeMillis(); + sentASDUs[currentIndex].entryTime = timestamp; + sentASDUs[currentIndex].queueIndex = index; + sentASDUs[currentIndex].seqNo = SendIMessage(asdu); + sentASDUs[currentIndex].sentTime = SystemUtils.currentTimeMillis(); - newestSentASDU = currentIndex; + newestSentASDU = currentIndex; - PrintSendBuffer(); + PrintSendBuffer(); + } } - else - return false; + finally + { + highPrioQueue.UnlockASDUQueue(); + } + } return true; } - private void SendWaitingASDUs() + /// + /// Send all high-priority ASDUs and the last waiting ASDU from the low-priority queue. + /// Returns true if ASDUs are still waiting.This can happen when there are more ASDUs + /// in the event (low-priority) buffer, or the connection is unavailable to send the high-priority + /// ASDUs (congestion or connection lost). + /// + private bool SendWaitingASDUs() { lock (highPrioQueue) { - - while (highPrioQueue.IsAsduAvailable()) + /* send all available high priority ASDUs first */ + while (highPrioQueue.IsHighPriorityAsduAvailable()) { if (sendNextHighPriorityASDU() == false) - return; + return true; if (running == false) - return; + return true; } } + /* send messages from low-priority queue */ sendNextAvailableASDU(); + + if (lowPrioQueue.NumberOfAsduInQueue > 0) + return true; + else + return false; } private void SendASDUInternal(ASDU asdu) diff --git a/lib60870/CS104/Server.cs b/lib60870/CS104/Server.cs index fc2c36d..4f38337 100644 --- a/lib60870/CS104/Server.cs +++ b/lib60870/CS104/Server.cs @@ -112,313 +112,6 @@ public enum EnqueueMode THROW_EXCEPTION } - internal class ASDUQueue - { - - private enum QueueEntryState - { - NOT_USED, - WAITING_FOR_TRANSMISSION, - SENT_BUT_NOT_CONFIRMED - } - - private struct ASDUQueueEntry - { - public long entryTimestamp; - public BufferFrame asdu; - public QueueEntryState state; - } - - // Queue for messages (ASDUs) - private ASDUQueueEntry[] enqueuedASDUs = null; - private int oldestQueueEntry = -1; - private int latestQueueEntry = -1; - private int numberOfAsduInQueue = 0; - public SemaphoreSlim queueLock = new SemaphoreSlim(1, 1); - private int maxQueueSize; - - private EnqueueMode enqueueMode; - - private ApplicationLayerParameters parameters; - - private Action DebugLog = null; - - public int NumberOfAsduInQueue { get => numberOfAsduInQueue; set => numberOfAsduInQueue = value; } - - public ASDUQueue(int maxQueueSize, EnqueueMode enqueueMode, ApplicationLayerParameters parameters, Action DebugLog) - { - enqueuedASDUs = new ASDUQueueEntry[maxQueueSize]; - - for (int i = 0; i < maxQueueSize; i++) - { - enqueuedASDUs[i].asdu = new BufferFrame(new byte[260], 6); - enqueuedASDUs[i].state = QueueEntryState.NOT_USED; - } - - this.enqueueMode = enqueueMode; - oldestQueueEntry = -1; - latestQueueEntry = -1; - NumberOfAsduInQueue = 0; - this.maxQueueSize = maxQueueSize; - this.parameters = parameters; - this.DebugLog = DebugLog; - } - - - - public void EnqueueAsdu(ASDU asdu) - { - lock (enqueuedASDUs) - { - if (oldestQueueEntry == -1) - { - oldestQueueEntry = 0; - latestQueueEntry = 0; - NumberOfAsduInQueue = 1; - - enqueuedASDUs[0].asdu.ResetFrame(); - asdu.Encode(enqueuedASDUs[0].asdu, parameters); - - enqueuedASDUs[0].entryTimestamp = SystemUtils.currentTimeMillis(); - enqueuedASDUs[0].state = QueueEntryState.WAITING_FOR_TRANSMISSION; - } - else - { - bool enqueue = true; - - if (NumberOfAsduInQueue == maxQueueSize) - { - if (enqueueMode == EnqueueMode.REMOVE_OLDEST) - { - } - else if (enqueueMode == EnqueueMode.IGNORE) - { - DebugLog("Queue is full. Ignore new ASDU."); - enqueue = false; - } - else if (enqueueMode == EnqueueMode.THROW_EXCEPTION) - { - throw new ASDUQueueException("Event queue is full."); - } - } - - if (enqueue) - { - latestQueueEntry = (latestQueueEntry + 1) % maxQueueSize; - - if (latestQueueEntry == oldestQueueEntry) - oldestQueueEntry = (oldestQueueEntry + 1) % maxQueueSize; - else - NumberOfAsduInQueue++; - - enqueuedASDUs[latestQueueEntry].asdu.ResetFrame(); - asdu.Encode(enqueuedASDUs[latestQueueEntry].asdu, parameters); - enqueuedASDUs[latestQueueEntry].entryTimestamp = SystemUtils.currentTimeMillis(); - enqueuedASDUs[latestQueueEntry].state = QueueEntryState.WAITING_FOR_TRANSMISSION; - - - } - - } - - } - - DebugLog("Queue contains " + NumberOfAsduInQueue + " messages (oldest: " + oldestQueueEntry + " latest: " + latestQueueEntry + ")"); - - } - - public void LockASDUQueue() - { - Monitor.Enter(enqueuedASDUs); - } - - public void UnlockASDUQueue() - { - Monitor.Exit(enqueuedASDUs); - } - - public bool MessageQueue_hasUnconfirmedIMessages() - { - bool retVal = false; - - if (NumberOfAsduInQueue != 0) - { - int currentIndex = oldestQueueEntry; - - while (currentIndex > 0) - { - if (enqueuedASDUs[currentIndex].state == QueueEntryState.SENT_BUT_NOT_CONFIRMED) - { - retVal = true; - break; - } - - if (currentIndex == latestQueueEntry) - break; - - if (enqueuedASDUs[currentIndex].state == QueueEntryState.NOT_USED) - break; - - currentIndex = (currentIndex + 1) % maxQueueSize; - } - } - return retVal; - } - - internal bool IsAsduAvailable() - { - if (enqueuedASDUs == null) - return false; - - if (NumberOfAsduInQueue > 0) - { - int currentIndex = oldestQueueEntry; - - while (enqueuedASDUs[currentIndex].state != QueueEntryState.WAITING_FOR_TRANSMISSION) - { - // break if we reached the latest entry - if (currentIndex == latestQueueEntry) - break; - - if (enqueuedASDUs[currentIndex].state == QueueEntryState.NOT_USED) - break; - - currentIndex = (currentIndex + 1) % maxQueueSize; - - } - - if (enqueuedASDUs[currentIndex].state == QueueEntryState.WAITING_FOR_TRANSMISSION) - { - enqueuedASDUs[currentIndex].state = QueueEntryState.SENT_BUT_NOT_CONFIRMED; - return true; - } - - return false; - } - - return false; - } - - internal BufferFrame GetNextWaitingASDU(out long timestamp, out int index) - { - timestamp = 0; - index = -1; - - if (enqueuedASDUs == null) - return null; - - if (NumberOfAsduInQueue > 0) - { - int currentIndex = oldestQueueEntry; - - while (enqueuedASDUs[currentIndex].state != QueueEntryState.WAITING_FOR_TRANSMISSION) - { - // break if we reached the latest entry - if (currentIndex == latestQueueEntry) - break; - - if (enqueuedASDUs[currentIndex].state == QueueEntryState.NOT_USED) - break; - - currentIndex = (currentIndex + 1) % maxQueueSize; - - } - - if (enqueuedASDUs[currentIndex].state == QueueEntryState.WAITING_FOR_TRANSMISSION) - { - enqueuedASDUs[currentIndex].state = QueueEntryState.SENT_BUT_NOT_CONFIRMED; - timestamp = enqueuedASDUs[currentIndex].entryTimestamp; - index = currentIndex; - return enqueuedASDUs[currentIndex].asdu; - } - - return null; - } - - return null; - } - - public void UnmarkAllASDUs() - { - lock (enqueuedASDUs) - { - if (NumberOfAsduInQueue > 0) - { - for (int i = 0; i < enqueuedASDUs.Length; i++) - { - if (enqueuedASDUs[i].state == QueueEntryState.SENT_BUT_NOT_CONFIRMED) - enqueuedASDUs[i].state = QueueEntryState.WAITING_FOR_TRANSMISSION; - } - } - } - } - - public void MarkASDUAsConfirmed(int index, long timestamp) - { - if (enqueuedASDUs == null) - return; - - if ((index < 0) || (index > enqueuedASDUs.Length)) - return; - - lock (enqueuedASDUs) - { - if (numberOfAsduInQueue > 0) - { - if (enqueuedASDUs[index].state == QueueEntryState.SENT_BUT_NOT_CONFIRMED) - { - if (enqueuedASDUs[index].entryTimestamp == timestamp) - { - int currentIndex = index; - - while (enqueuedASDUs[currentIndex].state == QueueEntryState.SENT_BUT_NOT_CONFIRMED) - { - DebugLog("Remove from queue with index " + currentIndex); - - enqueuedASDUs[currentIndex].state = QueueEntryState.NOT_USED; - enqueuedASDUs[currentIndex].entryTimestamp = 0; - NumberOfAsduInQueue -= 1; - - if (NumberOfAsduInQueue == 0) - { - oldestQueueEntry = -1; - latestQueueEntry = -1; - - break; - } - - if (currentIndex == oldestQueueEntry) - { - oldestQueueEntry = (index + 1) % maxQueueSize; - - if (NumberOfAsduInQueue == 1) - latestQueueEntry = oldestQueueEntry; - - break; - } - - currentIndex = currentIndex - 1; - - if (currentIndex < 0) - currentIndex = maxQueueSize - 1; - - // break if we reached the first deleted entry again - if (currentIndex == index) - break; - - } - - DebugLog("queue state: noASDUs: " + NumberOfAsduInQueue + " oldest: " + oldestQueueEntry + " latest: " + latestQueueEntry); - } - } - } - } - - } - - - } - /// /// Representation of a redundancy group. A redundancy group is a group of connections that share a unique /// event queue. Only one connection in a redundancy group can be active. diff --git a/lib60870/lib60870.csproj b/lib60870/lib60870.csproj index 34bb7c6..d8e508f 100644 --- a/lib60870/lib60870.csproj +++ b/lib60870/lib60870.csproj @@ -21,6 +21,7 @@ GPL-3.0-only + @@ -88,8 +89,8 @@ - - + + diff --git a/tests/Test.cs b/tests/Test.cs index 6399aff..4f15169 100644 --- a/tests/Test.cs +++ b/tests/Test.cs @@ -2983,6 +2983,8 @@ public void TestFileUploadSingleSection() server.GetAvailableFiles().AddFile(file); + Thread.Sleep(2000); + Connection con = new Connection("127.0.0.1", 2404); con.Connect(); @@ -2990,10 +2992,12 @@ public void TestFileUploadSingleSection() Receiver receiver = new Receiver(); + Assert.IsTrue(con.IsRunning); + Assert.IsTrue(server.IsRunning()); + try { - - con.GetFile(1, 30000, NameOfFile.TRANSPARENT_FILE, receiver, 10000); + con.GetFile(1, 30000, NameOfFile.TRANSPARENT_FILE, receiver, 30000); } catch (Exception ex) { @@ -3001,7 +3005,7 @@ public void TestFileUploadSingleSection() Assert.Fail("GetFile failed!"); } - Thread.Sleep(15000); + Thread.Sleep(30000); Assert.IsTrue(receiver.finishedCalled); Assert.AreEqual(100, receiver.recvdBytes); Assert.AreEqual(1, receiver.lastSection); From e37991479b826eee0015615b7a96d8e3adc0eb6c Mon Sep 17 00:00:00 2001 From: Maxson Ramon dos Anjos Medeiros Date: Tue, 18 Mar 2025 14:50:43 +0100 Subject: [PATCH 54/83] Only send last ASDU if lastSendASDU!= null -> on linkLayer.SendVariableLengthFramePrimary --- lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs b/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs index 465bf22..193feff 100644 --- a/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs +++ b/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs @@ -365,7 +365,8 @@ public override void RunStateMachine() else { DebugLog("PLL - repeat last ASDU"); - linkLayer.SendVariableLengthFramePrimary(FunctionCodePrimary.USER_DATA_CONFIRMED, linkLayerAddressOtherStation, !nextFcb, true, lastSendASDU); + if(lastSendASDU != null) + linkLayer.SendVariableLengthFramePrimary(FunctionCodePrimary.USER_DATA_CONFIRMED, linkLayerAddressOtherStation, !nextFcb, true, lastSendASDU); } lastSendTime = currentTime; From 63fce72dabb82c0ca396325cd5a46e6704fc5bbc Mon Sep 17 00:00:00 2001 From: Maxson Ramon dos Anjos Medeiros Date: Tue, 18 Mar 2025 15:04:58 +0100 Subject: [PATCH 55/83] ->Filx bug - confirm all unconfirmed messages before stopping the connection; ->Fix - send unconfirmed messages before closing the socket --- lib60870/CS104/Connection.cs | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/lib60870/CS104/Connection.cs b/lib60870/CS104/Connection.cs index f2671d1..5739363 100644 --- a/lib60870/CS104/Connection.cs +++ b/lib60870/CS104/Connection.cs @@ -1944,7 +1944,18 @@ private void HandleConnection() DebugLog("CLOSE CONNECTION!"); - // Release the socket. + + if (unconfirmedReceivedIMessages > 0) + { + /* confirm all unconfirmed messages before stopping the connection */ + + lastConfirmationTime = SystemUtils.currentTimeMillis(); + + unconfirmedReceivedIMessages = 0; + timeoutT2Triggered = false; + + SendSMessage(); + } running = false; @@ -1954,7 +1965,6 @@ private void HandleConnection() { try { - //socket.Shutdown(SocketShutdown.Both); socket.Shutdown(SocketShutdown.Receive); } catch (SocketException ex) @@ -2003,18 +2013,6 @@ private void HandleConnection() DebugLog(e.ToString()); } - if (unconfirmedReceivedIMessages > 0) - { - /* confirm all unconfirmed messages before stopping the connection */ - - lastConfirmationTime = SystemUtils.currentTimeMillis(); - - unconfirmedReceivedIMessages = 0; - timeoutT2Triggered = false; - - SendSMessage(); - } - conState = CS104_ConState.STATE_IDLE; running = false; From 4e2274b87d1cb67ae9f33bbe53c36fe88f983154 Mon Sep 17 00:00:00 2001 From: Maxson Ramon dos Anjos Medeiros Date: Tue, 18 Mar 2025 15:17:01 +0100 Subject: [PATCH 56/83] Fix bug on nof --- examples/cs104-client-file-upload/Program.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/cs104-client-file-upload/Program.cs b/examples/cs104-client-file-upload/Program.cs index 23cb296..97e4c86 100644 --- a/examples/cs104-client-file-upload/Program.cs +++ b/examples/cs104-client-file-upload/Program.cs @@ -39,7 +39,7 @@ public static void Main (string [] args) int fileIoa = 30001; if (args.Length == 0) { - Console.WriteLine ("upload [CA] [IOA]"); + Console.WriteLine ("upload "+ hostname + " ["+ fileCa.ToString() + "] ["+ fileIoa.ToString()+ "]"); } else { for (int i = 0; i < args.Length; i++) { if (i == 0) @@ -73,7 +73,7 @@ public static void Main (string [] args) file.AddSection (fileData); } - con.SendFile (fileCa, fileIoa, (NameOfFile) 12, file); + con.SendFile (fileCa, fileIoa, NameOfFile.TRANSPARENT_FILE, file); file.WaitUntilTransferIsComplete (); From dc2a5f46afc720505d9a7276b93186244a2b3098 Mon Sep 17 00:00:00 2001 From: Maxson Ramon dos Anjos Medeiros Date: Tue, 18 Mar 2025 15:35:57 +0100 Subject: [PATCH 57/83] Clean auto commented code --- examples/cs101-master-balanced/Program.cs | 2 +- examples/cs101-master-unbalanced/Program.cs | 2 +- examples/cs101-slave-balanced/Program.cs | 2 +- examples/cs101-slave-unbalanced/Program.cs | 2 +- lib60870/ASDUQueue.cs | 3 -- lib60870/CS101/CS101Slave.cs | 4 +-- lib60870/CS101/FileServices.cs | 22 +++++++------ lib60870/CS104/ClientConnection.cs | 32 ++++++++----------- lib60870/CS104/Connection.cs | 20 ++++++------ .../LinkLayer/PrimaryLinkLayerBalanced.cs | 2 +- 10 files changed, 40 insertions(+), 51 deletions(-) diff --git a/examples/cs101-master-balanced/Program.cs b/examples/cs101-master-balanced/Program.cs index 62091d5..cc61c68 100644 --- a/examples/cs101-master-balanced/Program.cs +++ b/examples/cs101-master-balanced/Program.cs @@ -32,7 +32,7 @@ public static void Main (string [] args) running = false; }; - string portName = "/dev/ttyUSB1"; + string portName = "COM1"; if (args.Length > 0) portName = args [0]; diff --git a/examples/cs101-master-unbalanced/Program.cs b/examples/cs101-master-unbalanced/Program.cs index c244cc4..9bd932d 100644 --- a/examples/cs101-master-unbalanced/Program.cs +++ b/examples/cs101-master-unbalanced/Program.cs @@ -106,7 +106,7 @@ public static void Main (string[] args) running = false; }; - string portName = "COM6"; + string portName = "COM1"; if (args.Length > 0) portName = args [0]; diff --git a/examples/cs101-slave-balanced/Program.cs b/examples/cs101-slave-balanced/Program.cs index 8456176..21160f4 100644 --- a/examples/cs101-slave-balanced/Program.cs +++ b/examples/cs101-slave-balanced/Program.cs @@ -58,7 +58,7 @@ public static void Main (string[] args) running = false; }; - string portName = "COM5"; // e.g. "COM3" on windows + string portName = "COM2"; // e.g. "COM3" on windows if (args.Length > 0) portName = args [0]; diff --git a/examples/cs101-slave-unbalanced/Program.cs b/examples/cs101-slave-unbalanced/Program.cs index d9da413..fa21dea 100644 --- a/examples/cs101-slave-unbalanced/Program.cs +++ b/examples/cs101-slave-unbalanced/Program.cs @@ -64,7 +64,7 @@ public static void Main (string[] args) running = false; }; - string portName = "COM5"; + string portName = "COM2"; if (args.Length > 0) portName = args [0]; diff --git a/lib60870/ASDUQueue.cs b/lib60870/ASDUQueue.cs index b4d7dc7..2ee017e 100644 --- a/lib60870/ASDUQueue.cs +++ b/lib60870/ASDUQueue.cs @@ -187,7 +187,6 @@ internal bool IsAsduAvailable() while (enqueuedASDUs[currentIndex].state != QueueEntryState.WAITING_FOR_TRANSMISSION) { - // break if we reached the latest entry if (currentIndex == latestQueueEntry) break; @@ -239,7 +238,6 @@ internal BufferFrame GetNextWaitingASDU(out long timestamp, out int index) while (enqueuedASDUs[currentIndex].state != QueueEntryState.WAITING_FOR_TRANSMISSION) { - // break if we reached the latest entry if (currentIndex == latestQueueEntry) break; @@ -353,7 +351,6 @@ public void MarkASDUAsConfirmed(int index, long timestamp) if (currentIndex < 0) currentIndex = maxQueueSize - 1; - // break if we reached the first deleted entry again if (currentIndex == index) break; diff --git a/lib60870/CS101/CS101Slave.cs b/lib60870/CS101/CS101Slave.cs index 0ff55c8..2306ed7 100644 --- a/lib60870/CS101/CS101Slave.cs +++ b/lib60870/CS101/CS101Slave.cs @@ -123,8 +123,6 @@ void ISecondaryApplicationLayer.ResetCUReceived(bool onlyFcb) * END ISecondaryApplicationLayer ********************************************/ - // private bool sendLinkLayerTestFunction = false; - private LinkLayer linkLayer = null; private byte[] buffer = new byte[300]; @@ -137,7 +135,7 @@ void ISecondaryApplicationLayer.ResetCUReceived(bool onlyFcb) private int linkLayerAddress = 0; private int linkLayerAddressOtherStation; - // link layer address of other station in balanced mode + /* link layer address of other station in balanced mode */ private Queue userDataClass1Queue = new Queue(); private int userDataClass1QueueMaxSize = 100; diff --git a/lib60870/CS101/FileServices.cs b/lib60870/CS101/FileServices.cs index 43ba5c8..41a1480 100644 --- a/lib60870/CS101/FileServices.cs +++ b/lib60870/CS101/FileServices.cs @@ -16,7 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with lib60870.NET. If not, see . + * along with lib60870.NET. If not, see . * * See COPYING file for the complete license text. */ @@ -419,7 +421,7 @@ public bool HandleFileAsdu(ASDU asdu) if ((asdu.Ca == ca)) { - // send first segment + /* send first segment */ currentSectionOffset = 0; @@ -772,7 +774,7 @@ public void HandleFileService() } } - // Check for timeout + /* Check for timeout */ if (state != FileClientState.IDLE) { if (SystemUtils.currentTimeMillis() > lastSentTime + timeout) @@ -1121,7 +1123,7 @@ public bool HandleFileAsdu(ASDU asdu) ioa = fileReady.ObjectAddress; nof = fileReady.NOF; - // send call file + /* send call file */ ASDU callFile = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, asdu.Ca, false); @@ -1154,7 +1156,7 @@ public bool HandleFileAsdu(ASDU asdu) currentSectionOffset = 0; currentSectionSize = sectionReady.LengthOfSection; - // send call section + /* send call section */ ASDU callSection = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, ca, false); @@ -1465,7 +1467,7 @@ public bool HandleFileAsdu(ASDU asdu) ASDU fileReady = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, asdu.Ca, false); - // check if already selected + /* check if already selected */ if (file.selectedBy == null) { file.selectedBy = this; @@ -1592,7 +1594,7 @@ public bool HandleFileAsdu(ASDU asdu) if (currentSectionSize > 0) { - // send section ready with new section number + /* send section ready with new section number */ ASDU sectionReady = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, asdu.Ca, false); @@ -1611,7 +1613,7 @@ public bool HandleFileAsdu(ASDU asdu) } else { - // send last section PDU + /* send last section PDU */ ASDU lastSection = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, asdu.Ca, false); @@ -1709,7 +1711,7 @@ public void HandleFileTransmission() if (currentSectionOffset == currentSectionSize) { - // send last segment + /* send last segment */ fileAsdu.AddInformationObject( new FileLastSegmentOrSection(file.GetIOA(), file.GetNameOfFile(), @@ -1769,7 +1771,7 @@ public void HandleFileTransmission() } } - // check for timeout + /* check for timeout */ if (SystemUtils.currentTimeMillis() > lastSentTime + timeout) { logger("Abort file transfer due to timeout"); diff --git a/lib60870/CS104/ClientConnection.cs b/lib60870/CS104/ClientConnection.cs index 94237b6..dc119c1 100644 --- a/lib60870/CS104/ClientConnection.cs +++ b/lib60870/CS104/ClientConnection.cs @@ -104,7 +104,7 @@ private void DebugLog(string msg) /* data structure for k-size sent ASDU buffer */ private struct SentASDU { - // required to identify message in server (low-priority) queue + /* required to identify message in server (low-priority) queue */ public long entryTime; /* -1 if ASDU is not from low-priority queue */ @@ -202,7 +202,6 @@ internal ClientConnection(Socket socket, TlsSecurityInformation tlsSecInfo, APCI receivedASDUs = new ConcurrentQueue(); highPrioQueue = new ASDUQueue(server.MaxHighPrioQueueSize, server.EnqueueMode, alParameters, DebugLog); - //highPrioQueue = new Queue(); socketStream = new NetworkStream(socket); this.socket = socket; @@ -340,7 +339,7 @@ private int receiveMessage(byte[] buffer) if (readState == 0) { - // wait for start byte + /* wait for start byte */ if (socketStream.Read(buffer, 0, 1) != 1) return -1; @@ -356,7 +355,7 @@ private int receiveMessage(byte[] buffer) if (readState == 1) { - // read length byte + /* read length byte */ if (socketStream.Read(buffer, 1, 1) != 1) return 0; @@ -415,7 +414,6 @@ private void SendSMessage() } catch (System.IO.IOException) { - // socket error --> close connection running = false; } } @@ -452,7 +450,6 @@ private int SendIMessage(BufferFrame asdu) } catch (System.IO.IOException) { - // socket error --> close connection running = false; } @@ -1062,7 +1059,7 @@ private bool CheckSequenceNumber(int seqNo) } else { - // Two cases are required to reflect sequence number overflow + /* Two cases are required to reflect sequence number overflow */ if (sentASDUs[oldestSentASDU].seqNo <= sentASDUs[newestSentASDU].seqNo) { if ((seqNo >= sentASDUs[oldestSentASDU].seqNo) && @@ -1215,7 +1212,7 @@ private bool HandleMessage(byte[] buffer, int msgSize) { ASDU asdu = new ASDU(alParameters, buffer, 6, msgSize); - // push to handler thread for processing + /* push to handler thread for processing */ DebugLog("Enqueue received I-message for processing"); receivedASDUs.Enqueue(asdu); } @@ -1227,14 +1224,14 @@ private bool HandleMessage(byte[] buffer, int msgSize) } else { - // connection not active + /* connection not active */ DebugLog("Connection not active -> close connection"); return false; } } - // Check for TESTFR_ACT message + /* Check for TESTFR_ACT message */ else if ((buffer[2] & 0x43) == 0x43) { DebugLog("Send TESTFR_CON"); @@ -1242,7 +1239,7 @@ private bool HandleMessage(byte[] buffer, int msgSize) socketStream.Write(TESTFR_CON_MSG, 0, TESTFR_CON_MSG.Length); } - // Check for STARTDT_ACT message + /* Check for STARTDT_ACT message */ else if ((buffer[2] & 0x07) == 0x07) { if (isActive == false) @@ -1257,7 +1254,7 @@ private bool HandleMessage(byte[] buffer, int msgSize) socketStream.Write(STARTDT_CON_MSG, 0, TESTFR_CON_MSG.Length); } - // Check for STOPDT_ACT message + /* Check for STOPDT_ACT message */ else if ((buffer[2] & 0x13) == 0x13) { DebugLog("Received STARTDT_ACT"); @@ -1301,7 +1298,7 @@ private bool HandleMessage(byte[] buffer, int msgSize) } } - // Check for TESTFR_CON message + /* Check for TESTFR_CON message */ else if ((buffer[2] & 0x83) == 0x83) { DebugLog("Recv TESTFR_CON"); @@ -1311,7 +1308,7 @@ private bool HandleMessage(byte[] buffer, int msgSize) ResetT3Timeout(currentTime); } - // S-message + /* S-message */ else if (buffer[2] == 0x01) { int seqNo = (buffer[4] + buffer[5] * 0x100) / 2; @@ -1397,7 +1394,6 @@ private bool handleTimeouts() { DebugLog("Timeout for TESTFR_CON message"); - // close connection return false; } } @@ -1569,7 +1565,7 @@ private void HandleConnection() try { - // Receive the response from the remote device. + /* Receive the response from the remote device */ int bytesRec = receiveMessage(bytes); if (bytesRec > 0) @@ -1620,8 +1616,6 @@ private void HandleConnection() DebugLog("CLOSE CONNECTION!"); - // Release the socket. - socket.Shutdown(SocketShutdown.Both); socket.Close(); @@ -1650,7 +1644,7 @@ private void HandleConnection() DebugLog(e.ToString()); } - // unmark unconfirmed messages in queue if k-buffer not empty + /* unmark unconfirmed messages in queue if k-buffer not empty */ if (oldestSentASDU != -1) lowPrioQueue.UnmarkAllASDUs(); diff --git a/lib60870/CS104/Connection.cs b/lib60870/CS104/Connection.cs index 5739363..b833c40 100644 --- a/lib60870/CS104/Connection.cs +++ b/lib60870/CS104/Connection.cs @@ -1284,7 +1284,7 @@ private int receiveMessage(byte[] buffer) if (readState == 0) { - // wait for start byte + /* wait for start byte */ if (netStream.Read(buffer, 0, 1) != 1) return -1; @@ -1300,7 +1300,7 @@ private int receiveMessage(byte[] buffer) if (readState == 1) { - // read length byte + /* read length byte */ if (netStream.Read(buffer, 1, 1) != 1) return 0; @@ -1421,7 +1421,8 @@ private bool checkMessage(byte[] buffer, int msgSize) uMessageTimeout = 0; if (buffer[2] == 0x43) - { // Check for TESTFR_ACT message + { + /* Check for TESTFR_ACT message */ statistics.RcvdTestFrActCounter++; DebugLog("RCVD TESTFR_ACT"); DebugLog("SEND TESTFR_CON"); @@ -1527,7 +1528,7 @@ private void ConnectSocketWithTimeout() throw new SocketException(87); // wrong argument } - // Create a TCP/IP socket. + /* Create a TCP/IP socket. */ socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); @@ -1566,7 +1567,7 @@ private void ConnectSocketWithTimeout() DebugLog("ObjectDisposedException -> Connect canceled"); - throw new SocketException(995); // WSA_OPERATION_ABORTED + throw new SocketException(995); /* WSA_OPERATION_ABORTED */ } } else @@ -1575,7 +1576,6 @@ private void ConnectSocketWithTimeout() { try { - //socket.Shutdown(SocketShutdown.Both); socket.Shutdown(SocketShutdown.Receive); } catch (SocketException ex) @@ -1590,7 +1590,7 @@ private void ConnectSocketWithTimeout() socket.Close(0); socket = null; - throw new SocketException(10060); // Connection timed out (WSAETiMEDOUT) + throw new SocketException(10060); /* Connection timed out (WSAETiMEDOUT) */ } } @@ -1605,7 +1605,6 @@ private bool handleTimeouts() { DebugLog("Timeout for TESTFR_CON message"); - // close connection return false; } else @@ -1740,7 +1739,7 @@ private void HandleConnection() try { - // Connect to a remote device. + /* Connect to a remote device. */ ConnectSocketWithTimeout(); DebugLog("Socket connected to " + socket.RemoteEndPoint.ToString()); @@ -1853,7 +1852,7 @@ private void HandleConnection() try { - // Receive a message from the remote device. + /* Receive a message from the remote device. */ int bytesRec = receiveMessage(bytes); if (bytesRec > 0) @@ -2039,7 +2038,6 @@ public void Cancel() { try { - //socket.Shutdown(SocketShutdown.Both); socket.Shutdown(SocketShutdown.Receive); } catch (SocketException ex) diff --git a/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs b/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs index 193feff..9dc8b52 100644 --- a/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs +++ b/lib60870/LinkLayer/PrimaryLinkLayerBalanced.cs @@ -36,7 +36,7 @@ internal class PrimaryLinkLayerBalanced : PrimaryLinkLayer private bool sendLinkLayerTestFunction = false; private bool nextFcb = true; - private BufferFrame lastSendASDU = null; // last send ASDU for message repetition after timeout + private BufferFrame lastSendASDU = null; /* last send ASDU for message repetition after timeout */ private int linkLayerAddressOtherStation = 0; From 82f011cf177e7f13f9ea9e9ae0abfa568b2f60f7 Mon Sep 17 00:00:00 2001 From: Maxson Ramon dos Anjos Medeiros Date: Tue, 18 Mar 2025 16:17:28 +0100 Subject: [PATCH 58/83] Check COT = FileTranfer on fileHandler for every case and return UNKNOWN_CAUSE_OF_TRANSMISSION asdu when different --- lib60870/ASDUQueue.cs | 6 +- lib60870/CS101/CS101Slave.cs | 1 - lib60870/CS101/FileServices.cs | 214 ++++++++++-------- lib60870/CS104/Connection.cs | 4 +- .../LinkLayer/TcpClientVirtualSerialPort.cs | 2 +- 5 files changed, 128 insertions(+), 99 deletions(-) diff --git a/lib60870/ASDUQueue.cs b/lib60870/ASDUQueue.cs index 2ee017e..0641ab1 100644 --- a/lib60870/ASDUQueue.cs +++ b/lib60870/ASDUQueue.cs @@ -14,7 +14,11 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with lib60870.NET. If not, see . + * along with lib60870.NET. If not, see . * * See COPYING file for the complete license text. */ diff --git a/lib60870/CS101/CS101Slave.cs b/lib60870/CS101/CS101Slave.cs index 2306ed7..daa0be1 100644 --- a/lib60870/CS101/CS101Slave.cs +++ b/lib60870/CS101/CS101Slave.cs @@ -108,7 +108,6 @@ bool ISecondaryApplicationLayer.HandleReceivedData(byte[] msg, bool isBroadcast, void ISecondaryApplicationLayer.ResetCUReceived(bool onlyFcb) { - //TODO delete data queues lock (userDataClass1Queue) { userDataClass1Queue.Clear(); diff --git a/lib60870/CS101/FileServices.cs b/lib60870/CS101/FileServices.cs index 41a1480..afa2a9d 100644 --- a/lib60870/CS101/FileServices.cs +++ b/lib60870/CS101/FileServices.cs @@ -1103,43 +1103,51 @@ public bool HandleFileAsdu(ASDU asdu) logger("Received file ready F_FR_NA_1"); - if (fileReadyHandler != null) + if (asdu.Cot == CauseOfTransmission.FILE_TRANSFER) { + if (fileReadyHandler != null) + { - FileReady fileReady = (FileReady)asdu.GetElement(0); + FileReady fileReady = (FileReady)asdu.GetElement(0); - fileReceiver = fileReadyHandler(fileReadyHandlerParameter, asdu.Ca, fileReady.ObjectAddress, fileReady.NOF, fileReady.LengthOfFile); + fileReceiver = fileReadyHandler(fileReadyHandlerParameter, asdu.Ca, fileReady.ObjectAddress, fileReady.NOF, fileReady.LengthOfFile); - if (fileReceiver == null) - { - asdu.IsNegative = true; - asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; - connection.SendASDU(asdu); - } - else - { + if (fileReceiver == null) + { + asdu.IsNegative = true; + asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; + connection.SendASDU(asdu); + } + else + { - ca = asdu.Ca; - ioa = fileReady.ObjectAddress; - nof = fileReady.NOF; + ca = asdu.Ca; + ioa = fileReady.ObjectAddress; + nof = fileReady.NOF; - /* send call file */ + /* send call file */ - ASDU callFile = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, asdu.Ca, false); + ASDU callFile = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, asdu.Ca, false); - callFile.AddInformationObject(new FileCallOrSelect(fileReady.ObjectAddress, fileReady.NOF, 0, SelectAndCallQualifier.REQUEST_FILE)); + callFile.AddInformationObject(new FileCallOrSelect(fileReady.ObjectAddress, fileReady.NOF, 0, SelectAndCallQualifier.REQUEST_FILE)); - connection.SendASDU(callFile); + connection.SendASDU(callFile); - lastSentTime = SystemUtils.currentTimeMillis(); - transferState = FileServerState.WAITING_FOR_SECTION_READY; - } + lastSentTime = SystemUtils.currentTimeMillis(); + transferState = FileServerState.WAITING_FOR_SECTION_READY; + } + } + else + { + asdu.IsNegative = true; + asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; + connection.SendASDU(asdu); + } } else { - asdu.IsNegative = true; - asdu.Cot = CauseOfTransmission.UNKNOWN_INFORMATION_OBJECT_ADDRESS; + asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; connection.SendASDU(asdu); } @@ -1147,134 +1155,154 @@ public bool HandleFileAsdu(ASDU asdu) case TypeID.F_SR_NA_1: /* Section Ready */ - if (transferState == FileServerState.WAITING_FOR_SECTION_READY) + if (asdu.Cot == CauseOfTransmission.FILE_TRANSFER) { + if (transferState == FileServerState.WAITING_FOR_SECTION_READY) + { - SectionReady sectionReady = (SectionReady)asdu.GetElement(0); + SectionReady sectionReady = (SectionReady)asdu.GetElement(0); - currentSectionNumber = sectionReady.NameOfSection; - currentSectionOffset = 0; - currentSectionSize = sectionReady.LengthOfSection; + currentSectionNumber = sectionReady.NameOfSection; + currentSectionOffset = 0; + currentSectionSize = sectionReady.LengthOfSection; - /* send call section */ + /* send call section */ - ASDU callSection = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, ca, false); + ASDU callSection = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, ca, false); - callSection.AddInformationObject(new FileCallOrSelect(ioa, nof, currentSectionNumber, SelectAndCallQualifier.REQUEST_SECTION)); + callSection.AddInformationObject(new FileCallOrSelect(ioa, nof, currentSectionNumber, SelectAndCallQualifier.REQUEST_SECTION)); - connection.SendASDU(callSection); - lastSentTime = SystemUtils.currentTimeMillis(); + connection.SendASDU(callSection); + lastSentTime = SystemUtils.currentTimeMillis(); - transferState = FileServerState.RECEIVE_SECTION; + transferState = FileServerState.RECEIVE_SECTION; + } } else { - + asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; + connection.SendASDU(asdu); } break; case TypeID.F_SG_NA_1: /* Segment */ - if (transferState == FileServerState.RECEIVE_SECTION) + if (asdu.Cot == CauseOfTransmission.FILE_TRANSFER) { + if (transferState == FileServerState.RECEIVE_SECTION) + { - FileSegment segment = (FileSegment)asdu.GetElement(0); + FileSegment segment = (FileSegment)asdu.GetElement(0); - logger("Received F_SG_NA_1(segment) (NoS=" + segment.NameOfSection + ", LoS=" + segment.LengthOfSegment + ")"); + logger("Received F_SG_NA_1(segment) (NoS=" + segment.NameOfSection + ", LoS=" + segment.LengthOfSegment + ")"); - if (fileReceiver != null) + if (fileReceiver != null) + { + fileReceiver.SegmentReceived(segment.NameOfSection, currentSectionOffset, segment.LengthOfSegment, segment.SegmentData); + } + + currentSectionOffset += segment.LengthOfSegment; + } + else { - fileReceiver.SegmentReceived(segment.NameOfSection, currentSectionOffset, segment.LengthOfSegment, segment.SegmentData); + logger("Unexpected F_SG_NA_1(file segment)"); } - - currentSectionOffset += segment.LengthOfSegment; } else { - logger("Unexpected F_SG_NA_1(file segment)"); + asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; + connection.SendASDU(asdu); } - - + break; case TypeID.F_LS_NA_1: /* Last Segment/Section */ logger("Received F_LS_NA_1 (last segment/section)"); - if (transferState == FileServerState.RECEIVE_SECTION) + if (asdu.Cot == CauseOfTransmission.FILE_TRANSFER) { - - FileLastSegmentOrSection lastSection = (FileLastSegmentOrSection)asdu.GetElement(0); - - if (lastSection.LSQ == LastSectionOrSegmentQualifier.SECTION_TRANSFER_WITHOUT_DEACT) + if (transferState == FileServerState.RECEIVE_SECTION) { - ASDU sectionAck = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, asdu.Ca, false); + FileLastSegmentOrSection lastSection = (FileLastSegmentOrSection)asdu.GetElement(0); - sectionAck.AddInformationObject(new FileACK(ioa, nof, lastSection.NameOfSection, AcknowledgeQualifier.POS_ACK_SECTION, FileError.DEFAULT)); + if (lastSection.LSQ == LastSectionOrSegmentQualifier.SECTION_TRANSFER_WITHOUT_DEACT) + { - connection.SendASDU(sectionAck); - lastSentTime = SystemUtils.currentTimeMillis(); + ASDU sectionAck = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, asdu.Ca, false); - logger("Send section ACK"); + sectionAck.AddInformationObject(new FileACK(ioa, nof, lastSection.NameOfSection, AcknowledgeQualifier.POS_ACK_SECTION, FileError.DEFAULT)); - transferState = FileServerState.WAITING_FOR_SECTION_READY; + connection.SendASDU(sectionAck); + lastSentTime = SystemUtils.currentTimeMillis(); - } - else if (lastSection.LSQ == LastSectionOrSegmentQualifier.FILE_TRANSFER_WITH_DEACT) - { - /* master aborted transfer */ + logger("Send section ACK"); - if (fileReceiver != null) - fileReceiver.Finished(FileErrorCode.ABORTED_BY_REMOTE); + transferState = FileServerState.WAITING_FOR_SECTION_READY; - transferState = FileServerState.UNSELECTED_IDLE; - } - else - { + } + else if (lastSection.LSQ == LastSectionOrSegmentQualifier.FILE_TRANSFER_WITH_DEACT) + { + /* master aborted transfer */ - } + if (fileReceiver != null) + fileReceiver.Finished(FileErrorCode.ABORTED_BY_REMOTE); + transferState = FileServerState.UNSELECTED_IDLE; + } + else + { - } - else if (transferState == FileServerState.WAITING_FOR_SECTION_READY) - { + } - FileLastSegmentOrSection lastSection = (FileLastSegmentOrSection)asdu.GetElement(0); - if (lastSection.LSQ == LastSectionOrSegmentQualifier.FILE_TRANSFER_WITHOUT_DEACT) + } + else if (transferState == FileServerState.WAITING_FOR_SECTION_READY) { - ASDU fileAck = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, asdu.Ca, false); + FileLastSegmentOrSection lastSection = (FileLastSegmentOrSection)asdu.GetElement(0); - fileAck.AddInformationObject(new FileACK(ioa, nof, lastSection.NameOfSection, AcknowledgeQualifier.POS_ACK_FILE, FileError.DEFAULT)); + if (lastSection.LSQ == LastSectionOrSegmentQualifier.FILE_TRANSFER_WITHOUT_DEACT) + { - connection.SendASDU(fileAck); - lastSentTime = SystemUtils.currentTimeMillis(); + ASDU fileAck = new ASDU(alParameters, CauseOfTransmission.FILE_TRANSFER, false, false, 0, asdu.Ca, false); - logger("Send file ACK"); + fileAck.AddInformationObject(new FileACK(ioa, nof, lastSection.NameOfSection, AcknowledgeQualifier.POS_ACK_FILE, FileError.DEFAULT)); - if (fileReceiver != null) - fileReceiver.Finished(FileErrorCode.SUCCESS); + connection.SendASDU(fileAck); + lastSentTime = SystemUtils.currentTimeMillis(); - transferState = FileServerState.UNSELECTED_IDLE; + logger("Send file ACK"); - logger("Received file success"); - } - else if (lastSection.LSQ == LastSectionOrSegmentQualifier.FILE_TRANSFER_WITH_DEACT) - { - /* master aborted transfer */ + if (fileReceiver != null) + fileReceiver.Finished(FileErrorCode.SUCCESS); - if (fileReceiver != null) - fileReceiver.Finished(FileErrorCode.ABORTED_BY_REMOTE); + transferState = FileServerState.UNSELECTED_IDLE; - transferState = FileServerState.UNSELECTED_IDLE; - } - else - { - logger("F_LS_NA_1 with unexpected LSQ: " + lastSection.LSQ.ToString()); + logger("Received file success"); + } + else if (lastSection.LSQ == LastSectionOrSegmentQualifier.FILE_TRANSFER_WITH_DEACT) + { + /* master aborted transfer */ + + if (fileReceiver != null) + fileReceiver.Finished(FileErrorCode.ABORTED_BY_REMOTE); + + transferState = FileServerState.UNSELECTED_IDLE; + } + else + { + logger("F_LS_NA_1 with unexpected LSQ: " + lastSection.LSQ.ToString()); + } } + + } + else + { + asdu.Cot = CauseOfTransmission.UNKNOWN_CAUSE_OF_TRANSMISSION; + connection.SendASDU(asdu); } break; @@ -1283,7 +1311,6 @@ public bool HandleFileAsdu(ASDU asdu) logger("Received file/section ACK F_AF_NA_1"); - //TODO move COT check to beginning of function! if (asdu.Cot == CauseOfTransmission.FILE_TRANSFER) { @@ -1425,7 +1452,6 @@ public bool HandleFileAsdu(ASDU asdu) } else { - // No file transmission in progress --> what to do? logger("Unexpected File ACK message -> ignore"); } diff --git a/lib60870/CS104/Connection.cs b/lib60870/CS104/Connection.cs index b833c40..9d292b6 100644 --- a/lib60870/CS104/Connection.cs +++ b/lib60870/CS104/Connection.cs @@ -1525,7 +1525,7 @@ private void ConnectSocketWithTimeout() } catch (Exception) { - throw new SocketException(87); // wrong argument + throw new SocketException(87); /* wrong argument */ } /* Create a TCP/IP socket. */ @@ -1545,7 +1545,7 @@ private void ConnectSocketWithTimeout() catch (Exception ex) { Console.WriteLine(ex.Message); - throw new SocketException(87); // wrong argument + throw new SocketException(87); /* wrong argument */ } } diff --git a/lib60870/LinkLayer/TcpClientVirtualSerialPort.cs b/lib60870/LinkLayer/TcpClientVirtualSerialPort.cs index a996836..39aca19 100644 --- a/lib60870/LinkLayer/TcpClientVirtualSerialPort.cs +++ b/lib60870/LinkLayer/TcpClientVirtualSerialPort.cs @@ -107,7 +107,7 @@ private void ConnectSocketWithTimeout() } catch (Exception) { - throw new SocketException(87); // wrong argument + throw new SocketException(87); /* wrong argument */ } if (!running) From 93b6d4bdb1edc294ff9584ad615a809d9923a9ea Mon Sep 17 00:00:00 2001 From: Maxson Ramon dos Anjos Medeiros Date: Thu, 20 Mar 2025 15:12:56 +0100 Subject: [PATCH 59/83] Fix -> Problem in normalized value handling -> Add scaled value test case --- doxygen/Doxyfile | 2649 ++++++++++++++++++++- doxygen/mz-automation.ico | Bin 5694 -> 0 bytes lib60870/CS101/MeasuredValueNormalized.cs | 10 +- lib60870/CS101/ParameterMeasuredValues.cs | 10 +- lib60870/CS101/ScaledValue.cs | 80 +- lib60870/CS101/SetpointCommands.cs | 10 +- tests/Test.cs | 45 +- 7 files changed, 2682 insertions(+), 122 deletions(-) delete mode 100644 doxygen/mz-automation.ico diff --git a/doxygen/Doxyfile b/doxygen/Doxyfile index 3a7eae6..dbcc3a8 100644 --- a/doxygen/Doxyfile +++ b/doxygen/Doxyfile @@ -1,19 +1,145 @@ -# Doxyfile 1.8.11 +# Doxyfile 1.9.8 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). +# +# Note: +# +# Use doxygen to compare the used configuration file with the template +# configuration file: +# doxygen -x [configFile] +# Use doxygen to compare the used configuration file with the template +# configuration file without replacing the environment variables or CMake type +# replacement variables: +# doxygen -x_noenv [configFile] #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the configuration +# file that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# https://www.gnu.org/software/libiconv/ for the list of possible encodings. +# The default value is: UTF-8. + DOXYFILE_ENCODING = UTF-8 -PROJECT_NAME = "lib60870.NET" -PROJECT_NUMBER = "2.2.0" + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = lib60870.NET + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = 2.3.0 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + PROJECT_BRIEF = "IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET" -PROJECT_LOGO = doxygen/mz-automation.ico + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = logo.png + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + OUTPUT_DIRECTORY = doxydoc.NET + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 +# sub-directories (in 2 levels) under the output directory of each output format +# and will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to +# control the number of sub-directories. +# The default value is: NO. + CREATE_SUBDIRS = NO + +# Controls the number of sub-directories that will be created when +# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every +# level increment doubles the number of directories, resulting in 4096 +# directories at level 8 which is the default and also the maximum value. The +# sub-directories are organized in 2 levels, the first level always has a fixed +# number of 16 directories. +# Minimum value: 0, maximum value: 8, default value: 8. +# This tag requires that the tag CREATE_SUBDIRS is set to YES. + +CREATE_SUBDIRS_LEVEL = 8 + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, +# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English +# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek, +# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with +# English messages), Korean, Korean-en (Korean with English messages), Latvian, +# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, +# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, +# Swedish, Turkish, Ukrainian and Vietnamese. +# The default value is: English. + OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ @@ -25,96 +151,838 @@ ABBREVIATE_BRIEF = "The $name class" \ a \ an \ the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + FULL_PATH_NAMES = YES -STRIP_FROM_PATH = -STRIP_FROM_INC_PATH = + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + JAVADOC_AUTOBRIEF = NO + +# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line +# such as +# /*************** +# as being the beginning of a Javadoc-style comment "banner". If set to NO, the +# Javadoc-style will behave just like regular comments and it will not be +# interpreted by doxygen. +# The default value is: NO. + +JAVADOC_BANNER = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + MULTILINE_CPP_IS_BRIEF = NO + +# By default Python docstrings are displayed as preformatted text and doxygen's +# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the +# doxygen's special commands can be used and the contents of the docstring +# documentation blocks is shown as doxygen documentation. +# The default value is: YES. + +PYTHON_DOCSTRING = YES + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + TAB_SIZE = 4 -ALIASES = -TCL_SUBST = + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:^^" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". Note that you cannot put \n's in the value part of an alias +# to insert newlines (in the resulting output). You can put ^^ in the value part +# of an alias to insert a newline as if a physical newline was in the original +# file. When you need a literal { or } or , in the value part of an alias you +# have to escape them by means of a backslash (\), this can lead to conflicts +# with the commands \{ and \} for these it is advised to use the version @{ and +# @} or use a double escape (\\{ and \\}) + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + OPTIMIZE_OUTPUT_JAVA = YES + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + OPTIMIZE_OUTPUT_VHDL = NO -EXTENSION_MAPPING = + +# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice +# sources only. Doxygen will then generate output that is more tailored for that +# language. For instance, namespaces will be presented as modules, types will be +# separated into more groups, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_SLICE = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, +# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, +# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser +# tries to guess whether the code is fixed or free formatted code, this is the +# default for Fortran type files). For instance to make doxygen treat .inc files +# as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. When specifying no_extension you should add +# * to the FILE_PATTERNS. +# +# Note see also the list of default file extension mappings. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See https://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 5. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 5 + +# The MARKDOWN_ID_STYLE tag can be used to specify the algorithm used to +# generate identifiers for the Markdown headings. Note: Every identifier is +# unique. +# Possible values are: DOXYGEN use a fixed 'autotoc_md' string followed by a +# sequence number starting at 0 and GITHUB use the lower case version of title +# with any whitespace replaced by '-' and punctuation characters removed. +# The default value is: DOXYGEN. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +MARKDOWN_ID_STYLE = DOXYGEN + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + LOOKUP_CACHE_SIZE = 0 + +# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use +# during processing. When set to 0 doxygen will based this on the number of +# cores available in the system. You can set it explicitly to a value larger +# than 0 to get more control over the balance between CPU load and processing +# speed. At this moment only the input processing can be done using multiple +# threads. Since this is still an experimental feature the default is set to 1, +# which effectively disables parallel processing. Please report any issues you +# encounter. Generating dot graphs in parallel is controlled by the +# DOT_NUM_THREADS setting. +# Minimum value: 0, maximum value: 32, default value: 1. + +NUM_PROC_THREADS = 1 + +# If the TIMESTAMP tag is set different from NO then each generated page will +# contain the date or date and time when the page was generated. Setting this to +# NO can help when comparing the output of multiple runs. +# Possible values are: YES, NO, DATETIME and DATE. +# The default value is: NO. + +TIMESTAMP = NO + #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + EXTRACT_PRIVATE = NO + +# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual +# methods of a class will be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIV_VIRTUAL = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + EXTRACT_ANON_NSPACES = NO + +# If this flag is set to YES, the name of an unnamed parameter in a declaration +# will be determined by the corresponding definition. By default unnamed +# parameters remain unnamed in the output. +# The default value is: YES. + +RESOLVE_UNNAMED_PARAMS = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# will also hide undocumented C++ concepts if enabled. This option has no effect +# if EXTRACT_ALL is enabled. +# The default value is: NO. + HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# declarations. If set to NO, these declarations will be included in the +# documentation. +# The default value is: NO. + HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + INTERNAL_DOCS = NO + +# With the correct setting of option CASE_SENSE_NAMES doxygen will better be +# able to match the capabilities of the underlying filesystem. In case the +# filesystem is case sensitive (i.e. it supports files in the same directory +# whose names only differ in casing), the option must be set to YES to properly +# deal with such files in case they appear in the input. For filesystems that +# are not case sensitive the option should be set to NO to properly deal with +# output files written for symbols that only differ in casing, such as for two +# classes, one named CLASS and the other named Class, and to also support +# references to files without having to specify the exact matching casing. On +# Windows (including Cygwin) and MacOS, users should typically set this option +# to NO, whereas on Linux or other Unix flavors it should typically be set to +# YES. +# Possible values are: SYSTEM, NO and YES. +# The default value is: SYSTEM. + CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class +# will show which file needs to be included to use the class. +# The default value is: YES. + +SHOW_HEADERFILE = YES + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + GENERATE_DEPRECATEDLIST= YES -ENABLED_SECTIONS = + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + SHOW_NAMESPACES = YES -FILE_VERSION_FILTER = -LAYOUT_FILE = -CITE_BIB_FILES = + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. See also section "Changing the +# layout of pages" for information. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages #--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as documenting some parameters in +# a documented function twice, or documenting parameters that don't exist or +# using markup commands wrongly. +# The default value is: YES. + WARN_IF_DOC_ERROR = YES + +# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete +# function parameter documentation. If set to NO, doxygen will accept that some +# parameters have no documentation without warning. +# The default value is: YES. + +WARN_IF_INCOMPLETE_DOC = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong parameter +# documentation, but not about the absence of documentation. If EXTRACT_ALL is +# set to YES then this flag will automatically be disabled. See also +# WARN_IF_INCOMPLETE_DOC +# The default value is: NO. + WARN_NO_PARAMDOC = NO + +# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about +# undocumented enumeration values. If set to NO, doxygen will accept +# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: NO. + +WARN_IF_UNDOC_ENUM_VAL = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS +# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but +# at the end of the doxygen process doxygen will return with a non-zero status. +# If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS_PRINT then doxygen behaves +# like FAIL_ON_WARNINGS but in case no WARN_LOGFILE is defined doxygen will not +# write the warning messages in between other messages but write them at the end +# of a run, in case a WARN_LOGFILE is defined the warning messages will be +# besides being in the defined file also be shown at the end of a run, unless +# the WARN_LOGFILE is defined as - i.e. standard output (stdout) in that case +# the behavior will remain as with the setting FAIL_ON_WARNINGS. +# Possible values are: NO, YES, FAIL_ON_WARNINGS and FAIL_ON_WARNINGS_PRINT. +# The default value is: NO. + WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# See also: WARN_LINE_FORMAT +# The default value is: $file:$line: $text. + WARN_FORMAT = "$file:$line: $text" -WARN_LOGFILE = + +# In the $text part of the WARN_FORMAT command it is possible that a reference +# to a more specific place is given. To make it easier to jump to this place +# (outside of doxygen) the user can define a custom "cut" / "paste" string. +# Example: +# WARN_LINE_FORMAT = "'vi $file +$line'" +# See also: WARN_FORMAT +# The default value is: at line $line of file $file. + +WARN_LINE_FORMAT = "at line $line of file $file" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). In case the file specified cannot be opened for writing the +# warning and error messages are written to standard error. When as file - is +# specified the warning and error messages are written to standard output +# (stdout). + +WARN_LOGFILE = + #--------------------------------------------------------------------------- # Configuration options related to the input files #--------------------------------------------------------------------------- -INPUT = README.md -INPUT += lib60870 - + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = ../lib60870 + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: +# https://www.gnu.org/software/libiconv/) for the list of possible encodings. +# See also: INPUT_FILE_ENCODING +# The default value is: UTF-8. + INPUT_ENCODING = UTF-8 + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify +# character encoding on a per file pattern basis. Doxygen will compare the file +# name with each pattern and apply the encoding instead of the default +# INPUT_ENCODING) if there is a match. The character encodings are a list of the +# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding +# "INPUT_ENCODING" for further information on supported encodings. + +INPUT_FILE_ENCODING = + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# Note the list of default checked file patterns might differ from the list of +# default file extension mappings. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cxxm, +# *.cpp, *.cppm, *.c++, *.c++m, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, +# *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, *.h++, *.ixx, *.l, *.cs, *.d, *.php, +# *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be +# provided as doxygen C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f18, *.f, *.for, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. + FILE_PATTERNS = *.c \ *.cc \ *.cxx \ @@ -158,217 +1026,1830 @@ FILE_PATTERNS = *.c \ *.qsf \ *.as \ *.js + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + RECURSIVE = YES -EXCLUDE = + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + EXCLUDE_SYMLINKS = NO -EXCLUDE_PATTERNS = -EXCLUDE_SYMBOLS = -EXAMPLE_PATH = examples + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# ANamespace::AClass, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = ../examples + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + EXAMPLE_RECURSIVE = NO -IMAGE_PATH = -INPUT_FILTER = -FILTER_PATTERNS = + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that doxygen will use the data processed and written to standard output +# for further processing, therefore nothing else, like debug statements or used +# commands (so in case of a Windows batch file always use @echo OFF), should be +# written to standard output. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + FILTER_SOURCE_FILES = NO -FILTER_SOURCE_PATTERNS = -USE_MDFILE_AS_MAINPAGE = README.md + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = ../README.md + +# The Fortran standard specifies that for fixed formatted Fortran code all +# characters from position 72 are to be considered as comment. A common +# extension is to allow longer lines before the automatic comment starts. The +# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can +# be processed before the automatic comment starts. +# Minimum value: 7, maximum value: 10000, default value: 72. + +FORTRAN_COMMENT_AFTER = 72 + #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# entity all documented functions referencing it will be listed. +# The default value is: NO. + REFERENCED_BY_RELATION = NO -REFERENCES_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see https://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + VERBATIM_HEADERS = YES + +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: +# http://clang.llvm.org/) for more accurate parsing at the cost of reduced +# performance. This can be particularly helpful with template rich C++ code for +# which doxygen's built-in parser lacks the necessary type information. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse_libclang=ON option for CMake. +# The default value is: NO. + CLANG_ASSISTED_PARSING = NO -CLANG_OPTIONS = + +# If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS +# tag is set to YES then doxygen will add the directory of each input to the +# include path. +# The default value is: YES. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_ADD_INC_PATHS = YES + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +# If clang assisted parsing is enabled you can provide the clang parser with the +# path to the directory containing a file called compile_commands.json. This +# file is the compilation database (see: +# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the +# options used when the source files were built. This is equivalent to +# specifying the -p option to a clang tool, such as clang-check. These options +# will then be passed to the parser. Any options specified with CLANG_OPTIONS +# will be added as well. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse_libclang=ON option for CMake. + +CLANG_DATABASE_PATH = + #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + ALPHABETICAL_INDEX = YES -COLS_IN_ALPHA_INDEX = 5 -IGNORE_PREFIX = + +# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes) +# that should be ignored while generating the index headers. The IGNORE_PREFIX +# tag works for classes, function and member names. The entity will be placed in +# the alphabetical list under the first letter of the entity name that remains +# after removing the prefix. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + #--------------------------------------------------------------------------- # Configuration options related to the HTML output #--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + HTML_FILE_EXTENSION = .html -HTML_HEADER = -HTML_FOOTER = -HTML_STYLESHEET = -HTML_EXTRA_STYLESHEET = -HTML_EXTRA_FILES = + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). +# Note: Since the styling of scrollbars can currently not be overruled in +# Webkit/Chromium, the styling will be left out of the default doxygen.css if +# one or more extra stylesheets have been specified. So if scrollbar +# customization is desired it has to be added explicitly. For an example see the +# documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output +# should be rendered with a dark or light theme. +# Possible values are: LIGHT always generate light mode output, DARK always +# generate dark mode output, AUTO_LIGHT automatically set the mode according to +# the user preference, use light mode if no preference is set (the default), +# AUTO_DARK automatically set the mode according to the user preference, use +# dark mode if no preference is set and TOGGLE allow to user to switch between +# light and dark mode via a button. +# The default value is: AUTO_LIGHT. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE = AUTO_LIGHT + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a color-wheel, see +# https://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use gray-scales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + HTML_COLORSTYLE_GAMMA = 80 -HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML +# documentation will contain a main index with vertical navigation menus that +# are dynamically created via JavaScript. If disabled, the navigation index will +# consists of multiple levels of tabs that are statically embedded in every HTML +# page. Disable this option to support browsers that do not have JavaScript, +# like the Qt help browser. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_MENUS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + HTML_DYNAMIC_SECTIONS = NO + +# If the HTML_CODE_FOLDING tag is set to YES then classes and functions can be +# dynamically folded and expanded in the generated HTML source code. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_CODE_FOLDING = YES + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: +# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To +# create a documentation set, doxygen will generate a Makefile in the HTML +# output directory. Running make will produce the docset in that directory and +# running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy +# genXcode/_index.html for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag determines the URL of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDURL = + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# on Windows. In the beginning of 2021 Microsoft took the original page, with +# a.o. the download links, offline the HTML help workshop was already many years +# in maintenance mode). You can download the HTML help workshop from the web +# archives at Installation executable (see: +# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo +# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + GENERATE_HTMLHELP = NO -CHM_FILE = -HHC_LOCATION = + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the main .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + GENERATE_CHI = NO -CHM_INDEX_ENCODING = + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + TOC_EXPAND = NO + +# The SITEMAP_URL tag is used to specify the full URL of the place where the +# generated documentation will be placed on the server by the user during the +# deployment of the documentation. The generated sitemap is called sitemap.xml +# and placed on the directory specified by HTML_OUTPUT. In case no SITEMAP_URL +# is specified no sitemap is generated. For information about the sitemap +# protocol see https://www.sitemaps.org +# This tag requires that the tag GENERATE_HTML is set to YES. + +SITEMAP_URL = + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + GENERATE_QHP = NO -QCH_FILE = + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + QHP_VIRTUAL_FOLDER = doc -QHP_CUST_FILTER_NAME = -QHP_CUST_FILTER_ATTRS = -QHP_SECT_FILTER_ATTRS = -QHG_LOCATION = + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location (absolute path +# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to +# run qhelpgenerator on the generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine tune the look of the index (see "Fine-tuning the output"). As an +# example, the default style sheet generated by doxygen has an example that +# shows how to put an image at the root of the tree instead of the PROJECT_NAME. +# Since the tree basically has the same information as the tab index, you could +# consider setting DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + GENERATE_TREEVIEW = YES + +# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the +# FULL_SIDEBAR option determines if the side bar is limited to only the treeview +# area (value NO) or if it should extend to the full height of the window (value +# YES). Setting this to YES gives a layout similar to +# https://docs.readthedocs.io with more room for contents, but less room for the +# project logo, title, and description. If either GENERATE_TREEVIEW or +# DISABLE_INDEX is set to NO, this option has no effect. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FULL_SIDEBAR = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + EXT_LINKS_IN_WINDOW = NO + +# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email +# addresses. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +OBFUSCATE_EMAILS = YES + +# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg +# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see +# https://inkscape.org) to generate formulas as SVG images instead of PNGs for +# the HTML output. These images will generally look nicer at scaled resolutions. +# Possible values are: png (the default) and svg (looks nicer but requires the +# pdf2svg or inkscape tool). +# The default value is: png. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FORMULA_FORMAT = png + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + FORMULA_FONTSIZE = 10 -FORMULA_TRANSPARENT = YES + +# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands +# to create new LaTeX commands to be used in formulas as building blocks. See +# the section "Including formulas" for details. + +FORMULA_MACROFILE = + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# https://www.mathjax.org) which uses client side JavaScript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + USE_MATHJAX = NO + +# With MATHJAX_VERSION it is possible to specify the MathJax version to be used. +# Note that the different versions of MathJax have different requirements with +# regards to the different settings, so it is possible that also other MathJax +# settings have to be changed when switching between the different MathJax +# versions. +# Possible values are: MathJax_2 and MathJax_3. +# The default value is: MathJax_2. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_VERSION = MathJax_2 + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. For more details about the output format see MathJax +# version 2 (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 +# (see: +# http://docs.mathjax.org/en/latest/web/components/output.html). +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility. This is the name for Mathjax version 2, for MathJax version 3 +# this will be translated into chtml), NativeMML (i.e. MathML. Only supported +# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This +# is the name for Mathjax version 3, for MathJax version 2 this will be +# translated into HTML-CSS) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from https://www.mathjax.org before deployment. The default value is: +# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 +# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 +# This tag requires that the tag USE_MATHJAX is set to YES. + MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest -MATHJAX_EXTENSIONS = -MATHJAX_CODEFILE = + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# for MathJax version 2 (see +# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# For example for MathJax version 3 (see +# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): +# MATHJAX_EXTENSIONS = ams +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , / + + diff --git a/doxygen/doxydoc.NET/html/annotated_dup.js b/doxygen/doxydoc.NET/html/annotated_dup.js new file mode 100644 index 0000000..be6034f --- /dev/null +++ b/doxygen/doxydoc.NET/html/annotated_dup.js @@ -0,0 +1,123 @@ +var annotated_dup = +[ + [ "lib60870", "namespacelib60870.html", [ + [ "CS101", "namespacelib60870_1_1_c_s101.html", [ + [ "ApplicationLayerParameters", "classlib60870_1_1_c_s101_1_1_application_layer_parameters.html", null ], + [ "ASDU", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html", "classlib60870_1_1_c_s101_1_1_a_s_d_u" ], + [ "ASDUQueueException", "classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception.html", null ], + [ "BinaryCounterReading", "classlib60870_1_1_c_s101_1_1_binary_counter_reading.html", "classlib60870_1_1_c_s101_1_1_binary_counter_reading" ], + [ "Bitstring32", "classlib60870_1_1_c_s101_1_1_bitstring32.html", null ], + [ "Bitstring32Command", "classlib60870_1_1_c_s101_1_1_bitstring32_command.html", null ], + [ "Bitstring32CommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a.html", null ], + [ "Bitstring32WithCP24Time2a", "classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a.html", null ], + [ "Bitstring32WithCP56Time2a", "classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a.html", null ], + [ "ClockSynchronizationCommand", "classlib60870_1_1_c_s101_1_1_clock_synchronization_command.html", null ], + [ "CounterInterrogationCommand", "classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html", "classlib60870_1_1_c_s101_1_1_counter_interrogation_command" ], + [ "CS101Master", "classlib60870_1_1_c_s101_1_1_c_s101_master.html", "classlib60870_1_1_c_s101_1_1_c_s101_master" ], + [ "CS101Slave", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html", "classlib60870_1_1_c_s101_1_1_c_s101_slave" ], + [ "DelayAcquisitionCommand", "classlib60870_1_1_c_s101_1_1_delay_acquisition_command.html", null ], + [ "DoubleCommand", "classlib60870_1_1_c_s101_1_1_double_command.html", null ], + [ "DoubleCommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a.html", null ], + [ "DoublePointInformation", "classlib60870_1_1_c_s101_1_1_double_point_information.html", null ], + [ "DoublePointWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a.html", null ], + [ "DoublePointWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a.html", null ], + [ "EndOfInitialization", "classlib60870_1_1_c_s101_1_1_end_of_initialization.html", "classlib60870_1_1_c_s101_1_1_end_of_initialization" ], + [ "EventOfProtectionEquipment", "classlib60870_1_1_c_s101_1_1_event_of_protection_equipment.html", null ], + [ "EventOfProtectionEquipmentWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a.html", null ], + [ "FileACK", "classlib60870_1_1_c_s101_1_1_file_a_c_k.html", "classlib60870_1_1_c_s101_1_1_file_a_c_k" ], + [ "FileCallOrSelect", "classlib60870_1_1_c_s101_1_1_file_call_or_select.html", "classlib60870_1_1_c_s101_1_1_file_call_or_select" ], + [ "FileDirectory", "classlib60870_1_1_c_s101_1_1_file_directory.html", "classlib60870_1_1_c_s101_1_1_file_directory" ], + [ "FileLastSegmentOrSection", "classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html", "classlib60870_1_1_c_s101_1_1_file_last_segment_or_section" ], + [ "FileReady", "classlib60870_1_1_c_s101_1_1_file_ready.html", "classlib60870_1_1_c_s101_1_1_file_ready" ], + [ "FilesAvailable", "classlib60870_1_1_c_s101_1_1_files_available.html", "classlib60870_1_1_c_s101_1_1_files_available" ], + [ "FileSegment", "classlib60870_1_1_c_s101_1_1_file_segment.html", null ], + [ "IFileProvider", "interfacelib60870_1_1_c_s101_1_1_i_file_provider.html", "interfacelib60870_1_1_c_s101_1_1_i_file_provider" ], + [ "IFileReceiver", "interfacelib60870_1_1_c_s101_1_1_i_file_receiver.html", null ], + [ "IMasterConnection", "interfacelib60870_1_1_c_s101_1_1_i_master_connection.html", null ], + [ "InformationObject", "classlib60870_1_1_c_s101_1_1_information_object.html", "classlib60870_1_1_c_s101_1_1_information_object" ], + [ "IntegratedTotals", "classlib60870_1_1_c_s101_1_1_integrated_totals.html", null ], + [ "IntegratedTotalsWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a.html", null ], + [ "IntegratedTotalsWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a.html", null ], + [ "InterrogationCommand", "classlib60870_1_1_c_s101_1_1_interrogation_command.html", null ], + [ "IPrivateIOFactory", "interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html", "interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory" ], + [ "Master", "classlib60870_1_1_c_s101_1_1_master.html", "classlib60870_1_1_c_s101_1_1_master" ], + [ "MeasuredValueNormalized", "classlib60870_1_1_c_s101_1_1_measured_value_normalized.html", null ], + [ "MeasuredValueNormalizedWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a.html", null ], + [ "MeasuredValueNormalizedWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a.html", null ], + [ "MeasuredValueNormalizedWithoutQuality", "classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html", null ], + [ "MeasuredValueScaled", "classlib60870_1_1_c_s101_1_1_measured_value_scaled.html", "classlib60870_1_1_c_s101_1_1_measured_value_scaled" ], + [ "MeasuredValueScaledWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a.html", null ], + [ "MeasuredValueScaledWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a.html", null ], + [ "MeasuredValueShort", "classlib60870_1_1_c_s101_1_1_measured_value_short.html", null ], + [ "MeasuredValueShortWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a.html", null ], + [ "MeasuredValueShortWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a.html", null ], + [ "OutputCircuitInfo", "classlib60870_1_1_c_s101_1_1_output_circuit_info.html", "classlib60870_1_1_c_s101_1_1_output_circuit_info" ], + [ "PackedOutputCircuitInfo", "classlib60870_1_1_c_s101_1_1_packed_output_circuit_info.html", null ], + [ "PackedOutputCircuitInfoWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a.html", null ], + [ "PackedSinglePointWithSCD", "classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d.html", null ], + [ "PackedStartEventsOfProtectionEquipment", "classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment.html", null ], + [ "PackedStartEventsOfProtectionEquipmentWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a.html", null ], + [ "ParameterActivation", "classlib60870_1_1_c_s101_1_1_parameter_activation.html", "classlib60870_1_1_c_s101_1_1_parameter_activation" ], + [ "ParameterFloatValue", "classlib60870_1_1_c_s101_1_1_parameter_float_value.html", null ], + [ "ParameterNormalizedValue", "classlib60870_1_1_c_s101_1_1_parameter_normalized_value.html", null ], + [ "ParameterScaledValue", "classlib60870_1_1_c_s101_1_1_parameter_scaled_value.html", null ], + [ "PrivateInformationObjectTypes", "classlib60870_1_1_c_s101_1_1_private_information_object_types.html", null ], + [ "QualifierOfInterrogation", "classlib60870_1_1_c_s101_1_1_qualifier_of_interrogation.html", null ], + [ "QualityDescriptor", "classlib60870_1_1_c_s101_1_1_quality_descriptor.html", null ], + [ "QualityDescriptorP", "classlib60870_1_1_c_s101_1_1_quality_descriptor_p.html", null ], + [ "ReadCommand", "classlib60870_1_1_c_s101_1_1_read_command.html", null ], + [ "ResetProcessCommand", "classlib60870_1_1_c_s101_1_1_reset_process_command.html", "classlib60870_1_1_c_s101_1_1_reset_process_command" ], + [ "ScaledValue", "classlib60870_1_1_c_s101_1_1_scaled_value.html", null ], + [ "SectionReady", "classlib60870_1_1_c_s101_1_1_section_ready.html", "classlib60870_1_1_c_s101_1_1_section_ready" ], + [ "SetpointCommandNormalized", "classlib60870_1_1_c_s101_1_1_setpoint_command_normalized.html", null ], + [ "SetpointCommandNormalizedWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a.html", null ], + [ "SetpointCommandQualifier", "classlib60870_1_1_c_s101_1_1_setpoint_command_qualifier.html", null ], + [ "SetpointCommandScaled", "classlib60870_1_1_c_s101_1_1_setpoint_command_scaled.html", null ], + [ "SetpointCommandScaledWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a.html", null ], + [ "SetpointCommandShort", "classlib60870_1_1_c_s101_1_1_setpoint_command_short.html", null ], + [ "SetpointCommandShortWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a.html", null ], + [ "SingleCommand", "classlib60870_1_1_c_s101_1_1_single_command.html", "classlib60870_1_1_c_s101_1_1_single_command" ], + [ "SingleCommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a.html", null ], + [ "SingleEvent", "classlib60870_1_1_c_s101_1_1_single_event.html", null ], + [ "SinglePointInformation", "classlib60870_1_1_c_s101_1_1_single_point_information.html", null ], + [ "SinglePointWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a.html", null ], + [ "SinglePointWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a.html", null ], + [ "Slave", "classlib60870_1_1_c_s101_1_1_slave.html", "classlib60870_1_1_c_s101_1_1_slave" ], + [ "StartEvent", "classlib60870_1_1_c_s101_1_1_start_event.html", "classlib60870_1_1_c_s101_1_1_start_event" ], + [ "StatusAndStatusChangeDetection", "classlib60870_1_1_c_s101_1_1_status_and_status_change_detection.html", null ], + [ "StepCommand", "classlib60870_1_1_c_s101_1_1_step_command.html", null ], + [ "StepCommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a.html", null ], + [ "StepPositionInformation", "classlib60870_1_1_c_s101_1_1_step_position_information.html", "classlib60870_1_1_c_s101_1_1_step_position_information" ], + [ "StepPositionWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a.html", null ], + [ "StepPositionWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a.html", null ], + [ "TestCommand", "classlib60870_1_1_c_s101_1_1_test_command.html", null ], + [ "TestCommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html", "classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a" ], + [ "TransparentFile", "classlib60870_1_1_c_s101_1_1_transparent_file.html", "classlib60870_1_1_c_s101_1_1_transparent_file" ] + ] ], + [ "CS104", "namespacelib60870_1_1_c_s104.html", [ + [ "APCIParameters", "classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html", "classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters" ], + [ "ClientConnection", "classlib60870_1_1_c_s104_1_1_client_connection.html", "classlib60870_1_1_c_s104_1_1_client_connection" ], + [ "Connection", "classlib60870_1_1_c_s104_1_1_connection.html", "classlib60870_1_1_c_s104_1_1_connection" ], + [ "ConnectionStatistics", "classlib60870_1_1_c_s104_1_1_connection_statistics.html", "classlib60870_1_1_c_s104_1_1_connection_statistics" ], + [ "RedundancyGroup", "classlib60870_1_1_c_s104_1_1_redundancy_group.html", "classlib60870_1_1_c_s104_1_1_redundancy_group" ], + [ "Server", "classlib60870_1_1_c_s104_1_1_server.html", "classlib60870_1_1_c_s104_1_1_server" ], + [ "TlsSecurityInformation", "classlib60870_1_1_c_s104_1_1_tls_security_information.html", "classlib60870_1_1_c_s104_1_1_tls_security_information" ] + ] ], + [ "linklayer", "namespacelib60870_1_1linklayer.html", [ + [ "LinkLayerBusyException", "classlib60870_1_1linklayer_1_1_link_layer_busy_exception.html", null ], + [ "LinkLayerParameters", "classlib60870_1_1linklayer_1_1_link_layer_parameters.html", "classlib60870_1_1linklayer_1_1_link_layer_parameters" ], + [ "TcpClientVirtualSerialPort", "classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html", "classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port" ], + [ "TcpServerVirtualSerialPort", "classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.html", "classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port" ] + ] ], + [ "ASDUParsingException", "classlib60870_1_1_a_s_d_u_parsing_exception.html", null ], + [ "ASDUQueue", "classlib60870_1_1_a_s_d_u_queue.html", null ], + [ "ConnectionException", "classlib60870_1_1_connection_exception.html", null ], + [ "CP16Time2a", "classlib60870_1_1_c_p16_time2a.html", null ], + [ "CP24Time2a", "classlib60870_1_1_c_p24_time2a.html", "classlib60870_1_1_c_p24_time2a" ], + [ "CP32Time2a", "classlib60870_1_1_c_p32_time2a.html", "classlib60870_1_1_c_p32_time2a" ], + [ "CP56Time2a", "classlib60870_1_1_c_p56_time2a.html", "classlib60870_1_1_c_p56_time2a" ], + [ "Frame", "classlib60870_1_1_frame.html", null ], + [ "LibraryCommon", "classlib60870_1_1_library_common.html", null ], + [ "SingleCommandQualifier", "classlib60870_1_1_single_command_qualifier.html", null ] + ] ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/bc_s.png b/doxygen/doxydoc.NET/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 HcmV?d00001 diff --git a/doxygen/doxydoc.NET/html/bc_sd.png b/doxygen/doxydoc.NET/html/bc_sd.png new file mode 100644 index 0000000000000000000000000000000000000000..31ca888dc71049713b35c351933a8d0f36180bf1 GIT binary patch literal 635 zcmV->0)+jEP)Jwi0r1~gdSq#w{Bu1q z`craw(p2!hu$4C_$Oc3X(sI6e=9QSTwPt{G) z=htT&^~&c~L2~e{r5_5SYe7#Is-$ln>~Kd%$F#tC65?{LvQ}8O`A~RBB0N~`2M+waajO;5>3B&-viHGJeEK2TQOiPRa zfDKyqwMc4wfaEh4jt>H`nW_Zidwk@Bowp`}(VUaj-pSI(-1L>FJVsX}Yl9~JsqgsZ zUD9(rMwf23Gez6KPa|wwInZodP-2}9@fK0Ga_9{8SOjU&4l`pH4@qlQp83>>HT$xW zER^U>)MyV%t(Lu=`d=Y?{k1@}&r7ZGkFQ%z%N+sE9BtYjovzxyxCPxN6&@wLK{soQ zSmkj$aLI}miuE^p@~4}mg9OjDfGEkgY4~^XzLRUBB*O{+&vq<3v(E%+k_i%=`~j%{ Vj14gnt9}3g002ovPDHLkV1n!oC4m3{ literal 0 HcmV?d00001 diff --git a/doxygen/doxydoc.NET/html/classes.html b/doxygen/doxydoc.NET/html/classes.html new file mode 100644 index 0000000..7f7fd2a --- /dev/null +++ b/doxygen/doxydoc.NET/html/classes.html @@ -0,0 +1,161 @@ + + + + + + + +lib60870.NET: Class Index + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Index
+
+
+
A | B | C | D | E | F | I | L | M | O | P | Q | R | S | T
+
+
+
A
+
APCIParameters (lib60870.CS104)
ApplicationLayerParameters (lib60870.CS101)
ASDU (lib60870.CS101)
ASDUParsingException (lib60870)
ASDUQueue (lib60870)
ASDUQueueException (lib60870.CS101)
+
+
B
+
BinaryCounterReading (lib60870.CS101)
Bitstring32 (lib60870.CS101)
Bitstring32Command (lib60870.CS101)
Bitstring32CommandWithCP56Time2a (lib60870.CS101)
Bitstring32WithCP24Time2a (lib60870.CS101)
Bitstring32WithCP56Time2a (lib60870.CS101)
+
+
C
+
ClientConnection (lib60870.CS104)
ClockSynchronizationCommand (lib60870.CS101)
Connection (lib60870.CS104)
ConnectionException (lib60870)
ConnectionStatistics (lib60870.CS104)
CounterInterrogationCommand (lib60870.CS101)
CP16Time2a (lib60870)
CP24Time2a (lib60870)
CP32Time2a (lib60870)
CP56Time2a (lib60870)
CS101Master (lib60870.CS101)
CS101Slave (lib60870.CS101)
+
+
D
+
DelayAcquisitionCommand (lib60870.CS101)
DoubleCommand (lib60870.CS101)
DoubleCommandWithCP56Time2a (lib60870.CS101)
DoublePointInformation (lib60870.CS101)
DoublePointWithCP24Time2a (lib60870.CS101)
DoublePointWithCP56Time2a (lib60870.CS101)
+
+
E
+
EndOfInitialization (lib60870.CS101)
EventOfProtectionEquipment (lib60870.CS101)
EventOfProtectionEquipmentWithCP56Time2a (lib60870.CS101)
+
+
F
+
FileACK (lib60870.CS101)
FileCallOrSelect (lib60870.CS101)
FileDirectory (lib60870.CS101)
FileLastSegmentOrSection (lib60870.CS101)
FileReady (lib60870.CS101)
FilesAvailable (lib60870.CS101)
FileSegment (lib60870.CS101)
Frame (lib60870)
+
+
I
+
IFileProvider (lib60870.CS101)
IFileReceiver (lib60870.CS101)
IMasterConnection (lib60870.CS101)
InformationObject (lib60870.CS101)
IntegratedTotals (lib60870.CS101)
IntegratedTotalsWithCP24Time2a (lib60870.CS101)
IntegratedTotalsWithCP56Time2a (lib60870.CS101)
InterrogationCommand (lib60870.CS101)
IPrivateIOFactory (lib60870.CS101)
+
+
L
+
LibraryCommon (lib60870)
LinkLayerBusyException (lib60870.linklayer)
LinkLayerParameters (lib60870.linklayer)
+
+
M
+
Master (lib60870.CS101)
MeasuredValueNormalized (lib60870.CS101)
MeasuredValueNormalizedWithCP24Time2a (lib60870.CS101)
MeasuredValueNormalizedWithCP56Time2a (lib60870.CS101)
MeasuredValueNormalizedWithoutQuality (lib60870.CS101)
MeasuredValueScaled (lib60870.CS101)
MeasuredValueScaledWithCP24Time2a (lib60870.CS101)
MeasuredValueScaledWithCP56Time2a (lib60870.CS101)
MeasuredValueShort (lib60870.CS101)
MeasuredValueShortWithCP24Time2a (lib60870.CS101)
MeasuredValueShortWithCP56Time2a (lib60870.CS101)
+
+
O
+
OutputCircuitInfo (lib60870.CS101)
+
+
P
+
PackedOutputCircuitInfo (lib60870.CS101)
PackedOutputCircuitInfoWithCP56Time2a (lib60870.CS101)
PackedSinglePointWithSCD (lib60870.CS101)
PackedStartEventsOfProtectionEquipment (lib60870.CS101)
PackedStartEventsOfProtectionEquipmentWithCP56Time2a (lib60870.CS101)
ParameterActivation (lib60870.CS101)
ParameterFloatValue (lib60870.CS101)
ParameterNormalizedValue (lib60870.CS101)
ParameterScaledValue (lib60870.CS101)
PrivateInformationObjectTypes (lib60870.CS101)
+
+
Q
+
QualifierOfInterrogation (lib60870.CS101)
QualityDescriptor (lib60870.CS101)
QualityDescriptorP (lib60870.CS101)
+
+
R
+
ReadCommand (lib60870.CS101)
RedundancyGroup (lib60870.CS104)
ResetProcessCommand (lib60870.CS101)
+
+
S
+
ScaledValue (lib60870.CS101)
SectionReady (lib60870.CS101)
Server (lib60870.CS104)
SetpointCommandNormalized (lib60870.CS101)
SetpointCommandNormalizedWithCP56Time2a (lib60870.CS101)
SetpointCommandQualifier (lib60870.CS101)
SetpointCommandScaled (lib60870.CS101)
SetpointCommandScaledWithCP56Time2a (lib60870.CS101)
SetpointCommandShort (lib60870.CS101)
SetpointCommandShortWithCP56Time2a (lib60870.CS101)
SingleCommand (lib60870.CS101)
SingleCommandQualifier (lib60870)
SingleCommandWithCP56Time2a (lib60870.CS101)
SingleEvent (lib60870.CS101)
SinglePointInformation (lib60870.CS101)
SinglePointWithCP24Time2a (lib60870.CS101)
SinglePointWithCP56Time2a (lib60870.CS101)
Slave (lib60870.CS101)
StartEvent (lib60870.CS101)
StatusAndStatusChangeDetection (lib60870.CS101)
StepCommand (lib60870.CS101)
StepCommandWithCP56Time2a (lib60870.CS101)
StepPositionInformation (lib60870.CS101)
StepPositionWithCP24Time2a (lib60870.CS101)
StepPositionWithCP56Time2a (lib60870.CS101)
+
+
T
+
TcpClientVirtualSerialPort (lib60870.linklayer)
TcpServerVirtualSerialPort (lib60870.linklayer)
TestCommand (lib60870.CS101)
TestCommandWithCP56Time2a (lib60870.CS101)
TlsSecurityInformation (lib60870.CS104)
TransparentFile (lib60870.CS101)
+
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception-members.html new file mode 100644 index 0000000..455fe45 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception-members.html @@ -0,0 +1,117 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.ASDUParsingException Member List
+
+
+ +

This is the complete list of members for lib60870.ASDUParsingException, including all inherited members.

+ + +
ASDUParsingException(string message) (defined in lib60870.ASDUParsingException)lib60870.ASDUParsingException
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception.html new file mode 100644 index 0000000..28f896d --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception.html @@ -0,0 +1,137 @@ + + + + + + + +lib60870.NET: lib60870.ASDUParsingException Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.ASDUParsingException Class Reference
+
+
+
+Inheritance diagram for lib60870.ASDUParsingException:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.ASDUParsingException:
+
+
Collaboration graph
+
[legend]
+ + + + +

+Public Member Functions

ASDUParsingException (string message)
 
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/ASDUParsingException.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception__coll__graph.dot new file mode 100644 index 0000000..8d95f3d --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.ASDUParsingException" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.ASDUParsingException",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Exception",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception__inherit__graph.dot new file mode 100644 index 0000000..8d95f3d --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.ASDUParsingException" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.ASDUParsingException",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Exception",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_queue-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_queue-members.html new file mode 100644 index 0000000..d31ebfd --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_queue-members.html @@ -0,0 +1,125 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.ASDUQueue Member List
+
+
+ +

This is the complete list of members for lib60870.ASDUQueue, including all inherited members.

+ + + + + + + + + + +
ASDUQueue(int maxQueueSize, EnqueueMode enqueueMode, ApplicationLayerParameters parameters, Action< string > DebugLog) (defined in lib60870.ASDUQueue)lib60870.ASDUQueue
EnqueueAsdu(ASDU asdu) (defined in lib60870.ASDUQueue)lib60870.ASDUQueue
LockASDUQueue() (defined in lib60870.ASDUQueue)lib60870.ASDUQueue
MarkASDUAsConfirmed(int index, long timestamp) (defined in lib60870.ASDUQueue)lib60870.ASDUQueue
MessageQueue_hasUnconfirmedIMessages() (defined in lib60870.ASDUQueue)lib60870.ASDUQueue
NumberOfAsduInQueue (defined in lib60870.ASDUQueue)lib60870.ASDUQueue
queueLock (defined in lib60870.ASDUQueue)lib60870.ASDUQueue
UnlockASDUQueue() (defined in lib60870.ASDUQueue)lib60870.ASDUQueue
UnmarkAllASDUs() (defined in lib60870.ASDUQueue)lib60870.ASDUQueue
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_queue.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_queue.html new file mode 100644 index 0000000..e7c63fa --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_queue.html @@ -0,0 +1,159 @@ + + + + + + + +lib60870.NET: lib60870.ASDUQueue Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.ASDUQueue Class Reference
+
+
+ + + + + + + + + + + + + + + + +

+Public Member Functions

ASDUQueue (int maxQueueSize, EnqueueMode enqueueMode, ApplicationLayerParameters parameters, Action< string > DebugLog)
 
+void EnqueueAsdu (ASDU asdu)
 
+void LockASDUQueue ()
 
+void UnlockASDUQueue ()
 
+bool MessageQueue_hasUnconfirmedIMessages ()
 
+void UnmarkAllASDUs ()
 
+void MarkASDUAsConfirmed (int index, long timestamp)
 
+ + + +

+Public Attributes

+SemaphoreSlim queueLock = new SemaphoreSlim(1, 1)
 
+ + + +

+Properties

+int NumberOfAsduInQueue [get, set]
 
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/ASDUQueue.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p16_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p16_time2a-members.html new file mode 100644 index 0000000..65216e0 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p16_time2a-members.html @@ -0,0 +1,125 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CP16Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CP16Time2a, including all inherited members.

+ + + + + + + + + + +
CP16Time2a(byte[] msg, int startIndex) (defined in lib60870.CP16Time2a)lib60870.CP16Time2a
CP16Time2a(int elapsedTimeInMs) (defined in lib60870.CP16Time2a)lib60870.CP16Time2a
CP16Time2a() (defined in lib60870.CP16Time2a)lib60870.CP16Time2a
CP16Time2a(CP16Time2a original) (defined in lib60870.CP16Time2a)lib60870.CP16Time2a
ElapsedTimeInMs (defined in lib60870.CP16Time2a)lib60870.CP16Time2a
Equals(object obj) (defined in lib60870.CP16Time2a)lib60870.CP16Time2a
GetEncodedValue() (defined in lib60870.CP16Time2a)lib60870.CP16Time2a
GetHashCode() (defined in lib60870.CP16Time2a)lib60870.CP16Time2a
ToString() (defined in lib60870.CP16Time2a)lib60870.CP16Time2a
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p16_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p16_time2a.html new file mode 100644 index 0000000..aa339cc --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p16_time2a.html @@ -0,0 +1,152 @@ + + + + + + + +lib60870.NET: lib60870.CP16Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CP16Time2a Class Reference
+
+
+ + + + + + + + + + + + + + + + +

+Public Member Functions

CP16Time2a (byte[] msg, int startIndex)
 
CP16Time2a (int elapsedTimeInMs)
 
CP16Time2a (CP16Time2a original)
 
+override bool Equals (object obj)
 
+override int GetHashCode ()
 
+byte[] GetEncodedValue ()
 
+override string ToString ()
 
+ + + +

+Properties

+int ElapsedTimeInMs [get, set]
 
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CP16Time2a.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p24_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p24_time2a-members.html new file mode 100644 index 0000000..88a985d --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p24_time2a-members.html @@ -0,0 +1,130 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CP24Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CP24Time2a, including all inherited members.

+ + + + + + + + + + + + + + + +
CP24Time2a(byte[] msg, int startIndex) (defined in lib60870.CP24Time2a)lib60870.CP24Time2a
CP24Time2a(int minute, int second, int millisecond) (defined in lib60870.CP24Time2a)lib60870.CP24Time2a
CP24Time2a() (defined in lib60870.CP24Time2a)lib60870.CP24Time2a
CP24Time2a(CP24Time2a original) (defined in lib60870.CP24Time2a)lib60870.CP24Time2a
Equals(object obj) (defined in lib60870.CP24Time2a)lib60870.CP24Time2a
GetEncodedValue() (defined in lib60870.CP24Time2a)lib60870.CP24Time2a
GetHashCode() (defined in lib60870.CP24Time2a)lib60870.CP24Time2a
GetMilliseconds()lib60870.CP24Time2a
Invalidlib60870.CP24Time2a
Millisecondlib60870.CP24Time2a
Minutelib60870.CP24Time2a
Secondlib60870.CP24Time2a
Substituedlib60870.CP24Time2a
ToString() (defined in lib60870.CP24Time2a)lib60870.CP24Time2a
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p24_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p24_time2a.html new file mode 100644 index 0000000..9e39622 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p24_time2a.html @@ -0,0 +1,314 @@ + + + + + + + +lib60870.NET: lib60870.CP24Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CP24Time2a Class Reference
+
+
+ + + + + + + + + + + + + + + + + + + +

+Public Member Functions

CP24Time2a (byte[] msg, int startIndex)
 
CP24Time2a (int minute, int second, int millisecond)
 
CP24Time2a (CP24Time2a original)
 
+override bool Equals (object obj)
 
+override int GetHashCode ()
 
int GetMilliseconds ()
 Gets the total milliseconds of the elapsed time.
 
+byte[] GetEncodedValue ()
 
+override string ToString ()
 
+ + + + + + + + + + + + + + + + +

+Properties

int Millisecond [get, set]
 Gets or sets the millisecond part of the time value.
 
int Second [get, set]
 Gets or sets the second (range 0 to 59)
 
int Minute [get, set]
 Gets or sets the minute (range 0 to 59)
 
bool Invalid [get, set]
 Gets a value indicating whether this lib60870.CP24Time2a is invalid.
 
bool Substitued [get, set]
 Gets a value indicating whether this lib60870.CP24Time2a was substitued by an intermediate station.
 
+

Member Function Documentation

+ +

◆ GetMilliseconds()

+ +
+
+ + + + + + + +
int lib60870.CP24Time2a.GetMilliseconds ()
+
+ +

Gets the total milliseconds of the elapsed time.

+
Returns
The milliseconds.
+ +
+
+

Property Documentation

+ +

◆ Invalid

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CP24Time2a.Invalid
+
+getset
+
+ +

Gets a value indicating whether this lib60870.CP24Time2a is invalid.

+

true if invalid; otherwise, false.

+ +
+
+ +

◆ Millisecond

+ +
+
+ + + + + +
+ + + + +
int lib60870.CP24Time2a.Millisecond
+
+getset
+
+ +

Gets or sets the millisecond part of the time value.

+

The millisecond.

+ +
+
+ +

◆ Minute

+ +
+
+ + + + + +
+ + + + +
int lib60870.CP24Time2a.Minute
+
+getset
+
+ +

Gets or sets the minute (range 0 to 59)

+

The minute.

+ +
+
+ +

◆ Second

+ +
+
+ + + + + +
+ + + + +
int lib60870.CP24Time2a.Second
+
+getset
+
+ +

Gets or sets the second (range 0 to 59)

+

The second.

+ +
+
+ +

◆ Substitued

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CP24Time2a.Substitued
+
+getset
+
+ +

Gets a value indicating whether this lib60870.CP24Time2a was substitued by an intermediate station.

+

true if substitued; otherwise, false.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CP24Time2a.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p24_time2a.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p24_time2a.js new file mode 100644 index 0000000..c26e724 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p24_time2a.js @@ -0,0 +1,9 @@ +var classlib60870_1_1_c_p24_time2a = +[ + [ "GetMilliseconds", "classlib60870_1_1_c_p24_time2a.html#afa47b9c056d5787d0368779f462fd2ff", null ], + [ "Invalid", "classlib60870_1_1_c_p24_time2a.html#acb0606324a0b221df177d242cd97f7c7", null ], + [ "Millisecond", "classlib60870_1_1_c_p24_time2a.html#a54e60600dccb34252b428488223f419e", null ], + [ "Minute", "classlib60870_1_1_c_p24_time2a.html#a1bdb66a13e77ea4ca5938c7609a38225", null ], + [ "Second", "classlib60870_1_1_c_p24_time2a.html#a44e08d428c8cbb76a84836b2ed19ae60", null ], + [ "Substitued", "classlib60870_1_1_c_p24_time2a.html#a4400a44009413f637412cb34d7d73820", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p32_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p32_time2a-members.html new file mode 100644 index 0000000..3f4211b --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p32_time2a-members.html @@ -0,0 +1,133 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CP32Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CP32Time2a, including all inherited members.

+ + + + + + + + + + + + + + + + + + +
CP32Time2a(int hours, int minutes, int seconds, int milliseconds, bool invalid, bool summertime) (defined in lib60870.CP32Time2a)lib60870.CP32Time2a
CP32Time2a(DateTime time) (defined in lib60870.CP32Time2a)lib60870.CP32Time2a
CP32Time2a() (defined in lib60870.CP32Time2a)lib60870.CP32Time2a
CP32Time2a(CP32Time2a original) (defined in lib60870.CP32Time2a)lib60870.CP32Time2a
Equals(object obj) (defined in lib60870.CP32Time2a)lib60870.CP32Time2a
GetDateTime(DateTime refTime)lib60870.CP32Time2a
GetDateTime() (defined in lib60870.CP32Time2a)lib60870.CP32Time2a
GetEncodedValue() (defined in lib60870.CP32Time2a)lib60870.CP32Time2a
GetHashCode() (defined in lib60870.CP32Time2a)lib60870.CP32Time2a
Hourlib60870.CP32Time2a
Invalidlib60870.CP32Time2a
Millisecondlib60870.CP32Time2a
Minutelib60870.CP32Time2a
Secondlib60870.CP32Time2a
Substitutedlib60870.CP32Time2a
SummerTime (defined in lib60870.CP32Time2a)lib60870.CP32Time2a
ToString() (defined in lib60870.CP32Time2a)lib60870.CP32Time2a
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p32_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p32_time2a.html new file mode 100644 index 0000000..c203a73 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p32_time2a.html @@ -0,0 +1,354 @@ + + + + + + + +lib60870.NET: lib60870.CP32Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CP32Time2a Class Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

CP32Time2a (int hours, int minutes, int seconds, int milliseconds, bool invalid, bool summertime)
 
CP32Time2a (DateTime time)
 
CP32Time2a (CP32Time2a original)
 
+override bool Equals (object obj)
 
+override int GetHashCode ()
 
DateTime GetDateTime (DateTime refTime)
 Gets the date time added to the reference day.
 
+DateTime GetDateTime ()
 
+byte[] GetEncodedValue ()
 
+override string ToString ()
 
+ + + + + + + + + + + + + + + + + + + + + +

+Properties

int Millisecond [get, set]
 Gets or sets the millisecond part of the time value (range 0 to 999)
 
int Second [get, set]
 Gets or sets the second (range 0 to 59)
 
int Minute [get, set]
 Gets or sets the minute (range 0 to 59)
 
int Hour [get, set]
 Gets or sets the hour (range 0 to 23)
 
+bool SummerTime [get, set]
 
bool Invalid [get, set]
 Gets a value indicating whether this lib60870.CP56Time2a is invalid.
 
bool Substituted [get, set]
 Gets a value indicating whether this lib60870.CP26Time2a was substitued by an intermediate station.
 
+

Member Function Documentation

+ +

◆ GetDateTime()

+ +
+
+ + + + + + + +
DateTime lib60870.CP32Time2a.GetDateTime (DateTime refTime)
+
+ +

Gets the date time added to the reference day.

+
Returns
The date time.
+
Parameters
+ + +
refTimeDatetime representing the reference day
+
+
+ +
+
+

Property Documentation

+ +

◆ Hour

+ +
+
+ + + + + +
+ + + + +
int lib60870.CP32Time2a.Hour
+
+getset
+
+ +

Gets or sets the hour (range 0 to 23)

+

The hour.

+ +
+
+ +

◆ Invalid

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CP32Time2a.Invalid
+
+getset
+
+ +

Gets a value indicating whether this lib60870.CP56Time2a is invalid.

+

true if invalid; otherwise, false.

+ +
+
+ +

◆ Millisecond

+ +
+
+ + + + + +
+ + + + +
int lib60870.CP32Time2a.Millisecond
+
+getset
+
+ +

Gets or sets the millisecond part of the time value (range 0 to 999)

+

The millisecond.

+ +
+
+ +

◆ Minute

+ +
+
+ + + + + +
+ + + + +
int lib60870.CP32Time2a.Minute
+
+getset
+
+ +

Gets or sets the minute (range 0 to 59)

+

The minute.

+ +
+
+ +

◆ Second

+ +
+
+ + + + + +
+ + + + +
int lib60870.CP32Time2a.Second
+
+getset
+
+ +

Gets or sets the second (range 0 to 59)

+

The second.

+ +
+
+ +

◆ Substituted

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CP32Time2a.Substituted
+
+getset
+
+ +

Gets a value indicating whether this lib60870.CP26Time2a was substitued by an intermediate station.

+

true if substitued; otherwise, false.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CP32Time2a.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p32_time2a.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p32_time2a.js new file mode 100644 index 0000000..11c9141 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p32_time2a.js @@ -0,0 +1,10 @@ +var classlib60870_1_1_c_p32_time2a = +[ + [ "GetDateTime", "classlib60870_1_1_c_p32_time2a.html#a57711ec4af4479936d10b2bf6df355a4", null ], + [ "Hour", "classlib60870_1_1_c_p32_time2a.html#a4cfa66063d1b214990d69515af388552", null ], + [ "Invalid", "classlib60870_1_1_c_p32_time2a.html#a9bc00071f0d79994977adcc9ea1564b4", null ], + [ "Millisecond", "classlib60870_1_1_c_p32_time2a.html#a144afbb4092fbe1a3196f30cba13fc37", null ], + [ "Minute", "classlib60870_1_1_c_p32_time2a.html#a723b8ffeb4915b7347aa97c65b2f4365", null ], + [ "Second", "classlib60870_1_1_c_p32_time2a.html#ae0c845c0ce9555c5ea2dd8514b6222dd", null ], + [ "Substituted", "classlib60870_1_1_c_p32_time2a.html#ae4e8f2da41474e5fbeb67412cb1a1523", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p56_time2a-members.html new file mode 100644 index 0000000..efc2683 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p56_time2a-members.html @@ -0,0 +1,137 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CP56Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CP56Time2a, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + +
CP56Time2a(byte[] msg, int startIndex) (defined in lib60870.CP56Time2a)lib60870.CP56Time2a
CP56Time2a(DateTime time) (defined in lib60870.CP56Time2a)lib60870.CP56Time2a
CP56Time2a() (defined in lib60870.CP56Time2a)lib60870.CP56Time2a
CP56Time2a(CP56Time2a original) (defined in lib60870.CP56Time2a)lib60870.CP56Time2a
DayOfMonthlib60870.CP56Time2a
DayOfWeeklib60870.CP56Time2a
Equals(object obj) (defined in lib60870.CP56Time2a)lib60870.CP56Time2a
GetDateTime(int startYear)lib60870.CP56Time2a
GetDateTime() (defined in lib60870.CP56Time2a)lib60870.CP56Time2a
GetEncodedValue() (defined in lib60870.CP56Time2a)lib60870.CP56Time2a
GetHashCode() (defined in lib60870.CP56Time2a)lib60870.CP56Time2a
Hourlib60870.CP56Time2a
Invalidlib60870.CP56Time2a
Millisecondlib60870.CP56Time2a
Minutelib60870.CP56Time2a
Monthlib60870.CP56Time2a
Secondlib60870.CP56Time2a
Substitutedlib60870.CP56Time2a
SummerTime (defined in lib60870.CP56Time2a)lib60870.CP56Time2a
ToString() (defined in lib60870.CP56Time2a)lib60870.CP56Time2a
Yearlib60870.CP56Time2a
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p56_time2a.html new file mode 100644 index 0000000..703ba1f --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p56_time2a.html @@ -0,0 +1,466 @@ + + + + + + + +lib60870.NET: lib60870.CP56Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CP56Time2a Class Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

CP56Time2a (byte[] msg, int startIndex)
 
CP56Time2a (DateTime time)
 
CP56Time2a (CP56Time2a original)
 
+override bool Equals (object obj)
 
+override int GetHashCode ()
 
DateTime GetDateTime (int startYear)
 Gets the date time.
 
+DateTime GetDateTime ()
 
+byte[] GetEncodedValue ()
 
+override string ToString ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

int Millisecond [get, set]
 Gets or sets the millisecond part of the time value.
 
int Second [get, set]
 Gets or sets the second (range 0 to 59)
 
int Minute [get, set]
 Gets or sets the minute (range 0 to 59)
 
int Hour [get, set]
 Gets or sets the hour (range 0 to 23)
 
int DayOfWeek [get, set]
 Gets or sets the day of week in range from 1 (Monday) until 7 (Sunday)
 
int DayOfMonth [get, set]
 Gets or sets the day of month in range 1 to 31.
 
int Month [get, set]
 Gets the month in range from 1 (January) to 12 (December)
 
int Year [get, set]
 Gets the year in the range 0 to 99.
 
+bool SummerTime [get, set]
 
bool Invalid [get, set]
 Gets a value indicating whether this lib60870.CP56Time2a is invalid.
 
bool Substituted [get, set]
 Gets a value indicating whether this lib60870.CP26Time2a was substitued by an intermediate station.
 
+

Member Function Documentation

+ +

◆ GetDateTime()

+ +
+
+ + + + + + + +
DateTime lib60870.CP56Time2a.GetDateTime (int startYear)
+
+ +

Gets the date time.

+
Returns
The date time.
+
Parameters
+ + +
startYearStart year.
+
+
+ +
+
+

Property Documentation

+ +

◆ DayOfMonth

+ +
+
+ + + + + +
+ + + + +
int lib60870.CP56Time2a.DayOfMonth
+
+getset
+
+ +

Gets or sets the day of month in range 1 to 31.

+

The day of month.

+ +
+
+ +

◆ DayOfWeek

+ +
+
+ + + + + +
+ + + + +
int lib60870.CP56Time2a.DayOfWeek
+
+getset
+
+ +

Gets or sets the day of week in range from 1 (Monday) until 7 (Sunday)

+

The day of week.

+ +
+
+ +

◆ Hour

+ +
+
+ + + + + +
+ + + + +
int lib60870.CP56Time2a.Hour
+
+getset
+
+ +

Gets or sets the hour (range 0 to 23)

+

The hour.

+ +
+
+ +

◆ Invalid

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CP56Time2a.Invalid
+
+getset
+
+ +

Gets a value indicating whether this lib60870.CP56Time2a is invalid.

+

true if invalid; otherwise, false.

+ +
+
+ +

◆ Millisecond

+ +
+
+ + + + + +
+ + + + +
int lib60870.CP56Time2a.Millisecond
+
+getset
+
+ +

Gets or sets the millisecond part of the time value.

+

The millisecond.

+ +
+
+ +

◆ Minute

+ +
+
+ + + + + +
+ + + + +
int lib60870.CP56Time2a.Minute
+
+getset
+
+ +

Gets or sets the minute (range 0 to 59)

+

The minute.

+ +
+
+ +

◆ Month

+ +
+
+ + + + + +
+ + + + +
int lib60870.CP56Time2a.Month
+
+getset
+
+ +

Gets the month in range from 1 (January) to 12 (December)

+

The month.

+ +
+
+ +

◆ Second

+ +
+
+ + + + + +
+ + + + +
int lib60870.CP56Time2a.Second
+
+getset
+
+ +

Gets or sets the second (range 0 to 59)

+

The second.

+ +
+
+ +

◆ Substituted

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CP56Time2a.Substituted
+
+getset
+
+ +

Gets a value indicating whether this lib60870.CP26Time2a was substitued by an intermediate station.

+

true if substitued; otherwise, false.

+ +
+
+ +

◆ Year

+ +
+
+ + + + + +
+ + + + +
int lib60870.CP56Time2a.Year
+
+getset
+
+ +

Gets the year in the range 0 to 99.

+

The year.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CP56Time2a.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p56_time2a.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p56_time2a.js new file mode 100644 index 0000000..5526d18 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p56_time2a.js @@ -0,0 +1,14 @@ +var classlib60870_1_1_c_p56_time2a = +[ + [ "GetDateTime", "classlib60870_1_1_c_p56_time2a.html#a83f9707e94051e90f0ab9b2f5dc1b3df", null ], + [ "DayOfMonth", "classlib60870_1_1_c_p56_time2a.html#a533808a9bd35fd250ff3197ce8b4e8fa", null ], + [ "DayOfWeek", "classlib60870_1_1_c_p56_time2a.html#afddcdbd7c4557c88032eb519a57b4019", null ], + [ "Hour", "classlib60870_1_1_c_p56_time2a.html#a34891c411294a0cb5bf2f1d4adb3286a", null ], + [ "Invalid", "classlib60870_1_1_c_p56_time2a.html#a7c00ef3b8b3f7fb1bb9a6cad0440f6dd", null ], + [ "Millisecond", "classlib60870_1_1_c_p56_time2a.html#a2e0c82ecba6b07880f9416101f004ecc", null ], + [ "Minute", "classlib60870_1_1_c_p56_time2a.html#af5a5ead5f041e47e0f4e201acb707d13", null ], + [ "Month", "classlib60870_1_1_c_p56_time2a.html#aeda1719c2e81de05a616f166036ef1f7", null ], + [ "Second", "classlib60870_1_1_c_p56_time2a.html#a02627aa0a76a5e3bfd4007a07f042a2c", null ], + [ "Substituted", "classlib60870_1_1_c_p56_time2a.html#a3b8f17e2e0ea8e6482dfae2fbea87173", null ], + [ "Year", "classlib60870_1_1_c_p56_time2a.html#acd2210101a5b5235b4779e3ecf00527e", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u-members.html new file mode 100644 index 0000000..50d6590 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u-members.html @@ -0,0 +1,132 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.ASDU Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.ASDU, including all inherited members.

+ + + + + + + + + + + + + + + + + +
AddInformationObject(InformationObject io)lib60870.CS101.ASDU
AsByteArray() (defined in lib60870.CS101.ASDU)lib60870.CS101.ASDU
ASDU(ApplicationLayerParameters parameters, CauseOfTransmission cot, bool isTest, bool isNegative, byte oa, int ca, bool isSequence)lib60870.CS101.ASDU
ASDU(ApplicationLayerParameters parameters, byte[] msg, int bufPos, int msgLength) (defined in lib60870.CS101.ASDU)lib60870.CS101.ASDU
Calib60870.CS101.ASDU
Cotlib60870.CS101.ASDU
GetElement(int index, PrivateInformationObjectTypes privateObjectTypes)lib60870.CS101.ASDU
GetElement(int index, IPrivateIOFactory ioFactory)lib60870.CS101.ASDU
GetElement(int index)lib60870.CS101.ASDU
IsNegativelib60870.CS101.ASDU
IsSequencelib60870.CS101.ASDU
IsTestlib60870.CS101.ASDU
NumberOfElementslib60870.CS101.ASDU
Oalib60870.CS101.ASDU
ToString() (defined in lib60870.CS101.ASDU)lib60870.CS101.ASDU
TypeIdlib60870.CS101.ASDU
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u.html new file mode 100644 index 0000000..d01a653 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u.html @@ -0,0 +1,577 @@ + + + + + + + +lib60870.NET: lib60870.CS101.ASDU Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.ASDU Class Reference
+
+
+ +

This class represents an application layer message. It contains some generic message information and one or more InformationObject instances of the same type. It is used to send and receive messages. + More...

+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 ASDU (ApplicationLayerParameters parameters, CauseOfTransmission cot, bool isTest, bool isNegative, byte oa, int ca, bool isSequence)
 Initializes a new instance of the lib60870.CS101.ASDU class.
 
bool AddInformationObject (InformationObject io)
 Adds an information object to the ASDU.
 
ASDU (ApplicationLayerParameters parameters, byte[] msg, int bufPos, int msgLength)
 
+byte[] AsByteArray ()
 
InformationObject GetElement (int index, PrivateInformationObjectTypes privateObjectTypes)
 Gets the element (information object) with the specified index. This function supports private information object types.
 
InformationObject GetElement (int index, IPrivateIOFactory ioFactory)
 Gets the element (information object) with the specified index. This function supports private information object types by using IPrivateIOFactory.
 
InformationObject GetElement (int index)
 Gets the element (information object) with the specified index.
 
+override string ToString ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

TypeID TypeId [get]
 Gets the type identifier (TI).
 
CauseOfTransmission Cot [get, set]
 Gets or sets the cause of transmission (COT)
 
byte Oa [get]
 Gets the originator address (OA)
 
bool IsTest [get]
 Gets a value indicating whether this instance is a test message.
 
bool IsNegative [get, set]
 Gets or sets a value indicating whether this instance is a negative confirmation.
 
int Ca [get]
 Gets the common address of the ASDU (CA)
 
bool IsSequence [get]
 Gets a value indicating whether this instance is a sequence of information objects.
 
int NumberOfElements [get]
 Gets the number of elements (information objects) of the ASDU.
 
+

Detailed Description

+

This class represents an application layer message. It contains some generic message information and one or more InformationObject instances of the same type. It is used to send and receive messages.

+

Constructor & Destructor Documentation

+ +

◆ ASDU()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
lib60870.CS101.ASDU.ASDU (ApplicationLayerParameters parameters,
CauseOfTransmission cot,
bool isTest,
bool isNegative,
byte oa,
int ca,
bool isSequence )
+
+ +

Initializes a new instance of the lib60870.CS101.ASDU class.

+
Parameters
+ + + + + + + + +
parametersapplication layer parameters to be used for encoding/decoding
cotCause of transmission (COT)
isTestIf set to true ASDU is a test ASDU.
isNegativeIf set to true is negative confirmation.
oaoriginator address (OA)
cacommon address of the ASDU (CA)
isSequenceIf set to true is a sequence of information objects.
+
+
+ +
+
+

Member Function Documentation

+ +

◆ AddInformationObject()

+ +
+
+ + + + + + + +
bool lib60870.CS101.ASDU.AddInformationObject (InformationObject io)
+
+ +

Adds an information object to the ASDU.

+

This function add an information object (InformationObject) to the ASDU. NOTE: that all information objects have to be of the same type. Otherwise an ArgumentException will be thrown. The function returns true when the information object has been added to the ASDU. The function returns false if there is no space left in the ASDU to add the information object, or when object cannot be added to a sequence because the IOA does not match.

Returns
true, if information object was added, false otherwise.
+
Parameters
+ + +
ioThe information object to add
+
+
+ +
+
+ +

◆ GetElement() [1/3]

+ +
+
+ + + + + + + +
InformationObject lib60870.CS101.ASDU.GetElement (int index)
+
+ +

Gets the element (information object) with the specified index.

+
Returns
the information object at index
+
Parameters
+ + +
indexindex of the element (starting with 0)
+
+
+
Exceptions
+ + +
lib60870.ASDUParsingExceptionThrown when there is a problem parsing the ASDU
+
+
+ +
+
+ +

◆ GetElement() [2/3]

+ +
+
+ + + + + + + + + + + +
InformationObject lib60870.CS101.ASDU.GetElement (int index,
IPrivateIOFactory ioFactory )
+
+ +

Gets the element (information object) with the specified index. This function supports private information object types by using IPrivateIOFactory.

+
Returns
the information object at index
+
Parameters
+ + + +
indexindex of the element (starting with 0)
ioFactoryuser defined information object parser
+
+
+
Exceptions
+ + +
lib60870.ASDUParsingExceptionThrown when there is a problem parsing the ASDU
+
+
+ +
+
+ +

◆ GetElement() [3/3]

+ +
+
+ + + + + + + + + + + +
InformationObject lib60870.CS101.ASDU.GetElement (int index,
PrivateInformationObjectTypes privateObjectTypes )
+
+ +

Gets the element (information object) with the specified index. This function supports private information object types.

+
Returns
the information object at index
+
Parameters
+ + + +
indexindex of the element (starting with 0)
privateObjectTypesknown private information object types
+
+
+
Exceptions
+ + +
lib60870.ASDUParsingExceptionThrown when there is a problem parsing the ASDU
+
+
+ +
+
+

Property Documentation

+ +

◆ Ca

+ +
+
+ + + + + +
+ + + + +
int lib60870.CS101.ASDU.Ca
+
+get
+
+ +

Gets the common address of the ASDU (CA)

+

The CA value

+ +
+
+ +

◆ Cot

+ +
+
+ + + + + +
+ + + + +
CauseOfTransmission lib60870.CS101.ASDU.Cot
+
+getset
+
+ +

Gets or sets the cause of transmission (COT)

+

The COT value

+ +
+
+ +

◆ IsNegative

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS101.ASDU.IsNegative
+
+getset
+
+ +

Gets or sets a value indicating whether this instance is a negative confirmation.

+

true if this instance is a negative confirmation; otherwise, false.

+ +
+
+ +

◆ IsSequence

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS101.ASDU.IsSequence
+
+get
+
+ +

Gets a value indicating whether this instance is a sequence of information objects.

+

A sequence of information objects contains multiple information objects with successive information object addresses (IOA).

+

true if this instance is a sequence; otherwise, false.

+ +
+
+ +

◆ IsTest

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS101.ASDU.IsTest
+
+get
+
+ +

Gets a value indicating whether this instance is a test message.

+

true if this instance is a test message; otherwise, false.

+ +
+
+ +

◆ NumberOfElements

+ +
+
+ + + + + +
+ + + + +
int lib60870.CS101.ASDU.NumberOfElements
+
+get
+
+ +

Gets the number of elements (information objects) of the ASDU.

+

The number of information objects.

+ +
+
+ +

◆ Oa

+ +
+
+ + + + + +
+ + + + +
byte lib60870.CS101.ASDU.Oa
+
+get
+
+ +

Gets the originator address (OA)

+

The OA

+ +
+
+ +

◆ TypeId

+ +
+
+ + + + + +
+ + + + +
TypeID lib60870.CS101.ASDU.TypeId
+
+get
+
+ +

Gets the type identifier (TI).

+

The type identifier.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/ASDU.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u.js new file mode 100644 index 0000000..a1c5935 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u.js @@ -0,0 +1,16 @@ +var classlib60870_1_1_c_s101_1_1_a_s_d_u = +[ + [ "ASDU", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a921d30b69cb8515973939210c0fd23b6", null ], + [ "AddInformationObject", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a2cc4f6257884b76e9e9f6b40cd3037c2", null ], + [ "GetElement", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a163ff2a748b560ecd08692a00ce83d57", null ], + [ "GetElement", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a752cdac37f9f37c859eb4de5bf01c746", null ], + [ "GetElement", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a3d57c6dab7100c5933373231c459d31f", null ], + [ "Ca", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a5d217b9cc0ecf22e127aa25c89e8a2f1", null ], + [ "Cot", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a68dd2e6df66c5c4298a357ac5da8fed1", null ], + [ "IsNegative", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a808a4ea51526b2ecbe0d9e23df1a018b", null ], + [ "IsSequence", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a874af72bec9618876b47a8da155de96f", null ], + [ "IsTest", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html#ae315fe2504e41a213cd76330cb56cc24", null ], + [ "NumberOfElements", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a8ab49764dd886c58be639d229e664af5", null ], + [ "Oa", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a73566a1f53fc1c1492804c4bcf068438", null ], + [ "TypeId", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html#ab0c3a8cae06afc0eea93c454815feb23", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception-members.html new file mode 100644 index 0000000..3bac976 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception-members.html @@ -0,0 +1,119 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.ASDUQueueException Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.ASDUQueueException, including all inherited members.

+ + + + +
ASDUQueueException() (defined in lib60870.CS101.ASDUQueueException)lib60870.CS101.ASDUQueueException
ASDUQueueException(string message) (defined in lib60870.CS101.ASDUQueueException)lib60870.CS101.ASDUQueueException
ASDUQueueException(string message, Exception innerException) (defined in lib60870.CS101.ASDUQueueException)lib60870.CS101.ASDUQueueException
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception.html new file mode 100644 index 0000000..5b21c80 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception.html @@ -0,0 +1,140 @@ + + + + + + + +lib60870.NET: lib60870.CS101.ASDUQueueException Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.ASDUQueueException Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.ASDUQueueException:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.ASDUQueueException:
+
+
Collaboration graph
+
[legend]
+ + + + + + +

+Public Member Functions

ASDUQueueException (string message)
 
ASDUQueueException (string message, Exception innerException)
 
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/Slave.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception__coll__graph.dot new file mode 100644 index 0000000..83a362f --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.ASDUQueueException" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.ASDUQueue\lException",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Exception",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception__inherit__graph.dot new file mode 100644 index 0000000..83a362f --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.ASDUQueueException" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.ASDUQueue\lException",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Exception",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_application_layer_parameters-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_application_layer_parameters-members.html new file mode 100644 index 0000000..a1eac79 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_application_layer_parameters-members.html @@ -0,0 +1,126 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_application_layer_parameters.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_application_layer_parameters.html new file mode 100644 index 0000000..6a5281d --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_application_layer_parameters.html @@ -0,0 +1,159 @@ + + + + + + + +lib60870.NET: lib60870.CS101.ApplicationLayerParameters Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.ApplicationLayerParameters Class Reference
+
+
+ + + + +

+Public Member Functions

+ApplicationLayerParameters Clone ()
 
+ + + +

+Static Public Attributes

+static int IEC60870_5_104_MAX_ASDU_LENGTH = 249
 
+ + + + + + + + + + + + + + + +

+Properties

+int SizeOfCOT [get, set]
 
+int OA [get, set]
 
+int SizeOfCA [get, set]
 
+int SizeOfIOA [get, set]
 
+int SizeOfTypeId [get]
 
+int SizeOfVSQ [get]
 
+int MaxAsduLength [get, set]
 
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/ApplicationLayerParameters.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_binary_counter_reading-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_binary_counter_reading-members.html new file mode 100644 index 0000000..8e988bf --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_binary_counter_reading-members.html @@ -0,0 +1,125 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.BinaryCounterReading Member List
+
+ +
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_binary_counter_reading.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_binary_counter_reading.html new file mode 100644 index 0000000..a2bb067 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_binary_counter_reading.html @@ -0,0 +1,283 @@ + + + + + + + +lib60870.NET: lib60870.CS101.BinaryCounterReading Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.BinaryCounterReading Class Reference
+
+
+ +

Binary counter reading. Used for tranmission of integrated totals. + More...

+ + + + + + + + +

+Public Member Functions

+byte[] GetEncodedValue ()
 
BinaryCounterReading (byte[] msg, int startIndex)
 
BinaryCounterReading (BinaryCounterReading original)
 
+ + + + + + + + + + + + + + + + +

+Properties

Int32 Value [get, set]
 Gets or sets the counter value.
 
int SequenceNumber [get, set]
 Gets or sets the sequence number.
 
bool Carry [get, set]
 Gets or sets the carry flag.
 
bool Adjusted [get, set]
 Gets or sets the adjusted flag.
 
bool Invalid [get, set]
 Gets or sets the invalid flag.
 
+

Detailed Description

+

Binary counter reading. Used for tranmission of integrated totals.

+

Property Documentation

+ +

◆ Adjusted

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS101.BinaryCounterReading.Adjusted
+
+getset
+
+ +

Gets or sets the adjusted flag.

+

true if adjusted flag is set; otherwise, false.

+ +
+
+ +

◆ Carry

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS101.BinaryCounterReading.Carry
+
+getset
+
+ +

Gets or sets the carry flag.

+

true if carry flag set; otherwise, false.

+ +
+
+ +

◆ Invalid

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS101.BinaryCounterReading.Invalid
+
+getset
+
+ +

Gets or sets the invalid flag.

+

true if invalid flag is set; otherwise, false.

+ +
+
+ +

◆ SequenceNumber

+ +
+
+ + + + + +
+ + + + +
int lib60870.CS101.BinaryCounterReading.SequenceNumber
+
+getset
+
+ +

Gets or sets the sequence number.

+

The sequence number.

+ +
+
+ +

◆ Value

+ +
+
+ + + + + +
+ + + + +
Int32 lib60870.CS101.BinaryCounterReading.Value
+
+getset
+
+ +

Gets or sets the counter value.

+

The value.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/BinaryCounterReading.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_binary_counter_reading.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_binary_counter_reading.js new file mode 100644 index 0000000..f42b4ea --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_binary_counter_reading.js @@ -0,0 +1,8 @@ +var classlib60870_1_1_c_s101_1_1_binary_counter_reading = +[ + [ "Adjusted", "classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#aacf2720e880dbb0f70ea212c59c8e31f", null ], + [ "Carry", "classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#a8d73e781be2f98f00d09f91e0c3d774a", null ], + [ "Invalid", "classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#a9c84bd5840b810546affba3f452b11e0", null ], + [ "SequenceNumber", "classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#ae04563ca55ecc0df58e80263d50db184", null ], + [ "Value", "classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#a548b83c567fc345f85573f31d3a71f03", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32-members.html new file mode 100644 index 0000000..5591e45 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32-members.html @@ -0,0 +1,128 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.Bitstring32 Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.Bitstring32, including all inherited members.

+ + + + + + + + + + + + + +
Bitstring32(int ioa, UInt32 value, QualityDescriptor quality) (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
Bitstring32(Bitstring32 original) (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32virtual
GetEncodedSize() (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Quality (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
SupportsSequence (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
Value (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32.html new file mode 100644 index 0000000..f289200 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32.html @@ -0,0 +1,225 @@ + + + + + + + +lib60870.NET: lib60870.CS101.Bitstring32 Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.Bitstring32 Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.Bitstring32:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.Bitstring32:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
Bitstring32 (int ioa, UInt32 value, QualityDescriptor quality)
 
Bitstring32 (Bitstring32 original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+UInt32 Value [get]
 
+QualityDescriptor Quality [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.Bitstring32.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/Bitstring32.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32__coll__graph.dot new file mode 100644 index 0000000..9af87cf --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.Bitstring32" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Bitstring32",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32__inherit__graph.dot new file mode 100644 index 0000000..ebe9d39 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32__inherit__graph.dot @@ -0,0 +1,14 @@ +digraph "lib60870.CS101.Bitstring32" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Bitstring32",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="lib60870.CS101.Bitstring32\lWithCP24Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a.html",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="lib60870.CS101.Bitstring32\lWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command-members.html new file mode 100644 index 0000000..f98b262 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command-members.html @@ -0,0 +1,126 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.Bitstring32Command Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.Bitstring32Command, including all inherited members.

+ + + + + + + + + + + +
Bitstring32Command(int objectAddress, UInt32 bitstring) (defined in lib60870.CS101.Bitstring32Command)lib60870.CS101.Bitstring32Command
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.Bitstring32Command)lib60870.CS101.Bitstring32Commandvirtual
GetEncodedSize() (defined in lib60870.CS101.Bitstring32Command)lib60870.CS101.Bitstring32Command
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
SupportsSequence (defined in lib60870.CS101.Bitstring32Command)lib60870.CS101.Bitstring32Command
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.Bitstring32Command)lib60870.CS101.Bitstring32Command
Value (defined in lib60870.CS101.Bitstring32Command)lib60870.CS101.Bitstring32Command
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command.html new file mode 100644 index 0000000..99563e8 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command.html @@ -0,0 +1,219 @@ + + + + + + + +lib60870.NET: lib60870.CS101.Bitstring32Command Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.Bitstring32Command Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.Bitstring32Command:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.Bitstring32Command:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
Bitstring32Command (int objectAddress, UInt32 bitstring)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+UInt32 Value [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.Bitstring32Command.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SetpointCommands.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command__coll__graph.dot new file mode 100644 index 0000000..93e73cb --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.Bitstring32Command" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Bitstring32\lCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command__inherit__graph.dot new file mode 100644 index 0000000..bfc95eb --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.Bitstring32Command" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Bitstring32\lCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="lib60870.CS101.Bitstring32\lCommandWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a-members.html new file mode 100644 index 0000000..be48ebc --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a-members.html @@ -0,0 +1,128 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.Bitstring32CommandWithCP56Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.Bitstring32CommandWithCP56Time2a, including all inherited members.

+ + + + + + + + + + + + + +
Bitstring32Command(int objectAddress, UInt32 bitstring) (defined in lib60870.CS101.Bitstring32Command)lib60870.CS101.Bitstring32Command
Bitstring32CommandWithCP56Time2a(int objectAddress, UInt32 bitstring, CP56Time2a timestamp) (defined in lib60870.CS101.Bitstring32CommandWithCP56Time2a)lib60870.CS101.Bitstring32CommandWithCP56Time2a
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.Bitstring32CommandWithCP56Time2a)lib60870.CS101.Bitstring32CommandWithCP56Time2avirtual
GetEncodedSize() (defined in lib60870.CS101.Bitstring32CommandWithCP56Time2a)lib60870.CS101.Bitstring32CommandWithCP56Time2a
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
SupportsSequence (defined in lib60870.CS101.Bitstring32CommandWithCP56Time2a)lib60870.CS101.Bitstring32CommandWithCP56Time2a
Timestamp (defined in lib60870.CS101.Bitstring32CommandWithCP56Time2a)lib60870.CS101.Bitstring32CommandWithCP56Time2a
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.Bitstring32CommandWithCP56Time2a)lib60870.CS101.Bitstring32CommandWithCP56Time2a
Value (defined in lib60870.CS101.Bitstring32Command)lib60870.CS101.Bitstring32Command
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a.html new file mode 100644 index 0000000..a78e4b2 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a.html @@ -0,0 +1,236 @@ + + + + + + + +lib60870.NET: lib60870.CS101.Bitstring32CommandWithCP56Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.Bitstring32CommandWithCP56Time2a Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.Bitstring32CommandWithCP56Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.Bitstring32CommandWithCP56Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
Bitstring32CommandWithCP56Time2a (int objectAddress, UInt32 bitstring, CP56Time2a timestamp)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.Bitstring32Command
+override int GetEncodedSize ()
 
Bitstring32Command (int objectAddress, UInt32 bitstring)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+CP56Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.Bitstring32Command
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+UInt32 Value [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.Bitstring32CommandWithCP56Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.Bitstring32Command.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SetpointCommands.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a__coll__graph.dot new file mode 100644 index 0000000..92e3621 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a__coll__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.Bitstring32CommandWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Bitstring32\lCommandWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Bitstring32Command",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32_command.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a__inherit__graph.dot new file mode 100644 index 0000000..92e3621 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.Bitstring32CommandWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Bitstring32\lCommandWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Bitstring32Command",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32_command.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a-members.html new file mode 100644 index 0000000..31235f9 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a-members.html @@ -0,0 +1,131 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.Bitstring32WithCP24Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.Bitstring32WithCP24Time2a, including all inherited members.

+ + + + + + + + + + + + + + + + +
Bitstring32(int ioa, UInt32 value, QualityDescriptor quality) (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
Bitstring32(Bitstring32 original) (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
Bitstring32WithCP24Time2a(int ioa, UInt32 value, QualityDescriptor quality, CP24Time2a timestamp) (defined in lib60870.CS101.Bitstring32WithCP24Time2a)lib60870.CS101.Bitstring32WithCP24Time2a
Bitstring32WithCP24Time2a(Bitstring32WithCP24Time2a original) (defined in lib60870.CS101.Bitstring32WithCP24Time2a)lib60870.CS101.Bitstring32WithCP24Time2a
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.Bitstring32WithCP24Time2a)lib60870.CS101.Bitstring32WithCP24Time2avirtual
GetEncodedSize() (defined in lib60870.CS101.Bitstring32WithCP24Time2a)lib60870.CS101.Bitstring32WithCP24Time2a
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Quality (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
SupportsSequence (defined in lib60870.CS101.Bitstring32WithCP24Time2a)lib60870.CS101.Bitstring32WithCP24Time2a
Timestamp (defined in lib60870.CS101.Bitstring32WithCP24Time2a)lib60870.CS101.Bitstring32WithCP24Time2a
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.Bitstring32WithCP24Time2a)lib60870.CS101.Bitstring32WithCP24Time2a
Value (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a.html new file mode 100644 index 0000000..862475d --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a.html @@ -0,0 +1,245 @@ + + + + + + + +lib60870.NET: lib60870.CS101.Bitstring32WithCP24Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.Bitstring32WithCP24Time2a Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.Bitstring32WithCP24Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.Bitstring32WithCP24Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
Bitstring32WithCP24Time2a (int ioa, UInt32 value, QualityDescriptor quality, CP24Time2a timestamp)
 
Bitstring32WithCP24Time2a (Bitstring32WithCP24Time2a original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.Bitstring32
+override int GetEncodedSize ()
 
Bitstring32 (int ioa, UInt32 value, QualityDescriptor quality)
 
Bitstring32 (Bitstring32 original)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+CP24Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.Bitstring32
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+UInt32 Value [get]
 
+QualityDescriptor Quality [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.Bitstring32WithCP24Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.Bitstring32.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/Bitstring32.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a__coll__graph.dot new file mode 100644 index 0000000..9502210 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a__coll__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.Bitstring32WithCP24Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Bitstring32\lWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Bitstring32",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a__inherit__graph.dot new file mode 100644 index 0000000..9502210 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.Bitstring32WithCP24Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Bitstring32\lWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Bitstring32",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a-members.html new file mode 100644 index 0000000..afaf961 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a-members.html @@ -0,0 +1,131 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.Bitstring32WithCP56Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.Bitstring32WithCP56Time2a, including all inherited members.

+ + + + + + + + + + + + + + + + +
Bitstring32(int ioa, UInt32 value, QualityDescriptor quality) (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
Bitstring32(Bitstring32 original) (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
Bitstring32WithCP56Time2a(int ioa, UInt32 value, QualityDescriptor quality, CP56Time2a timestamp) (defined in lib60870.CS101.Bitstring32WithCP56Time2a)lib60870.CS101.Bitstring32WithCP56Time2a
Bitstring32WithCP56Time2a(Bitstring32WithCP56Time2a original) (defined in lib60870.CS101.Bitstring32WithCP56Time2a)lib60870.CS101.Bitstring32WithCP56Time2a
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.Bitstring32WithCP56Time2a)lib60870.CS101.Bitstring32WithCP56Time2avirtual
GetEncodedSize() (defined in lib60870.CS101.Bitstring32WithCP56Time2a)lib60870.CS101.Bitstring32WithCP56Time2a
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Quality (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
SupportsSequence (defined in lib60870.CS101.Bitstring32WithCP56Time2a)lib60870.CS101.Bitstring32WithCP56Time2a
Timestamp (defined in lib60870.CS101.Bitstring32WithCP56Time2a)lib60870.CS101.Bitstring32WithCP56Time2a
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.Bitstring32WithCP56Time2a)lib60870.CS101.Bitstring32WithCP56Time2a
Value (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a.html new file mode 100644 index 0000000..c25f29b --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a.html @@ -0,0 +1,245 @@ + + + + + + + +lib60870.NET: lib60870.CS101.Bitstring32WithCP56Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.Bitstring32WithCP56Time2a Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.Bitstring32WithCP56Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.Bitstring32WithCP56Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
Bitstring32WithCP56Time2a (int ioa, UInt32 value, QualityDescriptor quality, CP56Time2a timestamp)
 
Bitstring32WithCP56Time2a (Bitstring32WithCP56Time2a original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.Bitstring32
+override int GetEncodedSize ()
 
Bitstring32 (int ioa, UInt32 value, QualityDescriptor quality)
 
Bitstring32 (Bitstring32 original)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+CP56Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.Bitstring32
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+UInt32 Value [get]
 
+QualityDescriptor Quality [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.Bitstring32WithCP56Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.Bitstring32.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/Bitstring32.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a__coll__graph.dot new file mode 100644 index 0000000..5956dd6 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a__coll__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.Bitstring32WithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Bitstring32\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Bitstring32",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a__inherit__graph.dot new file mode 100644 index 0000000..5956dd6 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.Bitstring32WithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Bitstring32\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Bitstring32",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master-members.html new file mode 100644 index 0000000..ad186c9 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master-members.html @@ -0,0 +1,155 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.CS101Master Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.CS101Master, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddPortDeniedHandler(EventHandler eventHandler) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
AddSlave(int slaveAddress) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
CS101Master(SerialPort port, LinkLayerMode mode, LinkLayerParameters llParams=null, ApplicationLayerParameters alParams=null) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
CS101Master(Stream serialStream, LinkLayerMode mode, LinkLayerParameters llParams=null, ApplicationLayerParameters alParams=null) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
DebugOutput (defined in lib60870.CS101.Master)lib60870.CS101.Master
debugOutput (defined in lib60870.CS101.Master)lib60870.CS101.Masterprotected
DIRlib60870.CS101.CS101Master
GetApplicationLayerParameters() (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
GetFile(int ca, int ioa, NameOfFile nof, IFileReceiver receiver) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
GetLinkLayerState() (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
GetLinkLayerState(int slaveAddress) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
OwnAddress (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
PollSingleSlave(int address) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
port (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Masterprotected
RequestClass1Data(int address) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
Run()lib60870.CS101.CS101Master
running (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Masterprotected
SendASDU(ASDU asdu) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
SendClockSyncCommand(int ca, CP56Time2a time) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
SendControlCommand(CauseOfTransmission cot, int ca, InformationObject sc) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
SendCounterInterrogationCommand(CauseOfTransmission cot, int ca, byte qcc) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
SendDelayAcquisitionCommand(CauseOfTransmission cot, int ca, CP16Time2a delay) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
SendFile(int ca, int ioa, NameOfFile nof, IFileProvider fileProvider) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
SendInterrogationCommand(CauseOfTransmission cot, int ca, byte qoi) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
SendLinkLayerTestFunction() (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
SendReadCommand(int ca, int ioa) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
SendResetProcessCommand(CauseOfTransmission cot, int ca, byte qrp) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
SendTestCommand(int ca) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
SendTestCommandWithCP56Time2a(int ca, ushort tsc, CP56Time2a time) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
SetASDUReceivedHandler(ASDUReceivedHandler handler, object parameter) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
SetLinkLayerStateChangedHandler(LinkLayerStateChanged handler, object parameter) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
SetReceivedRawMessageHandler(RawMessageHandler handler, object parameter) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
SetSentRawMessageHandler(RawMessageHandler handler, object parameter) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
SetTimeouts(int messageTimeout, int characterTimeout)lib60870.CS101.CS101Master
SlaveAddresslib60870.CS101.CS101Master
Start()lib60870.CS101.CS101Master
Stop()lib60870.CS101.CS101Master
UseSlaveAddress(int slaveAddress)lib60870.CS101.CS101Master
workerThread (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Masterprotected
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master.html new file mode 100644 index 0000000..798bea9 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master.html @@ -0,0 +1,393 @@ + + + + + + + +lib60870.NET: lib60870.CS101.CS101Master Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.CS101Master Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.CS101Master:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.CS101Master:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+void Run ()
 Run the protocol state machines a single time. Alternative to Start/Stop when no background thread should be used Has to be called frequently.
 
+void AddPortDeniedHandler (EventHandler eventHandler)
 
+void Start ()
 Start a background thread running the master.
 
+void Stop ()
 Stop the background thread.
 
+LinkLayerState GetLinkLayerState ()
 
+override void SetReceivedRawMessageHandler (RawMessageHandler handler, object parameter)
 
+override void SetSentRawMessageHandler (RawMessageHandler handler, object parameter)
 
CS101Master (SerialPort port, LinkLayerMode mode, LinkLayerParameters llParams=null, ApplicationLayerParameters alParams=null)
 
CS101Master (Stream serialStream, LinkLayerMode mode, LinkLayerParameters llParams=null, ApplicationLayerParameters alParams=null)
 
void SetTimeouts (int messageTimeout, int characterTimeout)
 Sets the timeouts for receiving messages (in milliseconds)
 
+void SetASDUReceivedHandler (ASDUReceivedHandler handler, object parameter)
 
+void AddSlave (int slaveAddress)
 
+LinkLayerState GetLinkLayerState (int slaveAddress)
 
+void SetLinkLayerStateChangedHandler (LinkLayerStateChanged handler, object parameter)
 
void UseSlaveAddress (int slaveAddress)
 Sets the slave link layer address to be used.
 
+void PollSingleSlave (int address)
 
+void RequestClass1Data (int address)
 
+void SendLinkLayerTestFunction ()
 
+override void SendInterrogationCommand (CauseOfTransmission cot, int ca, byte qoi)
 
+override void SendCounterInterrogationCommand (CauseOfTransmission cot, int ca, byte qcc)
 
+override void SendReadCommand (int ca, int ioa)
 
+override void SendClockSyncCommand (int ca, CP56Time2a time)
 
+override void SendTestCommand (int ca)
 
+override void SendTestCommandWithCP56Time2a (int ca, ushort tsc, CP56Time2a time)
 
+override void SendResetProcessCommand (CauseOfTransmission cot, int ca, byte qrp)
 
+override void SendDelayAcquisitionCommand (CauseOfTransmission cot, int ca, CP16Time2a delay)
 
+override void SendControlCommand (CauseOfTransmission cot, int ca, InformationObject sc)
 
+override void SendASDU (ASDU asdu)
 
+override ApplicationLayerParameters GetApplicationLayerParameters ()
 
+override void GetFile (int ca, int ioa, NameOfFile nof, IFileReceiver receiver)
 
+override void SendFile (int ca, int ioa, NameOfFile nof, IFileProvider fileProvider)
 
- Public Member Functions inherited from lib60870.CS101.Master
void SendInterrogationCommand (CauseOfTransmission cot, int ca, byte qoi)
 Sends the interrogation command.
 
void SendCounterInterrogationCommand (CauseOfTransmission cot, int ca, byte qcc)
 Sends the counter interrogation command (C_CI_NA_1 typeID: 101)
 
void SendReadCommand (int ca, int ioa)
 Sends a read command (C_RD_NA_1 typeID: 102).
 
void SendClockSyncCommand (int ca, CP56Time2a time)
 Sends a clock synchronization command (C_CS_NA_1 typeID: 103).
 
void SendTestCommand (int ca)
 Sends a test command (C_TS_NA_1 typeID: 104).
 
void SendTestCommandWithCP56Time2a (int ca, ushort tsc, CP56Time2a time)
 Sends a test command with CP56Time2a time (C_TS_TA_1 typeID: 107).
 
void SendResetProcessCommand (CauseOfTransmission cot, int ca, byte qrp)
 Sends a reset process command (C_RP_NA_1 typeID: 105).
 
void SendDelayAcquisitionCommand (CauseOfTransmission cot, int ca, CP16Time2a delay)
 Sends a delay acquisition command (C_CD_NA_1 typeID: 106).
 
void SendControlCommand (CauseOfTransmission cot, int ca, InformationObject sc)
 Sends the control command.
 
void SendASDU (ASDU asdu)
 Sends an arbitrary ASDU to the connected slave.
 
void GetFile (int ca, int ioa, NameOfFile nof, IFileReceiver receiver)
 Read the file from slave (upload file)
 
void SendFile (int ca, int ioa, NameOfFile nof, IFileProvider fileProvider)
 Sends the file to slave (download file)
 
ApplicationLayerParameters GetApplicationLayerParameters ()
 Get the application layer parameters used by this master instance.
 
void SetReceivedRawMessageHandler (RawMessageHandler handler, object parameter)
 Sets the raw message handler for received messages.
 
void SetSentRawMessageHandler (RawMessageHandler handler, object parameter)
 Sets the sent message handler for sent messages.
 
+ + + + + + + + + + +

+Protected Attributes

+Thread workerThread = null
 
+SerialPort port = null
 
+bool running = false
 
- Protected Attributes inherited from lib60870.CS101.Master
+bool debugOutput
 
+ + + + + + + + + + + + +

+Properties

+bool DIR [get, set]
 Value of DIR bit when sending messages.
 
+int OwnAddress [get, set]
 
int SlaveAddress [get, set]
 Gets or sets the link layer slave address.
 
- Properties inherited from lib60870.CS101.Master
+bool DebugOutput [get, set]
 
+

Member Function Documentation

+ +

◆ SetTimeouts()

+ +
+
+ + + + + + + + + + + +
void lib60870.CS101.CS101Master.SetTimeouts (int messageTimeout,
int characterTimeout )
+
+ +

Sets the timeouts for receiving messages (in milliseconds)

+
Parameters
+ + + +
messageTimeoutTimeout to wait for the first character of a message
characterTimeoutTimeout to wait for next characters in a message
+
+
+ +
+
+ +

◆ UseSlaveAddress()

+ +
+
+ + + + + + + +
void lib60870.CS101.CS101Master.UseSlaveAddress (int slaveAddress)
+
+ +

Sets the slave link layer address to be used.

+
Parameters
+ + +
slaveAddressSlave link layer address.
+
+
+ +
+
+

Property Documentation

+ +

◆ SlaveAddress

+ +
+
+ + + + + +
+ + + + +
int lib60870.CS101.CS101Master.SlaveAddress
+
+getset
+
+ +

Gets or sets the link layer slave address.

+

Slave link layer address.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/CS101Master.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master.js new file mode 100644 index 0000000..4611a99 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master.js @@ -0,0 +1,10 @@ +var classlib60870_1_1_c_s101_1_1_c_s101_master = +[ + [ "Run", "classlib60870_1_1_c_s101_1_1_c_s101_master.html#a4f258e8494717432a01be4ee1fcb5063", null ], + [ "SetTimeouts", "classlib60870_1_1_c_s101_1_1_c_s101_master.html#a1a60eeb2565d2111ecea43db4e4b1909", null ], + [ "Start", "classlib60870_1_1_c_s101_1_1_c_s101_master.html#a5bcaaddeb16ce3472d5567d430cf304d", null ], + [ "Stop", "classlib60870_1_1_c_s101_1_1_c_s101_master.html#a4b4ca2b56ec115d9b5f1eba13ff5c22a", null ], + [ "UseSlaveAddress", "classlib60870_1_1_c_s101_1_1_c_s101_master.html#a9923e8174758fdfa15198fcbde7502de", null ], + [ "DIR", "classlib60870_1_1_c_s101_1_1_c_s101_master.html#aceff4f3985519a296c989418c7ad71b0", null ], + [ "SlaveAddress", "classlib60870_1_1_c_s101_1_1_c_s101_master.html#aa7d93ac85baacaeaa6c70abce6856f58", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master__coll__graph.dot new file mode 100644 index 0000000..5de77e2 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master__coll__graph.dot @@ -0,0 +1,21 @@ +digraph "lib60870.CS101.CS101Master" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="lib60870.CS101.CS101Master",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Master",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_master.html",tooltip="Common interface for CS104 and CS101 balanced and unbalanced master."]; + Node3 -> Node1 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="IPrimaryLinkLayerCallbacks",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node4 -> Node1 [id="edge3_Node000001_Node000004",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=" linkLayer",fontcolor="grey" ]; + Node4 [id="Node000004",label="lib60870.linklayer.LinkLayer",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node5 -> Node4 [id="edge4_Node000004_Node000005",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=" linkLayerParameters",fontcolor="grey" ]; + Node5 [id="Node000005",label="lib60870.linklayer.LinkLayer\lParameters",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1linklayer_1_1_link_layer_parameters.html",tooltip="Link layer specific parameters."]; + Node6 -> Node4 [id="edge5_Node000004_Node000006",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=" transceiver",fontcolor="grey" ]; + Node6 [id="Node000006",label="lib60870.linklayer.Serial\lTransceiverFT12",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",tooltip=" "]; + Node7 -> Node1 [id="edge6_Node000001_Node000007",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=" fileClient",fontcolor="grey" ]; + Node7 [id="Node000007",label="lib60870.CS101.FileClient",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master__inherit__graph.dot new file mode 100644 index 0000000..85f5ad0 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.CS101Master" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.CS101Master",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Master",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_master.html",tooltip="Common interface for CS104 and CS101 balanced and unbalanced master."]; + Node3 -> Node1 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="IPrimaryLinkLayerCallbacks",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave-members.html new file mode 100644 index 0000000..5b3bd3a --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave-members.html @@ -0,0 +1,161 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.CS101Slave Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.CS101Slave, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
asduHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
asduHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
clockSynchronizationHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
clockSynchronizationHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
counterInterrogationHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
counterInterrogationHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
CS101Slave(SerialPort port, LinkLayerParameters parameters=null)lib60870.CS101.CS101Slave
CS101Slave(Stream serialStream, LinkLayerParameters parameters=null)lib60870.CS101.CS101Slave
DebugOutput (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
debugOutput (defined in lib60870.CS101.Slave)lib60870.CS101.Slaveprotected
delayAcquisitionHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
delayAcquisitionHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
DIRlib60870.CS101.CS101Slave
EnqueueUserDataClass1(ASDU asdu)lib60870.CS101.CS101Slave
EnqueueUserDataClass2(ASDU asdu)lib60870.CS101.CS101Slave
filesAvailable (defined in lib60870.CS101.Slave)lib60870.CS101.Slaveprotected
FileTimeout (defined in lib60870.CS101.CS101Slave)lib60870.CS101.CS101Slave
GetAvailableFiles()lib60870.CS101.Slave
interrogationHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
InterrogationHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
IsUserDataClass1QueueFull()lib60870.CS101.CS101Slave
IsUserDataClass2QueueFull()lib60870.CS101.CS101Slave
LinkLayerAddresslib60870.CS101.CS101Slave
LinkLayerAddressOtherStationlib60870.CS101.CS101Slave
LinkLayerModelib60870.CS101.CS101Slave
Parameterslib60870.CS101.CS101Slave
readHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
readHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
ReceiveMessageLoop()lib60870.CS101.CS101Slave
resetProcessHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
resetProcessHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
Run()lib60870.CS101.CS101Slave
SendLinkLayerTestFunction()lib60870.CS101.CS101Slave
SetASDUHandler(ASDUHandler handler, object parameter)lib60870.CS101.Slave
SetClockSynchronizationHandler(ClockSynchronizationHandler handler, object parameter)lib60870.CS101.Slave
SetCounterInterrogationHandler(CounterInterrogationHandler handler, object parameter)lib60870.CS101.Slave
SetDelayAcquisitionHandler(DelayAcquisitionHandler handler, object parameter) (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
SetFileReadyHandler(FileReadyHandler handler, object parameter)lib60870.CS101.Slave
SetInterrogationHandler(InterrogationHandler handler, object parameter)lib60870.CS101.Slave
SetReadHandler(ReadHandler handler, object parameter)lib60870.CS101.Slave
SetReceivedRawMessageHandler(RawMessageHandler handler, object parameter)lib60870.CS101.CS101Slave
SetResetProcessHandler(ResetProcessHandler handler, object parameter) (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
SetSentRawMessageHandler(RawMessageHandler handler, object parameter)lib60870.CS101.CS101Slave
SetUserDataQueueSizes(int class1QueueSize, int class2QueueSize)lib60870.CS101.CS101Slave
Stop()lib60870.CS101.CS101Slave
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave.html new file mode 100644 index 0000000..252d1ce --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave.html @@ -0,0 +1,680 @@ + + + + + + + +lib60870.NET: lib60870.CS101.CS101Slave Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.CS101Slave Class Reference
+
+
+ +

CS 101 slave implementation (implements Slave interface) + More...

+
+Inheritance diagram for lib60870.CS101.CS101Slave:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.CS101Slave:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+void Stop ()
 Stops the receive message loop.
 
void SetUserDataQueueSizes (int class1QueueSize, int class2QueueSize)
 Sets the user data queue sizes. When the maximum size is reached the oldest value will be deleted when a new ASDU is added.
 
bool IsUserDataClass1QueueFull ()
 Determines whether the user data class 1 queue is full.
 
void EnqueueUserDataClass1 (ASDU asdu)
 Enqueues an ASDU into the class 1 queue (for events, command responses, and other high-priority messages).
 
bool IsUserDataClass2QueueFull ()
 Determines whether the user data class 2 queue is full.
 
void EnqueueUserDataClass2 (ASDU asdu)
 Enqueues an ASDU into the class 2 queue (for periodic measurments, background scan, and other low-priority data).
 
 CS101Slave (SerialPort port, LinkLayerParameters parameters=null)
 Initializes a new instance of the lib60870.CS101.CS101Slave class.
 
 CS101Slave (Stream serialStream, LinkLayerParameters parameters=null)
 Initializes a new instance of the lib60870.CS101.CS101Slave class.
 
+void SendLinkLayerTestFunction ()
 Sends a link layer test function.
 
+void Run ()
 Run a the message receiver and state machines once. Can be used if no threads should be used.
 
void ReceiveMessageLoop ()
 Starts a loop that handles incoming messages.
 
void SetReceivedRawMessageHandler (RawMessageHandler handler, object parameter)
 Sets the raw message handler for received messages.
 
void SetSentRawMessageHandler (RawMessageHandler handler, object parameter)
 Sets the sent message handler for sent messages.
 
- Public Member Functions inherited from lib60870.CS101.Slave
void SetInterrogationHandler (InterrogationHandler handler, object parameter)
 Sets a callback for interrogaton requests.
 
void SetCounterInterrogationHandler (CounterInterrogationHandler handler, object parameter)
 Sets a callback for counter interrogaton requests.
 
void SetReadHandler (ReadHandler handler, object parameter)
 Sets a callback for read requests.
 
void SetClockSynchronizationHandler (ClockSynchronizationHandler handler, object parameter)
 Sets a callback for the clock synchronization request.
 
+void SetResetProcessHandler (ResetProcessHandler handler, object parameter)
 
+void SetDelayAcquisitionHandler (DelayAcquisitionHandler handler, object parameter)
 
void SetASDUHandler (ASDUHandler handler, object parameter)
 Sets a callback to handle ASDUs (commands, requests) form clients. This callback can be used when no other callback handles the message from the client/master.
 
void SetFileReadyHandler (FileReadyHandler handler, object parameter)
 Sets a callback handler that is called when a file ready message is received from a master.
 
FilesAvailable GetAvailableFiles ()
 Gets the available files that are registered with the file server.
 
+ + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

ApplicationLayerParameters Parameters [get, set]
 Gets or sets the application layer parameters-.
 
bool DIR [get, set]
 Gets or sets the direction bit value used for balanced mode (default is false)
 
LinkLayerMode LinkLayerMode [get, set]
 Gets or sets the link layer mode (balanced or unbalanced).
 
int LinkLayerAddress [get, set]
 Gets or sets the own link layer address.
 
int LinkLayerAddressOtherStation [get, set]
 Gets or sets the link layer address of the other station (for balanced mode).
 
+override int FileTimeout [get, set]
 
- Properties inherited from lib60870.CS101.Slave
+bool DebugOutput [get, set]
 
virtual int FileTimeout [get, set]
 Gets or sets the file service timeout.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Attributes inherited from lib60870.CS101.Slave
+InterrogationHandler interrogationHandler = null
 
+object InterrogationHandlerParameter = null
 
+CounterInterrogationHandler counterInterrogationHandler = null
 
+object counterInterrogationHandlerParameter = null
 
+ReadHandler readHandler = null
 
+object readHandlerParameter = null
 
+ClockSynchronizationHandler clockSynchronizationHandler = null
 
+object clockSynchronizationHandlerParameter = null
 
+ResetProcessHandler resetProcessHandler = null
 
+object resetProcessHandlerParameter = null
 
+DelayAcquisitionHandler delayAcquisitionHandler = null
 
+object delayAcquisitionHandlerParameter = null
 
+ASDUHandler asduHandler = null
 
+object asduHandlerParameter = null
 
- Protected Attributes inherited from lib60870.CS101.Slave
+bool debugOutput
 
+FilesAvailable filesAvailable = new FilesAvailable()
 
+

Detailed Description

+

CS 101 slave implementation (implements Slave interface)

+

Constructor & Destructor Documentation

+ +

◆ CS101Slave() [1/2]

+ +
+
+ + + + + + + + + + + +
lib60870.CS101.CS101Slave.CS101Slave (SerialPort port,
LinkLayerParameters parameters = null )
+
+ +

Initializes a new instance of the lib60870.CS101.CS101Slave class.

+
Parameters
+ + + +
portserial port instance
parameterslink layer parameters
+
+
+ +
+
+ +

◆ CS101Slave() [2/2]

+ +
+
+ + + + + + + + + + + +
lib60870.CS101.CS101Slave.CS101Slave (Stream serialStream,
LinkLayerParameters parameters = null )
+
+ +

Initializes a new instance of the lib60870.CS101.CS101Slave class.

+
Parameters
+ + + +
serialStreamA stream instance (e.g. TcpClientVirtualSerialPort or TcpServerVirtualSerialPort.
parameterslink layer parameters
+
+
+ +
+
+

Member Function Documentation

+ +

◆ EnqueueUserDataClass1()

+ +
+
+ + + + + + + +
void lib60870.CS101.CS101Slave.EnqueueUserDataClass1 (ASDU asdu)
+
+ +

Enqueues an ASDU into the class 1 queue (for events, command responses, and other high-priority messages).

+
Parameters
+ + +
asduASDU to enqueue
+
+
+ +
+
+ +

◆ EnqueueUserDataClass2()

+ +
+
+ + + + + + + +
void lib60870.CS101.CS101Slave.EnqueueUserDataClass2 (ASDU asdu)
+
+ +

Enqueues an ASDU into the class 2 queue (for periodic measurments, background scan, and other low-priority data).

+
Parameters
+ + +
asduASDU to enqueue
+
+
+ +
+
+ +

◆ IsUserDataClass1QueueFull()

+ +
+
+ + + + + + + +
bool lib60870.CS101.CS101Slave.IsUserDataClass1QueueFull ()
+
+ +

Determines whether the user data class 1 queue is full.

+
Returns
true if the queue is full; otherwise, false.
+ +
+
+ +

◆ IsUserDataClass2QueueFull()

+ +
+
+ + + + + + + +
bool lib60870.CS101.CS101Slave.IsUserDataClass2QueueFull ()
+
+ +

Determines whether the user data class 2 queue is full.

+
Returns
true if the queue is full; otherwise, false.
+ +
+
+ +

◆ ReceiveMessageLoop()

+ +
+
+ + + + + + + +
void lib60870.CS101.CS101Slave.ReceiveMessageLoop ()
+
+ +

Starts a loop that handles incoming messages.

+

It is best to be started in a separate thread. The loop can be stopped with the Stop method.

+ +
+
+ +

◆ SetReceivedRawMessageHandler()

+ +
+
+ + + + + + + + + + + +
void lib60870.CS101.CS101Slave.SetReceivedRawMessageHandler (RawMessageHandler handler,
object parameter )
+
+ +

Sets the raw message handler for received messages.

+
Parameters
+ + + +
handlerHandler/delegate that will be invoked when a message is received
parameterwill be passed to the delegate
+
+
+ +
+
+ +

◆ SetSentRawMessageHandler()

+ +
+
+ + + + + + + + + + + +
void lib60870.CS101.CS101Slave.SetSentRawMessageHandler (RawMessageHandler handler,
object parameter )
+
+ +

Sets the sent message handler for sent messages.

+
Parameters
+ + + +
handlerHandler/delegate that will be invoked when a message is sent<
parameterwill be passed to the delegate
+
+
+ +
+
+ +

◆ SetUserDataQueueSizes()

+ +
+
+ + + + + + + + + + + +
void lib60870.CS101.CS101Slave.SetUserDataQueueSizes (int class1QueueSize,
int class2QueueSize )
+
+ +

Sets the user data queue sizes. When the maximum size is reached the oldest value will be deleted when a new ASDU is added.

+
Parameters
+ + + +
class1QueueSizeClass 1 queue size.
class2QueueSizeClass 2 queue size.
+
+
+ +
+
+

Property Documentation

+ +

◆ DIR

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS101.CS101Slave.DIR
+
+getset
+
+ +

Gets or sets the direction bit value used for balanced mode (default is false)

+

true if DIR is set otherwise, false.

+ +
+
+ +

◆ LinkLayerAddress

+ +
+
+ + + + + +
+ + + + +
int lib60870.CS101.CS101Slave.LinkLayerAddress
+
+getset
+
+ +

Gets or sets the own link layer address.

+

own link layer address.

+ +
+
+ +

◆ LinkLayerAddressOtherStation

+ +
+
+ + + + + +
+ + + + +
int lib60870.CS101.CS101Slave.LinkLayerAddressOtherStation
+
+getset
+
+ +

Gets or sets the link layer address of the other station (for balanced mode).

+

link layer address of other station.

+ +
+
+ +

◆ LinkLayerMode

+ +
+
+ + + + + +
+ + + + +
LinkLayerMode lib60870.CS101.CS101Slave.LinkLayerMode
+
+getset
+
+ +

Gets or sets the link layer mode (balanced or unbalanced).

+

The link layer mode.

+ +
+
+ +

◆ Parameters

+ +
+
+ + + + + +
+ + + + +
ApplicationLayerParameters lib60870.CS101.CS101Slave.Parameters
+
+getset
+
+ +

Gets or sets the application layer parameters-.

+

Should be set before starting the communication

+

application layer parameters.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/CS101Slave.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave.js new file mode 100644 index 0000000..c28ffb4 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave.js @@ -0,0 +1,21 @@ +var classlib60870_1_1_c_s101_1_1_c_s101_slave = +[ + [ "CS101Slave", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a2e94b7ad7d65489e0dbe94fb76d79420", null ], + [ "CS101Slave", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a7d63775d354c7e0b9a3b50927ed74134", null ], + [ "EnqueueUserDataClass1", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a5a8573dbafd2ce027d9d7603b3347211", null ], + [ "EnqueueUserDataClass2", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a605411588ecb89ab825520cac38d547e", null ], + [ "IsUserDataClass1QueueFull", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a9903e812bc9779389eb09e855ae3dd74", null ], + [ "IsUserDataClass2QueueFull", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a24cdca7a10754390b15ce735f848cdb3", null ], + [ "ReceiveMessageLoop", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a19871be23f60399362713e78b8c07404", null ], + [ "Run", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#adeb6feabfe4b01f17bc863ea0281d79c", null ], + [ "SendLinkLayerTestFunction", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a1ee5095020096c7958e2230dbd273100", null ], + [ "SetReceivedRawMessageHandler", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a01bd8b909386de3b9426d5c953a716e3", null ], + [ "SetSentRawMessageHandler", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a0fa4e121ca94fc5a017587c1382d7f42", null ], + [ "SetUserDataQueueSizes", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a6c28db4c5b92dbc3b67e25d86c5a19df", null ], + [ "Stop", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a6502368270e7b7efa3a59778d58bda3a", null ], + [ "DIR", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#ae1d00e6ee950d56d5487384070651148", null ], + [ "LinkLayerAddress", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#aeb21ec9a8522c48ad37c263762d300a4", null ], + [ "LinkLayerAddressOtherStation", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#aa3c5ac017a1ea8fdbbb686c52076cc75", null ], + [ "LinkLayerMode", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#ad9d9bad745efb1fd3ce5bcbe894f6d97", null ], + [ "Parameters", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#ab063f08cb01b7c3ca5bdc86cbafec7d2", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave__coll__graph.dot new file mode 100644 index 0000000..f67288e --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave__coll__graph.dot @@ -0,0 +1,16 @@ +digraph "lib60870.CS101.CS101Slave" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.CS101Slave",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="CS 101 slave implementation (implements Slave interface)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Slave",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_slave.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=" filesAvailable",fontcolor="grey" ]; + Node3 [id="Node000003",label="lib60870.CS101.FilesAvailable",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_files_available.html",tooltip="Represents the available files in a file client or file server."]; + Node4 -> Node1 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="ISecondaryApplicationLayer",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node5 -> Node1 [id="edge4_Node000001_Node000005",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="IMasterConnection",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$interfacelib60870_1_1_c_s101_1_1_i_master_connection.html",tooltip="Provides functions to be used in Slave callbacks to send data back to the master."]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave__inherit__graph.dot new file mode 100644 index 0000000..94127b6 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave__inherit__graph.dot @@ -0,0 +1,14 @@ +digraph "lib60870.CS101.CS101Slave" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.CS101Slave",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="CS 101 slave implementation (implements Slave interface)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Slave",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_slave.html",tooltip=" "]; + Node3 -> Node1 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="ISecondaryApplicationLayer",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node4 -> Node1 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="IMasterConnection",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$interfacelib60870_1_1_c_s101_1_1_i_master_connection.html",tooltip="Provides functions to be used in Slave callbacks to send data back to the master."]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command-members.html new file mode 100644 index 0000000..d1b2165 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command-members.html @@ -0,0 +1,126 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.ClockSynchronizationCommand Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.ClockSynchronizationCommand, including all inherited members.

+ + + + + + + + + + + +
ClockSynchronizationCommand(int ioa, CP56Time2a newTime) (defined in lib60870.CS101.ClockSynchronizationCommand)lib60870.CS101.ClockSynchronizationCommand
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.ClockSynchronizationCommand)lib60870.CS101.ClockSynchronizationCommandvirtual
GetEncodedSize() (defined in lib60870.CS101.ClockSynchronizationCommand)lib60870.CS101.ClockSynchronizationCommand
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
NewTime (defined in lib60870.CS101.ClockSynchronizationCommand)lib60870.CS101.ClockSynchronizationCommand
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
SupportsSequence (defined in lib60870.CS101.ClockSynchronizationCommand)lib60870.CS101.ClockSynchronizationCommand
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.ClockSynchronizationCommand)lib60870.CS101.ClockSynchronizationCommand
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command.html new file mode 100644 index 0000000..1bc42ea --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command.html @@ -0,0 +1,219 @@ + + + + + + + +lib60870.NET: lib60870.CS101.ClockSynchronizationCommand Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.ClockSynchronizationCommand Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.ClockSynchronizationCommand:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.ClockSynchronizationCommand:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
ClockSynchronizationCommand (int ioa, CP56Time2a newTime)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+CP56Time2a NewTime [get, set]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.ClockSynchronizationCommand.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SystemInformationCommands.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command__coll__graph.dot new file mode 100644 index 0000000..a2a7e16 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.ClockSynchronizationCommand" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.ClockSynchronization\lCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command__inherit__graph.dot new file mode 100644 index 0000000..a2a7e16 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.ClockSynchronizationCommand" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.ClockSynchronization\lCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command-members.html new file mode 100644 index 0000000..6d6f2b9 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command-members.html @@ -0,0 +1,126 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.CounterInterrogationCommand Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.CounterInterrogationCommand, including all inherited members.

+ + + + + + + + + + + +
CounterInterrogationCommand(int ioa, byte qoi) (defined in lib60870.CS101.CounterInterrogationCommand)lib60870.CS101.CounterInterrogationCommand
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.CounterInterrogationCommand)lib60870.CS101.CounterInterrogationCommandvirtual
GetEncodedSize() (defined in lib60870.CS101.CounterInterrogationCommand)lib60870.CS101.CounterInterrogationCommand
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
QCClib60870.CS101.CounterInterrogationCommand
SupportsSequence (defined in lib60870.CS101.CounterInterrogationCommand)lib60870.CS101.CounterInterrogationCommand
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.CounterInterrogationCommand)lib60870.CS101.CounterInterrogationCommand
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html new file mode 100644 index 0000000..3465940 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html @@ -0,0 +1,245 @@ + + + + + + + +lib60870.NET: lib60870.CS101.CounterInterrogationCommand Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.CounterInterrogationCommand Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.CounterInterrogationCommand:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.CounterInterrogationCommand:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
CounterInterrogationCommand (int ioa, byte qoi)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
byte QCC [get, set]
 Gets or sets the QCC (Qualifier of counter interrogation).
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.CounterInterrogationCommand.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+

Property Documentation

+ +

◆ QCC

+ +
+
+ + + + + +
+ + + + +
byte lib60870.CS101.CounterInterrogationCommand.QCC
+
+getset
+
+ +

Gets or sets the QCC (Qualifier of counter interrogation).

+

The QCC

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SystemInformationCommands.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command.js new file mode 100644 index 0000000..fbdfde9 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command.js @@ -0,0 +1,4 @@ +var classlib60870_1_1_c_s101_1_1_counter_interrogation_command = +[ + [ "QCC", "classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html#a839093d6c7666896a4bcf2c9b079564e", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command__coll__graph.dot new file mode 100644 index 0000000..909e500 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.CounterInterrogationCommand" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.CounterInterrogation\lCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command__inherit__graph.dot new file mode 100644 index 0000000..909e500 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.CounterInterrogationCommand" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.CounterInterrogation\lCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command-members.html new file mode 100644 index 0000000..fb897bc --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command-members.html @@ -0,0 +1,126 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.DelayAcquisitionCommand Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.DelayAcquisitionCommand, including all inherited members.

+ + + + + + + + + + + +
Delay (defined in lib60870.CS101.DelayAcquisitionCommand)lib60870.CS101.DelayAcquisitionCommand
DelayAcquisitionCommand(int ioa, CP16Time2a delay) (defined in lib60870.CS101.DelayAcquisitionCommand)lib60870.CS101.DelayAcquisitionCommand
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.DelayAcquisitionCommand)lib60870.CS101.DelayAcquisitionCommandvirtual
GetEncodedSize() (defined in lib60870.CS101.DelayAcquisitionCommand)lib60870.CS101.DelayAcquisitionCommand
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
SupportsSequence (defined in lib60870.CS101.DelayAcquisitionCommand)lib60870.CS101.DelayAcquisitionCommand
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.DelayAcquisitionCommand)lib60870.CS101.DelayAcquisitionCommand
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command.html new file mode 100644 index 0000000..79b8689 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command.html @@ -0,0 +1,219 @@ + + + + + + + +lib60870.NET: lib60870.CS101.DelayAcquisitionCommand Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.DelayAcquisitionCommand Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.DelayAcquisitionCommand:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.DelayAcquisitionCommand:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
DelayAcquisitionCommand (int ioa, CP16Time2a delay)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+CP16Time2a Delay [get, set]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.DelayAcquisitionCommand.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SystemInformationCommands.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command__coll__graph.dot new file mode 100644 index 0000000..5b8bccc --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.DelayAcquisitionCommand" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.DelayAcquisition\lCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command__inherit__graph.dot new file mode 100644 index 0000000..5b8bccc --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.DelayAcquisitionCommand" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.DelayAcquisition\lCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command-members.html new file mode 100644 index 0000000..2513917 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command-members.html @@ -0,0 +1,131 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.DoubleCommand Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.DoubleCommand, including all inherited members.

+ + + + + + + + + + + + + + + + +
DoubleCommand(int ioa, int command, bool select, int quality) (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
DoubleCommand(DoubleCommand original) (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommandvirtual
GetEncodedSize() (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
OFF (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommandstatic
ON (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommandstatic
QU (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
Select (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
State (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
SupportsSequence (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command.html new file mode 100644 index 0000000..01e9f58 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command.html @@ -0,0 +1,238 @@ + + + + + + + +lib60870.NET: lib60870.CS101.DoubleCommand Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.DoubleCommand Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.DoubleCommand:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.DoubleCommand:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
DoubleCommand (int ioa, int command, bool select, int quality)
 
DoubleCommand (DoubleCommand original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + +

+Static Public Attributes

+static int OFF = 1
 
+static int ON = 2
 
+ + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+int QU [get]
 
+int State [get]
 
+bool Select [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.DoubleCommand.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SingleCommand.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command__coll__graph.dot new file mode 100644 index 0000000..2f7d8b8 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.DoubleCommand" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.DoubleCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command__inherit__graph.dot new file mode 100644 index 0000000..dd2dcf2 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command__inherit__graph.dot @@ -0,0 +1,16 @@ +digraph "lib60870.CS101.DoubleCommand" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.DoubleCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="lib60870.CS101.DoubleCommand\lWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a.html",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="lib60870.CS101.StepCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_command.html",tooltip=" "]; + Node4 -> Node5 [id="edge4_Node000004_Node000005",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="lib60870.CS101.StepCommand\lWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a-members.html new file mode 100644 index 0000000..e5eb7fa --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a-members.html @@ -0,0 +1,134 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.DoubleCommandWithCP56Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.DoubleCommandWithCP56Time2a, including all inherited members.

+ + + + + + + + + + + + + + + + + + + +
DoubleCommand(int ioa, int command, bool select, int quality) (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
DoubleCommand(DoubleCommand original) (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
DoubleCommandWithCP56Time2a(int ioa, int command, bool select, int quality, CP56Time2a timestamp) (defined in lib60870.CS101.DoubleCommandWithCP56Time2a)lib60870.CS101.DoubleCommandWithCP56Time2a
DoubleCommandWithCP56Time2a(DoubleCommandWithCP56Time2a original) (defined in lib60870.CS101.DoubleCommandWithCP56Time2a)lib60870.CS101.DoubleCommandWithCP56Time2a
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.DoubleCommandWithCP56Time2a)lib60870.CS101.DoubleCommandWithCP56Time2avirtual
GetEncodedSize() (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
OFF (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommandstatic
ON (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommandstatic
QU (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
Select (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
State (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
SupportsSequence (defined in lib60870.CS101.DoubleCommandWithCP56Time2a)lib60870.CS101.DoubleCommandWithCP56Time2a
Timestamp (defined in lib60870.CS101.DoubleCommandWithCP56Time2a)lib60870.CS101.DoubleCommandWithCP56Time2a
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.DoubleCommandWithCP56Time2a)lib60870.CS101.DoubleCommandWithCP56Time2a
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a.html new file mode 100644 index 0000000..6edd8cc --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a.html @@ -0,0 +1,252 @@ + + + + + + + +lib60870.NET: lib60870.CS101.DoubleCommandWithCP56Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.DoubleCommandWithCP56Time2a Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.DoubleCommandWithCP56Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.DoubleCommandWithCP56Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

DoubleCommandWithCP56Time2a (int ioa, int command, bool select, int quality, CP56Time2a timestamp)
 
DoubleCommandWithCP56Time2a (DoubleCommandWithCP56Time2a original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.DoubleCommand
+override int GetEncodedSize ()
 
DoubleCommand (int ioa, int command, bool select, int quality)
 
DoubleCommand (DoubleCommand original)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+CP56Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.DoubleCommand
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+int QU [get]
 
+int State [get]
 
+bool Select [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + + + + + + +

+Additional Inherited Members

- Static Public Attributes inherited from lib60870.CS101.DoubleCommand
+static int OFF = 1
 
+static int ON = 2
 
- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.DoubleCommandWithCP56Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.DoubleCommand.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SingleCommand.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a__coll__graph.dot new file mode 100644 index 0000000..169cacd --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a__coll__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.DoubleCommandWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.DoubleCommand\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="DoubleCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_command.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a__inherit__graph.dot new file mode 100644 index 0000000..169cacd --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.DoubleCommandWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.DoubleCommand\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="DoubleCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_command.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information-members.html new file mode 100644 index 0000000..2698ff7 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information-members.html @@ -0,0 +1,128 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.DoublePointInformation Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.DoublePointInformation, including all inherited members.

+ + + + + + + + + + + + + +
DoublePointInformation(int ioa, DoublePointValue value, QualityDescriptor quality) (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
DoublePointInformation(DoublePointInformation original) (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformationvirtual
GetEncodedSize() (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Quality (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
SupportsSequence (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
Value (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information.html new file mode 100644 index 0000000..8e6fdfd --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information.html @@ -0,0 +1,230 @@ + + + + + + + +lib60870.NET: lib60870.CS101.DoublePointInformation Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.DoublePointInformation Class Reference
+
+
+ +

Double point information object (M_DP_NA_1) + More...

+
+Inheritance diagram for lib60870.CS101.DoublePointInformation:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.DoublePointInformation:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
DoublePointInformation (int ioa, DoublePointValue value, QualityDescriptor quality)
 
DoublePointInformation (DoublePointInformation original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+DoublePointValue Value [get]
 
+QualityDescriptor Quality [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Detailed Description

+

Double point information object (M_DP_NA_1)

+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.DoublePointInformation.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/DoublePointInformation.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information__coll__graph.dot new file mode 100644 index 0000000..aa37919 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.DoublePointInformation" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.DoublePoint\lInformation",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Double point information object (M_DP_NA_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information__inherit__graph.dot new file mode 100644 index 0000000..fe5e102 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information__inherit__graph.dot @@ -0,0 +1,14 @@ +digraph "lib60870.CS101.DoublePointInformation" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.DoublePoint\lInformation",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Double point information object (M_DP_NA_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="lib60870.CS101.DoublePoint\lWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a.html",tooltip="Double point information object with CP24Time2a time tag (M_DP_TA_1)"]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="lib60870.CS101.DoublePoint\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a.html",tooltip="Double point information object with CP56Time2a time tag (M_DP_TB_1)"]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a-members.html new file mode 100644 index 0000000..9f5be9c --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a-members.html @@ -0,0 +1,131 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.DoublePointWithCP24Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.DoublePointWithCP24Time2a, including all inherited members.

+ + + + + + + + + + + + + + + + +
DoublePointInformation(int ioa, DoublePointValue value, QualityDescriptor quality) (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
DoublePointInformation(DoublePointInformation original) (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
DoublePointWithCP24Time2a(int ioa, DoublePointValue value, QualityDescriptor quality, CP24Time2a timestamp) (defined in lib60870.CS101.DoublePointWithCP24Time2a)lib60870.CS101.DoublePointWithCP24Time2a
DoublePointWithCP24Time2a(DoublePointWithCP24Time2a original) (defined in lib60870.CS101.DoublePointWithCP24Time2a)lib60870.CS101.DoublePointWithCP24Time2a
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.DoublePointWithCP24Time2a)lib60870.CS101.DoublePointWithCP24Time2avirtual
GetEncodedSize() (defined in lib60870.CS101.DoublePointWithCP24Time2a)lib60870.CS101.DoublePointWithCP24Time2a
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Quality (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
SupportsSequence (defined in lib60870.CS101.DoublePointWithCP24Time2a)lib60870.CS101.DoublePointWithCP24Time2a
Timestamp (defined in lib60870.CS101.DoublePointWithCP24Time2a)lib60870.CS101.DoublePointWithCP24Time2a
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.DoublePointWithCP24Time2a)lib60870.CS101.DoublePointWithCP24Time2a
Value (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a.html new file mode 100644 index 0000000..76b3690 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a.html @@ -0,0 +1,250 @@ + + + + + + + +lib60870.NET: lib60870.CS101.DoublePointWithCP24Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.DoublePointWithCP24Time2a Class Reference
+
+
+ +

Double point information object with CP24Time2a time tag (M_DP_TA_1) + More...

+
+Inheritance diagram for lib60870.CS101.DoublePointWithCP24Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.DoublePointWithCP24Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
DoublePointWithCP24Time2a (int ioa, DoublePointValue value, QualityDescriptor quality, CP24Time2a timestamp)
 
DoublePointWithCP24Time2a (DoublePointWithCP24Time2a original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.DoublePointInformation
+override int GetEncodedSize ()
 
DoublePointInformation (int ioa, DoublePointValue value, QualityDescriptor quality)
 
DoublePointInformation (DoublePointInformation original)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+CP24Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.DoublePointInformation
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+DoublePointValue Value [get]
 
+QualityDescriptor Quality [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Detailed Description

+

Double point information object with CP24Time2a time tag (M_DP_TA_1)

+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.DoublePointWithCP24Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.DoublePointInformation.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/DoublePointInformation.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a__coll__graph.dot new file mode 100644 index 0000000..86f78ad --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a__coll__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.DoublePointWithCP24Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.DoublePoint\lWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Double point information object with CP24Time2a time tag (M_DP_TA_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="DoublePointInformation",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_point_information.html",tooltip="Double point information object (M_DP_NA_1)"]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a__inherit__graph.dot new file mode 100644 index 0000000..86f78ad --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.DoublePointWithCP24Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.DoublePoint\lWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Double point information object with CP24Time2a time tag (M_DP_TA_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="DoublePointInformation",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_point_information.html",tooltip="Double point information object (M_DP_NA_1)"]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a-members.html new file mode 100644 index 0000000..cb153d3 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a-members.html @@ -0,0 +1,131 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.DoublePointWithCP56Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.DoublePointWithCP56Time2a, including all inherited members.

+ + + + + + + + + + + + + + + + +
DoublePointInformation(int ioa, DoublePointValue value, QualityDescriptor quality) (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
DoublePointInformation(DoublePointInformation original) (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
DoublePointWithCP56Time2a(int ioa, DoublePointValue value, QualityDescriptor quality, CP56Time2a timestamp) (defined in lib60870.CS101.DoublePointWithCP56Time2a)lib60870.CS101.DoublePointWithCP56Time2a
DoublePointWithCP56Time2a(DoublePointWithCP56Time2a original) (defined in lib60870.CS101.DoublePointWithCP56Time2a)lib60870.CS101.DoublePointWithCP56Time2a
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.DoublePointWithCP56Time2a)lib60870.CS101.DoublePointWithCP56Time2avirtual
GetEncodedSize() (defined in lib60870.CS101.DoublePointWithCP56Time2a)lib60870.CS101.DoublePointWithCP56Time2a
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Quality (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
SupportsSequence (defined in lib60870.CS101.DoublePointWithCP56Time2a)lib60870.CS101.DoublePointWithCP56Time2a
Timestamp (defined in lib60870.CS101.DoublePointWithCP56Time2a)lib60870.CS101.DoublePointWithCP56Time2a
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.DoublePointWithCP56Time2a)lib60870.CS101.DoublePointWithCP56Time2a
Value (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a.html new file mode 100644 index 0000000..7c1d301 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a.html @@ -0,0 +1,250 @@ + + + + + + + +lib60870.NET: lib60870.CS101.DoublePointWithCP56Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.DoublePointWithCP56Time2a Class Reference
+
+
+ +

Double point information object with CP56Time2a time tag (M_DP_TB_1) + More...

+
+Inheritance diagram for lib60870.CS101.DoublePointWithCP56Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.DoublePointWithCP56Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
DoublePointWithCP56Time2a (int ioa, DoublePointValue value, QualityDescriptor quality, CP56Time2a timestamp)
 
DoublePointWithCP56Time2a (DoublePointWithCP56Time2a original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.DoublePointInformation
+override int GetEncodedSize ()
 
DoublePointInformation (int ioa, DoublePointValue value, QualityDescriptor quality)
 
DoublePointInformation (DoublePointInformation original)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+CP56Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.DoublePointInformation
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+DoublePointValue Value [get]
 
+QualityDescriptor Quality [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Detailed Description

+

Double point information object with CP56Time2a time tag (M_DP_TB_1)

+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.DoublePointWithCP56Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.DoublePointInformation.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/DoublePointInformation.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a__coll__graph.dot new file mode 100644 index 0000000..a4aa735 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a__coll__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.DoublePointWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.DoublePoint\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Double point information object with CP56Time2a time tag (M_DP_TB_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="DoublePointInformation",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_point_information.html",tooltip="Double point information object (M_DP_NA_1)"]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a__inherit__graph.dot new file mode 100644 index 0000000..a4aa735 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.DoublePointWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.DoublePoint\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Double point information object with CP56Time2a time tag (M_DP_TB_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="DoublePointInformation",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_point_information.html",tooltip="Double point information object (M_DP_NA_1)"]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization-members.html new file mode 100644 index 0000000..58c40fa --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization-members.html @@ -0,0 +1,127 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.EndOfInitialization Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.EndOfInitialization, including all inherited members.

+ + + + + + + + + + + + +
COIlib60870.CS101.EndOfInitialization
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.EndOfInitialization)lib60870.CS101.EndOfInitializationvirtual
EndOfInitialization(byte coi) (defined in lib60870.CS101.EndOfInitialization)lib60870.CS101.EndOfInitialization
EndOfInitialization(EndOfInitialization original) (defined in lib60870.CS101.EndOfInitialization)lib60870.CS101.EndOfInitialization
GetEncodedSize() (defined in lib60870.CS101.EndOfInitialization)lib60870.CS101.EndOfInitialization
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
SupportsSequence (defined in lib60870.CS101.EndOfInitialization)lib60870.CS101.EndOfInitialization
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.EndOfInitialization)lib60870.CS101.EndOfInitialization
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization.html new file mode 100644 index 0000000..a9dc77b --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization.html @@ -0,0 +1,228 @@ + + + + + + + +lib60870.NET: lib60870.CS101.EndOfInitialization Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.EndOfInitialization Class Reference
+
+
+ +

End of initialization information object (M_EI_NA_1) + More...

+
+Inheritance diagram for lib60870.CS101.EndOfInitialization:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.EndOfInitialization:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
EndOfInitialization (byte coi)
 
EndOfInitialization (EndOfInitialization original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + +

+Properties

+byte COI [get, set]
 Cause of Initialization (COI)
 
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Detailed Description

+

End of initialization information object (M_EI_NA_1)

+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.EndOfInitialization.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/EndOfInitialization.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization.js new file mode 100644 index 0000000..b620194 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization.js @@ -0,0 +1,4 @@ +var classlib60870_1_1_c_s101_1_1_end_of_initialization = +[ + [ "COI", "classlib60870_1_1_c_s101_1_1_end_of_initialization.html#ad48e8ec133c8bf5ed7f389063492d67b", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization__coll__graph.dot new file mode 100644 index 0000000..48af3df --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.EndOfInitialization" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.EndOfInitialization",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="End of initialization information object (M_EI_NA_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization__inherit__graph.dot new file mode 100644 index 0000000..48af3df --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.EndOfInitialization" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.EndOfInitialization",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="End of initialization information object (M_EI_NA_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment-members.html new file mode 100644 index 0000000..2565818 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment-members.html @@ -0,0 +1,129 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.EventOfProtectionEquipment Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.EventOfProtectionEquipment, including all inherited members.

+ + + + + + + + + + + + + + +
ElapsedTime (defined in lib60870.CS101.EventOfProtectionEquipment)lib60870.CS101.EventOfProtectionEquipment
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.EventOfProtectionEquipment)lib60870.CS101.EventOfProtectionEquipmentvirtual
Event (defined in lib60870.CS101.EventOfProtectionEquipment)lib60870.CS101.EventOfProtectionEquipment
EventOfProtectionEquipment(int ioa, SingleEvent singleEvent, CP16Time2a elapsedTime, CP24Time2a timestamp) (defined in lib60870.CS101.EventOfProtectionEquipment)lib60870.CS101.EventOfProtectionEquipment
EventOfProtectionEquipment(EventOfProtectionEquipment original) (defined in lib60870.CS101.EventOfProtectionEquipment)lib60870.CS101.EventOfProtectionEquipment
GetEncodedSize() (defined in lib60870.CS101.EventOfProtectionEquipment)lib60870.CS101.EventOfProtectionEquipment
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
SupportsSequence (defined in lib60870.CS101.EventOfProtectionEquipment)lib60870.CS101.EventOfProtectionEquipment
Timestamp (defined in lib60870.CS101.EventOfProtectionEquipment)lib60870.CS101.EventOfProtectionEquipment
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.EventOfProtectionEquipment)lib60870.CS101.EventOfProtectionEquipment
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment.html new file mode 100644 index 0000000..b8a2334 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment.html @@ -0,0 +1,233 @@ + + + + + + + +lib60870.NET: lib60870.CS101.EventOfProtectionEquipment Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.EventOfProtectionEquipment Class Reference
+
+
+ +

Event of protection equipment information object (M_EP_TA_1) + More...

+
+Inheritance diagram for lib60870.CS101.EventOfProtectionEquipment:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.EventOfProtectionEquipment:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
EventOfProtectionEquipment (int ioa, SingleEvent singleEvent, CP16Time2a elapsedTime, CP24Time2a timestamp)
 
EventOfProtectionEquipment (EventOfProtectionEquipment original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+SingleEvent Event [get]
 
+CP16Time2a ElapsedTime [get]
 
+CP24Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Detailed Description

+

Event of protection equipment information object (M_EP_TA_1)

+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.EventOfProtectionEquipment.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/EventOfProtectionEquipment.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment__coll__graph.dot new file mode 100644 index 0000000..4cc91dc --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.EventOfProtectionEquipment" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.EventOfProtection\lEquipment",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Event of protection equipment information object (M_EP_TA_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment__inherit__graph.dot new file mode 100644 index 0000000..4cc91dc --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.EventOfProtectionEquipment" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.EventOfProtection\lEquipment",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Event of protection equipment information object (M_EP_TA_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a-members.html new file mode 100644 index 0000000..406fa1b --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a-members.html @@ -0,0 +1,129 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a, including all inherited members.

+ + + + + + + + + + + + + + +
ElapsedTime (defined in lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2avirtual
Event (defined in lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a
EventOfProtectionEquipmentWithCP56Time2a(int ioa, SingleEvent singleEvent, CP16Time2a elapsedTime, CP56Time2a timestamp) (defined in lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a
EventOfProtectionEquipmentWithCP56Time2a(EventOfProtectionEquipmentWithCP56Time2a original) (defined in lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a
GetEncodedSize() (defined in lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
SupportsSequence (defined in lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a
Timestamp (defined in lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a.html new file mode 100644 index 0000000..d0f0f68 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a.html @@ -0,0 +1,233 @@ + + + + + + + +lib60870.NET: lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a Class Reference
+
+
+ +

Event of protection equipment information object with CP56Time2a time tag (M_EP_TD_1) + More...

+
+Inheritance diagram for lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
EventOfProtectionEquipmentWithCP56Time2a (int ioa, SingleEvent singleEvent, CP16Time2a elapsedTime, CP56Time2a timestamp)
 
EventOfProtectionEquipmentWithCP56Time2a (EventOfProtectionEquipmentWithCP56Time2a original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+SingleEvent Event [get]
 
+CP16Time2a ElapsedTime [get]
 
+CP56Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Detailed Description

+

Event of protection equipment information object with CP56Time2a time tag (M_EP_TD_1)

+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/EventOfProtectionEquipment.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a__coll__graph.dot new file mode 100644 index 0000000..5a92505 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.EventOfProtection\lEquipmentWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Event of protection equipment information object with CP56Time2a time tag (M_EP_TD_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a__inherit__graph.dot new file mode 100644 index 0000000..5a92505 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.EventOfProtection\lEquipmentWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Event of protection equipment information object with CP56Time2a time tag (M_EP_TD_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k-members.html new file mode 100644 index 0000000..6f09e08 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k-members.html @@ -0,0 +1,130 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.FileACK Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.FileACK, including all inherited members.

+ + + + + + + + + + + + + + + +
AckQualifierlib60870.CS101.FileACK
AFQ (defined in lib60870.CS101.FileACK)lib60870.CS101.FileACK
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.FileACK)lib60870.CS101.FileACKvirtual
ErrorCode (defined in lib60870.CS101.FileACK)lib60870.CS101.FileACK
FileACK(int objectAddress, NameOfFile nof, byte nameOfSection, AcknowledgeQualifier qualifier, FileError errorCode) (defined in lib60870.CS101.FileACK)lib60870.CS101.FileACK
GetEncodedSize() (defined in lib60870.CS101.FileACK)lib60870.CS101.FileACK
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
NameOfSection (defined in lib60870.CS101.FileACK)lib60870.CS101.FileACK
NOF (defined in lib60870.CS101.FileACK)lib60870.CS101.FileACK
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
SupportsSequence (defined in lib60870.CS101.FileACK)lib60870.CS101.FileACK
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.FileACK)lib60870.CS101.FileACK
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k.html new file mode 100644 index 0000000..644d3c1 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k.html @@ -0,0 +1,262 @@ + + + + + + + +lib60870.NET: lib60870.CS101.FileACK Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.FileACK Class Reference
+
+
+ +

ACK file/section - F_AF_NA_1 (124) + More...

+
+Inheritance diagram for lib60870.CS101.FileACK:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.FileACK:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
FileACK (int objectAddress, NameOfFile nof, byte nameOfSection, AcknowledgeQualifier qualifier, FileError errorCode)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+NameOfFile NOF [get, set]
 
+byte NameOfSection [get, set]
 
AcknowledgeQualifier AckQualifier [get, set]
 Gets or sets the AFQ (acknowledge file or section qualifier)
 
+FileError ErrorCode [get, set]
 
+byte AFQ [get, set]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Detailed Description

+

ACK file/section - F_AF_NA_1 (124)

+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.FileACK.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+

Property Documentation

+ +

◆ AckQualifier

+ +
+
+ + + + + +
+ + + + +
AcknowledgeQualifier lib60870.CS101.FileACK.AckQualifier
+
+getset
+
+ +

Gets or sets the AFQ (acknowledge file or section qualifier)

+

The AFQ

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/FileObjects.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k.js new file mode 100644 index 0000000..b02eb5f --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k.js @@ -0,0 +1,4 @@ +var classlib60870_1_1_c_s101_1_1_file_a_c_k = +[ + [ "AckQualifier", "classlib60870_1_1_c_s101_1_1_file_a_c_k.html#a9f6b95cc90ebe3515dff6af81c294d81", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k__coll__graph.dot new file mode 100644 index 0000000..0d08976 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.FileACK" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.FileACK",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="ACK file/section - F_AF_NA_1 (124)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k__inherit__graph.dot new file mode 100644 index 0000000..0d08976 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.FileACK" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.FileACK",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="ACK file/section - F_AF_NA_1 (124)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select-members.html new file mode 100644 index 0000000..151485b --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select-members.html @@ -0,0 +1,128 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.FileCallOrSelect Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.FileCallOrSelect, including all inherited members.

+ + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.FileCallOrSelect)lib60870.CS101.FileCallOrSelectvirtual
FileCallOrSelect(int objectAddress, NameOfFile nof, byte nameOfSection, SelectAndCallQualifier scq) (defined in lib60870.CS101.FileCallOrSelect)lib60870.CS101.FileCallOrSelect
GetEncodedSize() (defined in lib60870.CS101.FileCallOrSelect)lib60870.CS101.FileCallOrSelect
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
NameOfSection (defined in lib60870.CS101.FileCallOrSelect)lib60870.CS101.FileCallOrSelect
NOF (defined in lib60870.CS101.FileCallOrSelect)lib60870.CS101.FileCallOrSelect
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
SCQlib60870.CS101.FileCallOrSelect
SupportsSequence (defined in lib60870.CS101.FileCallOrSelect)lib60870.CS101.FileCallOrSelect
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.FileCallOrSelect)lib60870.CS101.FileCallOrSelect
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select.html new file mode 100644 index 0000000..9580d22 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select.html @@ -0,0 +1,256 @@ + + + + + + + +lib60870.NET: lib60870.CS101.FileCallOrSelect Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.FileCallOrSelect Class Reference
+
+
+ +

Call/Select directory/file/section - F_SC_NA_1 (122) + More...

+
+Inheritance diagram for lib60870.CS101.FileCallOrSelect:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.FileCallOrSelect:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
FileCallOrSelect (int objectAddress, NameOfFile nof, byte nameOfSection, SelectAndCallQualifier scq)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+NameOfFile NOF [get, set]
 
+byte NameOfSection [get, set]
 
SelectAndCallQualifier SCQ [get, set]
 Gets or sets the SCQ (select and call qualifier)
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Detailed Description

+

Call/Select directory/file/section - F_SC_NA_1 (122)

+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.FileCallOrSelect.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+

Property Documentation

+ +

◆ SCQ

+ +
+
+ + + + + +
+ + + + +
SelectAndCallQualifier lib60870.CS101.FileCallOrSelect.SCQ
+
+getset
+
+ +

Gets or sets the SCQ (select and call qualifier)

+

The SCQ

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/FileObjects.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select.js new file mode 100644 index 0000000..d328c7b --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select.js @@ -0,0 +1,4 @@ +var classlib60870_1_1_c_s101_1_1_file_call_or_select = +[ + [ "SCQ", "classlib60870_1_1_c_s101_1_1_file_call_or_select.html#a6acae49243536a7db32643ffccdc17c8", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select__coll__graph.dot new file mode 100644 index 0000000..d23fe72 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.FileCallOrSelect" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.FileCallOr\lSelect",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Call/Select directory/file/section - F_SC_NA_1 (122)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select__inherit__graph.dot new file mode 100644 index 0000000..d23fe72 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.FileCallOrSelect" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.FileCallOr\lSelect",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Call/Select directory/file/section - F_SC_NA_1 (122)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory-members.html new file mode 100644 index 0000000..e0ba812 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory-members.html @@ -0,0 +1,133 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.FileDirectory Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.FileDirectory, including all inherited members.

+ + + + + + + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.FileDirectory)lib60870.CS101.FileDirectoryvirtual
FA (defined in lib60870.CS101.FileDirectory)lib60870.CS101.FileDirectory
FileDirectory(int objectAddress, NameOfFile nof, int lengthOfFile, byte sof, CP56Time2a creationTime) (defined in lib60870.CS101.FileDirectory)lib60870.CS101.FileDirectory
FileDirectory(int objectAddress, NameOfFile nof, int lengthOfFile, int status, bool LFD, bool FOR, bool FA, CP56Time2a creationTime) (defined in lib60870.CS101.FileDirectory)lib60870.CS101.FileDirectory
FOR (defined in lib60870.CS101.FileDirectory)lib60870.CS101.FileDirectory
GetEncodedSize() (defined in lib60870.CS101.FileDirectory)lib60870.CS101.FileDirectory
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
LengthOfFile (defined in lib60870.CS101.FileDirectory)lib60870.CS101.FileDirectory
LFD (defined in lib60870.CS101.FileDirectory)lib60870.CS101.FileDirectory
NOF (defined in lib60870.CS101.FileDirectory)lib60870.CS101.FileDirectory
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
SOFlib60870.CS101.FileDirectory
STATUS (defined in lib60870.CS101.FileDirectory)lib60870.CS101.FileDirectory
SupportsSequence (defined in lib60870.CS101.FileDirectory)lib60870.CS101.FileDirectory
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.FileDirectory)lib60870.CS101.FileDirectory
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory.html new file mode 100644 index 0000000..c42b544 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory.html @@ -0,0 +1,271 @@ + + + + + + + +lib60870.NET: lib60870.CS101.FileDirectory Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.FileDirectory Class Reference
+
+
+ +

File directory - F_DR_TA_1 (126) + More...

+
+Inheritance diagram for lib60870.CS101.FileDirectory:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.FileDirectory:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
FileDirectory (int objectAddress, NameOfFile nof, int lengthOfFile, byte sof, CP56Time2a creationTime)
 
FileDirectory (int objectAddress, NameOfFile nof, int lengthOfFile, int status, bool LFD, bool FOR, bool FA, CP56Time2a creationTime)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+NameOfFile NOF [get, set]
 
+int LengthOfFile [get, set]
 
byte SOF [get, set]
 Gets or sets the SOF (Status of file - 7.2.6.38 in IEC 60870-5-101:2003)
 
+int STATUS [get]
 
+bool LFD [get]
 
+bool FOR [get]
 
+bool FA [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Detailed Description

+

File directory - F_DR_TA_1 (126)

+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.FileDirectory.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+

Property Documentation

+ +

◆ SOF

+ +
+
+ + + + + +
+ + + + +
byte lib60870.CS101.FileDirectory.SOF
+
+getset
+
+ +

Gets or sets the SOF (Status of file - 7.2.6.38 in IEC 60870-5-101:2003)

+

SOF value

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/FileObjects.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory.js new file mode 100644 index 0000000..07a81a4 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory.js @@ -0,0 +1,4 @@ +var classlib60870_1_1_c_s101_1_1_file_directory = +[ + [ "SOF", "classlib60870_1_1_c_s101_1_1_file_directory.html#af1f8d171f735aae0eed368015a3be40d", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory__coll__graph.dot new file mode 100644 index 0000000..369ba1d --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.FileDirectory" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.FileDirectory",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="File directory - F_DR_TA_1 (126)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory__inherit__graph.dot new file mode 100644 index 0000000..369ba1d --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.FileDirectory" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.FileDirectory",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="File directory - F_DR_TA_1 (126)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section-members.html new file mode 100644 index 0000000..af08c25 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section-members.html @@ -0,0 +1,129 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.FileLastSegmentOrSection Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.FileLastSegmentOrSection, including all inherited members.

+ + + + + + + + + + + + + + +
CHSlib60870.CS101.FileLastSegmentOrSection
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.FileLastSegmentOrSection)lib60870.CS101.FileLastSegmentOrSectionvirtual
FileLastSegmentOrSection(int objectAddress, NameOfFile nof, byte nameOfSection, LastSectionOrSegmentQualifier lsq, byte checksum) (defined in lib60870.CS101.FileLastSegmentOrSection)lib60870.CS101.FileLastSegmentOrSection
GetEncodedSize() (defined in lib60870.CS101.FileLastSegmentOrSection)lib60870.CS101.FileLastSegmentOrSection
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
LSQ (defined in lib60870.CS101.FileLastSegmentOrSection)lib60870.CS101.FileLastSegmentOrSection
NameOfSection (defined in lib60870.CS101.FileLastSegmentOrSection)lib60870.CS101.FileLastSegmentOrSection
NOF (defined in lib60870.CS101.FileLastSegmentOrSection)lib60870.CS101.FileLastSegmentOrSection
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
SupportsSequence (defined in lib60870.CS101.FileLastSegmentOrSection)lib60870.CS101.FileLastSegmentOrSection
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.FileLastSegmentOrSection)lib60870.CS101.FileLastSegmentOrSection
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html new file mode 100644 index 0000000..2a7a0ff --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html @@ -0,0 +1,259 @@ + + + + + + + +lib60870.NET: lib60870.CS101.FileLastSegmentOrSection Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.FileLastSegmentOrSection Class Reference
+
+
+ +

Last segment/section - F_LS_NA_1 (123) + More...

+
+Inheritance diagram for lib60870.CS101.FileLastSegmentOrSection:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.FileLastSegmentOrSection:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
FileLastSegmentOrSection (int objectAddress, NameOfFile nof, byte nameOfSection, LastSectionOrSegmentQualifier lsq, byte checksum)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+NameOfFile NOF [get, set]
 
+byte NameOfSection [get, set]
 
+LastSectionOrSegmentQualifier LSQ [get, set]
 
byte CHS [get, set]
 Gets or sets the checksum.
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Detailed Description

+

Last segment/section - F_LS_NA_1 (123)

+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.FileLastSegmentOrSection.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+

Property Documentation

+ +

◆ CHS

+ +
+
+ + + + + +
+ + + + +
byte lib60870.CS101.FileLastSegmentOrSection.CHS
+
+getset
+
+ +

Gets or sets the checksum.

+

The checksum value

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/FileObjects.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.js new file mode 100644 index 0000000..0a24b3f --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.js @@ -0,0 +1,4 @@ +var classlib60870_1_1_c_s101_1_1_file_last_segment_or_section = +[ + [ "CHS", "classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html#af2302361352eb1447b4bfb6541772c50", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section__coll__graph.dot new file mode 100644 index 0000000..7e25fc7 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.FileLastSegmentOrSection" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.FileLastSegment\lOrSection",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Last segment/section - F_LS_NA_1 (123)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section__inherit__graph.dot new file mode 100644 index 0000000..7e25fc7 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.FileLastSegmentOrSection" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.FileLastSegment\lOrSection",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Last segment/section - F_LS_NA_1 (123)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready-members.html new file mode 100644 index 0000000..07e696d --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready-members.html @@ -0,0 +1,129 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.FileReady Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.FileReady, including all inherited members.

+ + + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.FileReady)lib60870.CS101.FileReadyvirtual
FileReady(int objectAddress, NameOfFile nof, int lengthOfFile, bool positive)lib60870.CS101.FileReady
FRQlib60870.CS101.FileReady
GetEncodedSize() (defined in lib60870.CS101.FileReady)lib60870.CS101.FileReady
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
LengthOfFile (defined in lib60870.CS101.FileReady)lib60870.CS101.FileReady
NOF (defined in lib60870.CS101.FileReady)lib60870.CS101.FileReady
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Positive (defined in lib60870.CS101.FileReady)lib60870.CS101.FileReady
SupportsSequence (defined in lib60870.CS101.FileReady)lib60870.CS101.FileReady
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.FileReady)lib60870.CS101.FileReady
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready.html new file mode 100644 index 0000000..e40b2be --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready.html @@ -0,0 +1,277 @@ + + + + + + + +lib60870.NET: lib60870.CS101.FileReady Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.FileReady Class Reference
+
+
+ +

File ready - F_FR_NA_1 (120) + More...

+
+Inheritance diagram for lib60870.CS101.FileReady:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.FileReady:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
 FileReady (int objectAddress, NameOfFile nof, int lengthOfFile, bool positive)
 Initializes a new instance of the lib60870.CS101.FileReady class.
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+NameOfFile NOF [get, set]
 
+int LengthOfFile [get, set]
 
+byte FRQ [get, set]
 Gets or sets the FRQ (File ready qualifier)
 
+bool Positive [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Detailed Description

+

File ready - F_FR_NA_1 (120)

+

Constructor & Destructor Documentation

+ +

◆ FileReady()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
lib60870.CS101.FileReady.FileReady (int objectAddress,
NameOfFile nof,
int lengthOfFile,
bool positive )
+
+ +

Initializes a new instance of the lib60870.CS101.FileReady class.

+
Parameters
+ + + + + +
objectAddressinformation object address (IOA)
nofNOF (file type)
lengthOfFileLength of file.
positiveIf set to true positive ACK.
+
+
+ +
+
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.FileReady.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/FileObjects.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready.js new file mode 100644 index 0000000..9e43719 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready.js @@ -0,0 +1,5 @@ +var classlib60870_1_1_c_s101_1_1_file_ready = +[ + [ "FileReady", "classlib60870_1_1_c_s101_1_1_file_ready.html#a109625172b98152e626a426c260295e6", null ], + [ "FRQ", "classlib60870_1_1_c_s101_1_1_file_ready.html#a68e7d332f311fb83d9bb617b6e54ec0a", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready__coll__graph.dot new file mode 100644 index 0000000..b67a656 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.FileReady" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.FileReady",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="File ready - F_FR_NA_1 (120)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready__inherit__graph.dot new file mode 100644 index 0000000..b67a656 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.FileReady" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.FileReady",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="File ready - F_FR_NA_1 (120)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment-members.html new file mode 100644 index 0000000..183785e --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment-members.html @@ -0,0 +1,130 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.FileSegment Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.FileSegment, including all inherited members.

+ + + + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.FileSegment)lib60870.CS101.FileSegmentvirtual
FileSegment(int objectAddress, NameOfFile nof, byte nameOfSection, byte[] data) (defined in lib60870.CS101.FileSegment)lib60870.CS101.FileSegment
GetEncodedSize() (defined in lib60870.CS101.FileSegment)lib60870.CS101.FileSegment
GetMaxDataSize(ApplicationLayerParameters parameters) (defined in lib60870.CS101.FileSegment)lib60870.CS101.FileSegmentstatic
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
LengthOfSegment (defined in lib60870.CS101.FileSegment)lib60870.CS101.FileSegment
NameOfSection (defined in lib60870.CS101.FileSegment)lib60870.CS101.FileSegment
NOF (defined in lib60870.CS101.FileSegment)lib60870.CS101.FileSegment
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
SegmentData (defined in lib60870.CS101.FileSegment)lib60870.CS101.FileSegment
SupportsSequence (defined in lib60870.CS101.FileSegment)lib60870.CS101.FileSegment
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.FileSegment)lib60870.CS101.FileSegment
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment.html new file mode 100644 index 0000000..ed682e2 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment.html @@ -0,0 +1,240 @@ + + + + + + + +lib60870.NET: lib60870.CS101.FileSegment Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.FileSegment Class Reference
+
+
+ +

File segment - F_SG_NA_1 (125) + More...

+
+Inheritance diagram for lib60870.CS101.FileSegment:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.FileSegment:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
FileSegment (int objectAddress, NameOfFile nof, byte nameOfSection, byte[] data)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + +

+Static Public Member Functions

+static int GetMaxDataSize (ApplicationLayerParameters parameters)
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+NameOfFile NOF [get, set]
 
+byte NameOfSection [get, set]
 
+byte LengthOfSegment [get, set]
 
+byte[] SegmentData [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Detailed Description

+

File segment - F_SG_NA_1 (125)

+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.FileSegment.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/FileObjects.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment__coll__graph.dot new file mode 100644 index 0000000..5c4e580 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.FileSegment" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.FileSegment",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="File segment - F_SG_NA_1 (125)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment__inherit__graph.dot new file mode 100644 index 0000000..5c4e580 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.FileSegment" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.FileSegment",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="File segment - F_SG_NA_1 (125)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_files_available-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_files_available-members.html new file mode 100644 index 0000000..6c3c403 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_files_available-members.html @@ -0,0 +1,119 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.FilesAvailable Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.FilesAvailable, including all inherited members.

+ + + + +
AddFile(IFileProvider file)lib60870.CS101.FilesAvailable
GetFiles()lib60870.CS101.FilesAvailable
RemoveFile(IFileProvider file)lib60870.CS101.FilesAvailable
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_files_available.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_files_available.html new file mode 100644 index 0000000..3288fe7 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_files_available.html @@ -0,0 +1,209 @@ + + + + + + + +lib60870.NET: lib60870.CS101.FilesAvailable Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.FilesAvailable Class Reference
+
+
+ +

Represents the available files in a file client or file server. + More...

+ + + + + + + + + + + +

+Public Member Functions

void AddFile (IFileProvider file)
 Adds a file to the list of available files.
 
void RemoveFile (IFileProvider file)
 Removes a file from the list of available files.
 
List< IFileProviderGetFiles ()
 Gets the list of available files.
 
+

Detailed Description

+

Represents the available files in a file client or file server.

+

Member Function Documentation

+ +

◆ AddFile()

+ +
+
+ + + + + + + +
void lib60870.CS101.FilesAvailable.AddFile (IFileProvider file)
+
+ +

Adds a file to the list of available files.

+
Parameters
+ + +
filefile to add
+
+
+ +
+
+ +

◆ GetFiles()

+ +
+
+ + + + + + + +
List< IFileProvider > lib60870.CS101.FilesAvailable.GetFiles ()
+
+ +

Gets the list of available files.

+
Returns
the list of available files
+ +
+
+ +

◆ RemoveFile()

+ +
+
+ + + + + + + +
void lib60870.CS101.FilesAvailable.RemoveFile (IFileProvider file)
+
+ +

Removes a file from the list of available files.

+
Parameters
+ + +
filefile to remove
+
+
+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/FileServices.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_files_available.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_files_available.js new file mode 100644 index 0000000..c0ae408 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_files_available.js @@ -0,0 +1,6 @@ +var classlib60870_1_1_c_s101_1_1_files_available = +[ + [ "AddFile", "classlib60870_1_1_c_s101_1_1_files_available.html#a72840ada81d664c1d63531ce022e57e5", null ], + [ "GetFiles", "classlib60870_1_1_c_s101_1_1_files_available.html#ad07db9fbd1ca2f1643991d7b446bf7c4", null ], + [ "RemoveFile", "classlib60870_1_1_c_s101_1_1_files_available.html#a894040bf5b71a47feaa4eab80cf7a0d9", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object-members.html new file mode 100644 index 0000000..c690d3a --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object-members.html @@ -0,0 +1,124 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.InformationObject Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.InformationObject, including all inherited members.

+ + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectvirtual
GetEncodedSize()lib60870.CS101.InformationObject
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
SupportsSequencelib60870.CS101.InformationObject
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Typelib60870.CS101.InformationObject
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object.html new file mode 100644 index 0000000..7c61bd1 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object.html @@ -0,0 +1,241 @@ + + + + + + + +lib60870.NET: lib60870.CS101.InformationObject Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.InformationObject Class Referenceabstract
+
+
+
+Inheritance diagram for lib60870.CS101.InformationObject:
+
+
Inheritance graph
+
[legend]
+ + + + + + + + + + + +

+Public Member Functions

+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+virtual void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
+ + + +

+Protected Member Functions

InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+ + + + + + + + + +

+Properties

+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+

Member Function Documentation

+ +

◆ GetEncodedSize()

+ +
+
+ + + + + +
+ + + + + + + +
int lib60870.CS101.InformationObject.GetEncodedSize ()
+
+abstract
+
+ +

Gets the encoded payload size of the object (information object size without the IOA)

+
Returns
The encoded size in bytes
+ +
+
+

Property Documentation

+ +

◆ SupportsSequence

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS101.InformationObject.SupportsSequence
+
+getabstract
+
+ +

Indicates if this information object type supports sequence of information objects encoding.

+

true if supports sequence encoding; otherwise, false.

+ +
+
+ +

◆ Type

+ +
+
+ + + + + +
+ + + + +
TypeID lib60870.CS101.InformationObject.Type
+
+getabstract
+
+ +

The type ID (message type) of the information object type.

+

The type.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/InformationObject.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object.js new file mode 100644 index 0000000..3b0143c --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object.js @@ -0,0 +1,6 @@ +var classlib60870_1_1_c_s101_1_1_information_object = +[ + [ "GetEncodedSize", "classlib60870_1_1_c_s101_1_1_information_object.html#a2e5cb4ff206963db465c10d06c6e1954", null ], + [ "SupportsSequence", "classlib60870_1_1_c_s101_1_1_information_object.html#a8e277f6a5d421d25ae9c9eb9b169887e", null ], + [ "Type", "classlib60870_1_1_c_s101_1_1_information_object.html#af2eba7ad5825d5d34258ce9747a615be", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object__inherit__graph.dot new file mode 100644 index 0000000..4eeb796 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object__inherit__graph.dot @@ -0,0 +1,105 @@ +digraph "lib60870.CS101.InformationObject" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="lib60870.CS101.Information\lObject",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="lib60870.CS101.Bitstring32",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32.html",tooltip=" "]; + Node2 -> Node3 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="lib60870.CS101.Bitstring32\lWithCP24Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a.html",tooltip=" "]; + Node2 -> Node4 [id="edge3_Node000002_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="lib60870.CS101.Bitstring32\lWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a.html",tooltip=" "]; + Node1 -> Node5 [id="edge4_Node000001_Node000005",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="lib60870.CS101.Bitstring32\lCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32_command.html",tooltip=" "]; + Node5 -> Node6 [id="edge5_Node000005_Node000006",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node6 [id="Node000006",label="lib60870.CS101.Bitstring32\lCommandWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a.html",tooltip=" "]; + Node1 -> Node7 [id="edge6_Node000001_Node000007",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node7 [id="Node000007",label="lib60870.CS101.ClockSynchronization\lCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_clock_synchronization_command.html",tooltip=" "]; + Node1 -> Node8 [id="edge7_Node000001_Node000008",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node8 [id="Node000008",label="lib60870.CS101.CounterInterrogation\lCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html",tooltip=" "]; + Node1 -> Node9 [id="edge8_Node000001_Node000009",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node9 [id="Node000009",label="lib60870.CS101.DelayAcquisition\lCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_delay_acquisition_command.html",tooltip=" "]; + Node1 -> Node10 [id="edge9_Node000001_Node000010",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node10 [id="Node000010",label="lib60870.CS101.DoubleCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_command.html",tooltip=" "]; + Node10 -> Node11 [id="edge10_Node000010_Node000011",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node11 [id="Node000011",label="lib60870.CS101.DoubleCommand\lWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a.html",tooltip=" "]; + Node10 -> Node12 [id="edge11_Node000010_Node000012",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node12 [id="Node000012",label="lib60870.CS101.StepCommand",height=0.2,width=0.4,color="orangered", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_command.html",tooltip=" "]; + Node1 -> Node14 [id="edge12_Node000001_Node000014",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node14 [id="Node000014",label="lib60870.CS101.DoublePoint\lInformation",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_point_information.html",tooltip="Double point information object (M_DP_NA_1)"]; + Node14 -> Node15 [id="edge13_Node000014_Node000015",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node15 [id="Node000015",label="lib60870.CS101.DoublePoint\lWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a.html",tooltip="Double point information object with CP24Time2a time tag (M_DP_TA_1)"]; + Node14 -> Node16 [id="edge14_Node000014_Node000016",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node16 [id="Node000016",label="lib60870.CS101.DoublePoint\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a.html",tooltip="Double point information object with CP56Time2a time tag (M_DP_TB_1)"]; + Node1 -> Node17 [id="edge15_Node000001_Node000017",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node17 [id="Node000017",label="lib60870.CS101.EndOfInitialization",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_end_of_initialization.html",tooltip="End of initialization information object (M_EI_NA_1)"]; + Node1 -> Node18 [id="edge16_Node000001_Node000018",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node18 [id="Node000018",label="lib60870.CS101.EventOfProtection\lEquipment",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_event_of_protection_equipment.html",tooltip="Event of protection equipment information object (M_EP_TA_1)"]; + Node1 -> Node19 [id="edge17_Node000001_Node000019",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node19 [id="Node000019",label="lib60870.CS101.EventOfProtection\lEquipmentWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a.html",tooltip="Event of protection equipment information object with CP56Time2a time tag (M_EP_TD_1)"]; + Node1 -> Node20 [id="edge18_Node000001_Node000020",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node20 [id="Node000020",label="lib60870.CS101.FileACK",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_file_a_c_k.html",tooltip="ACK file/section - F_AF_NA_1 (124)"]; + Node1 -> Node21 [id="edge19_Node000001_Node000021",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node21 [id="Node000021",label="lib60870.CS101.FileCallOr\lSelect",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_file_call_or_select.html",tooltip="Call/Select directory/file/section - F_SC_NA_1 (122)"]; + Node1 -> Node22 [id="edge20_Node000001_Node000022",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node22 [id="Node000022",label="lib60870.CS101.FileDirectory",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_file_directory.html",tooltip="File directory - F_DR_TA_1 (126)"]; + Node1 -> Node23 [id="edge21_Node000001_Node000023",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node23 [id="Node000023",label="lib60870.CS101.FileLastSegment\lOrSection",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html",tooltip="Last segment/section - F_LS_NA_1 (123)"]; + Node1 -> Node24 [id="edge22_Node000001_Node000024",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node24 [id="Node000024",label="lib60870.CS101.FileReady",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_file_ready.html",tooltip="File ready - F_FR_NA_1 (120)"]; + Node1 -> Node25 [id="edge23_Node000001_Node000025",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node25 [id="Node000025",label="lib60870.CS101.FileSegment",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_file_segment.html",tooltip="File segment - F_SG_NA_1 (125)"]; + Node1 -> Node26 [id="edge24_Node000001_Node000026",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node26 [id="Node000026",label="lib60870.CS101.Integrated\lTotals",height=0.2,width=0.4,color="red", fillcolor="#FFF0F0", style="filled",URL="$classlib60870_1_1_c_s101_1_1_integrated_totals.html",tooltip="Integrated totals information object (M_IT_NA_1)"]; + Node1 -> Node29 [id="edge25_Node000001_Node000029",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node29 [id="Node000029",label="lib60870.CS101.Interrogation\lCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_interrogation_command.html",tooltip=" "]; + Node1 -> Node30 [id="edge26_Node000001_Node000030",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node30 [id="Node000030",label="lib60870.CS101.MeasuredValue\lNormalizedWithoutQuality",height=0.2,width=0.4,color="red", fillcolor="#FFF0F0", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html",tooltip="Measured value normalized without quality information object (M_ME_ND_1)"]; + Node1 -> Node34 [id="edge27_Node000001_Node000034",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node34 [id="Node000034",label="lib60870.CS101.MeasuredValue\lScaled",height=0.2,width=0.4,color="orangered", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_scaled.html",tooltip=" "]; + Node1 -> Node37 [id="edge28_Node000001_Node000037",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node37 [id="Node000037",label="lib60870.CS101.MeasuredValue\lShort",height=0.2,width=0.4,color="orangered", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_short.html",tooltip=" "]; + Node1 -> Node40 [id="edge29_Node000001_Node000040",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node40 [id="Node000040",label="lib60870.CS101.PackedOutput\lCircuitInfo",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_packed_output_circuit_info.html",tooltip=" "]; + Node1 -> Node41 [id="edge30_Node000001_Node000041",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node41 [id="Node000041",label="lib60870.CS101.PackedOutput\lCircuitInfoWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a.html",tooltip=" "]; + Node1 -> Node42 [id="edge31_Node000001_Node000042",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node42 [id="Node000042",label="lib60870.CS101.PackedSingle\lPointWithSCD",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d.html",tooltip=" "]; + Node1 -> Node43 [id="edge32_Node000001_Node000043",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node43 [id="Node000043",label="lib60870.CS101.PackedStart\lEventsOfProtectionEquipment",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment.html",tooltip=" "]; + Node1 -> Node44 [id="edge33_Node000001_Node000044",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node44 [id="Node000044",label="lib60870.CS101.PackedStart\lEventsOfProtectionEquipmentWith\lCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a.html",tooltip=" "]; + Node1 -> Node45 [id="edge34_Node000001_Node000045",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node45 [id="Node000045",label="lib60870.CS101.Parameter\lActivation",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_parameter_activation.html",tooltip=" "]; + Node1 -> Node46 [id="edge35_Node000001_Node000046",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node46 [id="Node000046",label="lib60870.CS101.Parameter\lFloatValue",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_parameter_float_value.html",tooltip=" "]; + Node1 -> Node47 [id="edge36_Node000001_Node000047",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node47 [id="Node000047",label="lib60870.CS101.Parameter\lNormalizedValue",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_parameter_normalized_value.html",tooltip=" "]; + Node1 -> Node48 [id="edge37_Node000001_Node000048",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node48 [id="Node000048",label="lib60870.CS101.Parameter\lScaledValue",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_parameter_scaled_value.html",tooltip=" "]; + Node1 -> Node49 [id="edge38_Node000001_Node000049",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node49 [id="Node000049",label="lib60870.CS101.ReadCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_read_command.html",tooltip=" "]; + Node1 -> Node50 [id="edge39_Node000001_Node000050",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node50 [id="Node000050",label="lib60870.CS101.ResetProcess\lCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_reset_process_command.html",tooltip=" "]; + Node1 -> Node51 [id="edge40_Node000001_Node000051",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node51 [id="Node000051",label="lib60870.CS101.SectionReady",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_section_ready.html",tooltip="Section ready - F_SR_NA_1 (121)"]; + Node1 -> Node52 [id="edge41_Node000001_Node000052",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node52 [id="Node000052",label="lib60870.CS101.SetpointCommand\lNormalized",height=0.2,width=0.4,color="orangered", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_normalized.html",tooltip=" "]; + Node1 -> Node54 [id="edge42_Node000001_Node000054",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node54 [id="Node000054",label="lib60870.CS101.SetpointCommand\lScaled",height=0.2,width=0.4,color="orangered", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_scaled.html",tooltip=" "]; + Node1 -> Node56 [id="edge43_Node000001_Node000056",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node56 [id="Node000056",label="lib60870.CS101.SetpointCommand\lShort",height=0.2,width=0.4,color="orangered", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_short.html",tooltip=" "]; + Node1 -> Node58 [id="edge44_Node000001_Node000058",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node58 [id="Node000058",label="lib60870.CS101.SingleCommand",height=0.2,width=0.4,color="orangered", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_command.html",tooltip=" "]; + Node1 -> Node60 [id="edge45_Node000001_Node000060",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node60 [id="Node000060",label="lib60870.CS101.SinglePoint\lInformation",height=0.2,width=0.4,color="orangered", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_point_information.html",tooltip=" "]; + Node1 -> Node63 [id="edge46_Node000001_Node000063",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node63 [id="Node000063",label="lib60870.CS101.StepPosition\lInformation",height=0.2,width=0.4,color="red", fillcolor="#FFF0F0", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_position_information.html",tooltip="Step position information object (M_ST_NA_1)"]; + Node1 -> Node66 [id="edge47_Node000001_Node000066",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node66 [id="Node000066",label="lib60870.CS101.TestCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_test_command.html",tooltip=" "]; + Node1 -> Node67 [id="edge48_Node000001_Node000067",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node67 [id="Node000067",label="lib60870.CS101.TestCommand\lWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals-members.html new file mode 100644 index 0000000..6da80fd --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals-members.html @@ -0,0 +1,127 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.IntegratedTotals Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.IntegratedTotals, including all inherited members.

+ + + + + + + + + + + + +
BCR (defined in lib60870.CS101.IntegratedTotals)lib60870.CS101.IntegratedTotals
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.IntegratedTotals)lib60870.CS101.IntegratedTotalsvirtual
GetEncodedSize() (defined in lib60870.CS101.IntegratedTotals)lib60870.CS101.IntegratedTotals
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
IntegratedTotals(int ioa, BinaryCounterReading bcr) (defined in lib60870.CS101.IntegratedTotals)lib60870.CS101.IntegratedTotals
IntegratedTotals(IntegratedTotals original) (defined in lib60870.CS101.IntegratedTotals)lib60870.CS101.IntegratedTotals
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
SupportsSequence (defined in lib60870.CS101.IntegratedTotals)lib60870.CS101.IntegratedTotals
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.IntegratedTotals)lib60870.CS101.IntegratedTotals
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals.html new file mode 100644 index 0000000..a26d836 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals.html @@ -0,0 +1,227 @@ + + + + + + + +lib60870.NET: lib60870.CS101.IntegratedTotals Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.IntegratedTotals Class Reference
+
+
+ +

Integrated totals information object (M_IT_NA_1) + More...

+
+Inheritance diagram for lib60870.CS101.IntegratedTotals:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.IntegratedTotals:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
IntegratedTotals (int ioa, BinaryCounterReading bcr)
 
IntegratedTotals (IntegratedTotals original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+BinaryCounterReading BCR [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Detailed Description

+

Integrated totals information object (M_IT_NA_1)

+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.IntegratedTotals.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/IntegratedTotals.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals__coll__graph.dot new file mode 100644 index 0000000..1ea67cf --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.IntegratedTotals" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Integrated\lTotals",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Integrated totals information object (M_IT_NA_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals__inherit__graph.dot new file mode 100644 index 0000000..bde40d6 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals__inherit__graph.dot @@ -0,0 +1,15 @@ +digraph "lib60870.CS101.IntegratedTotals" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="lib60870.CS101.Integrated\lTotals",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Integrated totals information object (M_IT_NA_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="lib60870.CS101.Integrated\lTotalsWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a.html",tooltip="Integrated totals information object with CP24Time2a time tag (M_IT_TA_1)"]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="lib60870.CS101.Integrated\lTotalsWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a.html",tooltip="Integrated totals information object with CP56Time2a time tag (M_IT_TB_1)"]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a-members.html new file mode 100644 index 0000000..f5454a8 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a-members.html @@ -0,0 +1,131 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.IntegratedTotalsWithCP24Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.IntegratedTotalsWithCP24Time2a, including all inherited members.

+ + + + + + + + + + + + + + + + +
BCR (defined in lib60870.CS101.IntegratedTotals)lib60870.CS101.IntegratedTotals
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.IntegratedTotalsWithCP24Time2a)lib60870.CS101.IntegratedTotalsWithCP24Time2avirtual
GetEncodedSize() (defined in lib60870.CS101.IntegratedTotalsWithCP24Time2a)lib60870.CS101.IntegratedTotalsWithCP24Time2a
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
IntegratedTotals(int ioa, BinaryCounterReading bcr) (defined in lib60870.CS101.IntegratedTotals)lib60870.CS101.IntegratedTotals
IntegratedTotals(IntegratedTotals original) (defined in lib60870.CS101.IntegratedTotals)lib60870.CS101.IntegratedTotals
IntegratedTotalsWithCP24Time2a(int ioa, BinaryCounterReading bcr, CP24Time2a timestamp) (defined in lib60870.CS101.IntegratedTotalsWithCP24Time2a)lib60870.CS101.IntegratedTotalsWithCP24Time2a
IntegratedTotalsWithCP24Time2a(IntegratedTotalsWithCP24Time2a original) (defined in lib60870.CS101.IntegratedTotalsWithCP24Time2a)lib60870.CS101.IntegratedTotalsWithCP24Time2a
IntegratedTotalsWithCP24Time2a(IntegratedTotals original) (defined in lib60870.CS101.IntegratedTotalsWithCP24Time2a)lib60870.CS101.IntegratedTotalsWithCP24Time2a
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
SupportsSequence (defined in lib60870.CS101.IntegratedTotalsWithCP24Time2a)lib60870.CS101.IntegratedTotalsWithCP24Time2a
Timestamp (defined in lib60870.CS101.IntegratedTotalsWithCP24Time2a)lib60870.CS101.IntegratedTotalsWithCP24Time2a
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.IntegratedTotalsWithCP24Time2a)lib60870.CS101.IntegratedTotalsWithCP24Time2a
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a.html new file mode 100644 index 0000000..c05dd23 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a.html @@ -0,0 +1,250 @@ + + + + + + + +lib60870.NET: lib60870.CS101.IntegratedTotalsWithCP24Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.IntegratedTotalsWithCP24Time2a Class Reference
+
+
+ +

Integrated totals information object with CP24Time2a time tag (M_IT_TA_1) + More...

+
+Inheritance diagram for lib60870.CS101.IntegratedTotalsWithCP24Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.IntegratedTotalsWithCP24Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
IntegratedTotalsWithCP24Time2a (int ioa, BinaryCounterReading bcr, CP24Time2a timestamp)
 
IntegratedTotalsWithCP24Time2a (IntegratedTotalsWithCP24Time2a original)
 
IntegratedTotalsWithCP24Time2a (IntegratedTotals original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.IntegratedTotals
+override int GetEncodedSize ()
 
IntegratedTotals (int ioa, BinaryCounterReading bcr)
 
IntegratedTotals (IntegratedTotals original)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+CP24Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.IntegratedTotals
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+BinaryCounterReading BCR [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Detailed Description

+

Integrated totals information object with CP24Time2a time tag (M_IT_TA_1)

+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.IntegratedTotalsWithCP24Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.IntegratedTotals.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/IntegratedTotals.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a__coll__graph.dot new file mode 100644 index 0000000..644e505 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a__coll__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.IntegratedTotalsWithCP24Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Integrated\lTotalsWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Integrated totals information object with CP24Time2a time tag (M_IT_TA_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="IntegratedTotals",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_integrated_totals.html",tooltip="Integrated totals information object (M_IT_NA_1)"]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a__inherit__graph.dot new file mode 100644 index 0000000..644e505 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.IntegratedTotalsWithCP24Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Integrated\lTotalsWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Integrated totals information object with CP24Time2a time tag (M_IT_TA_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="IntegratedTotals",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_integrated_totals.html",tooltip="Integrated totals information object (M_IT_NA_1)"]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a-members.html new file mode 100644 index 0000000..cdc4463 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a-members.html @@ -0,0 +1,132 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.IntegratedTotalsWithCP56Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.IntegratedTotalsWithCP56Time2a, including all inherited members.

+ + + + + + + + + + + + + + + + + +
BCR (defined in lib60870.CS101.IntegratedTotals)lib60870.CS101.IntegratedTotals
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.IntegratedTotalsWithCP56Time2a)lib60870.CS101.IntegratedTotalsWithCP56Time2avirtual
GetEncodedSize() (defined in lib60870.CS101.IntegratedTotalsWithCP56Time2a)lib60870.CS101.IntegratedTotalsWithCP56Time2a
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
IntegratedTotals(int ioa, BinaryCounterReading bcr) (defined in lib60870.CS101.IntegratedTotals)lib60870.CS101.IntegratedTotals
IntegratedTotals(IntegratedTotals original) (defined in lib60870.CS101.IntegratedTotals)lib60870.CS101.IntegratedTotals
IntegratedTotalsWithCP56Time2a(int ioa, BinaryCounterReading bcr, CP56Time2a timestamp) (defined in lib60870.CS101.IntegratedTotalsWithCP56Time2a)lib60870.CS101.IntegratedTotalsWithCP56Time2a
IntegratedTotalsWithCP56Time2a(IntegratedTotalsWithCP56Time2a original) (defined in lib60870.CS101.IntegratedTotalsWithCP56Time2a)lib60870.CS101.IntegratedTotalsWithCP56Time2a
IntegratedTotalsWithCP56Time2a(IntegratedTotals original) (defined in lib60870.CS101.IntegratedTotalsWithCP56Time2a)lib60870.CS101.IntegratedTotalsWithCP56Time2a
IntegratedTotalsWithCP56Time2a(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.IntegratedTotalsWithCP56Time2a)lib60870.CS101.IntegratedTotalsWithCP56Time2a
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
SupportsSequence (defined in lib60870.CS101.IntegratedTotalsWithCP56Time2a)lib60870.CS101.IntegratedTotalsWithCP56Time2a
Timestamp (defined in lib60870.CS101.IntegratedTotalsWithCP56Time2a)lib60870.CS101.IntegratedTotalsWithCP56Time2a
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.IntegratedTotalsWithCP56Time2a)lib60870.CS101.IntegratedTotalsWithCP56Time2a
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a.html new file mode 100644 index 0000000..55ed4bd --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a.html @@ -0,0 +1,253 @@ + + + + + + + +lib60870.NET: lib60870.CS101.IntegratedTotalsWithCP56Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.IntegratedTotalsWithCP56Time2a Class Reference
+
+
+ +

Integrated totals information object with CP56Time2a time tag (M_IT_TB_1) + More...

+
+Inheritance diagram for lib60870.CS101.IntegratedTotalsWithCP56Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.IntegratedTotalsWithCP56Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
IntegratedTotalsWithCP56Time2a (int ioa, BinaryCounterReading bcr, CP56Time2a timestamp)
 
IntegratedTotalsWithCP56Time2a (IntegratedTotalsWithCP56Time2a original)
 
IntegratedTotalsWithCP56Time2a (IntegratedTotals original)
 
IntegratedTotalsWithCP56Time2a (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.IntegratedTotals
+override int GetEncodedSize ()
 
IntegratedTotals (int ioa, BinaryCounterReading bcr)
 
IntegratedTotals (IntegratedTotals original)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+CP56Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.IntegratedTotals
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+BinaryCounterReading BCR [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Detailed Description

+

Integrated totals information object with CP56Time2a time tag (M_IT_TB_1)

+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.IntegratedTotalsWithCP56Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.IntegratedTotals.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/IntegratedTotals.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a__coll__graph.dot new file mode 100644 index 0000000..4268fce --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a__coll__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.IntegratedTotalsWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Integrated\lTotalsWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Integrated totals information object with CP56Time2a time tag (M_IT_TB_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="IntegratedTotals",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_integrated_totals.html",tooltip="Integrated totals information object (M_IT_NA_1)"]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a__inherit__graph.dot new file mode 100644 index 0000000..4268fce --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.IntegratedTotalsWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Integrated\lTotalsWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Integrated totals information object with CP56Time2a time tag (M_IT_TB_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="IntegratedTotals",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_integrated_totals.html",tooltip="Integrated totals information object (M_IT_NA_1)"]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command-members.html new file mode 100644 index 0000000..7600933 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command-members.html @@ -0,0 +1,126 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.InterrogationCommand Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.InterrogationCommand, including all inherited members.

+ + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.InterrogationCommand)lib60870.CS101.InterrogationCommandvirtual
GetEncodedSize() (defined in lib60870.CS101.InterrogationCommand)lib60870.CS101.InterrogationCommand
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
InterrogationCommand(int ioa, byte qoi) (defined in lib60870.CS101.InterrogationCommand)lib60870.CS101.InterrogationCommand
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
QOI (defined in lib60870.CS101.InterrogationCommand)lib60870.CS101.InterrogationCommand
SupportsSequence (defined in lib60870.CS101.InterrogationCommand)lib60870.CS101.InterrogationCommand
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.InterrogationCommand)lib60870.CS101.InterrogationCommand
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command.html new file mode 100644 index 0000000..24d1545 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command.html @@ -0,0 +1,219 @@ + + + + + + + +lib60870.NET: lib60870.CS101.InterrogationCommand Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.InterrogationCommand Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.InterrogationCommand:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.InterrogationCommand:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
InterrogationCommand (int ioa, byte qoi)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+byte QOI [get, set]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.InterrogationCommand.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SystemInformationCommands.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command__coll__graph.dot new file mode 100644 index 0000000..6ac062e --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.InterrogationCommand" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Interrogation\lCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command__inherit__graph.dot new file mode 100644 index 0000000..6ac062e --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.InterrogationCommand" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Interrogation\lCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master-members.html new file mode 100644 index 0000000..5306334 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master-members.html @@ -0,0 +1,133 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.Master Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.Master, including all inherited members.

+ + + + + + + + + + + + + + + + + + +
DebugOutput (defined in lib60870.CS101.Master)lib60870.CS101.Master
debugOutput (defined in lib60870.CS101.Master)lib60870.CS101.Masterprotected
GetApplicationLayerParameters()lib60870.CS101.Master
GetFile(int ca, int ioa, NameOfFile nof, IFileReceiver receiver)lib60870.CS101.Master
SendASDU(ASDU asdu)lib60870.CS101.Master
SendClockSyncCommand(int ca, CP56Time2a time)lib60870.CS101.Master
SendControlCommand(CauseOfTransmission cot, int ca, InformationObject sc)lib60870.CS101.Master
SendCounterInterrogationCommand(CauseOfTransmission cot, int ca, byte qcc)lib60870.CS101.Master
SendDelayAcquisitionCommand(CauseOfTransmission cot, int ca, CP16Time2a delay)lib60870.CS101.Master
SendFile(int ca, int ioa, NameOfFile nof, IFileProvider fileProvider)lib60870.CS101.Master
SendInterrogationCommand(CauseOfTransmission cot, int ca, byte qoi)lib60870.CS101.Master
SendReadCommand(int ca, int ioa)lib60870.CS101.Master
SendResetProcessCommand(CauseOfTransmission cot, int ca, byte qrp)lib60870.CS101.Master
SendTestCommand(int ca)lib60870.CS101.Master
SendTestCommandWithCP56Time2a(int ca, ushort tsc, CP56Time2a time)lib60870.CS101.Master
SetReceivedRawMessageHandler(RawMessageHandler handler, object parameter)lib60870.CS101.Master
SetSentRawMessageHandler(RawMessageHandler handler, object parameter)lib60870.CS101.Master
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master.html new file mode 100644 index 0000000..d8497d7 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master.html @@ -0,0 +1,862 @@ + + + + + + + +lib60870.NET: lib60870.CS101.Master Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.Master Class Referenceabstract
+
+
+ +

Common interface for CS104 and CS101 balanced and unbalanced master. + More...

+
+Inheritance diagram for lib60870.CS101.Master:
+
+
Inheritance graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

void SendInterrogationCommand (CauseOfTransmission cot, int ca, byte qoi)
 Sends the interrogation command.
 
void SendCounterInterrogationCommand (CauseOfTransmission cot, int ca, byte qcc)
 Sends the counter interrogation command (C_CI_NA_1 typeID: 101)
 
void SendReadCommand (int ca, int ioa)
 Sends a read command (C_RD_NA_1 typeID: 102).
 
void SendClockSyncCommand (int ca, CP56Time2a time)
 Sends a clock synchronization command (C_CS_NA_1 typeID: 103).
 
void SendTestCommand (int ca)
 Sends a test command (C_TS_NA_1 typeID: 104).
 
void SendTestCommandWithCP56Time2a (int ca, ushort tsc, CP56Time2a time)
 Sends a test command with CP56Time2a time (C_TS_TA_1 typeID: 107).
 
void SendResetProcessCommand (CauseOfTransmission cot, int ca, byte qrp)
 Sends a reset process command (C_RP_NA_1 typeID: 105).
 
void SendDelayAcquisitionCommand (CauseOfTransmission cot, int ca, CP16Time2a delay)
 Sends a delay acquisition command (C_CD_NA_1 typeID: 106).
 
void SendControlCommand (CauseOfTransmission cot, int ca, InformationObject sc)
 Sends the control command.
 
void SendASDU (ASDU asdu)
 Sends an arbitrary ASDU to the connected slave.
 
void GetFile (int ca, int ioa, NameOfFile nof, IFileReceiver receiver)
 Read the file from slave (upload file)
 
void SendFile (int ca, int ioa, NameOfFile nof, IFileProvider fileProvider)
 Sends the file to slave (download file)
 
ApplicationLayerParameters GetApplicationLayerParameters ()
 Get the application layer parameters used by this master instance.
 
void SetReceivedRawMessageHandler (RawMessageHandler handler, object parameter)
 Sets the raw message handler for received messages.
 
void SetSentRawMessageHandler (RawMessageHandler handler, object parameter)
 Sets the sent message handler for sent messages.
 
+ + + +

+Protected Attributes

+bool debugOutput
 
+ + + +

+Properties

+bool DebugOutput [get, set]
 
+

Detailed Description

+

Common interface for CS104 and CS101 balanced and unbalanced master.

+

Member Function Documentation

+ +

◆ GetApplicationLayerParameters()

+ +
+
+ + + + + +
+ + + + + + + +
ApplicationLayerParameters lib60870.CS101.Master.GetApplicationLayerParameters ()
+
+abstract
+
+ +

Get the application layer parameters used by this master instance.

+
Returns
used application layer parameters
+ +
+
+ +

◆ GetFile()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
void lib60870.CS101.Master.GetFile (int ca,
int ioa,
NameOfFile nof,
IFileReceiver receiver )
+
+abstract
+
+ +

Read the file from slave (upload file)

+
Parameters
+ + + + + +
caCA
ioaIOA
nofName of file (file type)
receiverfile receiver instance
+
+
+ +
+
+ +

◆ SendASDU()

+ +
+
+ + + + + +
+ + + + + + + +
void lib60870.CS101.Master.SendASDU (ASDU asdu)
+
+abstract
+
+ +

Sends an arbitrary ASDU to the connected slave.

+
Parameters
+ + +
asduThe ASDU to send
+
+
+ +
+
+ +

◆ SendClockSyncCommand()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
void lib60870.CS101.Master.SendClockSyncCommand (int ca,
CP56Time2a time )
+
+abstract
+
+ +

Sends a clock synchronization command (C_CS_NA_1 typeID: 103).

+
Parameters
+ + + +
caCommon address
timethe new time to set
+
+
+
Exceptions
+ + +
ConnectionExceptiondescription
+
+
+ +
+
+ +

◆ SendControlCommand()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
void lib60870.CS101.Master.SendControlCommand (CauseOfTransmission cot,
int ca,
InformationObject sc )
+
+abstract
+
+ +

Sends the control command.

+

The type ID has to match the type of the InformationObject!

+

C_SC_NA_1 -> SingleCommand C_DC_NA_1 -> DoubleCommand C_RC_NA_1 -> StepCommand C_SC_TA_1 -> SingleCommandWithCP56Time2a C_SE_NA_1 -> SetpointCommandNormalized C_SE_NB_1 -> SetpointCommandScaled C_SE_NC_1 -> SetpointCommandShort C_BO_NA_1 -> Bitstring32Command

+
Parameters
+ + + + +
cotCause of transmission (use ACTIVATION to start a control sequence)
caCommon address
scInformation object of the command
+
+
+
Exceptions
+ + +
ConnectionExceptiondescription
+
+
+ +
+
+ +

◆ SendCounterInterrogationCommand()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
void lib60870.CS101.Master.SendCounterInterrogationCommand (CauseOfTransmission cot,
int ca,
byte qcc )
+
+abstract
+
+ +

Sends the counter interrogation command (C_CI_NA_1 typeID: 101)

+
Parameters
+ + + + +
cotCause of transmission
caCommon address
qccQualifier of counter interrogation command
+
+
+
Exceptions
+ + +
ConnectionExceptiondescription
+
+
+ +
+
+ +

◆ SendDelayAcquisitionCommand()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
void lib60870.CS101.Master.SendDelayAcquisitionCommand (CauseOfTransmission cot,
int ca,
CP16Time2a delay )
+
+abstract
+
+ +

Sends a delay acquisition command (C_CD_NA_1 typeID: 106).

+
Parameters
+ + + + +
cotCause of transmission
caCommon address
delaydelay for acquisition
+
+
+
Exceptions
+ + +
ConnectionExceptiondescription
+
+
+ +
+
+ +

◆ SendFile()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
void lib60870.CS101.Master.SendFile (int ca,
int ioa,
NameOfFile nof,
IFileProvider fileProvider )
+
+abstract
+
+ +

Sends the file to slave (download file)

+
Parameters
+ + + + + +
caCA
ioaIOA
nofName of file (file type)
fileProviderFile provider instance
+
+
+ +
+
+ +

◆ SendInterrogationCommand()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
void lib60870.CS101.Master.SendInterrogationCommand (CauseOfTransmission cot,
int ca,
byte qoi )
+
+abstract
+
+ +

Sends the interrogation command.

+
Parameters
+ + + + +
cotCause of transmission
caCommon address
qoiQualifier of interrogation (20 = station interrogation)
+
+
+
Exceptions
+ + +
ConnectionExceptiondescription
+
+
+ +
+
+ +

◆ SendReadCommand()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
void lib60870.CS101.Master.SendReadCommand (int ca,
int ioa )
+
+abstract
+
+ +

Sends a read command (C_RD_NA_1 typeID: 102).

+

This will send a read command C_RC_NA_1 (102) to the slave/outstation. The COT is always REQUEST (5). It is used to implement the cyclical polling of data application function.

+
Parameters
+ + + +
caCommon address
ioaInformation object address
+
+
+
Exceptions
+ + +
ConnectionExceptiondescription
+
+
+ +
+
+ +

◆ SendResetProcessCommand()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
void lib60870.CS101.Master.SendResetProcessCommand (CauseOfTransmission cot,
int ca,
byte qrp )
+
+abstract
+
+ +

Sends a reset process command (C_RP_NA_1 typeID: 105).

+
Parameters
+ + + + +
cotCause of transmission
caCommon address
qrpQualifier of reset process command
+
+
+
Exceptions
+ + +
ConnectionExceptiondescription
+
+
+ +
+
+ +

◆ SendTestCommand()

+ +
+
+ + + + + +
+ + + + + + + +
void lib60870.CS101.Master.SendTestCommand (int ca)
+
+abstract
+
+ +

Sends a test command (C_TS_NA_1 typeID: 104).

+

Not required and supported by IEC 60870-5-104.

+
Parameters
+ + +
caCommon address
+
+
+
Exceptions
+ + +
ConnectionExceptiondescription
+
+
+ +
+
+ +

◆ SendTestCommandWithCP56Time2a()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
void lib60870.CS101.Master.SendTestCommandWithCP56Time2a (int ca,
ushort tsc,
CP56Time2a time )
+
+abstract
+
+ +

Sends a test command with CP56Time2a time (C_TS_TA_1 typeID: 107).

+
Parameters
+ + + + +
caCommon address
tsctest sequence number
timetest timestamp
+
+
+
Exceptions
+ + +
ConnectionExceptiondescription
+
+
+ +
+
+ +

◆ SetReceivedRawMessageHandler()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
void lib60870.CS101.Master.SetReceivedRawMessageHandler (RawMessageHandler handler,
object parameter )
+
+abstract
+
+ +

Sets the raw message handler for received messages.

+
Parameters
+ + + +
handlerHandler/delegate that will be invoked when a message is received
parameterwill be passed to the delegate
+
+
+ +
+
+ +

◆ SetSentRawMessageHandler()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
void lib60870.CS101.Master.SetSentRawMessageHandler (RawMessageHandler handler,
object parameter )
+
+abstract
+
+ +

Sets the sent message handler for sent messages.

+
Parameters
+ + + +
handlerHandler/delegate that will be invoked when a message is sent<
parameterwill be passed to the delegate
+
+
+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/Master.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master.js new file mode 100644 index 0000000..79b217e --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master.js @@ -0,0 +1,18 @@ +var classlib60870_1_1_c_s101_1_1_master = +[ + [ "GetApplicationLayerParameters", "classlib60870_1_1_c_s101_1_1_master.html#ac8f077926245f7194b3aba089a7ce520", null ], + [ "GetFile", "classlib60870_1_1_c_s101_1_1_master.html#a67284f6ec618c943766040e3877acc7b", null ], + [ "SendASDU", "classlib60870_1_1_c_s101_1_1_master.html#a6917b74951e51d7e80bd0ae352bd6147", null ], + [ "SendClockSyncCommand", "classlib60870_1_1_c_s101_1_1_master.html#a71ae908a23d89528f78f061fa466104f", null ], + [ "SendControlCommand", "classlib60870_1_1_c_s101_1_1_master.html#a83a31edf0e9e4360e4dc613735f851d5", null ], + [ "SendCounterInterrogationCommand", "classlib60870_1_1_c_s101_1_1_master.html#a6b9a6af0acad8fa03468630363eb99a8", null ], + [ "SendDelayAcquisitionCommand", "classlib60870_1_1_c_s101_1_1_master.html#afbc769788f9720e9a3d63268500b8710", null ], + [ "SendFile", "classlib60870_1_1_c_s101_1_1_master.html#ad988de86e0a0ed0d052dc599b3fc98f3", null ], + [ "SendInterrogationCommand", "classlib60870_1_1_c_s101_1_1_master.html#ab25cd6997967e5a60943f391c2b2ddc0", null ], + [ "SendReadCommand", "classlib60870_1_1_c_s101_1_1_master.html#a52bcf5912b59e4ac44061730c3702eb4", null ], + [ "SendResetProcessCommand", "classlib60870_1_1_c_s101_1_1_master.html#a6440a2d388ca610f80190dda3c11b623", null ], + [ "SendTestCommand", "classlib60870_1_1_c_s101_1_1_master.html#a77d37b1e27cdd4eec1a314f3e2a09432", null ], + [ "SendTestCommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_master.html#a97c6f3b896c0588761bb1b113ef7f7be", null ], + [ "SetReceivedRawMessageHandler", "classlib60870_1_1_c_s101_1_1_master.html#a43ddedf33710bf27df6f10265787d359", null ], + [ "SetSentRawMessageHandler", "classlib60870_1_1_c_s101_1_1_master.html#ac850d2199ac83075bfe52648eec57993", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master__inherit__graph.dot new file mode 100644 index 0000000..e03e25b --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.Master" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Master",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Common interface for CS104 and CS101 balanced and unbalanced master."]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="lib60870.CS101.CS101Master",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_c_s101_master.html",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="lib60870.CS104.Connection",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s104_1_1_connection.html",tooltip="A single connection to a CS 104 (IEC 60870-5-104) server. Implements the Master interface."]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized-members.html new file mode 100644 index 0000000..7718322 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized-members.html @@ -0,0 +1,133 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.MeasuredValueNormalized Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.MeasuredValueNormalized, including all inherited members.

+ + + + + + + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalizedvirtual
GetEncodedSize() (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
MeasuredValueNormalized(int objectAddress, float value, QualityDescriptor quality) (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
MeasuredValueNormalized(int objectAddress, short value, QualityDescriptor quality) (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
MeasuredValueNormalized(MeasuredValueNormalized original) (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
MeasuredValueNormalizedWithoutQuality(int objectAddress, float normalizedValue) (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
MeasuredValueNormalizedWithoutQuality(MeasuredValueNormalizedWithoutQuality original) (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
MeasuredValueNormalizedWithoutQuality(int objectAddress, short rawValue) (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
NormalizedValue (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Quality (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
RawValue (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
SupportsSequence (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized.html new file mode 100644 index 0000000..11435d0 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized.html @@ -0,0 +1,258 @@ + + + + + + + +lib60870.NET: lib60870.CS101.MeasuredValueNormalized Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.MeasuredValueNormalized Class Reference
+
+
+ +

Measured value normalized information object (M_ME_NA_1) + More...

+
+Inheritance diagram for lib60870.CS101.MeasuredValueNormalized:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.MeasuredValueNormalized:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
MeasuredValueNormalized (int objectAddress, float value, QualityDescriptor quality)
 
MeasuredValueNormalized (int objectAddress, short value, QualityDescriptor quality)
 
MeasuredValueNormalized (MeasuredValueNormalized original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.MeasuredValueNormalizedWithoutQuality
+override int GetEncodedSize ()
 
MeasuredValueNormalizedWithoutQuality (int objectAddress, float normalizedValue)
 
MeasuredValueNormalizedWithoutQuality (MeasuredValueNormalizedWithoutQuality original)
 
MeasuredValueNormalizedWithoutQuality (int objectAddress, short rawValue)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+QualityDescriptor Quality [get]
 
- Properties inherited from lib60870.CS101.MeasuredValueNormalizedWithoutQuality
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+short RawValue [get, set]
 
+float NormalizedValue [get, set]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Detailed Description

+

Measured value normalized information object (M_ME_NA_1)

+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.MeasuredValueNormalized.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/MeasuredValueNormalized.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized__coll__graph.dot new file mode 100644 index 0000000..db0c04a --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized__coll__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.MeasuredValueNormalized" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lNormalized",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Measured value normalized information object (M_ME_NA_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="MeasuredValueNormalizedWithout\lQuality",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html",tooltip="Measured value normalized without quality information object (M_ME_ND_1)"]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized__inherit__graph.dot new file mode 100644 index 0000000..dea5ed6 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized__inherit__graph.dot @@ -0,0 +1,17 @@ +digraph "lib60870.CS101.MeasuredValueNormalized" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lNormalized",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Measured value normalized information object (M_ME_NA_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="MeasuredValueNormalizedWithout\lQuality",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html",tooltip="Measured value normalized without quality information object (M_ME_ND_1)"]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="lib60870.CS101.MeasuredValue\lNormalizedWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a.html",tooltip="Measured value normalized with CP24Time2a time tag (M_ME_TA_1)"]; + Node1 -> Node5 [id="edge4_Node000001_Node000005",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="lib60870.CS101.MeasuredValue\lNormalizedWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a.html",tooltip="Measured value normalized with CP56Time2a time tag (M_ME_TD_1)"]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a-members.html new file mode 100644 index 0000000..f989639 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a-members.html @@ -0,0 +1,137 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP24Time2avirtual
GetEncodedSize() (defined in lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
MeasuredValueNormalized(int objectAddress, float value, QualityDescriptor quality) (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
MeasuredValueNormalized(int objectAddress, short value, QualityDescriptor quality) (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
MeasuredValueNormalized(MeasuredValueNormalized original) (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
MeasuredValueNormalizedWithCP24Time2a(int objectAddress, float value, QualityDescriptor quality, CP24Time2a timestamp) (defined in lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a
MeasuredValueNormalizedWithCP24Time2a(int objectAddress, short value, QualityDescriptor quality, CP24Time2a timestamp) (defined in lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a
MeasuredValueNormalizedWithCP24Time2a(MeasuredValueNormalizedWithCP24Time2a original) (defined in lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a
MeasuredValueNormalizedWithoutQuality(int objectAddress, float normalizedValue) (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
MeasuredValueNormalizedWithoutQuality(MeasuredValueNormalizedWithoutQuality original) (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
MeasuredValueNormalizedWithoutQuality(int objectAddress, short rawValue) (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
NormalizedValue (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Quality (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
RawValue (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
SupportsSequence (defined in lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a
Timestamp (defined in lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a.html new file mode 100644 index 0000000..8166c79 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a.html @@ -0,0 +1,281 @@ + + + + + + + +lib60870.NET: lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a Class Reference
+
+
+ +

Measured value normalized with CP24Time2a time tag (M_ME_TA_1) + More...

+
+Inheritance diagram for lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
MeasuredValueNormalizedWithCP24Time2a (int objectAddress, float value, QualityDescriptor quality, CP24Time2a timestamp)
 
MeasuredValueNormalizedWithCP24Time2a (int objectAddress, short value, QualityDescriptor quality, CP24Time2a timestamp)
 
MeasuredValueNormalizedWithCP24Time2a (MeasuredValueNormalizedWithCP24Time2a original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.MeasuredValueNormalized
+override int GetEncodedSize ()
 
MeasuredValueNormalized (int objectAddress, float value, QualityDescriptor quality)
 
MeasuredValueNormalized (int objectAddress, short value, QualityDescriptor quality)
 
MeasuredValueNormalized (MeasuredValueNormalized original)
 
- Public Member Functions inherited from lib60870.CS101.MeasuredValueNormalizedWithoutQuality
+override int GetEncodedSize ()
 
MeasuredValueNormalizedWithoutQuality (int objectAddress, float normalizedValue)
 
MeasuredValueNormalizedWithoutQuality (MeasuredValueNormalizedWithoutQuality original)
 
MeasuredValueNormalizedWithoutQuality (int objectAddress, short rawValue)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+CP24Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.MeasuredValueNormalized
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+QualityDescriptor Quality [get]
 
- Properties inherited from lib60870.CS101.MeasuredValueNormalizedWithoutQuality
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+short RawValue [get, set]
 
+float NormalizedValue [get, set]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Detailed Description

+

Measured value normalized with CP24Time2a time tag (M_ME_TA_1)

+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.MeasuredValueNormalized.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/MeasuredValueNormalized.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a__coll__graph.dot new file mode 100644 index 0000000..6a8a10f --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a__coll__graph.dot @@ -0,0 +1,14 @@ +digraph "lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lNormalizedWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Measured value normalized with CP24Time2a time tag (M_ME_TA_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="MeasuredValueNormalized",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized.html",tooltip="Measured value normalized information object (M_ME_NA_1)"]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="MeasuredValueNormalizedWithout\lQuality",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html",tooltip="Measured value normalized without quality information object (M_ME_ND_1)"]; + Node4 -> Node3 [id="edge3_Node000003_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a__inherit__graph.dot new file mode 100644 index 0000000..6a8a10f --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a__inherit__graph.dot @@ -0,0 +1,14 @@ +digraph "lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lNormalizedWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Measured value normalized with CP24Time2a time tag (M_ME_TA_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="MeasuredValueNormalized",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized.html",tooltip="Measured value normalized information object (M_ME_NA_1)"]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="MeasuredValueNormalizedWithout\lQuality",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html",tooltip="Measured value normalized without quality information object (M_ME_ND_1)"]; + Node4 -> Node3 [id="edge3_Node000003_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a-members.html new file mode 100644 index 0000000..4a1557f --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a-members.html @@ -0,0 +1,137 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP56Time2avirtual
GetEncodedSize() (defined in lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
MeasuredValueNormalized(int objectAddress, float value, QualityDescriptor quality) (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
MeasuredValueNormalized(int objectAddress, short value, QualityDescriptor quality) (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
MeasuredValueNormalized(MeasuredValueNormalized original) (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
MeasuredValueNormalizedWithCP56Time2a(int objectAddress, float value, QualityDescriptor quality, CP56Time2a timestamp) (defined in lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a
MeasuredValueNormalizedWithCP56Time2a(int objectAddress, short value, QualityDescriptor quality, CP56Time2a timestamp) (defined in lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a
MeasuredValueNormalizedWithCP56Time2a(MeasuredValueNormalizedWithCP56Time2a original) (defined in lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a
MeasuredValueNormalizedWithoutQuality(int objectAddress, float normalizedValue) (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
MeasuredValueNormalizedWithoutQuality(MeasuredValueNormalizedWithoutQuality original) (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
MeasuredValueNormalizedWithoutQuality(int objectAddress, short rawValue) (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
NormalizedValue (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Quality (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
RawValue (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
SupportsSequence (defined in lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a
Timestamp (defined in lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a.html new file mode 100644 index 0000000..dad64a2 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a.html @@ -0,0 +1,281 @@ + + + + + + + +lib60870.NET: lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a Class Reference
+
+
+ +

Measured value normalized with CP56Time2a time tag (M_ME_TD_1) + More...

+
+Inheritance diagram for lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
MeasuredValueNormalizedWithCP56Time2a (int objectAddress, float value, QualityDescriptor quality, CP56Time2a timestamp)
 
MeasuredValueNormalizedWithCP56Time2a (int objectAddress, short value, QualityDescriptor quality, CP56Time2a timestamp)
 
MeasuredValueNormalizedWithCP56Time2a (MeasuredValueNormalizedWithCP56Time2a original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.MeasuredValueNormalized
+override int GetEncodedSize ()
 
MeasuredValueNormalized (int objectAddress, float value, QualityDescriptor quality)
 
MeasuredValueNormalized (int objectAddress, short value, QualityDescriptor quality)
 
MeasuredValueNormalized (MeasuredValueNormalized original)
 
- Public Member Functions inherited from lib60870.CS101.MeasuredValueNormalizedWithoutQuality
+override int GetEncodedSize ()
 
MeasuredValueNormalizedWithoutQuality (int objectAddress, float normalizedValue)
 
MeasuredValueNormalizedWithoutQuality (MeasuredValueNormalizedWithoutQuality original)
 
MeasuredValueNormalizedWithoutQuality (int objectAddress, short rawValue)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+CP56Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.MeasuredValueNormalized
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+QualityDescriptor Quality [get]
 
- Properties inherited from lib60870.CS101.MeasuredValueNormalizedWithoutQuality
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+short RawValue [get, set]
 
+float NormalizedValue [get, set]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Detailed Description

+

Measured value normalized with CP56Time2a time tag (M_ME_TD_1)

+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.MeasuredValueNormalized.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/MeasuredValueNormalized.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a__coll__graph.dot new file mode 100644 index 0000000..9616b38 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a__coll__graph.dot @@ -0,0 +1,14 @@ +digraph "lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lNormalizedWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Measured value normalized with CP56Time2a time tag (M_ME_TD_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="MeasuredValueNormalized",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized.html",tooltip="Measured value normalized information object (M_ME_NA_1)"]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="MeasuredValueNormalizedWithout\lQuality",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html",tooltip="Measured value normalized without quality information object (M_ME_ND_1)"]; + Node4 -> Node3 [id="edge3_Node000003_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a__inherit__graph.dot new file mode 100644 index 0000000..9616b38 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a__inherit__graph.dot @@ -0,0 +1,14 @@ +digraph "lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lNormalizedWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Measured value normalized with CP56Time2a time tag (M_ME_TD_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="MeasuredValueNormalized",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized.html",tooltip="Measured value normalized information object (M_ME_NA_1)"]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="MeasuredValueNormalizedWithout\lQuality",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html",tooltip="Measured value normalized without quality information object (M_ME_ND_1)"]; + Node4 -> Node3 [id="edge3_Node000003_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality-members.html new file mode 100644 index 0000000..91e2169 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality-members.html @@ -0,0 +1,129 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.MeasuredValueNormalizedWithoutQuality Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.MeasuredValueNormalizedWithoutQuality, including all inherited members.

+ + + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQualityvirtual
GetEncodedSize() (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
MeasuredValueNormalizedWithoutQuality(int objectAddress, float normalizedValue) (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
MeasuredValueNormalizedWithoutQuality(MeasuredValueNormalizedWithoutQuality original) (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
MeasuredValueNormalizedWithoutQuality(int objectAddress, short rawValue) (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
NormalizedValue (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
RawValue (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
SupportsSequence (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html new file mode 100644 index 0000000..f3ce85e --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html @@ -0,0 +1,233 @@ + + + + + + + +lib60870.NET: lib60870.CS101.MeasuredValueNormalizedWithoutQuality Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.MeasuredValueNormalizedWithoutQuality Class Reference
+
+
+ +

Measured value normalized without quality information object (M_ME_ND_1) + More...

+
+Inheritance diagram for lib60870.CS101.MeasuredValueNormalizedWithoutQuality:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.MeasuredValueNormalizedWithoutQuality:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
MeasuredValueNormalizedWithoutQuality (int objectAddress, float normalizedValue)
 
MeasuredValueNormalizedWithoutQuality (MeasuredValueNormalizedWithoutQuality original)
 
MeasuredValueNormalizedWithoutQuality (int objectAddress, short rawValue)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+short RawValue [get, set]
 
+float NormalizedValue [get, set]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Detailed Description

+

Measured value normalized without quality information object (M_ME_ND_1)

+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.MeasuredValueNormalizedWithoutQuality.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/MeasuredValueNormalized.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality__coll__graph.dot new file mode 100644 index 0000000..4805a68 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.MeasuredValueNormalizedWithoutQuality" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lNormalizedWithoutQuality",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Measured value normalized without quality information object (M_ME_ND_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality__inherit__graph.dot new file mode 100644 index 0000000..42dea41 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality__inherit__graph.dot @@ -0,0 +1,17 @@ +digraph "lib60870.CS101.MeasuredValueNormalizedWithoutQuality" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lNormalizedWithoutQuality",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Measured value normalized without quality information object (M_ME_ND_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="lib60870.CS101.MeasuredValue\lNormalized",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized.html",tooltip="Measured value normalized information object (M_ME_NA_1)"]; + Node3 -> Node4 [id="edge3_Node000003_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="lib60870.CS101.MeasuredValue\lNormalizedWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a.html",tooltip="Measured value normalized with CP24Time2a time tag (M_ME_TA_1)"]; + Node3 -> Node5 [id="edge4_Node000003_Node000005",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="lib60870.CS101.MeasuredValue\lNormalizedWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a.html",tooltip="Measured value normalized with CP56Time2a time tag (M_ME_TD_1)"]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled-members.html new file mode 100644 index 0000000..6bdcdcb --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled-members.html @@ -0,0 +1,128 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.MeasuredValueScaled Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.MeasuredValueScaled, including all inherited members.

+ + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.MeasuredValueScaled)lib60870.CS101.MeasuredValueScaledvirtual
GetEncodedSize() (defined in lib60870.CS101.MeasuredValueScaled)lib60870.CS101.MeasuredValueScaled
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
MeasuredValueScaled(int objectAddress, int value, QualityDescriptor quality)lib60870.CS101.MeasuredValueScaled
MeasuredValueScaled(MeasuredValueScaled original) (defined in lib60870.CS101.MeasuredValueScaled)lib60870.CS101.MeasuredValueScaled
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Quality (defined in lib60870.CS101.MeasuredValueScaled)lib60870.CS101.MeasuredValueScaled
ScaledValue (defined in lib60870.CS101.MeasuredValueScaled)lib60870.CS101.MeasuredValueScaled
SupportsSequence (defined in lib60870.CS101.MeasuredValueScaled)lib60870.CS101.MeasuredValueScaled
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.MeasuredValueScaled)lib60870.CS101.MeasuredValueScaled
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled.html new file mode 100644 index 0000000..4fb0f8b --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled.html @@ -0,0 +1,262 @@ + + + + + + + +lib60870.NET: lib60870.CS101.MeasuredValueScaled Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.MeasuredValueScaled Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.MeasuredValueScaled:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.MeasuredValueScaled:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
 MeasuredValueScaled (int objectAddress, int value, QualityDescriptor quality)
 Initializes a new instance of the lib60870.MeasuredValueScaled class.
 
MeasuredValueScaled (MeasuredValueScaled original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+ScaledValue ScaledValue [get]
 
+QualityDescriptor Quality [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Constructor & Destructor Documentation

+ +

◆ MeasuredValueScaled()

+ +
+
+ + + + + + + + + + + + + + + + +
lib60870.CS101.MeasuredValueScaled.MeasuredValueScaled (int objectAddress,
int value,
QualityDescriptor quality )
+
+ +

Initializes a new instance of the lib60870.MeasuredValueScaled class.

+
Parameters
+ + + + +
objectAddressInformation object address
valuescaled value (range -32768 - 32767)
qualityquality descriptor (according to IEC 60870-5-101:2003 7.2.6.3)
+
+
+ +
+
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.MeasuredValueScaled.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/MeasuredValueScaled.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled.js new file mode 100644 index 0000000..3b63d35 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled.js @@ -0,0 +1,4 @@ +var classlib60870_1_1_c_s101_1_1_measured_value_scaled = +[ + [ "MeasuredValueScaled", "classlib60870_1_1_c_s101_1_1_measured_value_scaled.html#a05819e48801faf682acea7f5c53d93e7", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled__coll__graph.dot new file mode 100644 index 0000000..650bc2e --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.MeasuredValueScaled" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lScaled",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled__inherit__graph.dot new file mode 100644 index 0000000..a2cfa1a --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled__inherit__graph.dot @@ -0,0 +1,15 @@ +digraph "lib60870.CS101.MeasuredValueScaled" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lScaled",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="lib60870.CS101.MeasuredValue\lScaledWithCP24Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a.html",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="lib60870.CS101.MeasuredValue\lScaledWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a-members.html new file mode 100644 index 0000000..773517e --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a-members.html @@ -0,0 +1,131 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.MeasuredValueScaledWithCP24Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.MeasuredValueScaledWithCP24Time2a, including all inherited members.

+ + + + + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.MeasuredValueScaledWithCP24Time2a)lib60870.CS101.MeasuredValueScaledWithCP24Time2avirtual
GetEncodedSize() (defined in lib60870.CS101.MeasuredValueScaledWithCP24Time2a)lib60870.CS101.MeasuredValueScaledWithCP24Time2a
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
MeasuredValueScaled(int objectAddress, int value, QualityDescriptor quality)lib60870.CS101.MeasuredValueScaled
MeasuredValueScaled(MeasuredValueScaled original) (defined in lib60870.CS101.MeasuredValueScaled)lib60870.CS101.MeasuredValueScaled
MeasuredValueScaledWithCP24Time2a(int objectAddress, int value, QualityDescriptor quality, CP24Time2a timestamp) (defined in lib60870.CS101.MeasuredValueScaledWithCP24Time2a)lib60870.CS101.MeasuredValueScaledWithCP24Time2a
MeasuredValueScaledWithCP24Time2a(MeasuredValueScaledWithCP24Time2a original) (defined in lib60870.CS101.MeasuredValueScaledWithCP24Time2a)lib60870.CS101.MeasuredValueScaledWithCP24Time2a
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Quality (defined in lib60870.CS101.MeasuredValueScaled)lib60870.CS101.MeasuredValueScaled
ScaledValue (defined in lib60870.CS101.MeasuredValueScaled)lib60870.CS101.MeasuredValueScaled
SupportsSequence (defined in lib60870.CS101.MeasuredValueScaledWithCP24Time2a)lib60870.CS101.MeasuredValueScaledWithCP24Time2a
Timestamp (defined in lib60870.CS101.MeasuredValueScaledWithCP24Time2a)lib60870.CS101.MeasuredValueScaledWithCP24Time2a
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.MeasuredValueScaledWithCP24Time2a)lib60870.CS101.MeasuredValueScaledWithCP24Time2a
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a.html new file mode 100644 index 0000000..9a763ed --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a.html @@ -0,0 +1,245 @@ + + + + + + + +lib60870.NET: lib60870.CS101.MeasuredValueScaledWithCP24Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.MeasuredValueScaledWithCP24Time2a Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.MeasuredValueScaledWithCP24Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.MeasuredValueScaledWithCP24Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
MeasuredValueScaledWithCP24Time2a (int objectAddress, int value, QualityDescriptor quality, CP24Time2a timestamp)
 
MeasuredValueScaledWithCP24Time2a (MeasuredValueScaledWithCP24Time2a original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.MeasuredValueScaled
+override int GetEncodedSize ()
 
 MeasuredValueScaled (int objectAddress, int value, QualityDescriptor quality)
 Initializes a new instance of the lib60870.MeasuredValueScaled class.
 
MeasuredValueScaled (MeasuredValueScaled original)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+CP24Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.MeasuredValueScaled
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+ScaledValue ScaledValue [get]
 
+QualityDescriptor Quality [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.MeasuredValueScaledWithCP24Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.MeasuredValueScaled.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/MeasuredValueScaled.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a__coll__graph.dot new file mode 100644 index 0000000..854cfef --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a__coll__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.MeasuredValueScaledWithCP24Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lScaledWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="MeasuredValueScaled",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_scaled.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a__inherit__graph.dot new file mode 100644 index 0000000..854cfef --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.MeasuredValueScaledWithCP24Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lScaledWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="MeasuredValueScaled",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_scaled.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a-members.html new file mode 100644 index 0000000..4957579 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a-members.html @@ -0,0 +1,131 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.MeasuredValueScaledWithCP56Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.MeasuredValueScaledWithCP56Time2a, including all inherited members.

+ + + + + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.MeasuredValueScaledWithCP56Time2a)lib60870.CS101.MeasuredValueScaledWithCP56Time2avirtual
GetEncodedSize() (defined in lib60870.CS101.MeasuredValueScaledWithCP56Time2a)lib60870.CS101.MeasuredValueScaledWithCP56Time2a
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
MeasuredValueScaled(int objectAddress, int value, QualityDescriptor quality)lib60870.CS101.MeasuredValueScaled
MeasuredValueScaled(MeasuredValueScaled original) (defined in lib60870.CS101.MeasuredValueScaled)lib60870.CS101.MeasuredValueScaled
MeasuredValueScaledWithCP56Time2a(int objectAddress, int value, QualityDescriptor quality, CP56Time2a timestamp) (defined in lib60870.CS101.MeasuredValueScaledWithCP56Time2a)lib60870.CS101.MeasuredValueScaledWithCP56Time2a
MeasuredValueScaledWithCP56Time2a(MeasuredValueScaledWithCP56Time2a original) (defined in lib60870.CS101.MeasuredValueScaledWithCP56Time2a)lib60870.CS101.MeasuredValueScaledWithCP56Time2a
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Quality (defined in lib60870.CS101.MeasuredValueScaled)lib60870.CS101.MeasuredValueScaled
ScaledValue (defined in lib60870.CS101.MeasuredValueScaled)lib60870.CS101.MeasuredValueScaled
SupportsSequence (defined in lib60870.CS101.MeasuredValueScaledWithCP56Time2a)lib60870.CS101.MeasuredValueScaledWithCP56Time2a
Timestamp (defined in lib60870.CS101.MeasuredValueScaledWithCP56Time2a)lib60870.CS101.MeasuredValueScaledWithCP56Time2a
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.MeasuredValueScaledWithCP56Time2a)lib60870.CS101.MeasuredValueScaledWithCP56Time2a
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a.html new file mode 100644 index 0000000..8d57709 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a.html @@ -0,0 +1,245 @@ + + + + + + + +lib60870.NET: lib60870.CS101.MeasuredValueScaledWithCP56Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.MeasuredValueScaledWithCP56Time2a Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.MeasuredValueScaledWithCP56Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.MeasuredValueScaledWithCP56Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
MeasuredValueScaledWithCP56Time2a (int objectAddress, int value, QualityDescriptor quality, CP56Time2a timestamp)
 
MeasuredValueScaledWithCP56Time2a (MeasuredValueScaledWithCP56Time2a original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.MeasuredValueScaled
+override int GetEncodedSize ()
 
 MeasuredValueScaled (int objectAddress, int value, QualityDescriptor quality)
 Initializes a new instance of the lib60870.MeasuredValueScaled class.
 
MeasuredValueScaled (MeasuredValueScaled original)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+CP56Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.MeasuredValueScaled
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+ScaledValue ScaledValue [get]
 
+QualityDescriptor Quality [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.MeasuredValueScaledWithCP56Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.MeasuredValueScaled.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/MeasuredValueScaled.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a__coll__graph.dot new file mode 100644 index 0000000..e78e55c --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a__coll__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.MeasuredValueScaledWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lScaledWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="MeasuredValueScaled",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_scaled.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a__inherit__graph.dot new file mode 100644 index 0000000..e78e55c --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.MeasuredValueScaledWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lScaledWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="MeasuredValueScaled",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_scaled.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short-members.html new file mode 100644 index 0000000..410b5f3 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short-members.html @@ -0,0 +1,128 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.MeasuredValueShort Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.MeasuredValueShort, including all inherited members.

+ + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShortvirtual
GetEncodedSize() (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
MeasuredValueShort(int objectAddress, float value, QualityDescriptor quality) (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
MeasuredValueShort(MeasuredValueShort original) (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Quality (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
SupportsSequence (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
Value (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short.html new file mode 100644 index 0000000..2d1832c --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short.html @@ -0,0 +1,225 @@ + + + + + + + +lib60870.NET: lib60870.CS101.MeasuredValueShort Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.MeasuredValueShort Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.MeasuredValueShort:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.MeasuredValueShort:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
MeasuredValueShort (int objectAddress, float value, QualityDescriptor quality)
 
MeasuredValueShort (MeasuredValueShort original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+float Value [get, set]
 
+QualityDescriptor Quality [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.MeasuredValueShort.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/MeasuredValueShort.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short__coll__graph.dot new file mode 100644 index 0000000..70f8cbd --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.MeasuredValueShort" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lShort",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short__inherit__graph.dot new file mode 100644 index 0000000..b3e9bb5 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short__inherit__graph.dot @@ -0,0 +1,15 @@ +digraph "lib60870.CS101.MeasuredValueShort" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lShort",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="lib60870.CS101.MeasuredValue\lShortWithCP24Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a.html",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="lib60870.CS101.MeasuredValue\lShortWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a-members.html new file mode 100644 index 0000000..364fa33 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a-members.html @@ -0,0 +1,131 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.MeasuredValueShortWithCP24Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.MeasuredValueShortWithCP24Time2a, including all inherited members.

+ + + + + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.MeasuredValueShortWithCP24Time2a)lib60870.CS101.MeasuredValueShortWithCP24Time2avirtual
GetEncodedSize() (defined in lib60870.CS101.MeasuredValueShortWithCP24Time2a)lib60870.CS101.MeasuredValueShortWithCP24Time2a
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
MeasuredValueShort(int objectAddress, float value, QualityDescriptor quality) (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
MeasuredValueShort(MeasuredValueShort original) (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
MeasuredValueShortWithCP24Time2a(int objectAddress, float value, QualityDescriptor quality, CP24Time2a timestamp) (defined in lib60870.CS101.MeasuredValueShortWithCP24Time2a)lib60870.CS101.MeasuredValueShortWithCP24Time2a
MeasuredValueShortWithCP24Time2a(MeasuredValueShortWithCP24Time2a original) (defined in lib60870.CS101.MeasuredValueShortWithCP24Time2a)lib60870.CS101.MeasuredValueShortWithCP24Time2a
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Quality (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
SupportsSequence (defined in lib60870.CS101.MeasuredValueShortWithCP24Time2a)lib60870.CS101.MeasuredValueShortWithCP24Time2a
Timestamp (defined in lib60870.CS101.MeasuredValueShortWithCP24Time2a)lib60870.CS101.MeasuredValueShortWithCP24Time2a
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.MeasuredValueShortWithCP24Time2a)lib60870.CS101.MeasuredValueShortWithCP24Time2a
Value (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a.html new file mode 100644 index 0000000..8ae4b05 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a.html @@ -0,0 +1,245 @@ + + + + + + + +lib60870.NET: lib60870.CS101.MeasuredValueShortWithCP24Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.MeasuredValueShortWithCP24Time2a Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.MeasuredValueShortWithCP24Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.MeasuredValueShortWithCP24Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
MeasuredValueShortWithCP24Time2a (int objectAddress, float value, QualityDescriptor quality, CP24Time2a timestamp)
 
MeasuredValueShortWithCP24Time2a (MeasuredValueShortWithCP24Time2a original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.MeasuredValueShort
+override int GetEncodedSize ()
 
MeasuredValueShort (int objectAddress, float value, QualityDescriptor quality)
 
MeasuredValueShort (MeasuredValueShort original)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+CP24Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.MeasuredValueShort
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+float Value [get, set]
 
+QualityDescriptor Quality [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.MeasuredValueShortWithCP24Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.MeasuredValueShort.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/MeasuredValueShort.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a__coll__graph.dot new file mode 100644 index 0000000..ab3fdf2 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a__coll__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.MeasuredValueShortWithCP24Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lShortWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="MeasuredValueShort",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_short.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a__inherit__graph.dot new file mode 100644 index 0000000..ab3fdf2 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.MeasuredValueShortWithCP24Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lShortWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="MeasuredValueShort",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_short.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a-members.html new file mode 100644 index 0000000..162d57c --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a-members.html @@ -0,0 +1,131 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.MeasuredValueShortWithCP56Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.MeasuredValueShortWithCP56Time2a, including all inherited members.

+ + + + + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.MeasuredValueShortWithCP56Time2a)lib60870.CS101.MeasuredValueShortWithCP56Time2avirtual
GetEncodedSize() (defined in lib60870.CS101.MeasuredValueShortWithCP56Time2a)lib60870.CS101.MeasuredValueShortWithCP56Time2a
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
MeasuredValueShort(int objectAddress, float value, QualityDescriptor quality) (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
MeasuredValueShort(MeasuredValueShort original) (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
MeasuredValueShortWithCP56Time2a(int objectAddress, float value, QualityDescriptor quality, CP56Time2a timestamp) (defined in lib60870.CS101.MeasuredValueShortWithCP56Time2a)lib60870.CS101.MeasuredValueShortWithCP56Time2a
MeasuredValueShortWithCP56Time2a(MeasuredValueShortWithCP56Time2a original) (defined in lib60870.CS101.MeasuredValueShortWithCP56Time2a)lib60870.CS101.MeasuredValueShortWithCP56Time2a
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Quality (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
SupportsSequence (defined in lib60870.CS101.MeasuredValueShortWithCP56Time2a)lib60870.CS101.MeasuredValueShortWithCP56Time2a
Timestamp (defined in lib60870.CS101.MeasuredValueShortWithCP56Time2a)lib60870.CS101.MeasuredValueShortWithCP56Time2a
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.MeasuredValueShortWithCP56Time2a)lib60870.CS101.MeasuredValueShortWithCP56Time2a
Value (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a.html new file mode 100644 index 0000000..2be8f65 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a.html @@ -0,0 +1,245 @@ + + + + + + + +lib60870.NET: lib60870.CS101.MeasuredValueShortWithCP56Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.MeasuredValueShortWithCP56Time2a Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.MeasuredValueShortWithCP56Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.MeasuredValueShortWithCP56Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
MeasuredValueShortWithCP56Time2a (int objectAddress, float value, QualityDescriptor quality, CP56Time2a timestamp)
 
MeasuredValueShortWithCP56Time2a (MeasuredValueShortWithCP56Time2a original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.MeasuredValueShort
+override int GetEncodedSize ()
 
MeasuredValueShort (int objectAddress, float value, QualityDescriptor quality)
 
MeasuredValueShort (MeasuredValueShort original)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+CP56Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.MeasuredValueShort
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+float Value [get, set]
 
+QualityDescriptor Quality [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.MeasuredValueShortWithCP56Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.MeasuredValueShort.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/MeasuredValueShort.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a__coll__graph.dot new file mode 100644 index 0000000..dd02f34 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a__coll__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.MeasuredValueShortWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lShortWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="MeasuredValueShort",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_short.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a__inherit__graph.dot new file mode 100644 index 0000000..dd02f34 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.MeasuredValueShortWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lShortWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="MeasuredValueShort",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_short.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_output_circuit_info-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_output_circuit_info-members.html new file mode 100644 index 0000000..f2c7462 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_output_circuit_info-members.html @@ -0,0 +1,128 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.OutputCircuitInfo Member List
+
+ +
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_output_circuit_info.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_output_circuit_info.html new file mode 100644 index 0000000..f54df48 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_output_circuit_info.html @@ -0,0 +1,267 @@ + + + + + + + +lib60870.NET: lib60870.CS101.OutputCircuitInfo Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.OutputCircuitInfo Class Reference
+
+
+ +

Output circuit information of protection equipment According to IEC 60870-5-101:2003 7.2.6.12. + More...

+ + + + + + + + + + + + + + +

+Public Member Functions

OutputCircuitInfo (OutputCircuitInfo original)
 
+override bool Equals (object obj)
 
+override int GetHashCode ()
 
OutputCircuitInfo (byte encodedValue)
 
OutputCircuitInfo (bool gc, bool cl1, bool cl2, bool cl3)
 
+override string ToString ()
 
+ + + + + + + + + + + + + + + +

+Properties

+byte EncodedValue [get, set]
 
bool GC [get, set]
 General command to output circuit.
 
bool CL1 [get, set]
 Command to output circuit phase L1.
 
bool CL2 [get, set]
 Command to output circuit phase L2.
 
bool CL3 [get, set]
 Command to output circuit phase L3.
 
+

Detailed Description

+

Output circuit information of protection equipment According to IEC 60870-5-101:2003 7.2.6.12.

+

Property Documentation

+ +

◆ CL1

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS101.OutputCircuitInfo.CL1
+
+getset
+
+ +

Command to output circuit phase L1.

+

true if set, otherwise, false.

+ +
+
+ +

◆ CL2

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS101.OutputCircuitInfo.CL2
+
+getset
+
+ +

Command to output circuit phase L2.

+

true if set, otherwise, false.

+ +
+
+ +

◆ CL3

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS101.OutputCircuitInfo.CL3
+
+getset
+
+ +

Command to output circuit phase L3.

+

true if set, otherwise, false.

+ +
+
+ +

◆ GC

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS101.OutputCircuitInfo.GC
+
+getset
+
+ +

General command to output circuit.

+

true if set, otherwise, false.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/OutputCircuitInfo.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_output_circuit_info.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_output_circuit_info.js new file mode 100644 index 0000000..43c0d47 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_output_circuit_info.js @@ -0,0 +1,7 @@ +var classlib60870_1_1_c_s101_1_1_output_circuit_info = +[ + [ "CL1", "classlib60870_1_1_c_s101_1_1_output_circuit_info.html#ac474a5e41cac7e82a2225cb27792fcf7", null ], + [ "CL2", "classlib60870_1_1_c_s101_1_1_output_circuit_info.html#a6507ca6be64921d3931911033d496661", null ], + [ "CL3", "classlib60870_1_1_c_s101_1_1_output_circuit_info.html#ad9d84ee2a4315546c531867e4d9a5e28", null ], + [ "GC", "classlib60870_1_1_c_s101_1_1_output_circuit_info.html#a1eeab57adef2da4f97af4fc96b07ad6c", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info-members.html new file mode 100644 index 0000000..f26fd81 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info-members.html @@ -0,0 +1,130 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.PackedOutputCircuitInfo Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.PackedOutputCircuitInfo, including all inherited members.

+ + + + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.PackedOutputCircuitInfo)lib60870.CS101.PackedOutputCircuitInfovirtual
GetEncodedSize() (defined in lib60870.CS101.PackedOutputCircuitInfo)lib60870.CS101.PackedOutputCircuitInfo
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
OCI (defined in lib60870.CS101.PackedOutputCircuitInfo)lib60870.CS101.PackedOutputCircuitInfo
OperatingTime (defined in lib60870.CS101.PackedOutputCircuitInfo)lib60870.CS101.PackedOutputCircuitInfo
PackedOutputCircuitInfo(int objectAddress, OutputCircuitInfo oci, QualityDescriptorP qdp, CP16Time2a operatingTime, CP24Time2a timestamp) (defined in lib60870.CS101.PackedOutputCircuitInfo)lib60870.CS101.PackedOutputCircuitInfo
PackedOutputCircuitInfo(PackedOutputCircuitInfo original) (defined in lib60870.CS101.PackedOutputCircuitInfo)lib60870.CS101.PackedOutputCircuitInfo
QDP (defined in lib60870.CS101.PackedOutputCircuitInfo)lib60870.CS101.PackedOutputCircuitInfo
SupportsSequence (defined in lib60870.CS101.PackedOutputCircuitInfo)lib60870.CS101.PackedOutputCircuitInfo
Timestamp (defined in lib60870.CS101.PackedOutputCircuitInfo)lib60870.CS101.PackedOutputCircuitInfo
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.PackedOutputCircuitInfo)lib60870.CS101.PackedOutputCircuitInfo
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info.html new file mode 100644 index 0000000..4ecbd48 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info.html @@ -0,0 +1,231 @@ + + + + + + + +lib60870.NET: lib60870.CS101.PackedOutputCircuitInfo Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.PackedOutputCircuitInfo Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.PackedOutputCircuitInfo:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.PackedOutputCircuitInfo:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
PackedOutputCircuitInfo (int objectAddress, OutputCircuitInfo oci, QualityDescriptorP qdp, CP16Time2a operatingTime, CP24Time2a timestamp)
 
PackedOutputCircuitInfo (PackedOutputCircuitInfo original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+OutputCircuitInfo OCI [get]
 
+QualityDescriptorP QDP [get]
 
+CP16Time2a OperatingTime [get]
 
+CP24Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.PackedOutputCircuitInfo.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/PackedOutputCircuitInfo.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info__coll__graph.dot new file mode 100644 index 0000000..5405fe2 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.PackedOutputCircuitInfo" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.PackedOutput\lCircuitInfo",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info__inherit__graph.dot new file mode 100644 index 0000000..5405fe2 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.PackedOutputCircuitInfo" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.PackedOutput\lCircuitInfo",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a-members.html new file mode 100644 index 0000000..66ba675 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a-members.html @@ -0,0 +1,130 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a, including all inherited members.

+ + + + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a)lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2avirtual
GetEncodedSize() (defined in lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a)lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
OCI (defined in lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a)lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a
OperatingTime (defined in lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a)lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a
PackedOutputCircuitInfoWithCP56Time2a(int objectAddress, OutputCircuitInfo oci, QualityDescriptorP qdp, CP16Time2a operatingTime, CP56Time2a timestamp) (defined in lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a)lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a
PackedOutputCircuitInfoWithCP56Time2a(PackedOutputCircuitInfoWithCP56Time2a original) (defined in lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a)lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a
QDP (defined in lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a)lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a
SupportsSequence (defined in lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a)lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a
Timestamp (defined in lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a)lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a)lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a.html new file mode 100644 index 0000000..8d9d85d --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a.html @@ -0,0 +1,231 @@ + + + + + + + +lib60870.NET: lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
PackedOutputCircuitInfoWithCP56Time2a (int objectAddress, OutputCircuitInfo oci, QualityDescriptorP qdp, CP16Time2a operatingTime, CP56Time2a timestamp)
 
PackedOutputCircuitInfoWithCP56Time2a (PackedOutputCircuitInfoWithCP56Time2a original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+OutputCircuitInfo OCI [get]
 
+QualityDescriptorP QDP [get]
 
+CP16Time2a OperatingTime [get]
 
+CP56Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/PackedOutputCircuitInfo.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a__coll__graph.dot new file mode 100644 index 0000000..653c76e --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.PackedOutput\lCircuitInfoWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a__inherit__graph.dot new file mode 100644 index 0000000..653c76e --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.PackedOutput\lCircuitInfoWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d-members.html new file mode 100644 index 0000000..a5c4f18 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d-members.html @@ -0,0 +1,128 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.PackedSinglePointWithSCD Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.PackedSinglePointWithSCD, including all inherited members.

+ + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.PackedSinglePointWithSCD)lib60870.CS101.PackedSinglePointWithSCDvirtual
GetEncodedSize() (defined in lib60870.CS101.PackedSinglePointWithSCD)lib60870.CS101.PackedSinglePointWithSCD
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
PackedSinglePointWithSCD(int objectAddress, StatusAndStatusChangeDetection scd, QualityDescriptor quality) (defined in lib60870.CS101.PackedSinglePointWithSCD)lib60870.CS101.PackedSinglePointWithSCD
PackedSinglePointWithSCD(PackedSinglePointWithSCD original) (defined in lib60870.CS101.PackedSinglePointWithSCD)lib60870.CS101.PackedSinglePointWithSCD
QDS (defined in lib60870.CS101.PackedSinglePointWithSCD)lib60870.CS101.PackedSinglePointWithSCD
SCD (defined in lib60870.CS101.PackedSinglePointWithSCD)lib60870.CS101.PackedSinglePointWithSCD
SupportsSequence (defined in lib60870.CS101.PackedSinglePointWithSCD)lib60870.CS101.PackedSinglePointWithSCD
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.PackedSinglePointWithSCD)lib60870.CS101.PackedSinglePointWithSCD
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d.html new file mode 100644 index 0000000..d8cac1d --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d.html @@ -0,0 +1,225 @@ + + + + + + + +lib60870.NET: lib60870.CS101.PackedSinglePointWithSCD Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.PackedSinglePointWithSCD Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.PackedSinglePointWithSCD:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.PackedSinglePointWithSCD:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
PackedSinglePointWithSCD (int objectAddress, StatusAndStatusChangeDetection scd, QualityDescriptor quality)
 
PackedSinglePointWithSCD (PackedSinglePointWithSCD original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+StatusAndStatusChangeDetection SCD [get, set]
 
+QualityDescriptor QDS [get, set]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.PackedSinglePointWithSCD.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SinglePointInformation.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d__coll__graph.dot new file mode 100644 index 0000000..b02ddc0 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.PackedSinglePointWithSCD" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.PackedSingle\lPointWithSCD",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d__inherit__graph.dot new file mode 100644 index 0000000..b02ddc0 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.PackedSinglePointWithSCD" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.PackedSingle\lPointWithSCD",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment-members.html new file mode 100644 index 0000000..5ff37ae --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment-members.html @@ -0,0 +1,130 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.PackedStartEventsOfProtectionEquipment Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.PackedStartEventsOfProtectionEquipment, including all inherited members.

+ + + + + + + + + + + + + + + +
ElapsedTime (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipment)lib60870.CS101.PackedStartEventsOfProtectionEquipment
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipment)lib60870.CS101.PackedStartEventsOfProtectionEquipmentvirtual
GetEncodedSize() (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipment)lib60870.CS101.PackedStartEventsOfProtectionEquipment
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
PackedStartEventsOfProtectionEquipment(int objectAddress, StartEvent spe, QualityDescriptorP qdp, CP16Time2a elapsedTime, CP24Time2a timestamp) (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipment)lib60870.CS101.PackedStartEventsOfProtectionEquipment
PackedStartEventsOfProtectionEquipment(PackedStartEventsOfProtectionEquipment original) (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipment)lib60870.CS101.PackedStartEventsOfProtectionEquipment
QDP (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipment)lib60870.CS101.PackedStartEventsOfProtectionEquipment
SPE (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipment)lib60870.CS101.PackedStartEventsOfProtectionEquipment
SupportsSequence (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipment)lib60870.CS101.PackedStartEventsOfProtectionEquipment
Timestamp (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipment)lib60870.CS101.PackedStartEventsOfProtectionEquipment
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipment)lib60870.CS101.PackedStartEventsOfProtectionEquipment
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment.html new file mode 100644 index 0000000..5aa40f0 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment.html @@ -0,0 +1,231 @@ + + + + + + + +lib60870.NET: lib60870.CS101.PackedStartEventsOfProtectionEquipment Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.PackedStartEventsOfProtectionEquipment Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.PackedStartEventsOfProtectionEquipment:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.PackedStartEventsOfProtectionEquipment:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
PackedStartEventsOfProtectionEquipment (int objectAddress, StartEvent spe, QualityDescriptorP qdp, CP16Time2a elapsedTime, CP24Time2a timestamp)
 
PackedStartEventsOfProtectionEquipment (PackedStartEventsOfProtectionEquipment original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+StartEvent SPE [get]
 
+QualityDescriptorP QDP [get]
 
+CP16Time2a ElapsedTime [get]
 
+CP24Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.PackedStartEventsOfProtectionEquipment.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/PackedStartEventsOfProtectionEquipment.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment__coll__graph.dot new file mode 100644 index 0000000..4ed6549 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.PackedStartEventsOfProtectionEquipment" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.PackedStart\lEventsOfProtectionEquipment",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment__inherit__graph.dot new file mode 100644 index 0000000..4ed6549 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.PackedStartEventsOfProtectionEquipment" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.PackedStart\lEventsOfProtectionEquipment",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a-members.html new file mode 100644 index 0000000..48a26b2 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a-members.html @@ -0,0 +1,130 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a, including all inherited members.

+ + + + + + + + + + + + + + + +
ElapsedTime (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2avirtual
GetEncodedSize() (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
PackedStartEventsOfProtectionEquipmentWithCP56Time2a(int objectAddress, StartEvent spe, QualityDescriptorP qdp, CP16Time2a elapsedTime, CP56Time2a timestamp) (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a
PackedStartEventsOfProtectionEquipmentWithCP56Time2a(PackedStartEventsOfProtectionEquipmentWithCP56Time2a original) (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a
QDP (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a
SPE (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a
SupportsSequence (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a
Timestamp (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a.html new file mode 100644 index 0000000..d3455ef --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a.html @@ -0,0 +1,231 @@ + + + + + + + +lib60870.NET: lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
PackedStartEventsOfProtectionEquipmentWithCP56Time2a (int objectAddress, StartEvent spe, QualityDescriptorP qdp, CP16Time2a elapsedTime, CP56Time2a timestamp)
 
PackedStartEventsOfProtectionEquipmentWithCP56Time2a (PackedStartEventsOfProtectionEquipmentWithCP56Time2a original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+StartEvent SPE [get]
 
+QualityDescriptorP QDP [get]
 
+CP16Time2a ElapsedTime [get]
 
+CP56Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/PackedStartEventsOfProtectionEquipment.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a__coll__graph.dot new file mode 100644 index 0000000..40ec84d --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.PackedStart\lEventsOfProtectionEquipmentWith\lCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a__inherit__graph.dot new file mode 100644 index 0000000..40ec84d --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.PackedStart\lEventsOfProtectionEquipmentWith\lCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation-members.html new file mode 100644 index 0000000..d9e459a --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation-members.html @@ -0,0 +1,130 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.ParameterActivation Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.ParameterActivation, including all inherited members.

+ + + + + + + + + + + + + + + +
DE_ACT_OBJECT_PARAMETER (defined in lib60870.CS101.ParameterActivation)lib60870.CS101.ParameterActivationstatic
DE_ACT_OBJECT_TRANSMISSION (defined in lib60870.CS101.ParameterActivation)lib60870.CS101.ParameterActivationstatic
DE_ACT_PREV_LOADED_PARAMETER (defined in lib60870.CS101.ParameterActivation)lib60870.CS101.ParameterActivationstatic
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.ParameterActivation)lib60870.CS101.ParameterActivationvirtual
GetEncodedSize() (defined in lib60870.CS101.ParameterActivation)lib60870.CS101.ParameterActivation
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
NOT_USED (defined in lib60870.CS101.ParameterActivation)lib60870.CS101.ParameterActivationstatic
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ParameterActivation(int objectAddress, byte qpa) (defined in lib60870.CS101.ParameterActivation)lib60870.CS101.ParameterActivation
QPAlib60870.CS101.ParameterActivation
SupportsSequence (defined in lib60870.CS101.ParameterActivation)lib60870.CS101.ParameterActivation
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.ParameterActivation)lib60870.CS101.ParameterActivation
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation.html new file mode 100644 index 0000000..e1a452f --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation.html @@ -0,0 +1,261 @@ + + + + + + + +lib60870.NET: lib60870.CS101.ParameterActivation Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.ParameterActivation Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.ParameterActivation:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.ParameterActivation:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
ParameterActivation (int objectAddress, byte qpa)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + +

+Static Public Attributes

+static byte NOT_USED = 0
 
+static byte DE_ACT_PREV_LOADED_PARAMETER = 1
 
+static byte DE_ACT_OBJECT_PARAMETER = 2
 
+static byte DE_ACT_OBJECT_TRANSMISSION = 3
 
+ + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
byte QPA [get]
 Gets the Qualifier of Parameter Activation (QPA)
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.ParameterActivation.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+

Property Documentation

+ +

◆ QPA

+ +
+
+ + + + + +
+ + + + +
byte lib60870.CS101.ParameterActivation.QPA
+
+get
+
+ +

Gets the Qualifier of Parameter Activation (QPA)

+

The QPA value

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/ParameterMeasuredValues.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation.js new file mode 100644 index 0000000..1b6a6ea --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation.js @@ -0,0 +1,4 @@ +var classlib60870_1_1_c_s101_1_1_parameter_activation = +[ + [ "QPA", "classlib60870_1_1_c_s101_1_1_parameter_activation.html#ab541aa687b71edc3411f12acd9adb618", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation__coll__graph.dot new file mode 100644 index 0000000..5c0de5b --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.ParameterActivation" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Parameter\lActivation",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation__inherit__graph.dot new file mode 100644 index 0000000..5c0de5b --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.ParameterActivation" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Parameter\lActivation",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value-members.html new file mode 100644 index 0000000..20a10ae --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value-members.html @@ -0,0 +1,127 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.ParameterFloatValue Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.ParameterFloatValue, including all inherited members.

+ + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.ParameterFloatValue)lib60870.CS101.ParameterFloatValuevirtual
GetEncodedSize() (defined in lib60870.CS101.ParameterFloatValue)lib60870.CS101.ParameterFloatValue
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ParameterFloatValue(int objectAddress, float value, byte qpm) (defined in lib60870.CS101.ParameterFloatValue)lib60870.CS101.ParameterFloatValue
QPM (defined in lib60870.CS101.ParameterFloatValue)lib60870.CS101.ParameterFloatValue
SupportsSequence (defined in lib60870.CS101.ParameterFloatValue)lib60870.CS101.ParameterFloatValue
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.ParameterFloatValue)lib60870.CS101.ParameterFloatValue
Value (defined in lib60870.CS101.ParameterFloatValue)lib60870.CS101.ParameterFloatValue
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value.html new file mode 100644 index 0000000..38987e0 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value.html @@ -0,0 +1,222 @@ + + + + + + + +lib60870.NET: lib60870.CS101.ParameterFloatValue Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.ParameterFloatValue Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.ParameterFloatValue:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.ParameterFloatValue:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
ParameterFloatValue (int objectAddress, float value, byte qpm)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+float Value [get]
 
+byte QPM [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.ParameterFloatValue.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/ParameterMeasuredValues.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value__coll__graph.dot new file mode 100644 index 0000000..977d226 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.ParameterFloatValue" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Parameter\lFloatValue",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value__inherit__graph.dot new file mode 100644 index 0000000..977d226 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.ParameterFloatValue" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Parameter\lFloatValue",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value-members.html new file mode 100644 index 0000000..38a04f0 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value-members.html @@ -0,0 +1,129 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.ParameterNormalizedValue Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.ParameterNormalizedValue, including all inherited members.

+ + + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.ParameterNormalizedValue)lib60870.CS101.ParameterNormalizedValuevirtual
GetEncodedSize() (defined in lib60870.CS101.ParameterNormalizedValue)lib60870.CS101.ParameterNormalizedValue
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
NormalizedValue (defined in lib60870.CS101.ParameterNormalizedValue)lib60870.CS101.ParameterNormalizedValue
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ParameterNormalizedValue(int objectAddress, float normalizedValue, byte qpm) (defined in lib60870.CS101.ParameterNormalizedValue)lib60870.CS101.ParameterNormalizedValue
ParameterNormalizedValue(int objectAddress, short rawValue, byte qpm) (defined in lib60870.CS101.ParameterNormalizedValue)lib60870.CS101.ParameterNormalizedValue
QPM (defined in lib60870.CS101.ParameterNormalizedValue)lib60870.CS101.ParameterNormalizedValue
RawValue (defined in lib60870.CS101.ParameterNormalizedValue)lib60870.CS101.ParameterNormalizedValue
SupportsSequence (defined in lib60870.CS101.ParameterNormalizedValue)lib60870.CS101.ParameterNormalizedValue
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.ParameterNormalizedValue)lib60870.CS101.ParameterNormalizedValue
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value.html new file mode 100644 index 0000000..5a1e843 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value.html @@ -0,0 +1,228 @@ + + + + + + + +lib60870.NET: lib60870.CS101.ParameterNormalizedValue Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.ParameterNormalizedValue Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.ParameterNormalizedValue:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.ParameterNormalizedValue:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
ParameterNormalizedValue (int objectAddress, float normalizedValue, byte qpm)
 
ParameterNormalizedValue (int objectAddress, short rawValue, byte qpm)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+short RawValue [get, set]
 
+float NormalizedValue [get, set]
 
+byte QPM [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.ParameterNormalizedValue.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/ParameterMeasuredValues.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value__coll__graph.dot new file mode 100644 index 0000000..75547b6 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.ParameterNormalizedValue" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Parameter\lNormalizedValue",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value__inherit__graph.dot new file mode 100644 index 0000000..75547b6 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.ParameterNormalizedValue" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Parameter\lNormalizedValue",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value-members.html new file mode 100644 index 0000000..29d7273 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value-members.html @@ -0,0 +1,127 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.ParameterScaledValue Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.ParameterScaledValue, including all inherited members.

+ + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.ParameterScaledValue)lib60870.CS101.ParameterScaledValuevirtual
GetEncodedSize() (defined in lib60870.CS101.ParameterScaledValue)lib60870.CS101.ParameterScaledValue
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ParameterScaledValue(int objectAddress, ScaledValue value, byte qpm) (defined in lib60870.CS101.ParameterScaledValue)lib60870.CS101.ParameterScaledValue
QPM (defined in lib60870.CS101.ParameterScaledValue)lib60870.CS101.ParameterScaledValue
ScaledValue (defined in lib60870.CS101.ParameterScaledValue)lib60870.CS101.ParameterScaledValue
SupportsSequence (defined in lib60870.CS101.ParameterScaledValue)lib60870.CS101.ParameterScaledValue
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.ParameterScaledValue)lib60870.CS101.ParameterScaledValue
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value.html new file mode 100644 index 0000000..12db998 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value.html @@ -0,0 +1,222 @@ + + + + + + + +lib60870.NET: lib60870.CS101.ParameterScaledValue Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.ParameterScaledValue Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.ParameterScaledValue:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.ParameterScaledValue:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
ParameterScaledValue (int objectAddress, ScaledValue value, byte qpm)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+ScaledValue ScaledValue [get, set]
 
+byte QPM [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.ParameterScaledValue.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/ParameterMeasuredValues.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value__coll__graph.dot new file mode 100644 index 0000000..ea18206 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.ParameterScaledValue" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Parameter\lScaledValue",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value__inherit__graph.dot new file mode 100644 index 0000000..ea18206 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.ParameterScaledValue" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Parameter\lScaledValue",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_private_information_object_types-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_private_information_object_types-members.html new file mode 100644 index 0000000..63697b2 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_private_information_object_types-members.html @@ -0,0 +1,117 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.PrivateInformationObjectTypes Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.PrivateInformationObjectTypes, including all inherited members.

+ + +
AddPrivateInformationObjectType(TypeID typeId, IPrivateIOFactory iot) (defined in lib60870.CS101.PrivateInformationObjectTypes)lib60870.CS101.PrivateInformationObjectTypes
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_private_information_object_types.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_private_information_object_types.html new file mode 100644 index 0000000..3d821b2 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_private_information_object_types.html @@ -0,0 +1,132 @@ + + + + + + + +lib60870.NET: lib60870.CS101.PrivateInformationObjectTypes Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.PrivateInformationObjectTypes Class Reference
+
+
+ +

Hold a list of private information object (IO) types to be used for parsing. + More...

+ + + + +

+Public Member Functions

+void AddPrivateInformationObjectType (TypeID typeId, IPrivateIOFactory iot)
 
+

Detailed Description

+

Hold a list of private information object (IO) types to be used for parsing.

+

The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/InformationObject.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_qualifier_of_interrogation-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_qualifier_of_interrogation-members.html new file mode 100644 index 0000000..d25f331 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_qualifier_of_interrogation-members.html @@ -0,0 +1,133 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.QualifierOfInterrogation Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.QualifierOfInterrogation, including all inherited members.

+ + + + + + + + + + + + + + + + + + +
GROUP_1 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
GROUP_10 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
GROUP_11 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
GROUP_12 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
GROUP_13 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
GROUP_14 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
GROUP_15 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
GROUP_16 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
GROUP_2 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
GROUP_3 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
GROUP_4 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
GROUP_5 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
GROUP_6 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
GROUP_7 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
GROUP_8 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
GROUP_9 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
STATION (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_qualifier_of_interrogation.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_qualifier_of_interrogation.html new file mode 100644 index 0000000..7fb99e6 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_qualifier_of_interrogation.html @@ -0,0 +1,175 @@ + + + + + + + +lib60870.NET: lib60870.CS101.QualifierOfInterrogation Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.QualifierOfInterrogation Class Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Static Public Attributes

+static byte STATION = 20
 
+static byte GROUP_1 = 21
 
+static byte GROUP_2 = 22
 
+static byte GROUP_3 = 23
 
+static byte GROUP_4 = 24
 
+static byte GROUP_5 = 25
 
+static byte GROUP_6 = 26
 
+static byte GROUP_7 = 27
 
+static byte GROUP_8 = 28
 
+static byte GROUP_9 = 29
 
+static byte GROUP_10 = 30
 
+static byte GROUP_11 = 31
 
+static byte GROUP_12 = 32
 
+static byte GROUP_13 = 33
 
+static byte GROUP_14 = 34
 
+static byte GROUP_15 = 35
 
+static byte GROUP_16 = 36
 
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SystemInformationCommands.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor-members.html new file mode 100644 index 0000000..90a46dc --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor-members.html @@ -0,0 +1,130 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.QualityDescriptor Member List
+
+ +
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor.html new file mode 100644 index 0000000..cbc5361 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor.html @@ -0,0 +1,171 @@ + + + + + + + +lib60870.NET: lib60870.CS101.QualityDescriptor Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.QualityDescriptor Class Reference
+
+
+ + + + + + + + + + + + +

+Public Member Functions

QualityDescriptor (QualityDescriptor original)
 
QualityDescriptor (byte encodedValue)
 
+override bool Equals (object obj)
 
+override int GetHashCode ()
 
+override string ToString ()
 
+ + + + + +

+Static Public Member Functions

+static QualityDescriptor VALID ()
 
+static QualityDescriptor INVALID ()
 
+ + + + + + + + + + + + + +

+Properties

+bool Overflow [get, set]
 
+bool Blocked [get, set]
 
+bool Substituted [get, set]
 
+bool NonTopical [get, set]
 
+bool Invalid [get, set]
 
+byte EncodedValue [get, set]
 
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/QualityDescriptor.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor_p-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor_p-members.html new file mode 100644 index 0000000..39636cc --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor_p-members.html @@ -0,0 +1,128 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.QualityDescriptorP Member List
+
+ +
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor_p.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor_p.html new file mode 100644 index 0000000..9d1d1c8 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor_p.html @@ -0,0 +1,166 @@ + + + + + + + +lib60870.NET: lib60870.CS101.QualityDescriptorP Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.QualityDescriptorP Class Reference
+
+
+ +

QDP - Quality descriptor for events of protection equipment according to IEC 60870-5-101:2003 7.2.6.4. + More...

+ + + + + + + + + + +

+Public Member Functions

QualityDescriptorP (byte encodedValue)
 
QualityDescriptorP (QualityDescriptorP original)
 
+override bool Equals (object obj)
 
+override int GetHashCode ()
 
+ + + + + + + + + + + + + + + +

+Properties

+bool Reserved [get, set]
 
+bool ElapsedTimeInvalid [get, set]
 
+bool Blocked [get, set]
 
+bool Substituted [get, set]
 
+bool NonTopical [get, set]
 
+bool Invalid [get, set]
 
+byte EncodedValue [get, set]
 
+

Detailed Description

+

QDP - Quality descriptor for events of protection equipment according to IEC 60870-5-101:2003 7.2.6.4.

+

The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/QualityDescriptorP.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command-members.html new file mode 100644 index 0000000..4b09287 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command-members.html @@ -0,0 +1,125 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.ReadCommand Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.ReadCommand, including all inherited members.

+ + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectvirtual
GetEncodedSize() (defined in lib60870.CS101.ReadCommand)lib60870.CS101.ReadCommand
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ReadCommand(int ioa) (defined in lib60870.CS101.ReadCommand)lib60870.CS101.ReadCommand
SupportsSequence (defined in lib60870.CS101.ReadCommand)lib60870.CS101.ReadCommand
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.ReadCommand)lib60870.CS101.ReadCommand
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command.html new file mode 100644 index 0000000..75234e7 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command.html @@ -0,0 +1,180 @@ + + + + + + + +lib60870.NET: lib60870.CS101.ReadCommand Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.ReadCommand Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.ReadCommand:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.ReadCommand:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
ReadCommand (int ioa)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+virtual void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
+ + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SystemInformationCommands.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command__coll__graph.dot new file mode 100644 index 0000000..f9cd915 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.ReadCommand" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.ReadCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command__inherit__graph.dot new file mode 100644 index 0000000..f9cd915 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.ReadCommand" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.ReadCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command-members.html new file mode 100644 index 0000000..c3f059f --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command-members.html @@ -0,0 +1,126 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.ResetProcessCommand Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.ResetProcessCommand, including all inherited members.

+ + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.ResetProcessCommand)lib60870.CS101.ResetProcessCommandvirtual
GetEncodedSize() (defined in lib60870.CS101.ResetProcessCommand)lib60870.CS101.ResetProcessCommand
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
QRPlib60870.CS101.ResetProcessCommand
ResetProcessCommand(int ioa, byte qrp) (defined in lib60870.CS101.ResetProcessCommand)lib60870.CS101.ResetProcessCommand
SupportsSequence (defined in lib60870.CS101.ResetProcessCommand)lib60870.CS101.ResetProcessCommand
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.ResetProcessCommand)lib60870.CS101.ResetProcessCommand
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command.html new file mode 100644 index 0000000..b4d7b4a --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command.html @@ -0,0 +1,245 @@ + + + + + + + +lib60870.NET: lib60870.CS101.ResetProcessCommand Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.ResetProcessCommand Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.ResetProcessCommand:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.ResetProcessCommand:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
ResetProcessCommand (int ioa, byte qrp)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
byte QRP [get, set]
 Gets or sets the QRP (Qualifier of reset process command).
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.ResetProcessCommand.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+

Property Documentation

+ +

◆ QRP

+ +
+
+ + + + + +
+ + + + +
byte lib60870.CS101.ResetProcessCommand.QRP
+
+getset
+
+ +

Gets or sets the QRP (Qualifier of reset process command).

+

The QRP

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SystemInformationCommands.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command.js new file mode 100644 index 0000000..de7d1fc --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command.js @@ -0,0 +1,4 @@ +var classlib60870_1_1_c_s101_1_1_reset_process_command = +[ + [ "QRP", "classlib60870_1_1_c_s101_1_1_reset_process_command.html#ab87ef8bc0fa796dd5544ef39df6db59a", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command__coll__graph.dot new file mode 100644 index 0000000..6e5bd4c --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.ResetProcessCommand" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.ResetProcess\lCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command__inherit__graph.dot new file mode 100644 index 0000000..6e5bd4c --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.ResetProcessCommand" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.ResetProcess\lCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_scaled_value-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_scaled_value-members.html new file mode 100644 index 0000000..de47c6e --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_scaled_value-members.html @@ -0,0 +1,128 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.ScaledValue Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.ScaledValue, including all inherited members.

+ + + + + + + + + + + + + +
ConvertNormalizedValueToScaled(float value) (defined in lib60870.CS101.ScaledValue)lib60870.CS101.ScaledValue
GetEncodedValue() (defined in lib60870.CS101.ScaledValue)lib60870.CS101.ScaledValue
GetNormalizedValue() (defined in lib60870.CS101.ScaledValue)lib60870.CS101.ScaledValue
ScaledValue(byte[] msg, int startIndex) (defined in lib60870.CS101.ScaledValue)lib60870.CS101.ScaledValue
ScaledValue() (defined in lib60870.CS101.ScaledValue)lib60870.CS101.ScaledValue
ScaledValue(int value) (defined in lib60870.CS101.ScaledValue)lib60870.CS101.ScaledValue
ScaledValue(short value) (defined in lib60870.CS101.ScaledValue)lib60870.CS101.ScaledValue
ScaledValue(ScaledValue original) (defined in lib60870.CS101.ScaledValue)lib60870.CS101.ScaledValue
SetScaledFromNormalizedValue(float value) (defined in lib60870.CS101.ScaledValue)lib60870.CS101.ScaledValue
ShortValue (defined in lib60870.CS101.ScaledValue)lib60870.CS101.ScaledValue
ToString() (defined in lib60870.CS101.ScaledValue)lib60870.CS101.ScaledValue
Value (defined in lib60870.CS101.ScaledValue)lib60870.CS101.ScaledValue
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_scaled_value.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_scaled_value.html new file mode 100644 index 0000000..c90bba1 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_scaled_value.html @@ -0,0 +1,161 @@ + + + + + + + +lib60870.NET: lib60870.CS101.ScaledValue Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.ScaledValue Class Reference
+
+
+ + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

ScaledValue (byte[] msg, int startIndex)
 
ScaledValue (int value)
 
ScaledValue (short value)
 
ScaledValue (ScaledValue original)
 
+byte[] GetEncodedValue ()
 
+override string ToString ()
 
+float GetNormalizedValue ()
 
+int ConvertNormalizedValueToScaled (float value)
 
+void SetScaledFromNormalizedValue (float value)
 
+ + + + + +

+Properties

+int Value [get, set]
 
+short ShortValue [get, set]
 
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/ScaledValue.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready-members.html new file mode 100644 index 0000000..dc42bb5 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready-members.html @@ -0,0 +1,130 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.SectionReady Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.SectionReady, including all inherited members.

+ + + + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.SectionReady)lib60870.CS101.SectionReadyvirtual
GetEncodedSize() (defined in lib60870.CS101.SectionReady)lib60870.CS101.SectionReady
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
LengthOfSection (defined in lib60870.CS101.SectionReady)lib60870.CS101.SectionReady
NameOfSection (defined in lib60870.CS101.SectionReady)lib60870.CS101.SectionReady
NOF (defined in lib60870.CS101.SectionReady)lib60870.CS101.SectionReady
NotReady (defined in lib60870.CS101.SectionReady)lib60870.CS101.SectionReady
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
SectionReady(int objectAddress, NameOfFile nof, byte nameOfSection, int lengthOfSection, bool notReady) (defined in lib60870.CS101.SectionReady)lib60870.CS101.SectionReady
SRQlib60870.CS101.SectionReady
SupportsSequence (defined in lib60870.CS101.SectionReady)lib60870.CS101.SectionReady
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.SectionReady)lib60870.CS101.SectionReady
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready.html new file mode 100644 index 0000000..5d2a398 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready.html @@ -0,0 +1,262 @@ + + + + + + + +lib60870.NET: lib60870.CS101.SectionReady Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.SectionReady Class Reference
+
+
+ +

Section ready - F_SR_NA_1 (121) + More...

+
+Inheritance diagram for lib60870.CS101.SectionReady:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.SectionReady:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
SectionReady (int objectAddress, NameOfFile nof, byte nameOfSection, int lengthOfSection, bool notReady)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+NameOfFile NOF [get, set]
 
+byte NameOfSection [get, set]
 
+int LengthOfSection [get, set]
 
byte SRQ [get, set]
 Gets or sets the SRQ (section ready qualifier)
 
+bool NotReady [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Detailed Description

+

Section ready - F_SR_NA_1 (121)

+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.SectionReady.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+

Property Documentation

+ +

◆ SRQ

+ +
+
+ + + + + +
+ + + + +
byte lib60870.CS101.SectionReady.SRQ
+
+getset
+
+ +

Gets or sets the SRQ (section ready qualifier)

+

The SRQ

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/FileObjects.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready.js new file mode 100644 index 0000000..6ae3839 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready.js @@ -0,0 +1,4 @@ +var classlib60870_1_1_c_s101_1_1_section_ready = +[ + [ "SRQ", "classlib60870_1_1_c_s101_1_1_section_ready.html#a5bbd3b419683eaa394c20ca9e3f1ba34", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready__coll__graph.dot new file mode 100644 index 0000000..5605a12 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.SectionReady" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.SectionReady",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Section ready - F_SR_NA_1 (121)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready__inherit__graph.dot new file mode 100644 index 0000000..5605a12 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.SectionReady" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.SectionReady",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Section ready - F_SR_NA_1 (121)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized-members.html new file mode 100644 index 0000000..b415cbf --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized-members.html @@ -0,0 +1,129 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.SetpointCommandNormalized Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.SetpointCommandNormalized, including all inherited members.

+ + + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalizedvirtual
GetEncodedSize() (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalized
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
NormalizedValue (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalized
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
QOS (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalized
RawValue (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalized
SetpointCommandNormalized(int objectAddress, float value, SetpointCommandQualifier qos) (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalized
SetpointCommandNormalized(int ObjectAddress, short value, SetpointCommandQualifier qos) (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalized
SupportsSequence (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalized
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalized
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized.html new file mode 100644 index 0000000..90cbc34 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized.html @@ -0,0 +1,228 @@ + + + + + + + +lib60870.NET: lib60870.CS101.SetpointCommandNormalized Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.SetpointCommandNormalized Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.SetpointCommandNormalized:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.SetpointCommandNormalized:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
SetpointCommandNormalized (int objectAddress, float value, SetpointCommandQualifier qos)
 
SetpointCommandNormalized (int ObjectAddress, short value, SetpointCommandQualifier qos)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+short RawValue [get, set]
 
+float NormalizedValue [get, set]
 
+SetpointCommandQualifier QOS [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.SetpointCommandNormalized.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SetpointCommands.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized__coll__graph.dot new file mode 100644 index 0000000..804b385 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.SetpointCommandNormalized" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.SetpointCommand\lNormalized",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized__inherit__graph.dot new file mode 100644 index 0000000..5429052 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.SetpointCommandNormalized" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.SetpointCommand\lNormalized",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="lib60870.CS101.SetpointCommand\lNormalizedWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a-members.html new file mode 100644 index 0000000..5b4a914 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a-members.html @@ -0,0 +1,132 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a, including all inherited members.

+ + + + + + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a)lib60870.CS101.SetpointCommandNormalizedWithCP56Time2avirtual
GetEncodedSize() (defined in lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a)lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
NormalizedValue (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalized
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
QOS (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalized
RawValue (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalized
SetpointCommandNormalized(int objectAddress, float value, SetpointCommandQualifier qos) (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalized
SetpointCommandNormalized(int ObjectAddress, short value, SetpointCommandQualifier qos) (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalized
SetpointCommandNormalizedWithCP56Time2a(int objectAddress, float value, SetpointCommandQualifier qos, CP56Time2a timestamp) (defined in lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a)lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a
SetpointCommandNormalizedWithCP56Time2a(int objectAddress, short value, SetpointCommandQualifier qos, CP56Time2a timestamp) (defined in lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a)lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a
SupportsSequence (defined in lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a)lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a
Timestamp (defined in lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a)lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a)lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a.html new file mode 100644 index 0000000..ccc8544 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a.html @@ -0,0 +1,248 @@ + + + + + + + +lib60870.NET: lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
SetpointCommandNormalizedWithCP56Time2a (int objectAddress, float value, SetpointCommandQualifier qos, CP56Time2a timestamp)
 
SetpointCommandNormalizedWithCP56Time2a (int objectAddress, short value, SetpointCommandQualifier qos, CP56Time2a timestamp)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.SetpointCommandNormalized
+override int GetEncodedSize ()
 
SetpointCommandNormalized (int objectAddress, float value, SetpointCommandQualifier qos)
 
SetpointCommandNormalized (int ObjectAddress, short value, SetpointCommandQualifier qos)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+CP56Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.SetpointCommandNormalized
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+short RawValue [get, set]
 
+float NormalizedValue [get, set]
 
+SetpointCommandQualifier QOS [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.SetpointCommandNormalized.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SetpointCommands.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a__coll__graph.dot new file mode 100644 index 0000000..6e457bf --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a__coll__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.SetpointCommand\lNormalizedWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="SetpointCommandNormalized",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_normalized.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a__inherit__graph.dot new file mode 100644 index 0000000..6e457bf --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.SetpointCommand\lNormalizedWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="SetpointCommandNormalized",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_normalized.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_qualifier-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_qualifier-members.html new file mode 100644 index 0000000..2580b8e --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_qualifier-members.html @@ -0,0 +1,121 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.SetpointCommandQualifier Member List
+
+ +
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_qualifier.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_qualifier.html new file mode 100644 index 0000000..f5806c2 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_qualifier.html @@ -0,0 +1,143 @@ + + + + + + + +lib60870.NET: lib60870.CS101.SetpointCommandQualifier Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.SetpointCommandQualifier Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

SetpointCommandQualifier (byte encodedValue)
 
SetpointCommandQualifier (bool select, int ql)
 
+byte GetEncodedValue ()
 
+ + + + + +

+Properties

+int QL [get]
 
+bool Select [get]
 
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SetpointCommandQualifier.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled-members.html new file mode 100644 index 0000000..8740a57 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled-members.html @@ -0,0 +1,127 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.SetpointCommandScaled Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.SetpointCommandScaled, including all inherited members.

+ + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.SetpointCommandScaled)lib60870.CS101.SetpointCommandScaledvirtual
GetEncodedSize() (defined in lib60870.CS101.SetpointCommandScaled)lib60870.CS101.SetpointCommandScaled
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
QOS (defined in lib60870.CS101.SetpointCommandScaled)lib60870.CS101.SetpointCommandScaled
ScaledValue (defined in lib60870.CS101.SetpointCommandScaled)lib60870.CS101.SetpointCommandScaled
SetpointCommandScaled(int objectAddress, ScaledValue value, SetpointCommandQualifier qos) (defined in lib60870.CS101.SetpointCommandScaled)lib60870.CS101.SetpointCommandScaled
SupportsSequence (defined in lib60870.CS101.SetpointCommandScaled)lib60870.CS101.SetpointCommandScaled
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.SetpointCommandScaled)lib60870.CS101.SetpointCommandScaled
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled.html new file mode 100644 index 0000000..fd34384 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled.html @@ -0,0 +1,222 @@ + + + + + + + +lib60870.NET: lib60870.CS101.SetpointCommandScaled Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.SetpointCommandScaled Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.SetpointCommandScaled:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.SetpointCommandScaled:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
SetpointCommandScaled (int objectAddress, ScaledValue value, SetpointCommandQualifier qos)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+ScaledValue ScaledValue [get]
 
+SetpointCommandQualifier QOS [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.SetpointCommandScaled.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SetpointCommands.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled__coll__graph.dot new file mode 100644 index 0000000..5cb2945 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.SetpointCommandScaled" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.SetpointCommand\lScaled",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled__inherit__graph.dot new file mode 100644 index 0000000..0fb99ff --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.SetpointCommandScaled" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.SetpointCommand\lScaled",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="lib60870.CS101.SetpointCommand\lScaledWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a-members.html new file mode 100644 index 0000000..45afcd1 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a-members.html @@ -0,0 +1,129 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.SetpointCommandScaledWithCP56Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.SetpointCommandScaledWithCP56Time2a, including all inherited members.

+ + + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.SetpointCommandScaledWithCP56Time2a)lib60870.CS101.SetpointCommandScaledWithCP56Time2avirtual
GetEncodedSize() (defined in lib60870.CS101.SetpointCommandScaledWithCP56Time2a)lib60870.CS101.SetpointCommandScaledWithCP56Time2a
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
QOS (defined in lib60870.CS101.SetpointCommandScaled)lib60870.CS101.SetpointCommandScaled
ScaledValue (defined in lib60870.CS101.SetpointCommandScaled)lib60870.CS101.SetpointCommandScaled
SetpointCommandScaled(int objectAddress, ScaledValue value, SetpointCommandQualifier qos) (defined in lib60870.CS101.SetpointCommandScaled)lib60870.CS101.SetpointCommandScaled
SetpointCommandScaledWithCP56Time2a(int objectAddress, ScaledValue value, SetpointCommandQualifier qos, CP56Time2a timestamp) (defined in lib60870.CS101.SetpointCommandScaledWithCP56Time2a)lib60870.CS101.SetpointCommandScaledWithCP56Time2a
SupportsSequence (defined in lib60870.CS101.SetpointCommandScaledWithCP56Time2a)lib60870.CS101.SetpointCommandScaledWithCP56Time2a
Timestamp (defined in lib60870.CS101.SetpointCommandScaledWithCP56Time2a)lib60870.CS101.SetpointCommandScaledWithCP56Time2a
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.SetpointCommandScaledWithCP56Time2a)lib60870.CS101.SetpointCommandScaledWithCP56Time2a
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a.html new file mode 100644 index 0000000..11e8b7e --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a.html @@ -0,0 +1,239 @@ + + + + + + + +lib60870.NET: lib60870.CS101.SetpointCommandScaledWithCP56Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.SetpointCommandScaledWithCP56Time2a Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.SetpointCommandScaledWithCP56Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.SetpointCommandScaledWithCP56Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
SetpointCommandScaledWithCP56Time2a (int objectAddress, ScaledValue value, SetpointCommandQualifier qos, CP56Time2a timestamp)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.SetpointCommandScaled
+override int GetEncodedSize ()
 
SetpointCommandScaled (int objectAddress, ScaledValue value, SetpointCommandQualifier qos)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+CP56Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.SetpointCommandScaled
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+ScaledValue ScaledValue [get]
 
+SetpointCommandQualifier QOS [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.SetpointCommandScaledWithCP56Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.SetpointCommandScaled.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SetpointCommands.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a__coll__graph.dot new file mode 100644 index 0000000..3d1af3b --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a__coll__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.SetpointCommandScaledWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.SetpointCommand\lScaledWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="SetpointCommandScaled",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_scaled.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a__inherit__graph.dot new file mode 100644 index 0000000..3d1af3b --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.SetpointCommandScaledWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.SetpointCommand\lScaledWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="SetpointCommandScaled",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_scaled.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short-members.html new file mode 100644 index 0000000..1de0311 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short-members.html @@ -0,0 +1,127 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.SetpointCommandShort Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.SetpointCommandShort, including all inherited members.

+ + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.SetpointCommandShort)lib60870.CS101.SetpointCommandShortvirtual
GetEncodedSize() (defined in lib60870.CS101.SetpointCommandShort)lib60870.CS101.SetpointCommandShort
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
QOS (defined in lib60870.CS101.SetpointCommandShort)lib60870.CS101.SetpointCommandShort
SetpointCommandShort(int objectAddress, float value, SetpointCommandQualifier qos) (defined in lib60870.CS101.SetpointCommandShort)lib60870.CS101.SetpointCommandShort
SupportsSequence (defined in lib60870.CS101.SetpointCommandShort)lib60870.CS101.SetpointCommandShort
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.SetpointCommandShort)lib60870.CS101.SetpointCommandShort
Value (defined in lib60870.CS101.SetpointCommandShort)lib60870.CS101.SetpointCommandShort
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short.html new file mode 100644 index 0000000..89f79aa --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short.html @@ -0,0 +1,222 @@ + + + + + + + +lib60870.NET: lib60870.CS101.SetpointCommandShort Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.SetpointCommandShort Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.SetpointCommandShort:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.SetpointCommandShort:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
SetpointCommandShort (int objectAddress, float value, SetpointCommandQualifier qos)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+float Value [get]
 
+SetpointCommandQualifier QOS [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.SetpointCommandShort.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SetpointCommands.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short__coll__graph.dot new file mode 100644 index 0000000..dd3f394 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.SetpointCommandShort" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.SetpointCommand\lShort",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short__inherit__graph.dot new file mode 100644 index 0000000..87a9674 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.SetpointCommandShort" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.SetpointCommand\lShort",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="lib60870.CS101.SetpointCommand\lShortWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a-members.html new file mode 100644 index 0000000..dd05db6 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a-members.html @@ -0,0 +1,129 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.SetpointCommandShortWithCP56Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.SetpointCommandShortWithCP56Time2a, including all inherited members.

+ + + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.SetpointCommandShortWithCP56Time2a)lib60870.CS101.SetpointCommandShortWithCP56Time2avirtual
GetEncodedSize() (defined in lib60870.CS101.SetpointCommandShortWithCP56Time2a)lib60870.CS101.SetpointCommandShortWithCP56Time2a
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
QOS (defined in lib60870.CS101.SetpointCommandShort)lib60870.CS101.SetpointCommandShort
SetpointCommandShort(int objectAddress, float value, SetpointCommandQualifier qos) (defined in lib60870.CS101.SetpointCommandShort)lib60870.CS101.SetpointCommandShort
SetpointCommandShortWithCP56Time2a(int objectAddress, float value, SetpointCommandQualifier qos, CP56Time2a timestamp) (defined in lib60870.CS101.SetpointCommandShortWithCP56Time2a)lib60870.CS101.SetpointCommandShortWithCP56Time2a
SupportsSequence (defined in lib60870.CS101.SetpointCommandShortWithCP56Time2a)lib60870.CS101.SetpointCommandShortWithCP56Time2a
Timestamp (defined in lib60870.CS101.SetpointCommandShortWithCP56Time2a)lib60870.CS101.SetpointCommandShortWithCP56Time2a
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.SetpointCommandShortWithCP56Time2a)lib60870.CS101.SetpointCommandShortWithCP56Time2a
Value (defined in lib60870.CS101.SetpointCommandShort)lib60870.CS101.SetpointCommandShort
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a.html new file mode 100644 index 0000000..a3c44fe --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a.html @@ -0,0 +1,239 @@ + + + + + + + +lib60870.NET: lib60870.CS101.SetpointCommandShortWithCP56Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.SetpointCommandShortWithCP56Time2a Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.SetpointCommandShortWithCP56Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.SetpointCommandShortWithCP56Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
SetpointCommandShortWithCP56Time2a (int objectAddress, float value, SetpointCommandQualifier qos, CP56Time2a timestamp)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.SetpointCommandShort
+override int GetEncodedSize ()
 
SetpointCommandShort (int objectAddress, float value, SetpointCommandQualifier qos)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+CP56Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.SetpointCommandShort
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+float Value [get]
 
+SetpointCommandQualifier QOS [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.SetpointCommandShortWithCP56Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.SetpointCommandShort.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SetpointCommands.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a__coll__graph.dot new file mode 100644 index 0000000..831b5a3 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a__coll__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.SetpointCommandShortWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.SetpointCommand\lShortWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="SetpointCommandShort",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_short.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a__inherit__graph.dot new file mode 100644 index 0000000..831b5a3 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.SetpointCommandShortWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.SetpointCommand\lShortWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="SetpointCommandShort",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_short.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command-members.html new file mode 100644 index 0000000..7c8366e --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command-members.html @@ -0,0 +1,129 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.SingleCommand Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.SingleCommand, including all inherited members.

+ + + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.SingleCommand)lib60870.CS101.SingleCommandvirtual
GetEncodedSize() (defined in lib60870.CS101.SingleCommand)lib60870.CS101.SingleCommand
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
QU (defined in lib60870.CS101.SingleCommand)lib60870.CS101.SingleCommand
Selectlib60870.CS101.SingleCommand
SingleCommand(int ioa, bool command, bool selectCommand, int qu) (defined in lib60870.CS101.SingleCommand)lib60870.CS101.SingleCommand
SingleCommand(SingleCommand original) (defined in lib60870.CS101.SingleCommand)lib60870.CS101.SingleCommand
Statelib60870.CS101.SingleCommand
SupportsSequence (defined in lib60870.CS101.SingleCommand)lib60870.CS101.SingleCommand
ToString() (defined in lib60870.CS101.SingleCommand)lib60870.CS101.SingleCommand
Type (defined in lib60870.CS101.SingleCommand)lib60870.CS101.SingleCommand
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command.html new file mode 100644 index 0000000..5b15926 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command.html @@ -0,0 +1,282 @@ + + + + + + + +lib60870.NET: lib60870.CS101.SingleCommand Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.SingleCommand Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.SingleCommand:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.SingleCommand:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
SingleCommand (int ioa, bool command, bool selectCommand, int qu)
 
SingleCommand (SingleCommand original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
+override string ToString ()
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+int QU [get, set]
 
bool State [get, set]
 Gets the state (off - false / on - true) of this command.
 
bool Select [get, set]
 Indicates if the command is a select or an execute command.
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.SingleCommand.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+

Property Documentation

+ +

◆ Select

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS101.SingleCommand.Select
+
+getset
+
+ +

Indicates if the command is a select or an execute command.

+

true if select; execute, false.

+ +
+
+ +

◆ State

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS101.SingleCommand.State
+
+getset
+
+ +

Gets the state (off - false / on - true) of this command.

+

true if on; otherwise, false.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SingleCommand.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command.js new file mode 100644 index 0000000..590c332 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command.js @@ -0,0 +1,5 @@ +var classlib60870_1_1_c_s101_1_1_single_command = +[ + [ "Select", "classlib60870_1_1_c_s101_1_1_single_command.html#a1829a95a868ed80cae41cc66f8d23867", null ], + [ "State", "classlib60870_1_1_c_s101_1_1_single_command.html#ae642167ac8c59c6a2f5552919c3606a4", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command__coll__graph.dot new file mode 100644 index 0000000..c3074f1 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.SingleCommand" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.SingleCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command__inherit__graph.dot new file mode 100644 index 0000000..5d7aed5 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.SingleCommand" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.SingleCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="lib60870.CS101.SingleCommand\lWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a-members.html new file mode 100644 index 0000000..7d6311a --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a-members.html @@ -0,0 +1,132 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.SingleCommandWithCP56Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.SingleCommandWithCP56Time2a, including all inherited members.

+ + + + + + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.SingleCommandWithCP56Time2a)lib60870.CS101.SingleCommandWithCP56Time2avirtual
GetEncodedSize() (defined in lib60870.CS101.SingleCommand)lib60870.CS101.SingleCommand
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
QU (defined in lib60870.CS101.SingleCommand)lib60870.CS101.SingleCommand
Selectlib60870.CS101.SingleCommand
SingleCommand(int ioa, bool command, bool selectCommand, int qu) (defined in lib60870.CS101.SingleCommand)lib60870.CS101.SingleCommand
SingleCommand(SingleCommand original) (defined in lib60870.CS101.SingleCommand)lib60870.CS101.SingleCommand
SingleCommandWithCP56Time2a(int ioa, bool command, bool selectCommand, int qu, CP56Time2a timestamp) (defined in lib60870.CS101.SingleCommandWithCP56Time2a)lib60870.CS101.SingleCommandWithCP56Time2a
SingleCommandWithCP56Time2a(SingleCommandWithCP56Time2a original) (defined in lib60870.CS101.SingleCommandWithCP56Time2a)lib60870.CS101.SingleCommandWithCP56Time2a
Statelib60870.CS101.SingleCommand
SupportsSequence (defined in lib60870.CS101.SingleCommandWithCP56Time2a)lib60870.CS101.SingleCommandWithCP56Time2a
Timestamp (defined in lib60870.CS101.SingleCommandWithCP56Time2a)lib60870.CS101.SingleCommandWithCP56Time2a
ToString() (defined in lib60870.CS101.SingleCommand)lib60870.CS101.SingleCommand
Type (defined in lib60870.CS101.SingleCommandWithCP56Time2a)lib60870.CS101.SingleCommandWithCP56Time2a
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a.html new file mode 100644 index 0000000..69ed34d --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a.html @@ -0,0 +1,248 @@ + + + + + + + +lib60870.NET: lib60870.CS101.SingleCommandWithCP56Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.SingleCommandWithCP56Time2a Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.SingleCommandWithCP56Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.SingleCommandWithCP56Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

SingleCommandWithCP56Time2a (int ioa, bool command, bool selectCommand, int qu, CP56Time2a timestamp)
 
SingleCommandWithCP56Time2a (SingleCommandWithCP56Time2a original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.SingleCommand
+override int GetEncodedSize ()
 
SingleCommand (int ioa, bool command, bool selectCommand, int qu)
 
SingleCommand (SingleCommand original)
 
+override string ToString ()
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+CP56Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.SingleCommand
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+int QU [get, set]
 
bool State [get, set]
 Gets the state (off - false / on - true) of this command.
 
bool Select [get, set]
 Indicates if the command is a select or an execute command.
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.SingleCommandWithCP56Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.SingleCommand.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SingleCommand.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a__coll__graph.dot new file mode 100644 index 0000000..8db0435 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a__coll__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.SingleCommandWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.SingleCommand\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="SingleCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_command.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a__inherit__graph.dot new file mode 100644 index 0000000..8db0435 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.SingleCommandWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.SingleCommand\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="SingleCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_command.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_event-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_event-members.html new file mode 100644 index 0000000..8df6483 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_event-members.html @@ -0,0 +1,124 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.SingleEvent Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.SingleEvent, including all inherited members.

+ + + + + + + + + +
EncodedValue (defined in lib60870.CS101.SingleEvent)lib60870.CS101.SingleEvent
Equals(object obj) (defined in lib60870.CS101.SingleEvent)lib60870.CS101.SingleEvent
GetHashCode() (defined in lib60870.CS101.SingleEvent)lib60870.CS101.SingleEvent
QDP (defined in lib60870.CS101.SingleEvent)lib60870.CS101.SingleEvent
SingleEvent() (defined in lib60870.CS101.SingleEvent)lib60870.CS101.SingleEvent
SingleEvent(SingleEvent orignal) (defined in lib60870.CS101.SingleEvent)lib60870.CS101.SingleEvent
SingleEvent(byte encodedValue) (defined in lib60870.CS101.SingleEvent)lib60870.CS101.SingleEvent
State (defined in lib60870.CS101.SingleEvent)lib60870.CS101.SingleEvent
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_event.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_event.html new file mode 100644 index 0000000..8621f6d --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_event.html @@ -0,0 +1,149 @@ + + + + + + + +lib60870.NET: lib60870.CS101.SingleEvent Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.SingleEvent Class Reference
+
+
+ + + + + + + + + + +

+Public Member Functions

SingleEvent (SingleEvent orignal)
 
+override bool Equals (object obj)
 
+override int GetHashCode ()
 
SingleEvent (byte encodedValue)
 
+ + + + + + + +

+Properties

+EventState State [get, set]
 
+QualityDescriptorP QDP [get, set]
 
+byte EncodedValue [get]
 
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SingleEvent.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information-members.html new file mode 100644 index 0000000..68a7d20 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information-members.html @@ -0,0 +1,128 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.SinglePointInformation Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.SinglePointInformation, including all inherited members.

+ + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformationvirtual
GetEncodedSize() (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Quality (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
SinglePointInformation(int objectAddress, bool value, QualityDescriptor quality) (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
SinglePointInformation(SinglePointInformation original) (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
SupportsSequence (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
Value (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information.html new file mode 100644 index 0000000..1af769f --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information.html @@ -0,0 +1,225 @@ + + + + + + + +lib60870.NET: lib60870.CS101.SinglePointInformation Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.SinglePointInformation Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.SinglePointInformation:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.SinglePointInformation:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
SinglePointInformation (int objectAddress, bool value, QualityDescriptor quality)
 
SinglePointInformation (SinglePointInformation original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+bool Value [get, set]
 
+QualityDescriptor Quality [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.SinglePointInformation.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SinglePointInformation.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information__coll__graph.dot new file mode 100644 index 0000000..5b8117f --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.SinglePointInformation" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.SinglePoint\lInformation",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information__inherit__graph.dot new file mode 100644 index 0000000..a80b236 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information__inherit__graph.dot @@ -0,0 +1,14 @@ +digraph "lib60870.CS101.SinglePointInformation" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.SinglePoint\lInformation",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="lib60870.CS101.SinglePoint\lWithCP24Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a.html",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="lib60870.CS101.SinglePoint\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a.html",tooltip="Single point with CP56Time2a timestamp (M_SP_TB_1)"]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a-members.html new file mode 100644 index 0000000..08a1255 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a-members.html @@ -0,0 +1,131 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.SinglePointWithCP24Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.SinglePointWithCP24Time2a, including all inherited members.

+ + + + + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.SinglePointWithCP24Time2a)lib60870.CS101.SinglePointWithCP24Time2avirtual
GetEncodedSize() (defined in lib60870.CS101.SinglePointWithCP24Time2a)lib60870.CS101.SinglePointWithCP24Time2a
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Quality (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
SinglePointInformation(int objectAddress, bool value, QualityDescriptor quality) (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
SinglePointInformation(SinglePointInformation original) (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
SinglePointWithCP24Time2a(int objectAddress, bool value, QualityDescriptor quality, CP24Time2a timestamp) (defined in lib60870.CS101.SinglePointWithCP24Time2a)lib60870.CS101.SinglePointWithCP24Time2a
SinglePointWithCP24Time2a(SinglePointWithCP24Time2a original) (defined in lib60870.CS101.SinglePointWithCP24Time2a)lib60870.CS101.SinglePointWithCP24Time2a
SupportsSequence (defined in lib60870.CS101.SinglePointWithCP24Time2a)lib60870.CS101.SinglePointWithCP24Time2a
Timestamp (defined in lib60870.CS101.SinglePointWithCP24Time2a)lib60870.CS101.SinglePointWithCP24Time2a
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.SinglePointWithCP24Time2a)lib60870.CS101.SinglePointWithCP24Time2a
Value (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a.html new file mode 100644 index 0000000..de89bd3 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a.html @@ -0,0 +1,245 @@ + + + + + + + +lib60870.NET: lib60870.CS101.SinglePointWithCP24Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.SinglePointWithCP24Time2a Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.SinglePointWithCP24Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.SinglePointWithCP24Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
SinglePointWithCP24Time2a (int objectAddress, bool value, QualityDescriptor quality, CP24Time2a timestamp)
 
SinglePointWithCP24Time2a (SinglePointWithCP24Time2a original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.SinglePointInformation
+override int GetEncodedSize ()
 
SinglePointInformation (int objectAddress, bool value, QualityDescriptor quality)
 
SinglePointInformation (SinglePointInformation original)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+CP24Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.SinglePointInformation
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+bool Value [get, set]
 
+QualityDescriptor Quality [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.SinglePointWithCP24Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.SinglePointInformation.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SinglePointInformation.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a__coll__graph.dot new file mode 100644 index 0000000..a4b5899 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a__coll__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.SinglePointWithCP24Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.SinglePoint\lWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="SinglePointInformation",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_point_information.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a__inherit__graph.dot new file mode 100644 index 0000000..a4b5899 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.SinglePointWithCP24Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.SinglePoint\lWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="SinglePointInformation",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_point_information.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a-members.html new file mode 100644 index 0000000..50175f2 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a-members.html @@ -0,0 +1,131 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.SinglePointWithCP56Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.SinglePointWithCP56Time2a, including all inherited members.

+ + + + + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.SinglePointWithCP56Time2a)lib60870.CS101.SinglePointWithCP56Time2avirtual
GetEncodedSize() (defined in lib60870.CS101.SinglePointWithCP56Time2a)lib60870.CS101.SinglePointWithCP56Time2a
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Quality (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
SinglePointInformation(int objectAddress, bool value, QualityDescriptor quality) (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
SinglePointInformation(SinglePointInformation original) (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
SinglePointWithCP56Time2a(int objectAddress, bool value, QualityDescriptor quality, CP56Time2a timestamp) (defined in lib60870.CS101.SinglePointWithCP56Time2a)lib60870.CS101.SinglePointWithCP56Time2a
SinglePointWithCP56Time2a(SinglePointWithCP56Time2a original) (defined in lib60870.CS101.SinglePointWithCP56Time2a)lib60870.CS101.SinglePointWithCP56Time2a
SupportsSequence (defined in lib60870.CS101.SinglePointWithCP56Time2a)lib60870.CS101.SinglePointWithCP56Time2a
Timestamp (defined in lib60870.CS101.SinglePointWithCP56Time2a)lib60870.CS101.SinglePointWithCP56Time2a
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.SinglePointWithCP56Time2a)lib60870.CS101.SinglePointWithCP56Time2a
Value (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a.html new file mode 100644 index 0000000..c258eca --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a.html @@ -0,0 +1,250 @@ + + + + + + + +lib60870.NET: lib60870.CS101.SinglePointWithCP56Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.SinglePointWithCP56Time2a Class Reference
+
+
+ +

Single point with CP56Time2a timestamp (M_SP_TB_1) + More...

+
+Inheritance diagram for lib60870.CS101.SinglePointWithCP56Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.SinglePointWithCP56Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
SinglePointWithCP56Time2a (int objectAddress, bool value, QualityDescriptor quality, CP56Time2a timestamp)
 
SinglePointWithCP56Time2a (SinglePointWithCP56Time2a original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.SinglePointInformation
+override int GetEncodedSize ()
 
SinglePointInformation (int objectAddress, bool value, QualityDescriptor quality)
 
SinglePointInformation (SinglePointInformation original)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+CP56Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.SinglePointInformation
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+bool Value [get, set]
 
+QualityDescriptor Quality [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Detailed Description

+

Single point with CP56Time2a timestamp (M_SP_TB_1)

+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.SinglePointWithCP56Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.SinglePointInformation.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SinglePointInformation.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a__coll__graph.dot new file mode 100644 index 0000000..41195cb --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a__coll__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.SinglePointWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.SinglePoint\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Single point with CP56Time2a timestamp (M_SP_TB_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="SinglePointInformation",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_point_information.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a__inherit__graph.dot new file mode 100644 index 0000000..41195cb --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.SinglePointWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.SinglePoint\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Single point with CP56Time2a timestamp (M_SP_TB_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="SinglePointInformation",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_point_information.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave-members.html new file mode 100644 index 0000000..84e2117 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave-members.html @@ -0,0 +1,143 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.Slave Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.Slave, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
asduHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
asduHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
clockSynchronizationHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
clockSynchronizationHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
counterInterrogationHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
counterInterrogationHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
DebugOutput (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
debugOutput (defined in lib60870.CS101.Slave)lib60870.CS101.Slaveprotected
delayAcquisitionHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
delayAcquisitionHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
filesAvailable (defined in lib60870.CS101.Slave)lib60870.CS101.Slaveprotected
FileTimeoutlib60870.CS101.Slave
GetAvailableFiles()lib60870.CS101.Slave
interrogationHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
InterrogationHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
readHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
readHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
resetProcessHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
resetProcessHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
SetASDUHandler(ASDUHandler handler, object parameter)lib60870.CS101.Slave
SetClockSynchronizationHandler(ClockSynchronizationHandler handler, object parameter)lib60870.CS101.Slave
SetCounterInterrogationHandler(CounterInterrogationHandler handler, object parameter)lib60870.CS101.Slave
SetDelayAcquisitionHandler(DelayAcquisitionHandler handler, object parameter) (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
SetFileReadyHandler(FileReadyHandler handler, object parameter)lib60870.CS101.Slave
SetInterrogationHandler(InterrogationHandler handler, object parameter)lib60870.CS101.Slave
SetReadHandler(ReadHandler handler, object parameter)lib60870.CS101.Slave
SetResetProcessHandler(ResetProcessHandler handler, object parameter) (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave.html new file mode 100644 index 0000000..209ab59 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave.html @@ -0,0 +1,454 @@ + + + + + + + +lib60870.NET: lib60870.CS101.Slave Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.Slave Class Referenceabstract
+
+
+
+Inheritance diagram for lib60870.CS101.Slave:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.Slave:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

void SetInterrogationHandler (InterrogationHandler handler, object parameter)
 Sets a callback for interrogaton requests.
 
void SetCounterInterrogationHandler (CounterInterrogationHandler handler, object parameter)
 Sets a callback for counter interrogaton requests.
 
void SetReadHandler (ReadHandler handler, object parameter)
 Sets a callback for read requests.
 
void SetClockSynchronizationHandler (ClockSynchronizationHandler handler, object parameter)
 Sets a callback for the clock synchronization request.
 
+void SetResetProcessHandler (ResetProcessHandler handler, object parameter)
 
+void SetDelayAcquisitionHandler (DelayAcquisitionHandler handler, object parameter)
 
void SetASDUHandler (ASDUHandler handler, object parameter)
 Sets a callback to handle ASDUs (commands, requests) form clients. This callback can be used when no other callback handles the message from the client/master.
 
void SetFileReadyHandler (FileReadyHandler handler, object parameter)
 Sets a callback handler that is called when a file ready message is received from a master.
 
FilesAvailable GetAvailableFiles ()
 Gets the available files that are registered with the file server.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

+InterrogationHandler interrogationHandler = null
 
+object InterrogationHandlerParameter = null
 
+CounterInterrogationHandler counterInterrogationHandler = null
 
+object counterInterrogationHandlerParameter = null
 
+ReadHandler readHandler = null
 
+object readHandlerParameter = null
 
+ClockSynchronizationHandler clockSynchronizationHandler = null
 
+object clockSynchronizationHandlerParameter = null
 
+ResetProcessHandler resetProcessHandler = null
 
+object resetProcessHandlerParameter = null
 
+DelayAcquisitionHandler delayAcquisitionHandler = null
 
+object delayAcquisitionHandlerParameter = null
 
+ASDUHandler asduHandler = null
 
+object asduHandlerParameter = null
 
+ + + + + +

+Protected Attributes

+bool debugOutput
 
+FilesAvailable filesAvailable = new FilesAvailable()
 
+ + + + + + +

+Properties

+bool DebugOutput [get, set]
 
virtual int FileTimeout [get, set]
 Gets or sets the file service timeout.
 
+

Member Function Documentation

+ +

◆ GetAvailableFiles()

+ +
+
+ + + + + + + +
FilesAvailable lib60870.CS101.Slave.GetAvailableFiles ()
+
+ +

Gets the available files that are registered with the file server.

+
Returns
The available files.
+ +
+
+ +

◆ SetASDUHandler()

+ +
+
+ + + + + + + + + + + +
void lib60870.CS101.Slave.SetASDUHandler (ASDUHandler handler,
object parameter )
+
+ +

Sets a callback to handle ASDUs (commands, requests) form clients. This callback can be used when no other callback handles the message from the client/master.

+
Parameters
+ + + +
handlerThe ASDU callback function
parameteruser provided parameter that is passed to the callback
+
+
+ +
+
+ +

◆ SetClockSynchronizationHandler()

+ +
+
+ + + + + + + + + + + +
void lib60870.CS101.Slave.SetClockSynchronizationHandler (ClockSynchronizationHandler handler,
object parameter )
+
+ +

Sets a callback for the clock synchronization request.

+
Parameters
+ + + +
handlerThe clock synchronization request handler callback function
parameteruser provided parameter that is passed to the callback
+
+
+ +
+
+ +

◆ SetCounterInterrogationHandler()

+ +
+
+ + + + + + + + + + + +
void lib60870.CS101.Slave.SetCounterInterrogationHandler (CounterInterrogationHandler handler,
object parameter )
+
+ +

Sets a callback for counter interrogaton requests.

+
Parameters
+ + + +
handlerThe counter interrogation request handler callback function
parameteruser provided parameter that is passed to the callback
+
+
+ +
+
+ +

◆ SetFileReadyHandler()

+ +
+
+ + + + + + + + + + + +
void lib60870.CS101.Slave.SetFileReadyHandler (FileReadyHandler handler,
object parameter )
+
+ +

Sets a callback handler that is called when a file ready message is received from a master.

+
Parameters
+ + + +
handlercallback function to be called
parameteruser provided parameter that is passed to the callback
+
+
+ +
+
+ +

◆ SetInterrogationHandler()

+ +
+
+ + + + + + + + + + + +
void lib60870.CS101.Slave.SetInterrogationHandler (InterrogationHandler handler,
object parameter )
+
+ +

Sets a callback for interrogaton requests.

+
Parameters
+ + + +
handlerThe interrogation request handler callback function
parameteruser provided parameter that is passed to the callback
+
+
+ +
+
+ +

◆ SetReadHandler()

+ +
+
+ + + + + + + + + + + +
void lib60870.CS101.Slave.SetReadHandler (ReadHandler handler,
object parameter )
+
+ +

Sets a callback for read requests.

+
Parameters
+ + + +
handlerThe read request handler callback function
parameteruser provided parameter that is passed to the callback
+
+
+ +
+
+

Property Documentation

+ +

◆ FileTimeout

+ +
+
+ + + + + +
+ + + + +
virtual int lib60870.CS101.Slave.FileTimeout
+
+getset
+
+ +

Gets or sets the file service timeout.

+

The file service timeout in ms

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/Slave.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave.js new file mode 100644 index 0000000..cdb28c6 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave.js @@ -0,0 +1,11 @@ +var classlib60870_1_1_c_s101_1_1_slave = +[ + [ "GetAvailableFiles", "classlib60870_1_1_c_s101_1_1_slave.html#a5e85ada660492fecd182e654a75c8b42", null ], + [ "SetASDUHandler", "classlib60870_1_1_c_s101_1_1_slave.html#a5bde494544e568d0d9c25b43449eb8ee", null ], + [ "SetClockSynchronizationHandler", "classlib60870_1_1_c_s101_1_1_slave.html#a83b600bacb0829048c432686991db8a7", null ], + [ "SetCounterInterrogationHandler", "classlib60870_1_1_c_s101_1_1_slave.html#ad6e8b2878a13fea3b23b0b41b4da2983", null ], + [ "SetFileReadyHandler", "classlib60870_1_1_c_s101_1_1_slave.html#a3d25c95061010fa26c02cca5de0ae3cd", null ], + [ "SetInterrogationHandler", "classlib60870_1_1_c_s101_1_1_slave.html#af5871de4b26756b7b6f88e7acdc96e84", null ], + [ "SetReadHandler", "classlib60870_1_1_c_s101_1_1_slave.html#a7f0490bec09dbf3a8fb1e1e8e21503c0", null ], + [ "FileTimeout", "classlib60870_1_1_c_s101_1_1_slave.html#a063b9d1a19a2960a91afc69204cc11f7", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave__coll__graph.dot new file mode 100644 index 0000000..edb4439 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.Slave" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Slave",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=" filesAvailable",fontcolor="grey" ]; + Node2 [id="Node000002",label="lib60870.CS101.FilesAvailable",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_files_available.html",tooltip="Represents the available files in a file client or file server."]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave__inherit__graph.dot new file mode 100644 index 0000000..c344272 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.Slave" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.Slave",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="lib60870.CS101.CS101Slave",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_c_s101_slave.html",tooltip="CS 101 slave implementation (implements Slave interface)"]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="lib60870.CS104.Server",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s104_1_1_server.html",tooltip="This class represents a single IEC 60870-5 server (slave or controlled station). It is also the main ..."]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_start_event-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_start_event-members.html new file mode 100644 index 0000000..90b3bed --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_start_event-members.html @@ -0,0 +1,131 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.StartEvent Member List
+
+ +
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_start_event.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_start_event.html new file mode 100644 index 0000000..803bf54 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_start_event.html @@ -0,0 +1,326 @@ + + + + + + + +lib60870.NET: lib60870.CS101.StartEvent Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.StartEvent Class Reference
+
+
+ +

SPE - Start events of protection equipment according to IEC 60870-5-101:2003 7.2.6.11. + More...

+ + + + + + + + + + + + +

+Public Member Functions

StartEvent (byte encodedValue)
 
StartEvent (StartEvent orignal)
 
+override bool Equals (object obj)
 
+override int GetHashCode ()
 
+override string ToString ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

bool GS [get, set]
 General start of operation.
 
bool SL1 [get, set]
 Start of operation phase L1.
 
bool SL2 [get, set]
 Start of operation phase L2.
 
bool SL3 [get, set]
 Start of operation phase L3.
 
bool SIE [get, set]
 Start of operation IE (earth current)
 
bool SRD [get, set]
 Start of operation in reverse direction.
 
+bool RES1 [get, set]
 
+bool RES2 [get, set]
 
+byte EncodedValue [get, set]
 
+

Detailed Description

+

SPE - Start events of protection equipment according to IEC 60870-5-101:2003 7.2.6.11.

+

Property Documentation

+ +

◆ GS

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS101.StartEvent.GS
+
+getset
+
+ +

General start of operation.

+

true if started; otherwise, false.

+ +
+
+ +

◆ SIE

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS101.StartEvent.SIE
+
+getset
+
+ +

Start of operation IE (earth current)

+

true if started; otherwise, false.

+ +
+
+ +

◆ SL1

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS101.StartEvent.SL1
+
+getset
+
+ +

Start of operation phase L1.

+

true if started; otherwise, false.

+ +
+
+ +

◆ SL2

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS101.StartEvent.SL2
+
+getset
+
+ +

Start of operation phase L2.

+

true if started; otherwise, false.

+ +
+
+ +

◆ SL3

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS101.StartEvent.SL3
+
+getset
+
+ +

Start of operation phase L3.

+

true if started; otherwise, false.

+ +
+
+ +

◆ SRD

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS101.StartEvent.SRD
+
+getset
+
+ +

Start of operation in reverse direction.

+

true if started; otherwise, false.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/StartEvent.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_start_event.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_start_event.js new file mode 100644 index 0000000..98bbe63 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_start_event.js @@ -0,0 +1,9 @@ +var classlib60870_1_1_c_s101_1_1_start_event = +[ + [ "GS", "classlib60870_1_1_c_s101_1_1_start_event.html#a6cf3d354c2df01eb808748353f743b33", null ], + [ "SIE", "classlib60870_1_1_c_s101_1_1_start_event.html#a63a1bca793fe829680fc745c8b537b1d", null ], + [ "SL1", "classlib60870_1_1_c_s101_1_1_start_event.html#a53c47cb469138b00f2d266da9ee91338", null ], + [ "SL2", "classlib60870_1_1_c_s101_1_1_start_event.html#a43c8205b9e5b018a89c57658d2fc7443", null ], + [ "SL3", "classlib60870_1_1_c_s101_1_1_start_event.html#a686791b47a50ff83badd20384b00a604", null ], + [ "SRD", "classlib60870_1_1_c_s101_1_1_start_event.html#a058cea08569048ffde04da4dab3630d7", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_status_and_status_change_detection-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_status_and_status_change_detection-members.html new file mode 100644 index 0000000..9a53c78 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_status_and_status_change_detection-members.html @@ -0,0 +1,127 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.StatusAndStatusChangeDetection Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.StatusAndStatusChangeDetection, including all inherited members.

+ + + + + + + + + + + + +
CD(int i) (defined in lib60870.CS101.StatusAndStatusChangeDetection)lib60870.CS101.StatusAndStatusChangeDetection
CD(int i, bool value) (defined in lib60870.CS101.StatusAndStatusChangeDetection)lib60870.CS101.StatusAndStatusChangeDetection
CDn (defined in lib60870.CS101.StatusAndStatusChangeDetection)lib60870.CS101.StatusAndStatusChangeDetection
GetEncodedValue() (defined in lib60870.CS101.StatusAndStatusChangeDetection)lib60870.CS101.StatusAndStatusChangeDetection
ST(int i) (defined in lib60870.CS101.StatusAndStatusChangeDetection)lib60870.CS101.StatusAndStatusChangeDetection
ST(int i, bool value) (defined in lib60870.CS101.StatusAndStatusChangeDetection)lib60870.CS101.StatusAndStatusChangeDetection
StatusAndStatusChangeDetection() (defined in lib60870.CS101.StatusAndStatusChangeDetection)lib60870.CS101.StatusAndStatusChangeDetection
StatusAndStatusChangeDetection(StatusAndStatusChangeDetection original) (defined in lib60870.CS101.StatusAndStatusChangeDetection)lib60870.CS101.StatusAndStatusChangeDetection
StatusAndStatusChangeDetection(byte[] msg, int startIndex) (defined in lib60870.CS101.StatusAndStatusChangeDetection)lib60870.CS101.StatusAndStatusChangeDetection
STn (defined in lib60870.CS101.StatusAndStatusChangeDetection)lib60870.CS101.StatusAndStatusChangeDetection
ToString() (defined in lib60870.CS101.StatusAndStatusChangeDetection)lib60870.CS101.StatusAndStatusChangeDetection
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_status_and_status_change_detection.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_status_and_status_change_detection.html new file mode 100644 index 0000000..0f7cccb --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_status_and_status_change_detection.html @@ -0,0 +1,158 @@ + + + + + + + +lib60870.NET: lib60870.CS101.StatusAndStatusChangeDetection Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.StatusAndStatusChangeDetection Class Reference
+
+
+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

+bool ST (int i)
 
+void ST (int i, bool value)
 
+bool CD (int i)
 
+void CD (int i, bool value)
 
StatusAndStatusChangeDetection (StatusAndStatusChangeDetection original)
 
StatusAndStatusChangeDetection (byte[] msg, int startIndex)
 
+byte[] GetEncodedValue ()
 
+override string ToString ()
 
+ + + + + +

+Properties

+UInt16 STn [get, set]
 
+UInt16 CDn [get, set]
 
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/StatusAndStatusChangeDetection.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command-members.html new file mode 100644 index 0000000..b768edf --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command-members.html @@ -0,0 +1,133 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.StepCommand Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.StepCommand, including all inherited members.

+ + + + + + + + + + + + + + + + + + +
DoubleCommand(int ioa, int command, bool select, int quality) (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
DoubleCommand(DoubleCommand original) (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommandvirtual
GetEncodedSize() (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
OFF (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommandstatic
ON (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommandstatic
QU (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
Select (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
State (defined in lib60870.CS101.StepCommand)lib60870.CS101.StepCommand
StepCommand(int ioa, StepCommandValue command, bool select, int quality) (defined in lib60870.CS101.StepCommand)lib60870.CS101.StepCommand
StepCommand(StepCommand original) (defined in lib60870.CS101.StepCommand)lib60870.CS101.StepCommand
SupportsSequence (defined in lib60870.CS101.StepCommand)lib60870.CS101.StepCommand
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.StepCommand)lib60870.CS101.StepCommand
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command.html new file mode 100644 index 0000000..0fecf55 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command.html @@ -0,0 +1,215 @@ + + + + + + + +lib60870.NET: lib60870.CS101.StepCommand Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.StepCommand Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.StepCommand:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.StepCommand:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

StepCommand (int ioa, StepCommandValue command, bool select, int quality)
 
StepCommand (StepCommand original)
 
- Public Member Functions inherited from lib60870.CS101.DoubleCommand
+override int GetEncodedSize ()
 
DoubleCommand (int ioa, int command, bool select, int quality)
 
DoubleCommand (DoubleCommand original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+new StepCommandValue State [get]
 
- Properties inherited from lib60870.CS101.DoubleCommand
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+int QU [get]
 
+int State [get]
 
+bool Select [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + + + + + + +

+Additional Inherited Members

- Static Public Attributes inherited from lib60870.CS101.DoubleCommand
+static int OFF = 1
 
+static int ON = 2
 
- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SingleCommand.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command__coll__graph.dot new file mode 100644 index 0000000..2359da9 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command__coll__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.StepCommand" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.StepCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="DoubleCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_command.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command__inherit__graph.dot new file mode 100644 index 0000000..5b1d66e --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command__inherit__graph.dot @@ -0,0 +1,14 @@ +digraph "lib60870.CS101.StepCommand" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.StepCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="DoubleCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_command.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="lib60870.CS101.StepCommand\lWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a-members.html new file mode 100644 index 0000000..305b5e6 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a-members.html @@ -0,0 +1,136 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.StepCommandWithCP56Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.StepCommandWithCP56Time2a, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + +
DoubleCommand(int ioa, int command, bool select, int quality) (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
DoubleCommand(DoubleCommand original) (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.StepCommandWithCP56Time2a)lib60870.CS101.StepCommandWithCP56Time2avirtual
GetEncodedSize() (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
OFF (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommandstatic
ON (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommandstatic
QU (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
Select (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
State (defined in lib60870.CS101.StepCommand)lib60870.CS101.StepCommand
StepCommand(int ioa, StepCommandValue command, bool select, int quality) (defined in lib60870.CS101.StepCommand)lib60870.CS101.StepCommand
StepCommand(StepCommand original) (defined in lib60870.CS101.StepCommand)lib60870.CS101.StepCommand
StepCommandWithCP56Time2a(int ioa, StepCommandValue command, bool select, int quality, CP56Time2a timestamp) (defined in lib60870.CS101.StepCommandWithCP56Time2a)lib60870.CS101.StepCommandWithCP56Time2a
StepCommandWithCP56Time2a(StepCommandWithCP56Time2a original) (defined in lib60870.CS101.StepCommandWithCP56Time2a)lib60870.CS101.StepCommandWithCP56Time2a
SupportsSequence (defined in lib60870.CS101.StepCommandWithCP56Time2a)lib60870.CS101.StepCommandWithCP56Time2a
Timestamp (defined in lib60870.CS101.StepCommandWithCP56Time2a)lib60870.CS101.StepCommandWithCP56Time2a
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.StepCommandWithCP56Time2a)lib60870.CS101.StepCommandWithCP56Time2a
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a.html new file mode 100644 index 0000000..2598c63 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a.html @@ -0,0 +1,269 @@ + + + + + + + +lib60870.NET: lib60870.CS101.StepCommandWithCP56Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.StepCommandWithCP56Time2a Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.StepCommandWithCP56Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.StepCommandWithCP56Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

StepCommandWithCP56Time2a (int ioa, StepCommandValue command, bool select, int quality, CP56Time2a timestamp)
 
StepCommandWithCP56Time2a (StepCommandWithCP56Time2a original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.StepCommand
StepCommand (int ioa, StepCommandValue command, bool select, int quality)
 
StepCommand (StepCommand original)
 
- Public Member Functions inherited from lib60870.CS101.DoubleCommand
+override int GetEncodedSize ()
 
DoubleCommand (int ioa, int command, bool select, int quality)
 
DoubleCommand (DoubleCommand original)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+CP56Time2a Timestamp [get]
 
- Properties inherited from lib60870.CS101.StepCommand
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+new StepCommandValue State [get]
 
- Properties inherited from lib60870.CS101.DoubleCommand
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+int QU [get]
 
+int State [get]
 
+bool Select [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + + + + + + +

+Additional Inherited Members

- Static Public Attributes inherited from lib60870.CS101.DoubleCommand
+static int OFF = 1
 
+static int ON = 2
 
- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.StepCommandWithCP56Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.DoubleCommand.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SingleCommand.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a__coll__graph.dot new file mode 100644 index 0000000..6a772e5 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a__coll__graph.dot @@ -0,0 +1,14 @@ +digraph "lib60870.CS101.StepCommandWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.StepCommand\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="StepCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_command.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="DoubleCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_command.html",tooltip=" "]; + Node4 -> Node3 [id="edge3_Node000003_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a__inherit__graph.dot new file mode 100644 index 0000000..6a772e5 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a__inherit__graph.dot @@ -0,0 +1,14 @@ +digraph "lib60870.CS101.StepCommandWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.StepCommand\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="StepCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_command.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="DoubleCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_command.html",tooltip=" "]; + Node4 -> Node3 [id="edge3_Node000003_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information-members.html new file mode 100644 index 0000000..eb00186 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information-members.html @@ -0,0 +1,129 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.StepPositionInformation Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.StepPositionInformation, including all inherited members.

+ + + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.StepPositionInformation)lib60870.CS101.StepPositionInformationvirtual
GetEncodedSize() (defined in lib60870.CS101.StepPositionInformation)lib60870.CS101.StepPositionInformation
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Quality (defined in lib60870.CS101.StepPositionInformation)lib60870.CS101.StepPositionInformation
StepPositionInformation(int ioa, int value, bool isTransient, QualityDescriptor quality) (defined in lib60870.CS101.StepPositionInformation)lib60870.CS101.StepPositionInformation
StepPositionInformation(StepPositionInformation original) (defined in lib60870.CS101.StepPositionInformation)lib60870.CS101.StepPositionInformation
SupportsSequence (defined in lib60870.CS101.StepPositionInformation)lib60870.CS101.StepPositionInformation
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Transientlib60870.CS101.StepPositionInformation
Type (defined in lib60870.CS101.StepPositionInformation)lib60870.CS101.StepPositionInformation
Valuelib60870.CS101.StepPositionInformation
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information.html new file mode 100644 index 0000000..a542d56 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information.html @@ -0,0 +1,284 @@ + + + + + + + +lib60870.NET: lib60870.CS101.StepPositionInformation Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.StepPositionInformation Class Reference
+
+
+ +

Step position information object (M_ST_NA_1) + More...

+
+Inheritance diagram for lib60870.CS101.StepPositionInformation:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.StepPositionInformation:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
StepPositionInformation (int ioa, int value, bool isTransient, QualityDescriptor quality)
 
StepPositionInformation (StepPositionInformation original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
int Value [get, set]
 Step position (range -64 ... +63)
 
bool Transient [get, set]
 Gets a value indicating whether this lib60870.StepPositionInformation is in transient state.
 
+QualityDescriptor Quality [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Detailed Description

+

Step position information object (M_ST_NA_1)

+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.StepPositionInformation.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+

Property Documentation

+ +

◆ Transient

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS101.StepPositionInformation.Transient
+
+getset
+
+ +

Gets a value indicating whether this lib60870.StepPositionInformation is in transient state.

+

true if transient; otherwise, false.

+ +
+
+ +

◆ Value

+ +
+
+ + + + + +
+ + + + +
int lib60870.CS101.StepPositionInformation.Value
+
+getset
+
+ +

Step position (range -64 ... +63)

+

The value.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/StepPositionInformation.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information.js new file mode 100644 index 0000000..251b984 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information.js @@ -0,0 +1,5 @@ +var classlib60870_1_1_c_s101_1_1_step_position_information = +[ + [ "Transient", "classlib60870_1_1_c_s101_1_1_step_position_information.html#aba392b47665d183b882892dc252f285f", null ], + [ "Value", "classlib60870_1_1_c_s101_1_1_step_position_information.html#a00370bb63d3ec53ded04f4d8108990cf", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information__coll__graph.dot new file mode 100644 index 0000000..e6e57bc --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.StepPositionInformation" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.StepPosition\lInformation",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Step position information object (M_ST_NA_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information__inherit__graph.dot new file mode 100644 index 0000000..bf9a82b --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information__inherit__graph.dot @@ -0,0 +1,15 @@ +digraph "lib60870.CS101.StepPositionInformation" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="lib60870.CS101.StepPosition\lInformation",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Step position information object (M_ST_NA_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="lib60870.CS101.StepPosition\lWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a.html",tooltip="Step position information object with CP24Time2a time tag (M_ST_TA_1)"]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="lib60870.CS101.StepPosition\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a.html",tooltip="Step position information object with CP56Time2a time tag (M_ST_TB_1)"]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a-members.html new file mode 100644 index 0000000..c6004cf --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a-members.html @@ -0,0 +1,132 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.StepPositionWithCP24Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.StepPositionWithCP24Time2a, including all inherited members.

+ + + + + + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.StepPositionWithCP24Time2a)lib60870.CS101.StepPositionWithCP24Time2avirtual
GetEncodedSize() (defined in lib60870.CS101.StepPositionWithCP24Time2a)lib60870.CS101.StepPositionWithCP24Time2a
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Quality (defined in lib60870.CS101.StepPositionInformation)lib60870.CS101.StepPositionInformation
StepPositionInformation(int ioa, int value, bool isTransient, QualityDescriptor quality) (defined in lib60870.CS101.StepPositionInformation)lib60870.CS101.StepPositionInformation
StepPositionInformation(StepPositionInformation original) (defined in lib60870.CS101.StepPositionInformation)lib60870.CS101.StepPositionInformation
StepPositionWithCP24Time2a(int ioa, int value, bool isTransient, QualityDescriptor quality, CP24Time2a timestamp) (defined in lib60870.CS101.StepPositionWithCP24Time2a)lib60870.CS101.StepPositionWithCP24Time2a
StepPositionWithCP24Time2a(StepPositionWithCP24Time2a original) (defined in lib60870.CS101.StepPositionWithCP24Time2a)lib60870.CS101.StepPositionWithCP24Time2a
SupportsSequence (defined in lib60870.CS101.StepPositionWithCP24Time2a)lib60870.CS101.StepPositionWithCP24Time2a
Timestamp (defined in lib60870.CS101.StepPositionWithCP24Time2a)lib60870.CS101.StepPositionWithCP24Time2a
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Transientlib60870.CS101.StepPositionInformation
Type (defined in lib60870.CS101.StepPositionWithCP24Time2a)lib60870.CS101.StepPositionWithCP24Time2a
Valuelib60870.CS101.StepPositionInformation
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a.html new file mode 100644 index 0000000..283d366 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a.html @@ -0,0 +1,253 @@ + + + + + + + +lib60870.NET: lib60870.CS101.StepPositionWithCP24Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.StepPositionWithCP24Time2a Class Reference
+
+
+ +

Step position information object with CP24Time2a time tag (M_ST_TA_1) + More...

+
+Inheritance diagram for lib60870.CS101.StepPositionWithCP24Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.StepPositionWithCP24Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
StepPositionWithCP24Time2a (int ioa, int value, bool isTransient, QualityDescriptor quality, CP24Time2a timestamp)
 
StepPositionWithCP24Time2a (StepPositionWithCP24Time2a original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.StepPositionInformation
+override int GetEncodedSize ()
 
StepPositionInformation (int ioa, int value, bool isTransient, QualityDescriptor quality)
 
StepPositionInformation (StepPositionInformation original)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+CP24Time2a Timestamp [get, set]
 
- Properties inherited from lib60870.CS101.StepPositionInformation
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
int Value [get, set]
 Step position (range -64 ... +63)
 
bool Transient [get, set]
 Gets a value indicating whether this lib60870.StepPositionInformation is in transient state.
 
+QualityDescriptor Quality [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Detailed Description

+

Step position information object with CP24Time2a time tag (M_ST_TA_1)

+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.StepPositionWithCP24Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.StepPositionInformation.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/StepPositionInformation.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a__coll__graph.dot new file mode 100644 index 0000000..342e9e5 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a__coll__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.StepPositionWithCP24Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.StepPosition\lWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Step position information object with CP24Time2a time tag (M_ST_TA_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="StepPositionInformation",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_position_information.html",tooltip="Step position information object (M_ST_NA_1)"]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a__inherit__graph.dot new file mode 100644 index 0000000..342e9e5 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.StepPositionWithCP24Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.StepPosition\lWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Step position information object with CP24Time2a time tag (M_ST_TA_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="StepPositionInformation",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_position_information.html",tooltip="Step position information object (M_ST_NA_1)"]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a-members.html new file mode 100644 index 0000000..7dd92b8 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a-members.html @@ -0,0 +1,132 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.StepPositionWithCP56Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.StepPositionWithCP56Time2a, including all inherited members.

+ + + + + + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.StepPositionWithCP56Time2a)lib60870.CS101.StepPositionWithCP56Time2avirtual
GetEncodedSize() (defined in lib60870.CS101.StepPositionWithCP56Time2a)lib60870.CS101.StepPositionWithCP56Time2a
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Quality (defined in lib60870.CS101.StepPositionInformation)lib60870.CS101.StepPositionInformation
StepPositionInformation(int ioa, int value, bool isTransient, QualityDescriptor quality) (defined in lib60870.CS101.StepPositionInformation)lib60870.CS101.StepPositionInformation
StepPositionInformation(StepPositionInformation original) (defined in lib60870.CS101.StepPositionInformation)lib60870.CS101.StepPositionInformation
StepPositionWithCP56Time2a(int ioa, int value, bool isTransient, QualityDescriptor quality, CP56Time2a timestamp) (defined in lib60870.CS101.StepPositionWithCP56Time2a)lib60870.CS101.StepPositionWithCP56Time2a
StepPositionWithCP56Time2a(StepPositionWithCP56Time2a original) (defined in lib60870.CS101.StepPositionWithCP56Time2a)lib60870.CS101.StepPositionWithCP56Time2a
SupportsSequence (defined in lib60870.CS101.StepPositionWithCP56Time2a)lib60870.CS101.StepPositionWithCP56Time2a
Timestamp (defined in lib60870.CS101.StepPositionWithCP56Time2a)lib60870.CS101.StepPositionWithCP56Time2a
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Transientlib60870.CS101.StepPositionInformation
Type (defined in lib60870.CS101.StepPositionWithCP56Time2a)lib60870.CS101.StepPositionWithCP56Time2a
Valuelib60870.CS101.StepPositionInformation
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a.html new file mode 100644 index 0000000..f57e210 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a.html @@ -0,0 +1,253 @@ + + + + + + + +lib60870.NET: lib60870.CS101.StepPositionWithCP56Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.StepPositionWithCP56Time2a Class Reference
+
+
+ +

Step position information object with CP56Time2a time tag (M_ST_TB_1) + More...

+
+Inheritance diagram for lib60870.CS101.StepPositionWithCP56Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.StepPositionWithCP56Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
StepPositionWithCP56Time2a (int ioa, int value, bool isTransient, QualityDescriptor quality, CP56Time2a timestamp)
 
StepPositionWithCP56Time2a (StepPositionWithCP56Time2a original)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.StepPositionInformation
+override int GetEncodedSize ()
 
StepPositionInformation (int ioa, int value, bool isTransient, QualityDescriptor quality)
 
StepPositionInformation (StepPositionInformation original)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
+CP56Time2a Timestamp [get, set]
 
- Properties inherited from lib60870.CS101.StepPositionInformation
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
int Value [get, set]
 Step position (range -64 ... +63)
 
bool Transient [get, set]
 Gets a value indicating whether this lib60870.StepPositionInformation is in transient state.
 
+QualityDescriptor Quality [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Detailed Description

+

Step position information object with CP56Time2a time tag (M_ST_TB_1)

+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.StepPositionWithCP56Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.StepPositionInformation.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/StepPositionInformation.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a__coll__graph.dot new file mode 100644 index 0000000..766aa49 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a__coll__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.StepPositionWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.StepPosition\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Step position information object with CP56Time2a time tag (M_ST_TB_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="StepPositionInformation",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_position_information.html",tooltip="Step position information object (M_ST_NA_1)"]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a__inherit__graph.dot new file mode 100644 index 0000000..766aa49 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.StepPositionWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.StepPosition\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Step position information object with CP56Time2a time tag (M_ST_TB_1)"]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="StepPositionInformation",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_position_information.html",tooltip="Step position information object (M_ST_NA_1)"]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command-members.html new file mode 100644 index 0000000..0c386d0 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command-members.html @@ -0,0 +1,126 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.TestCommand Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.TestCommand, including all inherited members.

+ + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.TestCommand)lib60870.CS101.TestCommandvirtual
GetEncodedSize() (defined in lib60870.CS101.TestCommand)lib60870.CS101.TestCommand
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
SupportsSequence (defined in lib60870.CS101.TestCommand)lib60870.CS101.TestCommand
TestCommand() (defined in lib60870.CS101.TestCommand)lib60870.CS101.TestCommand
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
Type (defined in lib60870.CS101.TestCommand)lib60870.CS101.TestCommand
Valid (defined in lib60870.CS101.TestCommand)lib60870.CS101.TestCommand
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command.html new file mode 100644 index 0000000..f362225 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command.html @@ -0,0 +1,216 @@ + + + + + + + +lib60870.NET: lib60870.CS101.TestCommand Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.TestCommand Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.TestCommand:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.TestCommand:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + +

+Properties

+override TypeID Type [get]
 
+bool Valid [get]
 
+override bool SupportsSequence [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.TestCommand.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SystemInformationCommands.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command__coll__graph.dot new file mode 100644 index 0000000..9db1047 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.TestCommand" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.TestCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command__inherit__graph.dot new file mode 100644 index 0000000..9db1047 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.TestCommand" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.TestCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a-members.html new file mode 100644 index 0000000..46fcbe6 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a-members.html @@ -0,0 +1,128 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.TestCommandWithCP56Time2a Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.TestCommandWithCP56Time2a, including all inherited members.

+ + + + + + + + + + + + + +
Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.TestCommandWithCP56Time2a)lib60870.CS101.TestCommandWithCP56Time2avirtual
GetEncodedSize() (defined in lib60870.CS101.TestCommandWithCP56Time2a)lib60870.CS101.TestCommandWithCP56Time2a
InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
SupportsSequence (defined in lib60870.CS101.TestCommandWithCP56Time2a)lib60870.CS101.TestCommandWithCP56Time2a
TestCommandWithCP56Time2a() (defined in lib60870.CS101.TestCommandWithCP56Time2a)lib60870.CS101.TestCommandWithCP56Time2a
TestCommandWithCP56Time2a(ushort tsc, CP56Time2a time) (defined in lib60870.CS101.TestCommandWithCP56Time2a)lib60870.CS101.TestCommandWithCP56Time2a
Timelib60870.CS101.TestCommandWithCP56Time2a
ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
TSClib60870.CS101.TestCommandWithCP56Time2a
Type (defined in lib60870.CS101.TestCommandWithCP56Time2a)lib60870.CS101.TestCommandWithCP56Time2a
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html new file mode 100644 index 0000000..390e621 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html @@ -0,0 +1,224 @@ + + + + + + + +lib60870.NET: lib60870.CS101.TestCommandWithCP56Time2a Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.TestCommandWithCP56Time2a Class Reference
+
+
+
+Inheritance diagram for lib60870.CS101.TestCommandWithCP56Time2a:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.TestCommandWithCP56Time2a:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + +

+Public Member Functions

+override int GetEncodedSize ()
 
TestCommandWithCP56Time2a (ushort tsc, CP56Time2a time)
 
override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
 
- Public Member Functions inherited from lib60870.CS101.InformationObject
+override string ToString ()
 
InformationObject (int objectAddress)
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+ + + + + + + + + + + + + + + + + + + + +

+Properties

+CP56Time2a Time [get, set]
 Test time.
 
+ushort TSC [get, set]
 Test sequence number.
 
+override TypeID Type [get]
 
+override bool SupportsSequence [get]
 
- Properties inherited from lib60870.CS101.InformationObject
+int ObjectAddress [get, set]
 
bool SupportsSequence [get]
 Indicates if this information object type supports sequence of information objects encoding.
 
TypeID Type [get]
 The type ID (message type) of the information object type.
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from lib60870.CS101.InformationObject
InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 
+

Member Function Documentation

+ +

◆ Encode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
override void lib60870.CS101.TestCommandWithCP56Time2a.Encode (Frame frame,
ApplicationLayerParameters parameters,
bool isSequence )
+
+virtual
+
+ +

Reimplemented from lib60870.CS101.InformationObject.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SystemInformationCommands.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.js new file mode 100644 index 0000000..9b1a9eb --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.js @@ -0,0 +1,5 @@ +var classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a = +[ + [ "Time", "classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html#abcedc8616644f69702da1eb4dddb1860", null ], + [ "TSC", "classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html#ae5a610ff07bf26fbc6eb1e54efbd99df", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a__coll__graph.dot new file mode 100644 index 0000000..f9ed1d3 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.TestCommandWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.TestCommand\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a__inherit__graph.dot new file mode 100644 index 0000000..f9ed1d3 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.TestCommandWithCP56Time2a" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.TestCommand\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file-members.html new file mode 100644 index 0000000..4852a10 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file-members.html @@ -0,0 +1,126 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.TransparentFile Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.TransparentFile, including all inherited members.

+ + + + + + + + + + + +
AddSection(byte[] section) (defined in lib60870.CS101.TransparentFile)lib60870.CS101.TransparentFile
GetCA()lib60870.CS101.TransparentFile
GetFileDate() (defined in lib60870.CS101.TransparentFile)lib60870.CS101.TransparentFile
GetFileSize()lib60870.CS101.TransparentFile
GetIOA()lib60870.CS101.TransparentFile
GetNameOfFile()lib60870.CS101.TransparentFile
GetSectionSize(int sectionNumber)lib60870.CS101.TransparentFile
GetSegmentData(int sectionNumber, int offset, int segmentSize, byte[] segmentData)lib60870.CS101.TransparentFile
TransferComplete(bool success)lib60870.CS101.TransparentFilevirtual
TransparentFile(int ca, int ioa, NameOfFile nof) (defined in lib60870.CS101.TransparentFile)lib60870.CS101.TransparentFile
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file.html new file mode 100644 index 0000000..bcc3f77 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file.html @@ -0,0 +1,384 @@ + + + + + + + +lib60870.NET: lib60870.CS101.TransparentFile Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.TransparentFile Class Reference
+
+
+ +

Simple implementation of IFileProvider that can be used to provide transparent files. Derived classed should override the TransferComplete method. + More...

+
+Inheritance diagram for lib60870.CS101.TransparentFile:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS101.TransparentFile:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

TransparentFile (int ca, int ioa, NameOfFile nof)
 
+void AddSection (byte[] section)
 
int GetCA ()
 Returns the CA (Comman address) of the file.
 
int GetIOA ()
 Returns the IOA (information object address of the file)
 
NameOfFile GetNameOfFile ()
 Gets the type ("name") of the file.
 
DateTime GetFileDate ()
 
int GetFileSize ()
 Gets the size of the file in bytes.
 
int GetSectionSize (int sectionNumber)
 Gets the size of a section in byzes.
 
bool GetSegmentData (int sectionNumber, int offset, int segmentSize, byte[] segmentData)
 Gets the segment data.
 
virtual void TransferComplete (bool success)
 Indicates that the transfer is complete. When success equals true the file data can be deleted.
 
+

Detailed Description

+

Simple implementation of IFileProvider that can be used to provide transparent files. Derived classed should override the TransferComplete method.

+

Member Function Documentation

+ +

◆ GetCA()

+ +
+
+ + + + + + + +
int lib60870.CS101.TransparentFile.GetCA ()
+
+ +

Returns the CA (Comman address) of the file.

+
Returns
The CA
+ +

Implements lib60870.CS101.IFileProvider.

+ +
+
+ +

◆ GetFileDate()

+ +
+
+ + + + + + + +
DateTime lib60870.CS101.TransparentFile.GetFileDate ()
+
+ +

Implements lib60870.CS101.IFileProvider.

+ +
+
+ +

◆ GetFileSize()

+ +
+
+ + + + + + + +
int lib60870.CS101.TransparentFile.GetFileSize ()
+
+ +

Gets the size of the file in bytes.

+
Returns
The file size in bytes
+ +

Implements lib60870.CS101.IFileProvider.

+ +
+
+ +

◆ GetIOA()

+ +
+
+ + + + + + + +
int lib60870.CS101.TransparentFile.GetIOA ()
+
+ +

Returns the IOA (information object address of the file)

+
Returns
The IOA
+ +

Implements lib60870.CS101.IFileProvider.

+ +
+
+ +

◆ GetNameOfFile()

+ +
+
+ + + + + + + +
NameOfFile lib60870.CS101.TransparentFile.GetNameOfFile ()
+
+ +

Gets the type ("name") of the file.

+
Returns
The file type
+ +

Implements lib60870.CS101.IFileProvider.

+ +
+
+ +

◆ GetSectionSize()

+ +
+
+ + + + + + + +
int lib60870.CS101.TransparentFile.GetSectionSize (int sectionNumber)
+
+ +

Gets the size of a section in byzes.

+
Returns
The section size in bytes or -1 if the section does not exist
+
Parameters
+ + +
sectionNumberNumber of section (starting with 0)
+
+
+ +

Implements lib60870.CS101.IFileProvider.

+ +
+
+ +

◆ GetSegmentData()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
bool lib60870.CS101.TransparentFile.GetSegmentData (int sectionNumber,
int offset,
int segmentSize,
byte[] segmentData )
+
+ +

Gets the segment data.

+
Returns
true, if segment data was gotten, false otherwise.
+
Parameters
+ + + + + +
sectionNumberSection number.
offsetOffset.
segmentSizeSegment size.
segmentDataSegment data.
+
+
+ +

Implements lib60870.CS101.IFileProvider.

+ +
+
+ +

◆ TransferComplete()

+ +
+
+ + + + + +
+ + + + + + + +
virtual void lib60870.CS101.TransparentFile.TransferComplete (bool success)
+
+virtual
+
+ +

Indicates that the transfer is complete. When success equals true the file data can be deleted.

+
Parameters
+ + +
successIf set to true success.
+
+
+ +

Implements lib60870.CS101.IFileProvider.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/FileServices.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file.js new file mode 100644 index 0000000..86b0945 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file.js @@ -0,0 +1,10 @@ +var classlib60870_1_1_c_s101_1_1_transparent_file = +[ + [ "GetCA", "classlib60870_1_1_c_s101_1_1_transparent_file.html#a7f9d7004443cb8285f67ef8362544313", null ], + [ "GetFileSize", "classlib60870_1_1_c_s101_1_1_transparent_file.html#a7eaa164b404cd4f32302c7f044b774ab", null ], + [ "GetIOA", "classlib60870_1_1_c_s101_1_1_transparent_file.html#a955484a99eb32c9a8c37a76959add633", null ], + [ "GetNameOfFile", "classlib60870_1_1_c_s101_1_1_transparent_file.html#a069c64d7b35226bb030fc5e0dfcbd5bd", null ], + [ "GetSectionSize", "classlib60870_1_1_c_s101_1_1_transparent_file.html#a4a53ae94f1bc4d70ebac30d1af9ba596", null ], + [ "GetSegmentData", "classlib60870_1_1_c_s101_1_1_transparent_file.html#adefa9e2224dba9bb842481db21e94216", null ], + [ "TransferComplete", "classlib60870_1_1_c_s101_1_1_transparent_file.html#a533ea7bd0c80d98d5ea48748c14ee376", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file__coll__graph.dot new file mode 100644 index 0000000..65b98fc --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.TransparentFile" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.TransparentFile",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Simple implementation of IFileProvider that can be used to provide transparent files...."]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="IFileProvider",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$interfacelib60870_1_1_c_s101_1_1_i_file_provider.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file__inherit__graph.dot new file mode 100644 index 0000000..65b98fc --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.TransparentFile" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.TransparentFile",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Simple implementation of IFileProvider that can be used to provide transparent files...."]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="IFileProvider",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$interfacelib60870_1_1_c_s101_1_1_i_file_provider.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters-members.html new file mode 100644 index 0000000..cb62ebc --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters-members.html @@ -0,0 +1,124 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS104.APCIParameters Member List
+
+ +
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html new file mode 100644 index 0000000..f75d2b4 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html @@ -0,0 +1,257 @@ + + + + + + + +lib60870.NET: lib60870.CS104.APCIParameters Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS104.APCIParameters Class Reference
+
+
+ +

Parameters for the CS 104 APCI (Application Protocol Control Information) + More...

+ + + + +

+Public Member Functions

+APCIParameters Clone ()
 
+ + + + + + + + + + + + + + + + + + + +

+Properties

+int K [get, set]
 number of unconfirmed APDUs in I format (range: 1 .. 32767 (2^15 - 1) - sender will stop transmission after k unconfirmed I messages
 
+int W [get, set]
 number of unconfirmed APDUs in I format (range: 1 .. 32767 (2^15 - 1) - receiver will confirm latest after w messages
 
int T0 [get, set]
 Timeout for connection establishment (in s)
 
int T1 [get, set]
 timeout for transmitted APDUs in I/U format (in s) when timeout elapsed without confirmation the connection will be closed
 
int T2 [get, set]
 timeout to confirm messages (in s)
 
int T3 [get, set]
 time until sending test telegrams in case of idle connection
 
+

Detailed Description

+

Parameters for the CS 104 APCI (Application Protocol Control Information)

+

Property Documentation

+ +

◆ T0

+ +
+
+ + + + + +
+ + + + +
int lib60870.CS104.APCIParameters.T0
+
+getset
+
+ +

Timeout for connection establishment (in s)

+

timeout t0

+ +
+
+ +

◆ T1

+ +
+
+ + + + + +
+ + + + +
int lib60870.CS104.APCIParameters.T1
+
+getset
+
+ +

timeout for transmitted APDUs in I/U format (in s) when timeout elapsed without confirmation the connection will be closed

+

timeout t1

+ +
+
+ +

◆ T2

+ +
+
+ + + + + +
+ + + + +
int lib60870.CS104.APCIParameters.T2
+
+getset
+
+ +

timeout to confirm messages (in s)

+

timeout t2

+ +
+
+ +

◆ T3

+ +
+
+ + + + + +
+ + + + +
int lib60870.CS104.APCIParameters.T3
+
+getset
+
+ +

time until sending test telegrams in case of idle connection

+

timeout t3

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS104/APCIParameters.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.js new file mode 100644 index 0000000..619f371 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.js @@ -0,0 +1,9 @@ +var classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters = +[ + [ "K", "classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#a0e3fc557d1c66308e6e38383ec9a5287", null ], + [ "T0", "classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#adb7f9816ddbbf8925f5372308efed78f", null ], + [ "T1", "classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#a11f40dff24e0352eb76b4d456afe9e68", null ], + [ "T2", "classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#a0320d85982ccb2814e8829c51d4eb7b8", null ], + [ "T3", "classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#ad68a65bbce99a4a7533a8c1291a52e0a", null ], + [ "W", "classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#ac86b4a16c31fd7ad6af55e6c7b6f048b", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection-members.html new file mode 100644 index 0000000..a8d3559 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection-members.html @@ -0,0 +1,127 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS104.ClientConnection Member List
+
+ +
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection.html new file mode 100644 index 0000000..89a4b65 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection.html @@ -0,0 +1,405 @@ + + + + + + + +lib60870.NET: lib60870.CS104.ClientConnection Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS104.ClientConnection Class Reference
+
+
+ +

Represents a client (master) connection. + More...

+
+Inheritance diagram for lib60870.CS104.ClientConnection:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS104.ClientConnection:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

ApplicationLayerParameters GetApplicationLayerParameters ()
 Gets the connection parameters.
 
bool MasterConnection_hasUnconfirmedMessages ()
 Checks if there are any unconfirmed messages in the low-priority or high-priority queues.
 
void SendASDU (ASDU asdu)
 Send a response ASDU over this connection.
 
void SendACT_CON (ASDU asdu, bool negative)
 Sends an Activation Confirmation (ACT_CON) ASDU with the specified negative flag.
 
void SendACT_TERM (ASDU asdu)
 Sends an Activation Termination (ACT_TERM) ASDU with a negative flag set to false.
 
bool CertificateValidationCallback (object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors sslPolicyErrors)
 Callback method to handle certificate validation in SSL/TLS communication. It checks various conditions such as certificate chain validation, specific certificate validation, and SSL policy errors to determine whether the certificate is valid for the current connection.
 
+void Close ()
 
+void ASDUReadyToSend ()
 
+ + + + + + + + + +

+Properties

IPEndPoint RemoteEndpoint [get]
 Gets the remote endpoint (client IP address and TCP port)
 
bool IsActive [get, set]
 Gets or sets a value indicating whether this connection is active. The active connection is the only connection that is answering application layer requests and sends cyclic, and spontaneous messages.
 
+MasterConnectionState State [get, set]
 
+

Detailed Description

+

Represents a client (master) connection.

+

Member Function Documentation

+ +

◆ CertificateValidationCallback()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
bool lib60870.CS104.ClientConnection.CertificateValidationCallback (object sender,
X509Certificate cert,
X509Chain chain,
SslPolicyErrors sslPolicyErrors )
+
+ +

Callback method to handle certificate validation in SSL/TLS communication. It checks various conditions such as certificate chain validation, specific certificate validation, and SSL policy errors to determine whether the certificate is valid for the current connection.

+
Parameters
+ + + + + +
senderThe source of the event. This is typically the SSL/TLS connection.
certThe certificate being validated.
chainThe certificate chain associated with the certificate.
sslPolicyErrorsThe SSL policy errors that occurred during certificate validation.
+
+
+
Returns
Returns true if the certificate is considered valid based on the specified criteria; otherwise, returns false.
+ +
+
+ +

◆ GetApplicationLayerParameters()

+ +
+
+ + + + + + + +
ApplicationLayerParameters lib60870.CS104.ClientConnection.GetApplicationLayerParameters ()
+
+ +

Gets the connection parameters.

+
Returns
The connection parameters used by the server.
+ +

Implements lib60870.CS101.IMasterConnection.

+ +
+
+ +

◆ MasterConnection_hasUnconfirmedMessages()

+ +
+
+ + + + + + + +
bool lib60870.CS104.ClientConnection.MasterConnection_hasUnconfirmedMessages ()
+
+ +

Checks if there are any unconfirmed messages in the low-priority or high-priority queues.

+
Returns
true if there are unconfirmed messages in either the low-priority or high-priority queues; false if no unconfirmed messages are found.
+ +
+
+ +

◆ SendACT_CON()

+ +
+
+ + + + + + + + + + + +
void lib60870.CS104.ClientConnection.SendACT_CON (ASDU asdu,
bool negative )
+
+ +

Sends an Activation Confirmation (ACT_CON) ASDU with the specified negative flag.

+
Parameters
+ + + +
asduThe ASDU to be sent as an Activation Confirmation (ACT_CON).
negativeA boolean flag indicating whether the Activation Confirmation is negative.
+
+
+ +

Implements lib60870.CS101.IMasterConnection.

+ +
+
+ +

◆ SendACT_TERM()

+ +
+
+ + + + + + + +
void lib60870.CS104.ClientConnection.SendACT_TERM (ASDU asdu)
+
+ +

Sends an Activation Termination (ACT_TERM) ASDU with a negative flag set to false.

+
Parameters
+ + +
asduThe ASDU to be sent as an Activation Termination (ACT_TERM).
+
+
+ +

Implements lib60870.CS101.IMasterConnection.

+ +
+
+ +

◆ SendASDU()

+ +
+
+ + + + + + + +
void lib60870.CS104.ClientConnection.SendASDU (ASDU asdu)
+
+ +

Send a response ASDU over this connection.

+
Exceptions
+ + +
ConnectionExceptionThrows an exception if the connection is no longer active (e.g. because it has been closed by the other side).
+
+
+
Parameters
+ + +
asduThe ASDU to send
+
+
+ +

Implements lib60870.CS101.IMasterConnection.

+ +
+
+

Property Documentation

+ +

◆ IsActive

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS104.ClientConnection.IsActive
+
+getset
+
+ +

Gets or sets a value indicating whether this connection is active. The active connection is the only connection that is answering application layer requests and sends cyclic, and spontaneous messages.

+

true if this instance is active; otherwise, false.

+ +
+
+ +

◆ RemoteEndpoint

+ +
+
+ + + + + +
+ + + + +
IPEndPoint lib60870.CS104.ClientConnection.RemoteEndpoint
+
+get
+
+ +

Gets the remote endpoint (client IP address and TCP port)

+

The remote IP endpoint

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS104/ClientConnection.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection.js new file mode 100644 index 0000000..b710ddc --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection.js @@ -0,0 +1,11 @@ +var classlib60870_1_1_c_s104_1_1_client_connection = +[ + [ "CertificateValidationCallback", "classlib60870_1_1_c_s104_1_1_client_connection.html#aa936b912c162118b6a9834030f924491", null ], + [ "GetApplicationLayerParameters", "classlib60870_1_1_c_s104_1_1_client_connection.html#a92d801095c3038a96b26093e7d38628a", null ], + [ "MasterConnection_hasUnconfirmedMessages", "classlib60870_1_1_c_s104_1_1_client_connection.html#a16acd0a66071c7d1f4d111fafd7a2421", null ], + [ "SendACT_CON", "classlib60870_1_1_c_s104_1_1_client_connection.html#a677c04ff5484b981e8464af8d9f86540", null ], + [ "SendACT_TERM", "classlib60870_1_1_c_s104_1_1_client_connection.html#aa5d85670797c2046051a4a10071fe611", null ], + [ "SendASDU", "classlib60870_1_1_c_s104_1_1_client_connection.html#a92362655a693e3081af86a00a24955ef", null ], + [ "IsActive", "classlib60870_1_1_c_s104_1_1_client_connection.html#afa8806c545bf905a3548afa9732de38b", null ], + [ "RemoteEndpoint", "classlib60870_1_1_c_s104_1_1_client_connection.html#ad59a914894aa422d1bff8b601cc100f3", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection__coll__graph.dot new file mode 100644 index 0000000..4ef248a --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS104.ClientConnection" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS104.ClientConnection",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Represents a client (master) connection."]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="IMasterConnection",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$interfacelib60870_1_1_c_s101_1_1_i_master_connection.html",tooltip="Provides functions to be used in Slave callbacks to send data back to the master."]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection__inherit__graph.dot new file mode 100644 index 0000000..4ef248a --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS104.ClientConnection" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS104.ClientConnection",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Represents a client (master) connection."]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="IMasterConnection",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$interfacelib60870_1_1_c_s101_1_1_i_master_connection.html",tooltip="Provides functions to be used in Slave callbacks to send data back to the master."]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection-members.html new file mode 100644 index 0000000..5bd1305 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection-members.html @@ -0,0 +1,169 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS104.Connection Member List
+
+
+ +

This is the complete list of members for lib60870.CS104.Connection, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Autostartlib60870.CS104.Connection
Cancel() (defined in lib60870.CS104.Connection)lib60870.CS104.Connection
CheckSequenceNumbers (defined in lib60870.CS104.Connection)lib60870.CS104.Connectionprotected
Close() (defined in lib60870.CS104.Connection)lib60870.CS104.Connection
Connect()lib60870.CS104.Connection
ConnectAsync()lib60870.CS104.Connection
Connection(string hostname, int tcpPort=2404)lib60870.CS104.Connection
Connection(string hostname, APCIParameters apciParameters, ApplicationLayerParameters alParameters)lib60870.CS104.Connection
Connection(string hostname, int tcpPort, APCIParameters apciParameters, ApplicationLayerParameters alParameters)lib60870.CS104.Connection
Connection(string hostname, TlsSecurityInformation tlsInfo, int tcpPort=19998)lib60870.CS104.Connection
Connection(string hostname, int tcpPort, APCIParameters apciParameters, ApplicationLayerParameters alParameters, TlsSecurityInformation tlsInfo)lib60870.CS104.Connection
ConnectTimeoutlib60870.CS104.Connection
DebugOutput (defined in lib60870.CS101.Master)lib60870.CS101.Master
debugOutput (defined in lib60870.CS101.Master)lib60870.CS101.Masterprotected
GetApplicationLayerParameters() (defined in lib60870.CS104.Connection)lib60870.CS104.Connection
GetDirectory(int ca)lib60870.CS104.Connection
GetFile(int ca, int ioa, NameOfFile nof, IFileReceiver receiver)lib60870.CS104.Connection
GetFile(int ca, int ioa, NameOfFile nof, IFileReceiver receiver, int timeout)lib60870.CS104.Connection
GetStatistics()lib60870.CS104.Connection
IsRunninglib60870.CS104.Connection
IsTransmitBufferFull()lib60870.CS104.Connection
LocalCertificateSelectionCallback(object sender, string targetHost, X509CertificateCollection localCertificates, X509Certificate remoteCertificate, string[] acceptableIssuers)lib60870.CS104.Connection
LocalIpAddresslib60870.CS104.Connection
LocalTcpPortlib60870.CS104.Connection
Parameters (defined in lib60870.CS104.Connection)lib60870.CS104.Connection
ReceiveSequenceNumberlib60870.CS104.Connection
ReceiveTimeoutlib60870.CS104.Connection
SendASDU(ASDU asdu)lib60870.CS104.Connection
SendClockSyncCommand(int ca, CP56Time2a time)lib60870.CS104.Connection
SendControlCommand(CauseOfTransmission cot, int ca, InformationObject sc)lib60870.CS104.Connection
SendCounterInterrogationCommand(CauseOfTransmission cot, int ca, byte qcc)lib60870.CS104.Connection
SendDelayAcquisitionCommand(CauseOfTransmission cot, int ca, CP16Time2a delay)lib60870.CS104.Connection
SendFile(int ca, int ioa, NameOfFile nof, IFileProvider fileProvider)lib60870.CS104.Connection
SendInterrogationCommand(CauseOfTransmission cot, int ca, byte qoi)lib60870.CS104.Connection
SendReadCommand(int ca, int ioa)lib60870.CS104.Connection
SendResetProcessCommand(CauseOfTransmission cot, int ca, byte qrp)lib60870.CS104.Connection
SendSequenceNumberlib60870.CS104.Connection
SendStartDT()lib60870.CS104.Connection
SendStartDT_CON()lib60870.CS104.Connectionprotected
SendStopDT()lib60870.CS104.Connection
SendStopDT_CON()lib60870.CS104.Connectionprotected
SendTestCommand(int ca)lib60870.CS104.Connection
SendTestCommandWithCP56Time2a(int ca, ushort tsc, CP56Time2a time)lib60870.CS104.Connection
SendTestFR_ACT()lib60870.CS104.Connectionprotected
SendTestFR_CON()lib60870.CS104.Connectionprotected
SetASDUReceivedHandler(ASDUReceivedHandler handler, object parameter)lib60870.CS104.Connection
SetConnectionHandler(ConnectionHandler handler, object parameter)lib60870.CS104.Connection
SetConnectTimeout(int millies)lib60870.CS104.Connection
SetReceivedRawMessageHandler(RawMessageHandler handler, object parameter)lib60870.CS104.Connection
SetSentRawMessageHandler(RawMessageHandler handler, object parameter)lib60870.CS104.Connection
SetTlsSecurity(TlsSecurityInformation securityInfo)lib60870.CS104.Connection
tcpPort (defined in lib60870.CS104.Connection)lib60870.CS104.Connectionprotected
UseSendMessageQueuelib60870.CS104.Connection
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection.html new file mode 100644 index 0000000..c5a1942 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection.html @@ -0,0 +1,1539 @@ + + + + + + + +lib60870.NET: lib60870.CS104.Connection Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS104.Connection Class Reference
+
+
+ +

A single connection to a CS 104 (IEC 60870-5-104) server. Implements the Master interface. + More...

+
+Inheritance diagram for lib60870.CS104.Connection:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS104.Connection:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 Connection (string hostname, int tcpPort=2404)
 Initializes a new instance of the lib60870.CS104.Connection class.
 
 Connection (string hostname, APCIParameters apciParameters, ApplicationLayerParameters alParameters)
 Initializes a new instance of the lib60870.CS104.Connection class.
 
 Connection (string hostname, int tcpPort, APCIParameters apciParameters, ApplicationLayerParameters alParameters)
 Initializes a new instance of the lib60870.CS104.Connection class.
 
 Connection (string hostname, TlsSecurityInformation tlsInfo, int tcpPort=19998)
 Initializes a new instance of the lib60870.CS104.Connection class using TLS.
 
 Connection (string hostname, int tcpPort, APCIParameters apciParameters, ApplicationLayerParameters alParameters, TlsSecurityInformation tlsInfo)
 Initializes a new instance of the lib60870.CS104.Connection class using TLS.
 
void SetTlsSecurity (TlsSecurityInformation securityInfo)
 Set the security parameters for TLS.
 
ConnectionStatistics GetStatistics ()
 Gets the conenction statistics.
 
void SetConnectTimeout (int millies)
 Sets the connect timeout.
 
override void SendInterrogationCommand (CauseOfTransmission cot, int ca, byte qoi)
 Sends the interrogation command.
 
override void SendCounterInterrogationCommand (CauseOfTransmission cot, int ca, byte qcc)
 Sends the counter interrogation command (C_CI_NA_1 typeID: 101)
 
override void SendReadCommand (int ca, int ioa)
 Sends a read command (C_RD_NA_1 typeID: 102).
 
override void SendClockSyncCommand (int ca, CP56Time2a time)
 Sends a clock synchronization command (C_CS_NA_1 typeID: 103).
 
override void SendTestCommand (int ca)
 Sends a test command (C_TS_NA_1 typeID: 104).
 
override void SendTestCommandWithCP56Time2a (int ca, ushort tsc, CP56Time2a time)
 Sends a test command with CP56Time2a time (C_TS_TA_1 typeID: 107).
 
override void SendResetProcessCommand (CauseOfTransmission cot, int ca, byte qrp)
 Sends a reset process command (C_RP_NA_1 typeID: 105).
 
override void SendDelayAcquisitionCommand (CauseOfTransmission cot, int ca, CP16Time2a delay)
 Sends a delay acquisition command (C_CD_NA_1 typeID: 106).
 
override void SendControlCommand (CauseOfTransmission cot, int ca, InformationObject sc)
 Sends the control command.
 
override void SendASDU (ASDU asdu)
 Sends an arbitrary ASDU to the connected slave.
 
+override ApplicationLayerParameters GetApplicationLayerParameters ()
 
+void SendStartDT ()
 Start data transmission on this connection.
 
+void SendStopDT ()
 Stop data transmission on this connection.
 
void Connect ()
 Connect this instance.
 
void ConnectAsync ()
 Connects to the server (outstation). This is a non-blocking call. Before using the connection you have to check if the connection is already connected and running.
 
X509Certificate LocalCertificateSelectionCallback (object sender, string targetHost, X509CertificateCollection localCertificates, X509Certificate remoteCertificate, string[] acceptableIssuers)
 Callback function for selecting a local certificate during an SSL/TLS handshake.
 
+void Cancel ()
 
+void Close ()
 
void SetASDUReceivedHandler (ASDUReceivedHandler handler, object parameter)
 Set the ASDUReceivedHandler. This handler is invoked whenever a new ASDU is received.
 
void SetConnectionHandler (ConnectionHandler handler, object parameter)
 Sets the connection handler. The connection handler is called when the connection is established or closed.
 
override void SetReceivedRawMessageHandler (RawMessageHandler handler, object parameter)
 Sets the raw message handler. This is a callback to intercept raw messages received.
 
override void SetSentRawMessageHandler (RawMessageHandler handler, object parameter)
 Sets the sent message handler. This is a callback to intercept the sent raw messages.
 
bool IsTransmitBufferFull ()
 Determines whether the transmit (send) buffer is full. If true the next send command will throw a ConnectionException.
 
override void GetFile (int ca, int ioa, NameOfFile nof, IFileReceiver receiver)
 Initiates a request to retrieve a file from the remote system.
 
void GetFile (int ca, int ioa, NameOfFile nof, IFileReceiver receiver, int timeout)
 Initiates a request to retrieve a file from the remote system with a specified timeout.
 
override void SendFile (int ca, int ioa, NameOfFile nof, IFileProvider fileProvider)
 Initiates a request to send a file to the remote system.
 
void GetDirectory (int ca)
 Requests the directory listing from the remote system.
 
- Public Member Functions inherited from lib60870.CS101.Master
void SendInterrogationCommand (CauseOfTransmission cot, int ca, byte qoi)
 Sends the interrogation command.
 
void SendCounterInterrogationCommand (CauseOfTransmission cot, int ca, byte qcc)
 Sends the counter interrogation command (C_CI_NA_1 typeID: 101)
 
void SendReadCommand (int ca, int ioa)
 Sends a read command (C_RD_NA_1 typeID: 102).
 
void SendClockSyncCommand (int ca, CP56Time2a time)
 Sends a clock synchronization command (C_CS_NA_1 typeID: 103).
 
void SendTestCommand (int ca)
 Sends a test command (C_TS_NA_1 typeID: 104).
 
void SendTestCommandWithCP56Time2a (int ca, ushort tsc, CP56Time2a time)
 Sends a test command with CP56Time2a time (C_TS_TA_1 typeID: 107).
 
void SendResetProcessCommand (CauseOfTransmission cot, int ca, byte qrp)
 Sends a reset process command (C_RP_NA_1 typeID: 105).
 
void SendDelayAcquisitionCommand (CauseOfTransmission cot, int ca, CP16Time2a delay)
 Sends a delay acquisition command (C_CD_NA_1 typeID: 106).
 
void SendControlCommand (CauseOfTransmission cot, int ca, InformationObject sc)
 Sends the control command.
 
void SendASDU (ASDU asdu)
 Sends an arbitrary ASDU to the connected slave.
 
void GetFile (int ca, int ioa, NameOfFile nof, IFileReceiver receiver)
 Read the file from slave (upload file)
 
void SendFile (int ca, int ioa, NameOfFile nof, IFileProvider fileProvider)
 Sends the file to slave (download file)
 
ApplicationLayerParameters GetApplicationLayerParameters ()
 Get the application layer parameters used by this master instance.
 
void SetReceivedRawMessageHandler (RawMessageHandler handler, object parameter)
 Sets the raw message handler for received messages.
 
void SetSentRawMessageHandler (RawMessageHandler handler, object parameter)
 Sets the sent message handler for sent messages.
 
+ + + + + + + + + + + + + +

+Protected Member Functions

+void SendStartDT_CON ()
 Start application layer data transmission on this connection.
 
+void SendStopDT_CON ()
 Sends a STOPDT_CON message to the remote server if the connection is active.
 
+void SendTestFR_ACT ()
 Sends a TESTFR_ACT message to the remote server if the connection is active.
 
+void SendTestFR_CON ()
 Sends a TESTFR_CON message to the remote server if the connection is active.
 
+ + + + + + +

+Protected Attributes

+int tcpPort
 
- Protected Attributes inherited from lib60870.CS101.Master
+bool debugOutput
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

+string LocalIpAddress [get, set]
 Set the local IP address for the local connection endpoint.
 
+int LocalTcpPort [get, set]
 Set the TCP (source) port for the local connection endpoint (0 to automatically select a source port)
 
bool UseSendMessageQueue [get, set]
 Gets or sets a value indicating whether this lib60870.Connection use send message queue.
 
int SendSequenceNumber [get, set]
 Gets or sets the send sequence number N(S). WARNING: For test purposes only! Do net set in real application!
 
+bool CheckSequenceNumbers [get, set]
 
int ReceiveSequenceNumber [get, set]
 Gets or sets the receive sequence number N(R). WARNING: For test purposes only! Do net set in real application!
 
bool Autostart [get, set]
 Gets or sets a value indicating whether this lib60870.Connection is automatically sends a STARTDT_ACT message on startup.
 
+ApplicationLayerParameters Parameters [get]
 
+int ConnectTimeout [get, set]
 Timeout for connection establishment in milliseconds (ms)
 
+int ReceiveTimeout [get, set]
 Maximum allowed time for receiving a single message.
 
bool IsRunning [get]
 Gets a value indicating whether this T:lib60870.CS104.Connection is running(connected).
 
- Properties inherited from lib60870.CS101.Master
+bool DebugOutput [get, set]
 
+

Detailed Description

+

A single connection to a CS 104 (IEC 60870-5-104) server. Implements the Master interface.

+

Constructor & Destructor Documentation

+ +

◆ Connection() [1/5]

+ +
+
+ + + + + + + + + + + +
lib60870.CS104.Connection.Connection (string hostname,
int tcpPort = 2404 )
+
+ +

Initializes a new instance of the lib60870.CS104.Connection class.

+
Parameters
+ + + +
hostnamehostname of IP address of the CS 104 server
tcpPortTCP port of the CS 104 server
+
+
+ +
+
+ +

◆ Connection() [2/5]

+ +
+
+ + + + + + + + + + + + + + + + +
lib60870.CS104.Connection.Connection (string hostname,
APCIParameters apciParameters,
ApplicationLayerParameters alParameters )
+
+ +

Initializes a new instance of the lib60870.CS104.Connection class.

+
Parameters
+ + + + +
hostnamehostname of IP address of the CS 104 server
apciParametersAPCI parameters.
alParametersapplication layer parameters.
+
+
+ +
+
+ +

◆ Connection() [3/5]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
lib60870.CS104.Connection.Connection (string hostname,
int tcpPort,
APCIParameters apciParameters,
ApplicationLayerParameters alParameters )
+
+ +

Initializes a new instance of the lib60870.CS104.Connection class.

+
Parameters
+ + + + + +
hostnamehostname of IP address of the CS 104 server
tcpPortTCP port of the CS 104 server
apciParametersAPCI parameters.
alParametersapplication layer parameters.
+
+
+ +
+
+ +

◆ Connection() [4/5]

+ +
+
+ + + + + + + + + + + + + + + + +
lib60870.CS104.Connection.Connection (string hostname,
TlsSecurityInformation tlsInfo,
int tcpPort = 19998 )
+
+ +

Initializes a new instance of the lib60870.CS104.Connection class using TLS.

+
Parameters
+ + + + +
hostnamehostname of IP address of the CS 104 server
tlsInfoTLS setup
tcpPortTCP port of the CS 104 server
+
+
+ +
+
+ +

◆ Connection() [5/5]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
lib60870.CS104.Connection.Connection (string hostname,
int tcpPort,
APCIParameters apciParameters,
ApplicationLayerParameters alParameters,
TlsSecurityInformation tlsInfo )
+
+ +

Initializes a new instance of the lib60870.CS104.Connection class using TLS.

+
Parameters
+ + + + + + +
hostnamehostname of IP address of the CS 104 server
tcpPortTCP port of the CS 104 server
apciParametersAPCI parameters.
alParametersapplication layer parameters.
tlsInfoTLS setup
+
+
+ +
+
+

Member Function Documentation

+ +

◆ Connect()

+ +
+
+ + + + + + + +
void lib60870.CS104.Connection.Connect ()
+
+ +

Connect this instance.

+

The function will throw a SocketException if the connection attempt is rejected or timed out.

Exceptions
+ + +
ConnectionExceptiondescription
+
+
+ +
+
+ +

◆ ConnectAsync()

+ +
+
+ + + + + + + +
void lib60870.CS104.Connection.ConnectAsync ()
+
+ +

Connects to the server (outstation). This is a non-blocking call. Before using the connection you have to check if the connection is already connected and running.

+
Exceptions
+ + +
ConnectionExceptiondescription
+
+
+ +
+
+ +

◆ GetDirectory()

+ +
+
+ + + + + + + +
void lib60870.CS104.Connection.GetDirectory (int ca)
+
+ +

Requests the directory listing from the remote system.

+
Parameters
+ + +
caThe communication address of the remote system.
+
+
+ +
+
+ +

◆ GetFile() [1/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
override void lib60870.CS104.Connection.GetFile (int ca,
int ioa,
NameOfFile nof,
IFileReceiver receiver )
+
+ +

Initiates a request to retrieve a file from the remote system.

+
Parameters
+ + + + + +
caThe communication address of the remote system.
ioaThe information object address for the file.
nofThe name of the file to be retrieved.
receiverThe receiver implementation to handle the file data.
+
+
+ +
+
+ +

◆ GetFile() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
void lib60870.CS104.Connection.GetFile (int ca,
int ioa,
NameOfFile nof,
IFileReceiver receiver,
int timeout )
+
+ +

Initiates a request to retrieve a file from the remote system with a specified timeout.

+
Parameters
+ + + + + + +
caThe communication address of the remote system.
ioaThe information object address for the file.
nofThe name of the file to be retrieved.
receiverThe receiver implementation to handle the file data.
timeoutThe timeout duration in milliseconds for the file request.
+
+
+ +
+
+ +

◆ GetStatistics()

+ +
+
+ + + + + + + +
ConnectionStatistics lib60870.CS104.Connection.GetStatistics ()
+
+ +

Gets the conenction statistics.

+
Returns
The connection statistics.
+ +
+
+ +

◆ IsTransmitBufferFull()

+ +
+
+ + + + + + + +
bool lib60870.CS104.Connection.IsTransmitBufferFull ()
+
+ +

Determines whether the transmit (send) buffer is full. If true the next send command will throw a ConnectionException.

+
Returns
true if this instance is send buffer full; otherwise, false.
+ +
+
+ +

◆ LocalCertificateSelectionCallback()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
X509Certificate lib60870.CS104.Connection.LocalCertificateSelectionCallback (object sender,
string targetHost,
X509CertificateCollection localCertificates,
X509Certificate remoteCertificate,
string[] acceptableIssuers )
+
+ +

Callback function for selecting a local certificate during an SSL/TLS handshake.

+
Parameters
+ + + + + + +
senderThe source of the certificate selection request (typically the client in an SSL/TLS connection).
targetHostThe name of the server being connected to (host name or IP address).
localCertificatesThe collection of local certificates available for selection.
remoteCertificateThe remote server's certificate being validated (not used in this implementation).
acceptableIssuersA list of acceptable issuers for the certificate (not used in this implementation).
+
+
+
Returns
The local certificate to be used for the SSL/TLS connection. In this case, the first certificate in the collection.
+ +
+
+ +

◆ SendASDU()

+ +
+
+ + + + + + + +
override void lib60870.CS104.Connection.SendASDU (ASDU asdu)
+
+ +

Sends an arbitrary ASDU to the connected slave.

+
Parameters
+ + +
asduThe ASDU to send
+
+
+ +
+
+ +

◆ SendClockSyncCommand()

+ +
+
+ + + + + + + + + + + +
override void lib60870.CS104.Connection.SendClockSyncCommand (int ca,
CP56Time2a time )
+
+ +

Sends a clock synchronization command (C_CS_NA_1 typeID: 103).

+
Parameters
+ + + +
caCommon address
timethe new time to set
+
+
+
Exceptions
+ + +
ConnectionExceptiondescription
+
+
+ +
+
+ +

◆ SendControlCommand()

+ +
+
+ + + + + + + + + + + + + + + + +
override void lib60870.CS104.Connection.SendControlCommand (CauseOfTransmission cot,
int ca,
InformationObject sc )
+
+ +

Sends the control command.

+

The type ID has to match the type of the InformationObject!

+

C_SC_NA_1 -> SingleCommand C_DC_NA_1 -> DoubleCommand C_RC_NA_1 -> StepCommand C_SC_TA_1 -> SingleCommandWithCP56Time2a C_SE_NA_1 -> SetpointCommandNormalized C_SE_NB_1 -> SetpointCommandScaled C_SE_NC_1 -> SetpointCommandShort C_BO_NA_1 -> Bitstring32Command

+
Parameters
+ + + + +
cotCause of transmission (use ACTIVATION to start a control sequence)
caCommon address
scInformation object of the command
+
+
+
Exceptions
+ + +
ConnectionExceptiondescription
+
+
+ +
+
+ +

◆ SendCounterInterrogationCommand()

+ +
+
+ + + + + + + + + + + + + + + + +
override void lib60870.CS104.Connection.SendCounterInterrogationCommand (CauseOfTransmission cot,
int ca,
byte qcc )
+
+ +

Sends the counter interrogation command (C_CI_NA_1 typeID: 101)

+
Parameters
+ + + + +
cotCause of transmission
caCommon address
qccQualifier of counter interrogation command
+
+
+
Exceptions
+ + +
ConnectionExceptiondescription
+
+
+ +
+
+ +

◆ SendDelayAcquisitionCommand()

+ +
+
+ + + + + + + + + + + + + + + + +
override void lib60870.CS104.Connection.SendDelayAcquisitionCommand (CauseOfTransmission cot,
int ca,
CP16Time2a delay )
+
+ +

Sends a delay acquisition command (C_CD_NA_1 typeID: 106).

+
Parameters
+ + + + +
cotCause of transmission
caCommon address
delaydelay for acquisition
+
+
+
Exceptions
+ + +
ConnectionExceptiondescription
+
+
+ +
+
+ +

◆ SendFile()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
override void lib60870.CS104.Connection.SendFile (int ca,
int ioa,
NameOfFile nof,
IFileProvider fileProvider )
+
+ +

Initiates a request to send a file to the remote system.

+
Parameters
+ + + + + +
caThe communication address of the remote system.
ioaThe information object address for the file.
nofThe name of the file to be sent.
fileProviderThe file provider interface that supplies the file data to be sent.
+
+
+ +
+
+ +

◆ SendInterrogationCommand()

+ +
+
+ + + + + + + + + + + + + + + + +
override void lib60870.CS104.Connection.SendInterrogationCommand (CauseOfTransmission cot,
int ca,
byte qoi )
+
+ +

Sends the interrogation command.

+
Parameters
+ + + + +
cotCause of transmission
caCommon address
qoiQualifier of interrogation (20 = station interrogation)
+
+
+
Exceptions
+ + +
ConnectionExceptiondescription
+
+
+ +
+
+ +

◆ SendReadCommand()

+ +
+
+ + + + + + + + + + + +
override void lib60870.CS104.Connection.SendReadCommand (int ca,
int ioa )
+
+ +

Sends a read command (C_RD_NA_1 typeID: 102).

+

This will send a read command C_RC_NA_1 (102) to the slave/outstation. The COT is always REQUEST (5). It is used to implement the cyclical polling of data application function.

+
Parameters
+ + + +
caCommon address
ioaInformation object address
+
+
+
Exceptions
+ + +
ConnectionExceptiondescription
+
+
+ +
+
+ +

◆ SendResetProcessCommand()

+ +
+
+ + + + + + + + + + + + + + + + +
override void lib60870.CS104.Connection.SendResetProcessCommand (CauseOfTransmission cot,
int ca,
byte qrp )
+
+ +

Sends a reset process command (C_RP_NA_1 typeID: 105).

+
Parameters
+ + + + +
cotCause of transmission
caCommon address
qrpQualifier of reset process command
+
+
+
Exceptions
+ + +
ConnectionExceptiondescription
+
+
+ +
+
+ +

◆ SendTestCommand()

+ +
+
+ + + + + + + +
override void lib60870.CS104.Connection.SendTestCommand (int ca)
+
+ +

Sends a test command (C_TS_NA_1 typeID: 104).

+

Not required and supported by IEC 60870-5-104.

+
Parameters
+ + +
caCommon address
+
+
+
Exceptions
+ + +
ConnectionExceptiondescription
+
+
+ +
+
+ +

◆ SendTestCommandWithCP56Time2a()

+ +
+
+ + + + + + + + + + + + + + + + +
override void lib60870.CS104.Connection.SendTestCommandWithCP56Time2a (int ca,
ushort tsc,
CP56Time2a time )
+
+ +

Sends a test command with CP56Time2a time (C_TS_TA_1 typeID: 107).

+
Parameters
+ + + + +
caCommon address
tsctest sequence number
timetest timestamp
+
+
+
Exceptions
+ + +
ConnectionExceptiondescription
+
+
+ +
+
+ +

◆ SetASDUReceivedHandler()

+ +
+
+ + + + + + + + + + + +
void lib60870.CS104.Connection.SetASDUReceivedHandler (ASDUReceivedHandler handler,
object parameter )
+
+ +

Set the ASDUReceivedHandler. This handler is invoked whenever a new ASDU is received.

+
Parameters
+ + + +
handlerthe handler to be called
parameteruser provided parameter that is passed to the handler
+
+
+ +
+
+ +

◆ SetConnectionHandler()

+ +
+
+ + + + + + + + + + + +
void lib60870.CS104.Connection.SetConnectionHandler (ConnectionHandler handler,
object parameter )
+
+ +

Sets the connection handler. The connection handler is called when the connection is established or closed.

+
Parameters
+ + + +
handlerthe handler to be called
parameteruser provided parameter that is passed to the handler
+
+
+ +
+
+ +

◆ SetConnectTimeout()

+ +
+
+ + + + + + + +
void lib60870.CS104.Connection.SetConnectTimeout (int millies)
+
+ +

Sets the connect timeout.

+
Parameters
+ + +
milliestimeout value in milliseconds (ms)
+
+
+ +
+
+ +

◆ SetReceivedRawMessageHandler()

+ +
+
+ + + + + + + + + + + +
override void lib60870.CS104.Connection.SetReceivedRawMessageHandler (RawMessageHandler handler,
object parameter )
+
+ +

Sets the raw message handler. This is a callback to intercept raw messages received.

+
Parameters
+ + + +
handlerHandler/delegate that will be invoked when a message is received
parameterwill be passed to the delegate
+
+
+ +
+
+ +

◆ SetSentRawMessageHandler()

+ +
+
+ + + + + + + + + + + +
override void lib60870.CS104.Connection.SetSentRawMessageHandler (RawMessageHandler handler,
object parameter )
+
+ +

Sets the sent message handler. This is a callback to intercept the sent raw messages.

+
Parameters
+ + + +
handlerHandler/delegate that will be invoked when a message is sent<
parameterwill be passed to the delegate
+
+
+ +
+
+ +

◆ SetTlsSecurity()

+ +
+
+ + + + + + + +
void lib60870.CS104.Connection.SetTlsSecurity (TlsSecurityInformation securityInfo)
+
+ +

Set the security parameters for TLS.

+
Parameters
+ + +
securityInfoSecurity info.
+
+
+ +
+
+

Property Documentation

+ +

◆ Autostart

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS104.Connection.Autostart
+
+getset
+
+ +

Gets or sets a value indicating whether this lib60870.Connection is automatically sends a STARTDT_ACT message on startup.

+

true to send STARTDT_ACT message on startup; otherwise, false.

+ +
+
+ +

◆ IsRunning

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS104.Connection.IsRunning
+
+get
+
+ +

Gets a value indicating whether this T:lib60870.CS104.Connection is running(connected).

+

true if is running/connected; otherwise, false.

+ +
+
+ +

◆ ReceiveSequenceNumber

+ +
+
+ + + + + +
+ + + + +
int lib60870.CS104.Connection.ReceiveSequenceNumber
+
+getset
+
+ +

Gets or sets the receive sequence number N(R). WARNING: For test purposes only! Do net set in real application!

+

The receive sequence number N(R)

+ +
+
+ +

◆ SendSequenceNumber

+ +
+
+ + + + + +
+ + + + +
int lib60870.CS104.Connection.SendSequenceNumber
+
+getset
+
+ +

Gets or sets the send sequence number N(S). WARNING: For test purposes only! Do net set in real application!

+

The send sequence number N(S)

+ +
+
+ +

◆ UseSendMessageQueue

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS104.Connection.UseSendMessageQueue
+
+getset
+
+ +

Gets or sets a value indicating whether this lib60870.Connection use send message queue.

+

If true the Connection stores the ASDUs to be sent in a Queue when the connection cannot send ASDUs. This is the case when the counterpart (slave/server) is (temporarily) not able to handle new message, or the slave did not confirm the reception of the ASDUs for other reasons. If false the ASDU will be ignored and a lib60870.ConnectionException will be thrown in this case.

+

true if use send message queue; otherwise, false.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS104/Connection.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection.js new file mode 100644 index 0000000..3cd5427 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection.js @@ -0,0 +1,48 @@ +var classlib60870_1_1_c_s104_1_1_connection = +[ + [ "Connection", "classlib60870_1_1_c_s104_1_1_connection.html#a6fe992399ec28f325cb953737e4006a0", null ], + [ "Connection", "classlib60870_1_1_c_s104_1_1_connection.html#a3eae55571e202eb6736600f1e77ebe39", null ], + [ "Connection", "classlib60870_1_1_c_s104_1_1_connection.html#a02efd3de4daa87455c94621c8a225eda", null ], + [ "Connection", "classlib60870_1_1_c_s104_1_1_connection.html#ab6fa4b93d7a17e5eb0eabb97e0e8360f", null ], + [ "Connection", "classlib60870_1_1_c_s104_1_1_connection.html#a54aa828ed44ffbc63fdd71d3860bf541", null ], + [ "Connect", "classlib60870_1_1_c_s104_1_1_connection.html#a2f21059cd28bf0a85f9ed4a666c6e96f", null ], + [ "ConnectAsync", "classlib60870_1_1_c_s104_1_1_connection.html#af8aed177bd279389527cbfa8eede3ba6", null ], + [ "GetDirectory", "classlib60870_1_1_c_s104_1_1_connection.html#a131c3dd3059b67c6ec0b2351c5e1e50c", null ], + [ "GetFile", "classlib60870_1_1_c_s104_1_1_connection.html#adca074f2aa74aae897fbfc85a4bbe6d5", null ], + [ "GetFile", "classlib60870_1_1_c_s104_1_1_connection.html#a25c9f162dfde01896bb30e8f61092183", null ], + [ "GetStatistics", "classlib60870_1_1_c_s104_1_1_connection.html#a5867e9bda4cf3d6647ebf50603e1be17", null ], + [ "IsTransmitBufferFull", "classlib60870_1_1_c_s104_1_1_connection.html#a079f96f5d2be9416e9c0c4518542eb07", null ], + [ "LocalCertificateSelectionCallback", "classlib60870_1_1_c_s104_1_1_connection.html#ab773a1837cbbd532d5406f05b9d3cf3f", null ], + [ "SendASDU", "classlib60870_1_1_c_s104_1_1_connection.html#ac8604cef7b2781cb63a16de0bff9a308", null ], + [ "SendClockSyncCommand", "classlib60870_1_1_c_s104_1_1_connection.html#aa91efa113abc4e69578a487a2a934871", null ], + [ "SendControlCommand", "classlib60870_1_1_c_s104_1_1_connection.html#a5f1458066ec9a11a12ff68c7416071fa", null ], + [ "SendCounterInterrogationCommand", "classlib60870_1_1_c_s104_1_1_connection.html#ae8629df4fb0e9cf3868728e52ec995ca", null ], + [ "SendDelayAcquisitionCommand", "classlib60870_1_1_c_s104_1_1_connection.html#af178dab629740182d7c7e07eb32a4117", null ], + [ "SendFile", "classlib60870_1_1_c_s104_1_1_connection.html#a889e1aef3301cb272286a1279ae6caa3", null ], + [ "SendInterrogationCommand", "classlib60870_1_1_c_s104_1_1_connection.html#a25c57d614b315bad886edbaead69bd3d", null ], + [ "SendReadCommand", "classlib60870_1_1_c_s104_1_1_connection.html#aeaa8a8dbf8e2449d0222837b9d5ae3d8", null ], + [ "SendResetProcessCommand", "classlib60870_1_1_c_s104_1_1_connection.html#ab615b3065cf5248d9b9951c4e178fa80", null ], + [ "SendStartDT", "classlib60870_1_1_c_s104_1_1_connection.html#a57d40edfe14bfe66f832a7647e3173ae", null ], + [ "SendStartDT_CON", "classlib60870_1_1_c_s104_1_1_connection.html#a65d8586e819b9c537b2461611b0bb9ca", null ], + [ "SendStopDT", "classlib60870_1_1_c_s104_1_1_connection.html#a2510773333d6aaea354c5730f2bc139f", null ], + [ "SendStopDT_CON", "classlib60870_1_1_c_s104_1_1_connection.html#a6723565d01d05539a320810217955743", null ], + [ "SendTestCommand", "classlib60870_1_1_c_s104_1_1_connection.html#a310efefcea197178942abe509b04f463", null ], + [ "SendTestCommandWithCP56Time2a", "classlib60870_1_1_c_s104_1_1_connection.html#a3d38dafcc825eb9bba7258c2525a56ad", null ], + [ "SendTestFR_ACT", "classlib60870_1_1_c_s104_1_1_connection.html#afe81514340488a718a49706233816052", null ], + [ "SendTestFR_CON", "classlib60870_1_1_c_s104_1_1_connection.html#a876db462369040f272cddd144833ab56", null ], + [ "SetASDUReceivedHandler", "classlib60870_1_1_c_s104_1_1_connection.html#a7fd6fb3ca802d91197f1927f2e4f8712", null ], + [ "SetConnectionHandler", "classlib60870_1_1_c_s104_1_1_connection.html#afa545f647708d76bc23b3e5cbad1ac46", null ], + [ "SetConnectTimeout", "classlib60870_1_1_c_s104_1_1_connection.html#af5de8a91a2f77bfa69421b3e3da9276e", null ], + [ "SetReceivedRawMessageHandler", "classlib60870_1_1_c_s104_1_1_connection.html#a54fa6f1012457a6e0f492441cc4bfa23", null ], + [ "SetSentRawMessageHandler", "classlib60870_1_1_c_s104_1_1_connection.html#a787c8ff4943b9991328550f69807ef6e", null ], + [ "SetTlsSecurity", "classlib60870_1_1_c_s104_1_1_connection.html#a33eae01473eb5dc6545a74601b3d9a85", null ], + [ "Autostart", "classlib60870_1_1_c_s104_1_1_connection.html#aa941946c92bfe52f71c137c3fbf6d601", null ], + [ "ConnectTimeout", "classlib60870_1_1_c_s104_1_1_connection.html#a5bc80935ee36a7bcca2c4807f0abeed4", null ], + [ "IsRunning", "classlib60870_1_1_c_s104_1_1_connection.html#a83f3dfb64fa61b1d3fef93e938c692a1", null ], + [ "LocalIpAddress", "classlib60870_1_1_c_s104_1_1_connection.html#abfa6d1581b6702a9f1dbdb96a79f5bc3", null ], + [ "LocalTcpPort", "classlib60870_1_1_c_s104_1_1_connection.html#a871e51aa4130ab9185014a4a845fdd2a", null ], + [ "ReceiveSequenceNumber", "classlib60870_1_1_c_s104_1_1_connection.html#ab6a705b8f4d600160fa842031363e63e", null ], + [ "ReceiveTimeout", "classlib60870_1_1_c_s104_1_1_connection.html#a3bf1bdcc082cd5347acb0fcb29078000", null ], + [ "SendSequenceNumber", "classlib60870_1_1_c_s104_1_1_connection.html#a38bffb6d3d17033d40383529aa69c105", null ], + [ "UseSendMessageQueue", "classlib60870_1_1_c_s104_1_1_connection.html#a452b4617dc369f3e9d6f509a0634fc21", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection__coll__graph.dot new file mode 100644 index 0000000..a74bf13 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS104.Connection" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS104.Connection",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="A single connection to a CS 104 (IEC 60870-5-104) server. Implements the Master interface."]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Master",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_master.html",tooltip="Common interface for CS104 and CS101 balanced and unbalanced master."]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection__inherit__graph.dot new file mode 100644 index 0000000..a74bf13 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS104.Connection" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS104.Connection",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="A single connection to a CS 104 (IEC 60870-5-104) server. Implements the Master interface."]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Master",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_master.html",tooltip="Common interface for CS104 and CS101 balanced and unbalanced master."]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection_statistics-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection_statistics-members.html new file mode 100644 index 0000000..db9655a --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection_statistics-members.html @@ -0,0 +1,120 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS104.ConnectionStatistics Member List
+
+ +
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection_statistics.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection_statistics.html new file mode 100644 index 0000000..31a4a3f --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection_statistics.html @@ -0,0 +1,242 @@ + + + + + + + +lib60870.NET: lib60870.CS104.ConnectionStatistics Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS104.ConnectionStatistics Class Reference
+
+
+ +

Provides some Connection statistics. + More...

+ + + + + + + + + + + + + + +

+Properties

int SentMsgCounter [get, set]
 Gets or sets the sent message counter.
 
int RcvdMsgCounter [get, set]
 Gets or sets the received message counter.
 
int RcvdTestFrActCounter [get, set]
 Counter for the TEST_FR_ACT messages received.
 
int RcvdTestFrConCounter [get, set]
 Counter for the TEST_FR_CON messages received.
 
+

Detailed Description

+

Provides some Connection statistics.

+

Property Documentation

+ +

◆ RcvdMsgCounter

+ +
+
+ + + + + +
+ + + + +
int lib60870.CS104.ConnectionStatistics.RcvdMsgCounter
+
+getset
+
+ +

Gets or sets the received message counter.

+

The received message counter.

+ +
+
+ +

◆ RcvdTestFrActCounter

+ +
+
+ + + + + +
+ + + + +
int lib60870.CS104.ConnectionStatistics.RcvdTestFrActCounter
+
+getset
+
+ +

Counter for the TEST_FR_ACT messages received.

+

The TEST_FR_ACT counter.

+ +
+
+ +

◆ RcvdTestFrConCounter

+ +
+
+ + + + + +
+ + + + +
int lib60870.CS104.ConnectionStatistics.RcvdTestFrConCounter
+
+getset
+
+ +

Counter for the TEST_FR_CON messages received.

+

The TEST_FR_CON counter.

+ +
+
+ +

◆ SentMsgCounter

+ +
+
+ + + + + +
+ + + + +
int lib60870.CS104.ConnectionStatistics.SentMsgCounter
+
+getset
+
+ +

Gets or sets the sent message counter.

+

The sent message counter.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS104/Connection.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection_statistics.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection_statistics.js new file mode 100644 index 0000000..0b57243 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection_statistics.js @@ -0,0 +1,7 @@ +var classlib60870_1_1_c_s104_1_1_connection_statistics = +[ + [ "RcvdMsgCounter", "classlib60870_1_1_c_s104_1_1_connection_statistics.html#a763d4accdb60725988746edc43675f2e", null ], + [ "RcvdTestFrActCounter", "classlib60870_1_1_c_s104_1_1_connection_statistics.html#aba25451b06261758d07cc6d0f64292bd", null ], + [ "RcvdTestFrConCounter", "classlib60870_1_1_c_s104_1_1_connection_statistics.html#a4aef0532af04bf8cc51ab76069845eb8", null ], + [ "SentMsgCounter", "classlib60870_1_1_c_s104_1_1_connection_statistics.html#ad04c56b6a2a9520d5296c56d12f2b5b0", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group-members.html new file mode 100644 index 0000000..c7ba699 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group-members.html @@ -0,0 +1,123 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS104.RedundancyGroup Member List
+
+ +
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group.html new file mode 100644 index 0000000..881a7c6 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group.html @@ -0,0 +1,309 @@ + + + + + + + +lib60870.NET: lib60870.CS104.RedundancyGroup Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS104.RedundancyGroup Class Reference
+
+
+ +

Representation of a redundancy group. A redundancy group is a group of connections that share a unique event queue. Only one connection in a redundancy group can be active. + More...

+
+Collaboration diagram for lib60870.CS104.RedundancyGroup:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + +

+Public Member Functions

 RedundancyGroup (string name)
 Initializes a new instance of the lib60870.CS104.RedundancyGroup class.
 
void AddAllowedClient (IPAddress ipAddress)
 Adds a client specified by the IP address.
 
void AddAllowedClient (string ipString)
 Adds a client specified by the IP address.
 
void EnqueueASDU (ASDU asdu)
 Enqueues the ASDU to the redundancy group specific message queue. This function is called by lib60870.CS104.Server.EnqueueASDU. If the Server.EnqueuASDU method is used this method should not be called!
 
+ + + + + + + +

+Properties

string Name [get]
 Gets the name.
 
bool IsCatchAll [get]
 Gets a value indicating whether this instance is a catch all group. All clients that are not explicitely assigned to a specific group are handled by the catch all group.
 
+

Detailed Description

+

Representation of a redundancy group. A redundancy group is a group of connections that share a unique event queue. Only one connection in a redundancy group can be active.

+

Constructor & Destructor Documentation

+ +

◆ RedundancyGroup()

+ +
+
+ + + + + + + +
lib60870.CS104.RedundancyGroup.RedundancyGroup (string name)
+
+ +

Initializes a new instance of the lib60870.CS104.RedundancyGroup class.

+
Parameters
+ + +
namean optional name for debugging purposes.
+
+
+ +
+
+

Member Function Documentation

+ +

◆ AddAllowedClient() [1/2]

+ +
+
+ + + + + + + +
void lib60870.CS104.RedundancyGroup.AddAllowedClient (IPAddress ipAddress)
+
+ +

Adds a client specified by the IP address.

+
Parameters
+ + +
ipAddressIP address of the client.
+
+
+ +
+
+ +

◆ AddAllowedClient() [2/2]

+ +
+
+ + + + + + + +
void lib60870.CS104.RedundancyGroup.AddAllowedClient (string ipString)
+
+ +

Adds a client specified by the IP address.

+
Parameters
+ + +
ipAddressIP address of the client.
+
+
+ +
+
+ +

◆ EnqueueASDU()

+ +
+
+ + + + + + + +
void lib60870.CS104.RedundancyGroup.EnqueueASDU (ASDU asdu)
+
+ +

Enqueues the ASDU to the redundancy group specific message queue. This function is called by lib60870.CS104.Server.EnqueueASDU. If the Server.EnqueuASDU method is used this method should not be called!

+
Parameters
+ + +
asduThe ASDU to enqueue.
+
+
+ +
+
+

Property Documentation

+ +

◆ IsCatchAll

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS104.RedundancyGroup.IsCatchAll
+
+get
+
+ +

Gets a value indicating whether this instance is a catch all group. All clients that are not explicitely assigned to a specific group are handled by the catch all group.

+

true if this instance is a catch all group; otherwise, false.

+ +
+
+ +

◆ Name

+ +
+
+ + + + + +
+ + + + +
string lib60870.CS104.RedundancyGroup.Name
+
+get
+
+ +

Gets the name.

+

the name, or null if no name is set

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS104/Server.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group.js new file mode 100644 index 0000000..dee9b60 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group.js @@ -0,0 +1,9 @@ +var classlib60870_1_1_c_s104_1_1_redundancy_group = +[ + [ "RedundancyGroup", "classlib60870_1_1_c_s104_1_1_redundancy_group.html#a3bfc0c71f3919a451288a9b2581e6560", null ], + [ "AddAllowedClient", "classlib60870_1_1_c_s104_1_1_redundancy_group.html#a971ee15ef8b50bf62d75e552dbc5a118", null ], + [ "AddAllowedClient", "classlib60870_1_1_c_s104_1_1_redundancy_group.html#a30f6faca907a9496271e7c43e12ba220", null ], + [ "EnqueueASDU", "classlib60870_1_1_c_s104_1_1_redundancy_group.html#af72be4629377a6c78f4f9733f4e251b4", null ], + [ "IsCatchAll", "classlib60870_1_1_c_s104_1_1_redundancy_group.html#aa09df33fcd23dcf486800f45f3d41d32", null ], + [ "Name", "classlib60870_1_1_c_s104_1_1_redundancy_group.html#ab5d3a9a8d2fcca1e07fbb547cd072248", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group__coll__graph.dot new file mode 100644 index 0000000..9e3db46 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group__coll__graph.dot @@ -0,0 +1,16 @@ +digraph "lib60870.CS104.RedundancyGroup" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS104.Redundancy\lGroup",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Representation of a redundancy group. A redundancy group is a group of connections that share a uniqu..."]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=" asduQueue",fontcolor="grey" ]; + Node2 [id="Node000002",label="lib60870.ASDUQueue",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_a_s_d_u_queue.html",tooltip=" "]; + Node3 -> Node1 [id="edge2_Node000001_Node000003",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=" server",fontcolor="grey" ]; + Node3 [id="Node000003",label="lib60870.CS104.Server",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s104_1_1_server.html",tooltip="This class represents a single IEC 60870-5 server (slave or controlled station). It is also the main ..."]; + Node4 -> Node3 [id="edge3_Node000003_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="CS101::Slave",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_slave.html",tooltip=" "]; + Node5 -> Node4 [id="edge4_Node000004_Node000005",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=" filesAvailable",fontcolor="grey" ]; + Node5 [id="Node000005",label="lib60870.CS101.FilesAvailable",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_files_available.html",tooltip="Represents the available files in a file client or file server."]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server-members.html new file mode 100644 index 0000000..7c21791 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server-members.html @@ -0,0 +1,168 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS104.Server Member List
+
+
+ +

This is the complete list of members for lib60870.CS104.Server, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddRedundancyGroup(RedundancyGroup redundancyGroup)lib60870.CS104.Server
asduHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
asduHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
clockSynchronizationHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
clockSynchronizationHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
connectionRequestHandler (defined in lib60870.CS104.Server)lib60870.CS104.Server
connectionRequestHandlerParameter (defined in lib60870.CS104.Server)lib60870.CS104.Server
counterInterrogationHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
counterInterrogationHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
DebugOutput (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
debugOutput (defined in lib60870.CS101.Slave)lib60870.CS101.Slaveprotected
delayAcquisitionHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
delayAcquisitionHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
EnqueueASDU(ASDU asdu)lib60870.CS104.Server
EnqueueModelib60870.CS104.Server
filesAvailable (defined in lib60870.CS101.Slave)lib60870.CS101.Slaveprotected
FileTimeout (defined in lib60870.CS104.Server)lib60870.CS104.Server
GetAPCIParameters()lib60870.CS104.Server
GetApplicationLayerParameters()lib60870.CS104.Server
GetAvailableFiles()lib60870.CS101.Slave
GetNumberOfQueueEntries(RedundancyGroup redundancyGroup=null) (defined in lib60870.CS104.Server)lib60870.CS104.Server
interrogationHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
InterrogationHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
IsRunning()lib60870.CS104.Server
MaxHighPrioQueueSizelib60870.CS104.Server
MaxOpenConnectionslib60870.CS104.Server
MaxQueueSizelib60870.CS104.Server
OpenConnectionslib60870.CS104.Server
readHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
readHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
ReceiveTimeoutlib60870.CS104.Server
resetProcessHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
resetProcessHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
Server()lib60870.CS104.Server
Server(TlsSecurityInformation securityInfo)lib60870.CS104.Server
Server(APCIParameters apciParameters, ApplicationLayerParameters alParameters)lib60870.CS104.Server
Server(APCIParameters apciParameters, ApplicationLayerParameters alParameters, TlsSecurityInformation securityInfo)lib60870.CS104.Server
ServerModelib60870.CS104.Server
SetASDUHandler(ASDUHandler handler, object parameter)lib60870.CS101.Slave
SetClockSynchronizationHandler(ClockSynchronizationHandler handler, object parameter)lib60870.CS101.Slave
SetConnectionEventHandler(ConnectionEventHandler handler, object parameter)lib60870.CS104.Server
SetConnectionRequestHandler(ConnectionRequestHandler handler, object parameter)lib60870.CS104.Server
SetCounterInterrogationHandler(CounterInterrogationHandler handler, object parameter)lib60870.CS101.Slave
SetDelayAcquisitionHandler(DelayAcquisitionHandler handler, object parameter) (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
SetFileReadyHandler(FileReadyHandler handler, object parameter)lib60870.CS101.Slave
SetInterrogationHandler(InterrogationHandler handler, object parameter)lib60870.CS101.Slave
SetLocalAddress(string localAddress)lib60870.CS104.Server
SetLocalPort(int tcpPort)lib60870.CS104.Server
SetReadHandler(ReadHandler handler, object parameter)lib60870.CS101.Slave
SetResetProcessHandler(ResetProcessHandler handler, object parameter) (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
Start()lib60870.CS104.Server
Stop()lib60870.CS104.Server
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server.html new file mode 100644 index 0000000..13233a1 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server.html @@ -0,0 +1,786 @@ + + + + + + + +lib60870.NET: lib60870.CS104.Server Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS104.Server Class Reference
+
+
+ +

This class represents a single IEC 60870-5 server (slave or controlled station). It is also the main access to the CS 104 server API. + More...

+
+Inheritance diagram for lib60870.CS104.Server:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.CS104.Server:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

ApplicationLayerParameters GetApplicationLayerParameters ()
 Get active application layer parameters (modify only before starting the server!)
 
APCIParameters GetAPCIParameters ()
 Get active APCI parameters (modify only before starting the server!)
 
Server ()
 Create a new server using default connection parameters.
 
 Server (TlsSecurityInformation securityInfo)
 Create a new server using default connection parameters and TLS configuration.
 
 Server (APCIParameters apciParameters, ApplicationLayerParameters alParameters)
 Create a new server using the provided connection parameters.
 
 Server (APCIParameters apciParameters, ApplicationLayerParameters alParameters, TlsSecurityInformation securityInfo)
 Create a new server using the provided connection parameters.
 
void AddRedundancyGroup (RedundancyGroup redundancyGroup)
 Adds a redundancy group to the server. Each redundancy group has its own event queue.
 
void SetConnectionRequestHandler (ConnectionRequestHandler handler, object parameter)
 Sets a callback handler for connection request. The user can allow (returning true) or deny (returning false) the connection attempt. If no handler is installed every new connection will be accepted.
 
void SetConnectionEventHandler (ConnectionEventHandler handler, object parameter)
 Sets the connection event handler. The connection event handler will be called whenever a new connection was opened, closed, activated, or inactivated.
 
+int GetNumberOfQueueEntries (RedundancyGroup redundancyGroup=null)
 
void SetLocalAddress (string localAddress)
 Sets the local IP address to bind the server. Default is "0.0.0.0" for all interfaces.
 
void SetLocalPort (int tcpPort)
 Sets the local TCP port to bind to. Default is 2404, or 19998 when using TLS.
 
+void Start ()
 Start the server. Listen to client connections.
 
+void Stop ()
 Stop the server. Close all open client connections.
 
bool IsRunning ()
 Check if the server is running (listening to client connections and handling connections) or not.
 
void EnqueueASDU (ASDU asdu)
 Enqueues the ASDU to the transmission queue.
 
- Public Member Functions inherited from lib60870.CS101.Slave
void SetInterrogationHandler (InterrogationHandler handler, object parameter)
 Sets a callback for interrogaton requests.
 
void SetCounterInterrogationHandler (CounterInterrogationHandler handler, object parameter)
 Sets a callback for counter interrogaton requests.
 
void SetReadHandler (ReadHandler handler, object parameter)
 Sets a callback for read requests.
 
void SetClockSynchronizationHandler (ClockSynchronizationHandler handler, object parameter)
 Sets a callback for the clock synchronization request.
 
+void SetResetProcessHandler (ResetProcessHandler handler, object parameter)
 
+void SetDelayAcquisitionHandler (DelayAcquisitionHandler handler, object parameter)
 
void SetASDUHandler (ASDUHandler handler, object parameter)
 Sets a callback to handle ASDUs (commands, requests) form clients. This callback can be used when no other callback handles the message from the client/master.
 
void SetFileReadyHandler (FileReadyHandler handler, object parameter)
 Sets a callback handler that is called when a file ready message is received from a master.
 
FilesAvailable GetAvailableFiles ()
 Gets the available files that are registered with the file server.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

+ConnectionRequestHandler connectionRequestHandler = null
 
+object connectionRequestHandlerParameter = null
 
- Public Attributes inherited from lib60870.CS101.Slave
+InterrogationHandler interrogationHandler = null
 
+object InterrogationHandlerParameter = null
 
+CounterInterrogationHandler counterInterrogationHandler = null
 
+object counterInterrogationHandlerParameter = null
 
+ReadHandler readHandler = null
 
+object readHandlerParameter = null
 
+ClockSynchronizationHandler clockSynchronizationHandler = null
 
+object clockSynchronizationHandlerParameter = null
 
+ResetProcessHandler resetProcessHandler = null
 
+object resetProcessHandlerParameter = null
 
+DelayAcquisitionHandler delayAcquisitionHandler = null
 
+object delayAcquisitionHandlerParameter = null
 
+ASDUHandler asduHandler = null
 
+object asduHandlerParameter = null
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

ServerMode ServerMode [get, set]
 Gets or sets the server mode (behavior regarding redundancy groups)
 
EnqueueMode EnqueueMode [get, set]
 Gets or sets the mode of ASDU queue behaviour. Default mode is EnqueueMode.REMOVE_OLDEST.
 
int MaxQueueSize [get, set]
 Gets or sets the maximum size of the ASDU queue. Setting this property has no effect after calling the Start method.
 
int MaxHighPrioQueueSize [get, set]
 Gets or sets the maximum size of the ASDU high priotity queue. Setting this property has no effect after calling the Start method.
 
int MaxOpenConnections [get, set]
 Gets or sets the maximum number of open TCP connections.
 
int OpenConnections [get]
 Gets the number of connected master/client stations.
 
+int ReceiveTimeout [get, set]
 Maximum allowed time for receiving a single message.
 
+override int FileTimeout [get, set]
 
- Properties inherited from lib60870.CS101.Slave
+bool DebugOutput [get, set]
 
virtual int FileTimeout [get, set]
 Gets or sets the file service timeout.
 
+ + + + + + +

+Additional Inherited Members

- Protected Attributes inherited from lib60870.CS101.Slave
+bool debugOutput
 
+FilesAvailable filesAvailable = new FilesAvailable()
 
+

Detailed Description

+

This class represents a single IEC 60870-5 server (slave or controlled station). It is also the main access to the CS 104 server API.

+

Constructor & Destructor Documentation

+ +

◆ Server() [1/3]

+ +
+
+ + + + + + + +
lib60870.CS104.Server.Server (TlsSecurityInformation securityInfo)
+
+ +

Create a new server using default connection parameters and TLS configuration.

+
Parameters
+ + +
securityInfoTLS layer configuation, or null when not using TLS
+
+
+ +
+
+ +

◆ Server() [2/3]

+ +
+
+ + + + + + + + + + + +
lib60870.CS104.Server.Server (APCIParameters apciParameters,
ApplicationLayerParameters alParameters )
+
+ +

Create a new server using the provided connection parameters.

+
Parameters
+ + + +
apciParametersAPCI parameters
alParametersapplication layer parameters
+
+
+ +
+
+ +

◆ Server() [3/3]

+ +
+
+ + + + + + + + + + + + + + + + +
lib60870.CS104.Server.Server (APCIParameters apciParameters,
ApplicationLayerParameters alParameters,
TlsSecurityInformation securityInfo )
+
+ +

Create a new server using the provided connection parameters.

+
Parameters
+ + + +
apciParametersAPCI parameters
alParametersapplication layer parameters
+
+
+ +
+
+

Member Function Documentation

+ +

◆ AddRedundancyGroup()

+ +
+
+ + + + + + + +
void lib60870.CS104.Server.AddRedundancyGroup (RedundancyGroup redundancyGroup)
+
+ +

Adds a redundancy group to the server. Each redundancy group has its own event queue.

+
Parameters
+ + +
redundancyGroupRedundancy group.
+
+
+ +
+
+ +

◆ EnqueueASDU()

+ +
+
+ + + + + + + +
void lib60870.CS104.Server.EnqueueASDU (ASDU asdu)
+
+ +

Enqueues the ASDU to the transmission queue.

+

If an active connection exists the ASDU will be sent to the active client immediately. Otherwhise the ASDU will be added to the transmission queue for later transmission.

Parameters
+ + +
asduASDU to be sent
+
+
+
Exceptions
+ + +
lib60870.CS101.ASDUQueueExceptionwhen the ASDU queue is full and mode is EnqueueMode.THROW_EXCEPTION.
+
+
+ +
+
+ +

◆ GetAPCIParameters()

+ +
+
+ + + + + + + +
APCIParameters lib60870.CS104.Server.GetAPCIParameters ()
+
+ +

Get active APCI parameters (modify only before starting the server!)

+
Returns
APCI parameters object used by the server
+ +
+
+ +

◆ GetApplicationLayerParameters()

+ +
+
+ + + + + + + +
ApplicationLayerParameters lib60870.CS104.Server.GetApplicationLayerParameters ()
+
+ +

Get active application layer parameters (modify only before starting the server!)

+
Returns
application layer parameters object used by the server
+ +
+
+ +

◆ IsRunning()

+ +
+
+ + + + + + + +
bool lib60870.CS104.Server.IsRunning ()
+
+ +

Check if the server is running (listening to client connections and handling connections) or not.

+
Returns
true when the server is running, false otherwise
+ +
+
+ +

◆ SetConnectionEventHandler()

+ +
+
+ + + + + + + + + + + +
void lib60870.CS104.Server.SetConnectionEventHandler (ConnectionEventHandler handler,
object parameter )
+
+ +

Sets the connection event handler. The connection event handler will be called whenever a new connection was opened, closed, activated, or inactivated.

+
Parameters
+ + + +
handlerHandler.
parameterParameter.
+
+
+ +
+
+ +

◆ SetConnectionRequestHandler()

+ +
+
+ + + + + + + + + + + +
void lib60870.CS104.Server.SetConnectionRequestHandler (ConnectionRequestHandler handler,
object parameter )
+
+ +

Sets a callback handler for connection request. The user can allow (returning true) or deny (returning false) the connection attempt. If no handler is installed every new connection will be accepted.

+
Parameters
+ + + +
handlerHandler.
parameterParameter.
+
+
+ +
+
+ +

◆ SetLocalAddress()

+ +
+
+ + + + + + + +
void lib60870.CS104.Server.SetLocalAddress (string localAddress)
+
+ +

Sets the local IP address to bind the server. Default is "0.0.0.0" for all interfaces.

+
Parameters
+ + +
localAddressLocal IP address or hostname to bind.
+
+
+ +
+
+ +

◆ SetLocalPort()

+ +
+
+ + + + + + + +
void lib60870.CS104.Server.SetLocalPort (int tcpPort)
+
+ +

Sets the local TCP port to bind to. Default is 2404, or 19998 when using TLS.

+
Parameters
+ + +
tcpPortLocal TCP port to bind.
+
+
+ +
+
+

Property Documentation

+ +

◆ EnqueueMode

+ +
+
+ + + + + +
+ + + + +
EnqueueMode lib60870.CS104.Server.EnqueueMode
+
+getset
+
+ +

Gets or sets the mode of ASDU queue behaviour. Default mode is EnqueueMode.REMOVE_OLDEST.

+

the mode of ASDU queue behaviour

+ +
+
+ +

◆ MaxHighPrioQueueSize

+ +
+
+ + + + + +
+ + + + +
int lib60870.CS104.Server.MaxHighPrioQueueSize
+
+getset
+
+ +

Gets or sets the maximum size of the ASDU high priotity queue. Setting this property has no effect after calling the Start method.

+

The size of the max high priotity queue.

+ +
+
+ +

◆ MaxOpenConnections

+ +
+
+ + + + + +
+ + + + +
int lib60870.CS104.Server.MaxOpenConnections
+
+getset
+
+ +

Gets or sets the maximum number of open TCP connections.

+

The maximum number of open TCP connections.

+ +
+
+ +

◆ MaxQueueSize

+ +
+
+ + + + + +
+ + + + +
int lib60870.CS104.Server.MaxQueueSize
+
+getset
+
+ +

Gets or sets the maximum size of the ASDU queue. Setting this property has no effect after calling the Start method.

+

The size of the max queue.

+ +
+
+ +

◆ OpenConnections

+ +
+
+ + + + + +
+ + + + +
int lib60870.CS104.Server.OpenConnections
+
+get
+
+ +

Gets the number of connected master/client stations.

+

The number of open connections.

+ +
+
+ +

◆ ServerMode

+ +
+
+ + + + + +
+ + + + +
ServerMode lib60870.CS104.Server.ServerMode
+
+getset
+
+ +

Gets or sets the server mode (behavior regarding redundancy groups)

+

The server mode.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS104/Server.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server.js new file mode 100644 index 0000000..d4c00fd --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server.js @@ -0,0 +1,25 @@ +var classlib60870_1_1_c_s104_1_1_server = +[ + [ "Server", "classlib60870_1_1_c_s104_1_1_server.html#aae44fa0f507ea4b8d343686a9345e419", null ], + [ "Server", "classlib60870_1_1_c_s104_1_1_server.html#a12b5bdf509e0b569295b8821c016770b", null ], + [ "Server", "classlib60870_1_1_c_s104_1_1_server.html#a4b25619314b9e2586d21d83f3ed9fcd0", null ], + [ "Server", "classlib60870_1_1_c_s104_1_1_server.html#a4a25393ccd928dc4abbb13c14e3579c2", null ], + [ "AddRedundancyGroup", "classlib60870_1_1_c_s104_1_1_server.html#af970d8d63a4d220d54e213250e90eada", null ], + [ "EnqueueASDU", "classlib60870_1_1_c_s104_1_1_server.html#aa6f1a77ab87c08ca663ab88dcf1b9dbe", null ], + [ "GetAPCIParameters", "classlib60870_1_1_c_s104_1_1_server.html#a859b8ac2c4b9cd87efc490173c8cd38a", null ], + [ "GetApplicationLayerParameters", "classlib60870_1_1_c_s104_1_1_server.html#a21f35d1f590dae3b557c413e2f05d01d", null ], + [ "IsRunning", "classlib60870_1_1_c_s104_1_1_server.html#a8d16b6e5d54bee55912a00c0cb3b28fc", null ], + [ "SetConnectionEventHandler", "classlib60870_1_1_c_s104_1_1_server.html#afa4ae496c2260bc6b501a60259c35282", null ], + [ "SetConnectionRequestHandler", "classlib60870_1_1_c_s104_1_1_server.html#a8c3dbeea77158bb5014d9739bb8f1116", null ], + [ "SetLocalAddress", "classlib60870_1_1_c_s104_1_1_server.html#af7db8efa36f1bfc559ac96308a907d07", null ], + [ "SetLocalPort", "classlib60870_1_1_c_s104_1_1_server.html#aa3ddaa0a4c43ca80f35f523d84347753", null ], + [ "Start", "classlib60870_1_1_c_s104_1_1_server.html#af8d37c78f23fafbb74091b7d3d0ed684", null ], + [ "Stop", "classlib60870_1_1_c_s104_1_1_server.html#a07fc33e78e4b8d156e1bbe08170c62cf", null ], + [ "EnqueueMode", "classlib60870_1_1_c_s104_1_1_server.html#a102d175703f4f357e5749265352ce71e", null ], + [ "MaxHighPrioQueueSize", "classlib60870_1_1_c_s104_1_1_server.html#a408a31dd3cf6e781d7295804bd96d767", null ], + [ "MaxOpenConnections", "classlib60870_1_1_c_s104_1_1_server.html#adcea16c6c2db799bc5b6750e82ca2235", null ], + [ "MaxQueueSize", "classlib60870_1_1_c_s104_1_1_server.html#acef2c82d580d17114847df8409f6bf4f", null ], + [ "OpenConnections", "classlib60870_1_1_c_s104_1_1_server.html#a63dda97b27c78743dee7374d66cdda53", null ], + [ "ReceiveTimeout", "classlib60870_1_1_c_s104_1_1_server.html#a5cbb4d451a08d3b381fce39b5bf4ed3e", null ], + [ "ServerMode", "classlib60870_1_1_c_s104_1_1_server.html#a9c05718964db1a69771955715585c4da", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server__coll__graph.dot new file mode 100644 index 0000000..8840317 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server__coll__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS104.Server" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS104.Server",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="This class represents a single IEC 60870-5 server (slave or controlled station). It is also the main ..."]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="CS101::Slave",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_slave.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=" filesAvailable",fontcolor="grey" ]; + Node3 [id="Node000003",label="lib60870.CS101.FilesAvailable",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_files_available.html",tooltip="Represents the available files in a file client or file server."]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server__inherit__graph.dot new file mode 100644 index 0000000..b2af2fe --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS104.Server" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS104.Server",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="This class represents a single IEC 60870-5 server (slave or controlled station). It is also the main ..."]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="CS101::Slave",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_slave.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_tls_security_information-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_tls_security_information-members.html new file mode 100644 index 0000000..ce416a4 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_tls_security_information-members.html @@ -0,0 +1,128 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS104.TlsSecurityInformation Member List
+
+ +
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_tls_security_information.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_tls_security_information.html new file mode 100644 index 0000000..2f62087 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_tls_security_information.html @@ -0,0 +1,240 @@ + + + + + + + +lib60870.NET: lib60870.CS104.TlsSecurityInformation Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS104.TlsSecurityInformation Class Reference
+
+
+ + + + + + + + + + +

+Public Member Functions

TlsSecurityInformation (string targetHostName, X509Certificate2 ownCertificate)
 
TlsSecurityInformation (X509Certificate2 ownCertificate)
 
+void AddAllowedCertificate (X509Certificate2 allowedCertificate)
 
+void AddCA (X509Certificate2 caCertificate)
 
+ + + + + + + + + + + + + + + + + + + + +

+Properties

bool ChainValidation [get, set]
 Gets or sets a value indicating whether this lib60870.TlsSecurityInformation performs a X509 chain validation against the registered CA certificates.
 
bool AllowOnlySpecificCertificates [get, set]
 Gets or sets a value indicating whether this lib60870.TlsSecurityInformation allow only specific certificates.
 
+X509Certificate2 OwnCertificate [get, set]
 
+List< X509Certificate2 > AllowedCertificates [get, set]
 
+List< X509Certificate2 > CaCertificates [get]
 
+string TargetHostName [get]
 
+SslProtocols TlsVersion [get, set]
 
RemoteCertificateValidationCallback CertificateValidationCallback [get, set]
 Gets or sets the certificate validation callback.
 
+

Property Documentation

+ +

◆ AllowOnlySpecificCertificates

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS104.TlsSecurityInformation.AllowOnlySpecificCertificates
+
+getset
+
+ +

Gets or sets a value indicating whether this lib60870.TlsSecurityInformation allow only specific certificates.

+

true if allow only specific certificates; otherwise, false.

+ +
+
+ +

◆ CertificateValidationCallback

+ +
+
+ + + + + +
+ + + + +
RemoteCertificateValidationCallback lib60870.CS104.TlsSecurityInformation.CertificateValidationCallback
+
+getset
+
+ +

Gets or sets the certificate validation callback.

+

The certificate validation callback, or null to use the library internal certificate validation callbacks

+ +
+
+ +

◆ ChainValidation

+ +
+
+ + + + + +
+ + + + +
bool lib60870.CS104.TlsSecurityInformation.ChainValidation
+
+getset
+
+ +

Gets or sets a value indicating whether this lib60870.TlsSecurityInformation performs a X509 chain validation against the registered CA certificates.

+

true if chain validation; otherwise, false.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS104/TlsSecurityInformation.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_tls_security_information.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_tls_security_information.js new file mode 100644 index 0000000..4da1bdc --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_tls_security_information.js @@ -0,0 +1,6 @@ +var classlib60870_1_1_c_s104_1_1_tls_security_information = +[ + [ "AllowOnlySpecificCertificates", "classlib60870_1_1_c_s104_1_1_tls_security_information.html#aecf70336635c0bfe0fe713a5e427fa3e", null ], + [ "CertificateValidationCallback", "classlib60870_1_1_c_s104_1_1_tls_security_information.html#ab90e1e052fa15e1b211109d30529b491", null ], + [ "ChainValidation", "classlib60870_1_1_c_s104_1_1_tls_security_information.html#a2b367122104e8ac1469d6240c427fe86", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception-members.html new file mode 100644 index 0000000..ba0e82f --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception-members.html @@ -0,0 +1,118 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.ConnectionException Member List
+
+
+ +

This is the complete list of members for lib60870.ConnectionException, including all inherited members.

+ + + +
ConnectionException(string message) (defined in lib60870.ConnectionException)lib60870.ConnectionException
ConnectionException(string message, Exception e) (defined in lib60870.ConnectionException)lib60870.ConnectionException
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception.html new file mode 100644 index 0000000..8019f1a --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception.html @@ -0,0 +1,140 @@ + + + + + + + +lib60870.NET: lib60870.ConnectionException Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.ConnectionException Class Reference
+
+
+
+Inheritance diagram for lib60870.ConnectionException:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.ConnectionException:
+
+
Collaboration graph
+
[legend]
+ + + + + + +

+Public Member Functions

ConnectionException (string message)
 
ConnectionException (string message, Exception e)
 
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/ConnectionException.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception__coll__graph.dot new file mode 100644 index 0000000..5650f01 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.ConnectionException" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.ConnectionException",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Exception",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception__inherit__graph.dot new file mode 100644 index 0000000..8a6426f --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.ConnectionException" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.ConnectionException",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Exception",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="lib60870.linklayer.LinkLayer\lBusyException",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1linklayer_1_1_link_layer_busy_exception.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_frame-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_frame-members.html new file mode 100644 index 0000000..3b857f2 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_frame-members.html @@ -0,0 +1,121 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.Frame Member List
+
+
+ +

This is the complete list of members for lib60870.Frame, including all inherited members.

+ + + + + + +
AppendBytes(byte[] bytes) (defined in lib60870.Frame)lib60870.Frame
GetBuffer() (defined in lib60870.Frame)lib60870.Frame
GetMsgSize() (defined in lib60870.Frame)lib60870.Frame
ResetFrame() (defined in lib60870.Frame)lib60870.Frame
SetNextByte(byte value) (defined in lib60870.Frame)lib60870.Frame
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_frame.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_frame.html new file mode 100644 index 0000000..ff79819 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_frame.html @@ -0,0 +1,149 @@ + + + + + + + +lib60870.NET: lib60870.Frame Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.Frame Class Referenceabstract
+
+
+ +

Abstract class to encode an application layer frame. + More...

+
+Inheritance diagram for lib60870.Frame:
+
+
Inheritance graph
+
[legend]
+ + + + + + + + + + + + +

+Public Member Functions

+void ResetFrame ()
 
+void SetNextByte (byte value)
 
+void AppendBytes (byte[] bytes)
 
+int GetMsgSize ()
 
+byte[] GetBuffer ()
 
+

Detailed Description

+

Abstract class to encode an application layer frame.

+

The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/Frame.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_frame__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_frame__inherit__graph.dot new file mode 100644 index 0000000..1a1184b --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_frame__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.Frame" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.Frame",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Abstract class to encode an application layer frame."]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="lib60870.BufferFrame",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_library_common-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_library_common-members.html new file mode 100644 index 0000000..e79f7b2 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_library_common-members.html @@ -0,0 +1,120 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.LibraryCommon Member List
+
+
+ +

This is the complete list of members for lib60870.LibraryCommon, including all inherited members.

+ + + + + +
GetLibraryVersionString()lib60870.LibraryCommonstatic
VERSION_MAJORlib60870.LibraryCommonstatic
VERSION_MINORlib60870.LibraryCommonstatic
VERSION_PATCHlib60870.LibraryCommonstatic
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_library_common.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_library_common.html new file mode 100644 index 0000000..86822c2 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_library_common.html @@ -0,0 +1,177 @@ + + + + + + + +lib60870.NET: lib60870.LibraryCommon Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.LibraryCommon Class Reference
+
+
+ +

Common information functions about the library. + More...

+ + + + + +

+Static Public Member Functions

static string GetLibraryVersionString ()
 Gets the library version as string {major}.{minor}.{patch}.
 
+ + + + + + + + + + +

+Static Public Attributes

+const int VERSION_MAJOR = 2
 Library major version number.
 
+const int VERSION_MINOR = 3
 Library minor version number.
 
+const int VERSION_PATCH = 0
 Library patch number.
 
+

Detailed Description

+

Common information functions about the library.

+

Member Function Documentation

+ +

◆ GetLibraryVersionString()

+ +
+
+ + + + + +
+ + + + + + + +
static string lib60870.LibraryCommon.GetLibraryVersionString ()
+
+static
+
+ +

Gets the library version as string {major}.{minor}.{patch}.

+
Returns
The library version as string.
+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/LibraryCommon.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_single_command_qualifier-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_single_command_qualifier-members.html new file mode 100644 index 0000000..30a7634 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_single_command_qualifier-members.html @@ -0,0 +1,122 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.SingleCommandQualifier Member List
+
+
+ +

This is the complete list of members for lib60870.SingleCommandQualifier, including all inherited members.

+ + + + + + + +
GetEncodedValue() (defined in lib60870.SingleCommandQualifier)lib60870.SingleCommandQualifier
QU (defined in lib60870.SingleCommandQualifier)lib60870.SingleCommandQualifier
Select (defined in lib60870.SingleCommandQualifier)lib60870.SingleCommandQualifier
SingleCommandQualifier(byte encodedValue) (defined in lib60870.SingleCommandQualifier)lib60870.SingleCommandQualifier
SingleCommandQualifier(bool state, bool selectCommand, int qu) (defined in lib60870.SingleCommandQualifier)lib60870.SingleCommandQualifier
State (defined in lib60870.SingleCommandQualifier)lib60870.SingleCommandQualifier
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_single_command_qualifier.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_single_command_qualifier.html new file mode 100644 index 0000000..7d403ee --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1_single_command_qualifier.html @@ -0,0 +1,146 @@ + + + + + + + +lib60870.NET: lib60870.SingleCommandQualifier Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.SingleCommandQualifier Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

SingleCommandQualifier (byte encodedValue)
 
SingleCommandQualifier (bool state, bool selectCommand, int qu)
 
+byte GetEncodedValue ()
 
+ + + + + + + +

+Properties

+int QU [get]
 
+bool State [get]
 
+bool Select [get]
 
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SingleCommandQualifier.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception-members.html new file mode 100644 index 0000000..7971441 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception-members.html @@ -0,0 +1,120 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.linklayer.LinkLayerBusyException Member List
+
+
+ +

This is the complete list of members for lib60870.linklayer.LinkLayerBusyException, including all inherited members.

+ + + + + +
ConnectionException(string message) (defined in lib60870.ConnectionException)lib60870.ConnectionException
ConnectionException(string message, Exception e) (defined in lib60870.ConnectionException)lib60870.ConnectionException
LinkLayerBusyException(string message) (defined in lib60870.linklayer.LinkLayerBusyException)lib60870.linklayer.LinkLayerBusyException
LinkLayerBusyException(string message, Exception e) (defined in lib60870.linklayer.LinkLayerBusyException)lib60870.linklayer.LinkLayerBusyException
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception.html b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception.html new file mode 100644 index 0000000..108f62d --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception.html @@ -0,0 +1,147 @@ + + + + + + + +lib60870.NET: lib60870.linklayer.LinkLayerBusyException Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.linklayer.LinkLayerBusyException Class Reference
+
+
+
+Inheritance diagram for lib60870.linklayer.LinkLayerBusyException:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.linklayer.LinkLayerBusyException:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + +

+Public Member Functions

LinkLayerBusyException (string message)
 
LinkLayerBusyException (string message, Exception e)
 
- Public Member Functions inherited from lib60870.ConnectionException
ConnectionException (string message)
 
ConnectionException (string message, Exception e)
 
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/LinkLayer/PrimaryLinkLayer.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception__coll__graph.dot new file mode 100644 index 0000000..ec5dc38 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception__coll__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.linklayer.LinkLayerBusyException" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.linklayer.LinkLayer\lBusyException",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="lib60870::ConnectionException",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_connection_exception.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="Exception",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception__inherit__graph.dot new file mode 100644 index 0000000..ec5dc38 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.linklayer.LinkLayerBusyException" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.linklayer.LinkLayer\lBusyException",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="lib60870::ConnectionException",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_connection_exception.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="Exception",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_parameters-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_parameters-members.html new file mode 100644 index 0000000..b517ab3 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_parameters-members.html @@ -0,0 +1,121 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.linklayer.LinkLayerParameters Member List
+
+ +
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_parameters.html b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_parameters.html new file mode 100644 index 0000000..dbcbfc5 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_parameters.html @@ -0,0 +1,271 @@ + + + + + + + +lib60870.NET: lib60870.linklayer.LinkLayerParameters Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.linklayer.LinkLayerParameters Class Reference
+
+
+ +

Link layer specific parameters. + More...

+ + + + + + + + + + + + + + + + + +

+Properties

int AddressLength [get, set]
 Gets or sets the length of the link layer address field.
 
int TimeoutForACK [get, set]
 Gets or sets the timeout for message ACK.
 
long TimeoutRepeat [get, set]
 Gets or sets the timeout for message repetition in case of missing ACK messages.
 
bool UseSingleCharACK [get, set]
 Gets or sets a value indicating whether the secondary link layer uses single character ACK instead of FC 0 or FC 9.
 
int TimeoutLinkState [get, set]
 Gets or sets the interval to repeat request status of link (FC=9) after response timeout.
 
+

Detailed Description

+

Link layer specific parameters.

+

Property Documentation

+ +

◆ AddressLength

+ +
+
+ + + + + +
+ + + + +
int lib60870.linklayer.LinkLayerParameters.AddressLength
+
+getset
+
+ +

Gets or sets the length of the link layer address field.

+

The value can be either 0, 1, or 2 for balanced mode or 0, or 1 for unbalanced mode

+

The length of the address in byte

+ +
+
+ +

◆ TimeoutForACK

+ +
+
+ + + + + +
+ + + + +
int lib60870.linklayer.LinkLayerParameters.TimeoutForACK
+
+getset
+
+ +

Gets or sets the timeout for message ACK.

+

The timeout to wait for message ACK in ms

+ +
+
+ +

◆ TimeoutLinkState

+ +
+
+ + + + + +
+ + + + +
int lib60870.linklayer.LinkLayerParameters.TimeoutLinkState
+
+getset
+
+ +

Gets or sets the interval to repeat request status of link (FC=9) after response timeout.

+

the timeout value in ms

+ +
+
+ +

◆ TimeoutRepeat

+ +
+
+ + + + + +
+ + + + +
long lib60870.linklayer.LinkLayerParameters.TimeoutRepeat
+
+getset
+
+ +

Gets or sets the timeout for message repetition in case of missing ACK messages.

+

The timeout for message repetition in ms

+ +
+
+ +

◆ UseSingleCharACK

+ +
+
+ + + + + +
+ + + + +
bool lib60870.linklayer.LinkLayerParameters.UseSingleCharACK
+
+getset
+
+ +

Gets or sets a value indicating whether the secondary link layer uses single character ACK instead of FC 0 or FC 9.

+

true if use single char ACK; otherwise, false.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/LinkLayer/LinkLayer.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_parameters.js b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_parameters.js new file mode 100644 index 0000000..3b254cc --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_parameters.js @@ -0,0 +1,8 @@ +var classlib60870_1_1linklayer_1_1_link_layer_parameters = +[ + [ "AddressLength", "classlib60870_1_1linklayer_1_1_link_layer_parameters.html#abfa30c4ae394e96224933817b768d248", null ], + [ "TimeoutForACK", "classlib60870_1_1linklayer_1_1_link_layer_parameters.html#a2f97069460fa1a3873ca1cf91331d739", null ], + [ "TimeoutLinkState", "classlib60870_1_1linklayer_1_1_link_layer_parameters.html#ac79c13d5078a838e029e78a588e261a1", null ], + [ "TimeoutRepeat", "classlib60870_1_1linklayer_1_1_link_layer_parameters.html#a8907a50f70413012cf82de440e2b5581", null ], + [ "UseSingleCharACK", "classlib60870_1_1linklayer_1_1_link_layer_parameters.html#a35b88393725992cef49bbf6f7e196c5b", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port-members.html new file mode 100644 index 0000000..7a6af50 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port-members.html @@ -0,0 +1,134 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.linklayer.TcpClientVirtualSerialPort Member List
+
+
+ +

This is the complete list of members for lib60870.linklayer.TcpClientVirtualSerialPort, including all inherited members.

+ + + + + + + + + + + + + + + + + + + +
CanRead (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
CanSeek (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
CanTimeout (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
CanWrite (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
Connectedlib60870.linklayer.TcpClientVirtualSerialPort
DebugOutput (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
Flush() (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
Length (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
Position (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
Read(byte[] buffer, int offset, int count) (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
ReadTimeout (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
Seek(long offset, SeekOrigin origin) (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
SetLength(long value) (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
Start()lib60870.linklayer.TcpClientVirtualSerialPort
Stop()lib60870.linklayer.TcpClientVirtualSerialPort
TcpClientVirtualSerialPort(String hostname, int tcpPort=2404)lib60870.linklayer.TcpClientVirtualSerialPort
Write(byte[] buffer, int offset, int count) (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
WriteTimeout (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html new file mode 100644 index 0000000..4ca36eb --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html @@ -0,0 +1,256 @@ + + + + + + + +lib60870.NET: lib60870.linklayer.TcpClientVirtualSerialPort Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.linklayer.TcpClientVirtualSerialPort Class Reference
+
+
+ +

TCP client virtual serial port. Can be used to tunnel CS 101 protocol over TCP/IP. + More...

+
+Inheritance diagram for lib60870.linklayer.TcpClientVirtualSerialPort:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.linklayer.TcpClientVirtualSerialPort:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 TcpClientVirtualSerialPort (String hostname, int tcpPort=2404)
 Initializes a new instance of the lib60870.linklayer.TcpClientVirtualSerialPort class.
 
+void Start ()
 Start the virtual serial port (connect to server)
 
+void Stop ()
 Stop the virtual serial port.
 
+override int Read (byte[] buffer, int offset, int count)
 
+override void Write (byte[] buffer, int offset, int count)
 
+override long Seek (long offset, SeekOrigin origin)
 
+override void Flush ()
 
+override void SetLength (long value)
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Properties

bool Connected [get]
 Gets a value indicating whether this lib60870.linklayer.TcpClientVirtualSerialPort is connected to a server.
 
+bool DebugOutput [get, set]
 
+override bool CanRead [get]
 
+override bool CanSeek [get]
 
+override bool CanTimeout [get]
 
+override bool CanWrite [get]
 
+override long Length [get]
 
+override long Position [get, set]
 
+override int ReadTimeout [get, set]
 
+override int WriteTimeout [get, set]
 
+

Detailed Description

+

TCP client virtual serial port. Can be used to tunnel CS 101 protocol over TCP/IP.

+

Constructor & Destructor Documentation

+ +

◆ TcpClientVirtualSerialPort()

+ +
+
+ + + + + + + + + + + +
lib60870.linklayer.TcpClientVirtualSerialPort.TcpClientVirtualSerialPort (String hostname,
int tcpPort = 2404 )
+
+ +

Initializes a new instance of the lib60870.linklayer.TcpClientVirtualSerialPort class.

+
Parameters
+ + + +
hostnameIP address of the server
tcpPortTCP port of the server
+
+
+ +
+
+

Property Documentation

+ +

◆ Connected

+ +
+
+ + + + + +
+ + + + +
bool lib60870.linklayer.TcpClientVirtualSerialPort.Connected
+
+get
+
+ +

Gets a value indicating whether this lib60870.linklayer.TcpClientVirtualSerialPort is connected to a server.

+

true if connected; otherwise, false.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/LinkLayer/TcpClientVirtualSerialPort.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.js b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.js new file mode 100644 index 0000000..1081bff --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.js @@ -0,0 +1,7 @@ +var classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port = +[ + [ "TcpClientVirtualSerialPort", "classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html#a38baef0d15205486d0f5d07106473836", null ], + [ "Start", "classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html#a1417a91389e864dd32cff7e80def1021", null ], + [ "Stop", "classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html#aba1035cd8d8a91290dd7d19ec48bfb34", null ], + [ "Connected", "classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html#a8e6479066b29f09067340b7fc1b29cbc", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port__coll__graph.dot new file mode 100644 index 0000000..025be12 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.linklayer.TcpClientVirtualSerialPort" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.linklayer.TcpClient\lVirtualSerialPort",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="TCP client virtual serial port. Can be used to tunnel CS 101 protocol over TCP/IP."]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Stream",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port__inherit__graph.dot new file mode 100644 index 0000000..025be12 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.linklayer.TcpClientVirtualSerialPort" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.linklayer.TcpClient\lVirtualSerialPort",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="TCP client virtual serial port. Can be used to tunnel CS 101 protocol over TCP/IP."]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Stream",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port-members.html new file mode 100644 index 0000000..3f598dd --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port-members.html @@ -0,0 +1,136 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.linklayer.TcpServerVirtualSerialPort Member List
+
+
+ +

This is the complete list of members for lib60870.linklayer.TcpServerVirtualSerialPort, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + +
CanRead (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
CanSeek (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
CanTimeout (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
CanWrite (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
DebugOutput (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
Flush() (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
Length (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
Position (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
Read(byte[] buffer, int offset, int count) (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
ReadTimeout (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
Seek(long offset, SeekOrigin origin) (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
SetConnectionRequestHandler(TcpConnectionEventHandler handler, object parameter) (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
SetLength(long value) (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
SetLocalAddress(string localAddress)lib60870.linklayer.TcpServerVirtualSerialPort
SetTcpPort(int tcpPort) (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
Start() (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
Stop() (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
TcpServerVirtualSerialPort() (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
Write(byte[] buffer, int offset, int count) (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
WriteTimeout (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.html b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.html new file mode 100644 index 0000000..560a2e7 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.html @@ -0,0 +1,221 @@ + + + + + + + +lib60870.NET: lib60870.linklayer.TcpServerVirtualSerialPort Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.linklayer.TcpServerVirtualSerialPort Class Reference
+
+
+
+Inheritance diagram for lib60870.linklayer.TcpServerVirtualSerialPort:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for lib60870.linklayer.TcpServerVirtualSerialPort:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+void SetConnectionRequestHandler (TcpConnectionEventHandler handler, object parameter)
 
void SetLocalAddress (string localAddress)
 Sets the local address to used.
 
+void SetTcpPort (int tcpPort)
 
+void Start ()
 
+void Stop ()
 
+override int Read (byte[] buffer, int offset, int count)
 
+override void Write (byte[] buffer, int offset, int count)
 
+override long Seek (long offset, SeekOrigin origin)
 
+override void Flush ()
 
+override void SetLength (long value)
 
+ + + + + + + + + + + + + + + + + + + +

+Properties

+bool DebugOutput [get, set]
 
+override bool CanRead [get]
 
+override bool CanSeek [get]
 
+override bool CanTimeout [get]
 
+override bool CanWrite [get]
 
+override long Length [get]
 
+override long Position [get, set]
 
+override int ReadTimeout [get, set]
 
+override int WriteTimeout [get, set]
 
+

Member Function Documentation

+ +

◆ SetLocalAddress()

+ +
+
+ + + + + + + +
void lib60870.linklayer.TcpServerVirtualSerialPort.SetLocalAddress (string localAddress)
+
+ +

Sets the local address to used.

+
Parameters
+ + +
localAddressLocal address. Use "0.0.0.0" for all interfaces(default)
+
+
+ +
+
+
The documentation for this class was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/LinkLayer/TcpServerVirtualSerialPort.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.js b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.js new file mode 100644 index 0000000..b641739 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.js @@ -0,0 +1,4 @@ +var classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port = +[ + [ "SetLocalAddress", "classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.html#a52cf94c390fdb9de1da505a259dc85a1", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port__coll__graph.dot new file mode 100644 index 0000000..2129294 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port__coll__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.linklayer.TcpServerVirtualSerialPort" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.linklayer.TcpServer\lVirtualSerialPort",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Stream",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port__inherit__graph.dot new file mode 100644 index 0000000..2129294 --- /dev/null +++ b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.linklayer.TcpServerVirtualSerialPort" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.linklayer.TcpServer\lVirtualSerialPort",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Stream",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/clipboard.js b/doxygen/doxydoc.NET/html/clipboard.js new file mode 100644 index 0000000..42c1fb0 --- /dev/null +++ b/doxygen/doxydoc.NET/html/clipboard.js @@ -0,0 +1,61 @@ +/** + +The code below is based on the Doxygen Awesome project, see +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2022 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +let clipboard_title = "Copy to clipboard" +let clipboard_icon = `` +let clipboard_successIcon = `` +let clipboard_successDuration = 1000 + +$(function() { + if(navigator.clipboard) { + const fragments = document.getElementsByClassName("fragment") + for(const fragment of fragments) { + const clipboard_div = document.createElement("div") + clipboard_div.classList.add("clipboard") + clipboard_div.innerHTML = clipboard_icon + clipboard_div.title = clipboard_title + $(clipboard_div).click(function() { + const content = this.parentNode.cloneNode(true) + // filter out line number and folded fragments from file listings + content.querySelectorAll(".lineno, .ttc, .foldclosed").forEach((node) => { node.remove() }) + let text = content.textContent + // remove trailing newlines and trailing spaces from empty lines + text = text.replace(/^\s*\n/gm,'\n').replace(/\n*$/,'') + navigator.clipboard.writeText(text); + this.classList.add("success") + this.innerHTML = clipboard_successIcon + window.setTimeout(() => { // switch back to normal icon after timeout + this.classList.remove("success") + this.innerHTML = clipboard_icon + }, clipboard_successDuration); + }) + fragment.insertBefore(clipboard_div, fragment.firstChild) + } + } +}) diff --git a/doxygen/doxydoc.NET/html/closed.png b/doxygen/doxydoc.NET/html/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 HcmV?d00001 diff --git a/doxygen/doxydoc.NET/html/cookie.js b/doxygen/doxydoc.NET/html/cookie.js new file mode 100644 index 0000000..53ad21d --- /dev/null +++ b/doxygen/doxydoc.NET/html/cookie.js @@ -0,0 +1,58 @@ +/*! + Cookie helper functions + Copyright (c) 2023 Dimitri van Heesch + Released under MIT license. +*/ +let Cookie = { + cookie_namespace: 'doxygen_', + + readSetting(cookie,defVal) { + if (window.chrome) { + const val = localStorage.getItem(this.cookie_namespace+cookie) || + sessionStorage.getItem(this.cookie_namespace+cookie); + if (val) return val; + } else { + let myCookie = this.cookie_namespace+cookie+"="; + if (document.cookie) { + const index = document.cookie.indexOf(myCookie); + if (index != -1) { + const valStart = index + myCookie.length; + let valEnd = document.cookie.indexOf(";", valStart); + if (valEnd == -1) { + valEnd = document.cookie.length; + } + return document.cookie.substring(valStart, valEnd); + } + } + } + return defVal; + }, + + writeSetting(cookie,val,days=10*365) { // default days='forever', 0=session cookie, -1=delete + if (window.chrome) { + if (days==0) { + sessionStorage.setItem(this.cookie_namespace+cookie,val); + } else { + localStorage.setItem(this.cookie_namespace+cookie,val); + } + } else { + let date = new Date(); + date.setTime(date.getTime()+(days*24*60*60*1000)); + const expiration = days!=0 ? "expires="+date.toGMTString()+";" : ""; + document.cookie = this.cookie_namespace + cookie + "=" + + val + "; SameSite=Lax;" + expiration + "path=/"; + } + }, + + eraseSetting(cookie) { + if (window.chrome) { + if (localStorage.getItem(this.cookie_namespace+cookie)) { + localStorage.removeItem(this.cookie_namespace+cookie); + } else if (sessionStorage.getItem(this.cookie_namespace+cookie)) { + sessionStorage.removeItem(this.cookie_namespace+cookie); + } + } else { + this.writeSetting(cookie,'',-1); + } + }, +} diff --git a/doxygen/doxydoc.NET/html/dir_1426ccace41ffc2cc2eca9b41b45b309.html b/doxygen/doxydoc.NET/html/dir_1426ccace41ffc2cc2eca9b41b45b309.html new file mode 100644 index 0000000..be72f81 --- /dev/null +++ b/doxygen/doxydoc.NET/html/dir_1426ccace41ffc2cc2eca9b41b45b309.html @@ -0,0 +1,119 @@ + + + + + + + +lib60870.NET: C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj Directory Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
obj Directory Reference
+
+
+
+Directory dependency graph for obj:
+
+
C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj
+
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/dir_1426ccace41ffc2cc2eca9b41b45b309_dep.dot b/doxygen/doxydoc.NET/html/dir_1426ccace41ffc2cc2eca9b41b45b309_dep.dot new file mode 100644 index 0000000..daf98e0 --- /dev/null +++ b/doxygen/doxydoc.NET/html/dir_1426ccace41ffc2cc2eca9b41b45b309_dep.dot @@ -0,0 +1,17 @@ +digraph "C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + compound=true + subgraph clusterdir_d8978c4994c85815b95534f7a21d38a3 { + graph [ bgcolor="#edf0f7", pencolor="grey25", label="lib60870", fontname=Helvetica,fontsize=10 style="filled,dashed", URL="dir_d8978c4994c85815b95534f7a21d38a3.html",tooltip=""] + subgraph clusterdir_1426ccace41ffc2cc2eca9b41b45b309 { + graph [ bgcolor="#edf0f7", pencolor="grey25", label="", fontname=Helvetica,fontsize=10 style="filled,bold", URL="dir_1426ccace41ffc2cc2eca9b41b45b309.html",tooltip=""] + dir_1426ccace41ffc2cc2eca9b41b45b309 [shape=plaintext, label="obj"]; + dir_b0a5ae503da9b14c7a6f4a2af13537d9 [label="Debug", fillcolor="#a2b4d6", color="grey25", style="filled", URL="dir_b0a5ae503da9b14c7a6f4a2af13537d9.html",tooltip=""]; + dir_b850c7c61d39a008cf3688cd306216ed [label="x86", fillcolor="#a2b4d6", color="grey25", style="filled", URL="dir_b850c7c61d39a008cf3688cd306216ed.html",tooltip=""]; + } + } +} diff --git a/doxygen/doxydoc.NET/html/dir_3a7e63ee7cf2b5c4d7f4a7d7af5f0b48.html b/doxygen/doxydoc.NET/html/dir_3a7e63ee7cf2b5c4d7f4a7d7af5f0b48.html new file mode 100644 index 0000000..21988e9 --- /dev/null +++ b/doxygen/doxydoc.NET/html/dir_3a7e63ee7cf2b5c4d7f4a7d7af5f0b48.html @@ -0,0 +1,119 @@ + + + + + + + +lib60870.NET: C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/LinkLayer Directory Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
LinkLayer Directory Reference
+
+
+
+Directory dependency graph for LinkLayer:
+
+
C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/LinkLayer
+
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/dir_3a7e63ee7cf2b5c4d7f4a7d7af5f0b48_dep.dot b/doxygen/doxydoc.NET/html/dir_3a7e63ee7cf2b5c4d7f4a7d7af5f0b48_dep.dot new file mode 100644 index 0000000..b652ac8 --- /dev/null +++ b/doxygen/doxydoc.NET/html/dir_3a7e63ee7cf2b5c4d7f4a7d7af5f0b48_dep.dot @@ -0,0 +1,12 @@ +digraph "C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/LinkLayer" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + compound=true + subgraph clusterdir_d8978c4994c85815b95534f7a21d38a3 { + graph [ bgcolor="#edf0f7", pencolor="grey25", label="lib60870", fontname=Helvetica,fontsize=10 style="filled,dashed", URL="dir_d8978c4994c85815b95534f7a21d38a3.html",tooltip=""] + dir_3a7e63ee7cf2b5c4d7f4a7d7af5f0b48 [label="LinkLayer", fillcolor="#edf0f7", color="grey25", style="filled,bold", URL="dir_3a7e63ee7cf2b5c4d7f4a7d7af5f0b48.html",tooltip=""]; + } +} diff --git a/doxygen/doxydoc.NET/html/dir_78da73360675c066effe4a54d369d8c9.html b/doxygen/doxydoc.NET/html/dir_78da73360675c066effe4a54d369d8c9.html new file mode 100644 index 0000000..7f4387d --- /dev/null +++ b/doxygen/doxydoc.NET/html/dir_78da73360675c066effe4a54d369d8c9.html @@ -0,0 +1,119 @@ + + + + + + + +lib60870.NET: C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj/Debug/netstandard2.0 Directory Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
netstandard2.0 Directory Reference
+
+
+
+Directory dependency graph for netstandard2.0:
+
+
C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj/Debug/netstandard2.0
+
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/dir_78da73360675c066effe4a54d369d8c9_dep.dot b/doxygen/doxydoc.NET/html/dir_78da73360675c066effe4a54d369d8c9_dep.dot new file mode 100644 index 0000000..f16f0b3 --- /dev/null +++ b/doxygen/doxydoc.NET/html/dir_78da73360675c066effe4a54d369d8c9_dep.dot @@ -0,0 +1,12 @@ +digraph "C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj/Debug/netstandard2.0" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + compound=true + subgraph clusterdir_b0a5ae503da9b14c7a6f4a2af13537d9 { + graph [ bgcolor="#edf0f7", pencolor="grey50", label="Debug", fontname=Helvetica,fontsize=10 style="filled,dashed", URL="dir_b0a5ae503da9b14c7a6f4a2af13537d9.html",tooltip=""] + dir_78da73360675c066effe4a54d369d8c9 [label="netstandard2.0", fillcolor="#edf0f7", color="grey25", style="filled,bold", URL="dir_78da73360675c066effe4a54d369d8c9.html",tooltip=""]; + } +} diff --git a/doxygen/doxydoc.NET/html/dir_81ad2ef2a5969c1913fa2b2ec7ae6d60.html b/doxygen/doxydoc.NET/html/dir_81ad2ef2a5969c1913fa2b2ec7ae6d60.html new file mode 100644 index 0000000..317768f --- /dev/null +++ b/doxygen/doxydoc.NET/html/dir_81ad2ef2a5969c1913fa2b2ec7ae6d60.html @@ -0,0 +1,119 @@ + + + + + + + +lib60870.NET: C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS104 Directory Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
CS104 Directory Reference
+
+
+
+Directory dependency graph for CS104:
+
+
C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS104
+
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/dir_81ad2ef2a5969c1913fa2b2ec7ae6d60_dep.dot b/doxygen/doxydoc.NET/html/dir_81ad2ef2a5969c1913fa2b2ec7ae6d60_dep.dot new file mode 100644 index 0000000..e287100 --- /dev/null +++ b/doxygen/doxydoc.NET/html/dir_81ad2ef2a5969c1913fa2b2ec7ae6d60_dep.dot @@ -0,0 +1,12 @@ +digraph "C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS104" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + compound=true + subgraph clusterdir_d8978c4994c85815b95534f7a21d38a3 { + graph [ bgcolor="#edf0f7", pencolor="grey25", label="lib60870", fontname=Helvetica,fontsize=10 style="filled,dashed", URL="dir_d8978c4994c85815b95534f7a21d38a3.html",tooltip=""] + dir_81ad2ef2a5969c1913fa2b2ec7ae6d60 [label="CS104", fillcolor="#edf0f7", color="grey25", style="filled,bold", URL="dir_81ad2ef2a5969c1913fa2b2ec7ae6d60.html",tooltip=""]; + } +} diff --git a/doxygen/doxydoc.NET/html/dir_8ef50c26ad56f3b20d037a50a7a693a6.html b/doxygen/doxydoc.NET/html/dir_8ef50c26ad56f3b20d037a50a7a693a6.html new file mode 100644 index 0000000..79e2775 --- /dev/null +++ b/doxygen/doxydoc.NET/html/dir_8ef50c26ad56f3b20d037a50a7a693a6.html @@ -0,0 +1,119 @@ + + + + + + + +lib60870.NET: C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101 Directory Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
CS101 Directory Reference
+
+
+
+Directory dependency graph for CS101:
+
+
C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101
+
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/dir_8ef50c26ad56f3b20d037a50a7a693a6_dep.dot b/doxygen/doxydoc.NET/html/dir_8ef50c26ad56f3b20d037a50a7a693a6_dep.dot new file mode 100644 index 0000000..56b62da --- /dev/null +++ b/doxygen/doxydoc.NET/html/dir_8ef50c26ad56f3b20d037a50a7a693a6_dep.dot @@ -0,0 +1,12 @@ +digraph "C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + compound=true + subgraph clusterdir_d8978c4994c85815b95534f7a21d38a3 { + graph [ bgcolor="#edf0f7", pencolor="grey25", label="lib60870", fontname=Helvetica,fontsize=10 style="filled,dashed", URL="dir_d8978c4994c85815b95534f7a21d38a3.html",tooltip=""] + dir_8ef50c26ad56f3b20d037a50a7a693a6 [label="CS101", fillcolor="#edf0f7", color="grey25", style="filled,bold", URL="dir_8ef50c26ad56f3b20d037a50a7a693a6.html",tooltip=""]; + } +} diff --git a/doxygen/doxydoc.NET/html/dir_93f3e8569115651ede3b56a0e65cbd1f.html b/doxygen/doxydoc.NET/html/dir_93f3e8569115651ede3b56a0e65cbd1f.html new file mode 100644 index 0000000..305224d --- /dev/null +++ b/doxygen/doxydoc.NET/html/dir_93f3e8569115651ede3b56a0e65cbd1f.html @@ -0,0 +1,119 @@ + + + + + + + +lib60870.NET: C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/Properties Directory Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Properties Directory Reference
+
+
+
+Directory dependency graph for Properties:
+
+
C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/Properties
+
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/dir_93f3e8569115651ede3b56a0e65cbd1f_dep.dot b/doxygen/doxydoc.NET/html/dir_93f3e8569115651ede3b56a0e65cbd1f_dep.dot new file mode 100644 index 0000000..b341a79 --- /dev/null +++ b/doxygen/doxydoc.NET/html/dir_93f3e8569115651ede3b56a0e65cbd1f_dep.dot @@ -0,0 +1,12 @@ +digraph "C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/Properties" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + compound=true + subgraph clusterdir_d8978c4994c85815b95534f7a21d38a3 { + graph [ bgcolor="#edf0f7", pencolor="grey25", label="lib60870", fontname=Helvetica,fontsize=10 style="filled,dashed", URL="dir_d8978c4994c85815b95534f7a21d38a3.html",tooltip=""] + dir_93f3e8569115651ede3b56a0e65cbd1f [label="Properties", fillcolor="#edf0f7", color="grey25", style="filled,bold", URL="dir_93f3e8569115651ede3b56a0e65cbd1f.html",tooltip=""]; + } +} diff --git a/doxygen/doxydoc.NET/html/dir_b0a5ae503da9b14c7a6f4a2af13537d9.html b/doxygen/doxydoc.NET/html/dir_b0a5ae503da9b14c7a6f4a2af13537d9.html new file mode 100644 index 0000000..83f4e95 --- /dev/null +++ b/doxygen/doxydoc.NET/html/dir_b0a5ae503da9b14c7a6f4a2af13537d9.html @@ -0,0 +1,125 @@ + + + + + + + +lib60870.NET: C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj/Debug Directory Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Debug Directory Reference
+
+
+
+Directory dependency graph for Debug:
+
+
C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj/Debug
+
+ + + + +

+Directories

 netstandard2.0
 
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/dir_b0a5ae503da9b14c7a6f4a2af13537d9_dep.dot b/doxygen/doxydoc.NET/html/dir_b0a5ae503da9b14c7a6f4a2af13537d9_dep.dot new file mode 100644 index 0000000..b58a4c9 --- /dev/null +++ b/doxygen/doxydoc.NET/html/dir_b0a5ae503da9b14c7a6f4a2af13537d9_dep.dot @@ -0,0 +1,16 @@ +digraph "C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj/Debug" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + compound=true + subgraph clusterdir_1426ccace41ffc2cc2eca9b41b45b309 { + graph [ bgcolor="#edf0f7", pencolor="grey50", label="obj", fontname=Helvetica,fontsize=10 style="filled,dashed", URL="dir_1426ccace41ffc2cc2eca9b41b45b309.html",tooltip=""] + subgraph clusterdir_b0a5ae503da9b14c7a6f4a2af13537d9 { + graph [ bgcolor="#edf0f7", pencolor="grey25", label="", fontname=Helvetica,fontsize=10 style="filled,bold", URL="dir_b0a5ae503da9b14c7a6f4a2af13537d9.html",tooltip=""] + dir_b0a5ae503da9b14c7a6f4a2af13537d9 [shape=plaintext, label="Debug"]; + dir_78da73360675c066effe4a54d369d8c9 [label="netstandard2.0", fillcolor="#a2b4d6", color="grey25", style="filled", URL="dir_78da73360675c066effe4a54d369d8c9.html",tooltip=""]; + } + } +} diff --git a/doxygen/doxydoc.NET/html/dir_b850c7c61d39a008cf3688cd306216ed.html b/doxygen/doxydoc.NET/html/dir_b850c7c61d39a008cf3688cd306216ed.html new file mode 100644 index 0000000..d5fe4b4 --- /dev/null +++ b/doxygen/doxydoc.NET/html/dir_b850c7c61d39a008cf3688cd306216ed.html @@ -0,0 +1,125 @@ + + + + + + + +lib60870.NET: C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj/x86 Directory Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
x86 Directory Reference
+
+
+
+Directory dependency graph for x86:
+
+
C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj/x86
+
+ + + + +

+Directories

 Debug
 
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/dir_b850c7c61d39a008cf3688cd306216ed_dep.dot b/doxygen/doxydoc.NET/html/dir_b850c7c61d39a008cf3688cd306216ed_dep.dot new file mode 100644 index 0000000..9d1248c --- /dev/null +++ b/doxygen/doxydoc.NET/html/dir_b850c7c61d39a008cf3688cd306216ed_dep.dot @@ -0,0 +1,16 @@ +digraph "C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj/x86" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + compound=true + subgraph clusterdir_1426ccace41ffc2cc2eca9b41b45b309 { + graph [ bgcolor="#edf0f7", pencolor="grey50", label="obj", fontname=Helvetica,fontsize=10 style="filled,dashed", URL="dir_1426ccace41ffc2cc2eca9b41b45b309.html",tooltip=""] + subgraph clusterdir_b850c7c61d39a008cf3688cd306216ed { + graph [ bgcolor="#edf0f7", pencolor="grey25", label="", fontname=Helvetica,fontsize=10 style="filled,bold", URL="dir_b850c7c61d39a008cf3688cd306216ed.html",tooltip=""] + dir_b850c7c61d39a008cf3688cd306216ed [shape=plaintext, label="x86"]; + dir_e363fa5d362eba4388eff3f3f5e37912 [label="Debug", fillcolor="#a2b4d6", color="grey25", style="filled", URL="dir_e363fa5d362eba4388eff3f3f5e37912.html",tooltip=""]; + } + } +} diff --git a/doxygen/doxydoc.NET/html/dir_d8978c4994c85815b95534f7a21d38a3.html b/doxygen/doxydoc.NET/html/dir_d8978c4994c85815b95534f7a21d38a3.html new file mode 100644 index 0000000..0a815f0 --- /dev/null +++ b/doxygen/doxydoc.NET/html/dir_d8978c4994c85815b95534f7a21d38a3.html @@ -0,0 +1,126 @@ + + + + + + + +lib60870.NET: C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870 Directory Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870 Directory Reference
+
+
+ + + + + + + + + + +

+Directories

 CS101
 
 CS104
 
 LinkLayer
 
 Properties
 
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/dir_e363fa5d362eba4388eff3f3f5e37912.html b/doxygen/doxydoc.NET/html/dir_e363fa5d362eba4388eff3f3f5e37912.html new file mode 100644 index 0000000..9d3cf05 --- /dev/null +++ b/doxygen/doxydoc.NET/html/dir_e363fa5d362eba4388eff3f3f5e37912.html @@ -0,0 +1,119 @@ + + + + + + + +lib60870.NET: C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj/x86/Debug Directory Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Debug Directory Reference
+
+
+
+Directory dependency graph for Debug:
+
+
C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj/x86/Debug
+
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/dir_e363fa5d362eba4388eff3f3f5e37912_dep.dot b/doxygen/doxydoc.NET/html/dir_e363fa5d362eba4388eff3f3f5e37912_dep.dot new file mode 100644 index 0000000..340792a --- /dev/null +++ b/doxygen/doxydoc.NET/html/dir_e363fa5d362eba4388eff3f3f5e37912_dep.dot @@ -0,0 +1,12 @@ +digraph "C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj/x86/Debug" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + compound=true + subgraph clusterdir_b850c7c61d39a008cf3688cd306216ed { + graph [ bgcolor="#edf0f7", pencolor="grey50", label="x86", fontname=Helvetica,fontsize=10 style="filled,dashed", URL="dir_b850c7c61d39a008cf3688cd306216ed.html",tooltip=""] + dir_e363fa5d362eba4388eff3f3f5e37912 [label="Debug", fillcolor="#edf0f7", color="grey25", style="filled,bold", URL="dir_e363fa5d362eba4388eff3f3f5e37912.html",tooltip=""]; + } +} diff --git a/doxygen/doxydoc.NET/html/doc.svg b/doxygen/doxydoc.NET/html/doc.svg new file mode 100644 index 0000000..0b928a5 --- /dev/null +++ b/doxygen/doxydoc.NET/html/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doxygen/doxydoc.NET/html/docd.svg b/doxygen/doxydoc.NET/html/docd.svg new file mode 100644 index 0000000..ac18b27 --- /dev/null +++ b/doxygen/doxydoc.NET/html/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doxygen/doxydoc.NET/html/doxygen.css b/doxygen/doxydoc.NET/html/doxygen.css new file mode 100644 index 0000000..209912c --- /dev/null +++ b/doxygen/doxydoc.NET/html/doxygen.css @@ -0,0 +1,2244 @@ +/* The standard CSS for doxygen 1.11.0*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--fragment-copy-ok-color: #2EC82E; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +/** special sections */ +--warning-color-bg: #f8d1cc; +--warning-color-hl: #b61825; +--warning-color-text: #75070f; +--note-color-bg: #faf3d8; +--note-color-hl: #f3a600; +--note-color-text: #5f4204; +--todo-color-bg: #e4f3ff; +--todo-color-hl: #1879C4; +--todo-color-text: #274a5c; +--test-color-bg: #e8e8ff; +--test-color-hl: #3939C4; +--test-color-text: #1a1a5c; +--deprecated-color-bg: #ecf0f3; +--deprecated-color-hl: #5b6269; +--deprecated-color-text: #43454a; +--bug-color-bg: #e4dafd; +--bug-color-hl: #5b2bdd; +--bug-color-text: #2a0d72; +--invariant-color-bg: #d8f1e3; +--invariant-color-hl: #44b86f; +--invariant-color-text: #265532; +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: #090D16; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--fragment-copy-ok-color: #0EA80E; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +/** special sections */ +--warning-color-bg: #2e1917; +--warning-color-hl: #ad2617; +--warning-color-text: #f5b1aa; +--note-color-bg: #3b2e04; +--note-color-hl: #f1b602; +--note-color-text: #ceb670; +--todo-color-bg: #163750; +--todo-color-hl: #1982D2; +--todo-color-text: #dcf0fa; +--test-color-bg: #121258; +--test-color-hl: #4242cf; +--test-color-text: #c0c0da; +--deprecated-color-bg: #2e323b; +--deprecated-color-hl: #738396; +--deprecated-color-text: #abb0bd; +--bug-color-bg: #2a2536; +--bug-color-hl: #7661b3; +--bug-color-text: #ae9ed6; +--invariant-color-bg: #303a35; +--invariant-color-hl: #76ce96; +--invariant-color-text: #cceed5; +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: none; + background: linear-gradient(to bottom, transparent 0,transparent calc(100% - 1px), currentColor 100%); +} + +a:hover > span.arrow { + text-decoration: none; + background : var(--nav-background-color); +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul.check { + list-style:none; + text-indent: -16px; + padding-left: 38px; +} +li.unchecked:before { + content: "\2610\A0"; +} +li.checked:before { + content: "\2611\A0"; +} + +ol { + text-indent: 0px; +} + +ul { + text-indent: 0px; + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; + overflow-y: hidden; + position: relative; + min-height: 12px; + margin: 10px 0px; + padding: 10px 10px; + border: 1px solid var(--fragment-border-color); + border-radius: 4px; + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); +} + +pre.fragment { + word-wrap: break-word; + font-size: 10pt; + line-height: 125%; + font-family: var(--font-family-monospace); +} + +.clipboard { + width: 24px; + height: 24px; + right: 5px; + top: 5px; + opacity: 0; + position: absolute; + display: inline; + overflow: auto; + fill: var(--fragment-foreground-color); + justify-content: center; + align-items: center; + cursor: pointer; +} + +.clipboard.success { + border: 1px solid var(--fragment-foreground-color); + border-radius: 4px; +} + +.fragment:hover .clipboard, .clipboard.success { + opacity: .28; +} + +.clipboard:hover, .clipboard.success { + opacity: 1 !important; +} + +.clipboard:active:not([class~=success]) svg { + transform: scale(.91); +} + +.clipboard.success svg { + fill: var(--fragment-copy-ok-color); +} + +.clipboard.success { + border-color: var(--fragment-copy-ok-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; + padding: 0px; + padding-bottom: 1px; +} + +.paramname { + white-space: nowrap; + padding: 0px; + padding-bottom: 1px; + margin-left: 2px; +} + +.paramname em { + color: var(--memdef-param-name-color); + font-style: normal; + margin-right: 1px; +} + +.paramname .paramdefval { + font-family: var(--font-family-monospace); +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* + +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention, dl.important { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +*/ + +dl.bug dt a, dl.deprecated dt a, dl.todo dt a, dl.test a { + font-weight: bold !important; +} + +dl.warning, dl.attention, dl.important, dl.note, dl.deprecated, dl.bug, +dl.invariant, dl.pre, dl.post, dl.todo, dl.test, dl.remark { + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; + border-radius: 4px; +} + +dl.section dd { + margin-bottom: 2px; +} + +dl.warning, dl.attention, dl.important { + background: var(--warning-color-bg); + border-left: 8px solid var(--warning-color-hl); + color: var(--warning-color-text); +} + +dl.warning dt, dl.attention dt, dl.important dt { + color: var(--warning-color-hl); +} + +dl.note, dl.remark { + background: var(--note-color-bg); + border-left: 8px solid var(--note-color-hl); + color: var(--note-color-text); +} + +dl.note dt, dl.remark dt { + color: var(--note-color-hl); +} + +dl.todo { + background: var(--todo-color-bg); + border-left: 8px solid var(--todo-color-hl); + color: var(--todo-color-text); +} + +dl.todo dt { + color: var(--todo-color-hl); +} + +dl.test { + background: var(--test-color-bg); + border-left: 8px solid var(--test-color-hl); + color: var(--test-color-text); +} + +dl.test dt { + color: var(--test-color-hl); +} + +dl.bug dt a { + color: var(--bug-color-hl) !important; +} + +dl.bug { + background: var(--bug-color-bg); + border-left: 8px solid var(--bug-color-hl); + color: var(--bug-color-text); +} + +dl.bug dt a { + color: var(--bug-color-hl) !important; +} + +dl.deprecated { + background: var(--deprecated-color-bg); + border-left: 8px solid var(--deprecated-color-hl); + color: var(--deprecated-color-text); +} + +dl.deprecated dt a { + color: var(--deprecated-color-hl) !important; +} + +dl.note dd, dl.warning dd, dl.pre dd, dl.post dd, +dl.remark dd, dl.attention dd, dl.important dd, dl.invariant dd, +dl.bug dd, dl.deprecated dd, dl.todo dd, dl.test dd { + margin-inline-start: 0px; +} + +dl.invariant, dl.pre, dl.post { + background: var(--invariant-color-bg); + border-left: 8px solid var(--invariant-color-hl); + color: var(--invariant-color-text); +} + +dl.invariant dt, dl.pre dt, dl.post dt { + color: var(--invariant-color-hl); +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/doxygen/doxydoc.NET/html/doxygen.svg b/doxygen/doxydoc.NET/html/doxygen.svg new file mode 100644 index 0000000..79a7635 --- /dev/null +++ b/doxygen/doxydoc.NET/html/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doxygen/doxydoc.NET/html/doxygen_crawl.html b/doxygen/doxydoc.NET/html/doxygen_crawl.html new file mode 100644 index 0000000..83baf4f --- /dev/null +++ b/doxygen/doxydoc.NET/html/doxygen_crawl.html @@ -0,0 +1,937 @@ + + + +Validator / crawler helper + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doxygen/doxydoc.NET/html/dynsections.js b/doxygen/doxydoc.NET/html/dynsections.js new file mode 100644 index 0000000..b05f4c8 --- /dev/null +++ b/doxygen/doxydoc.NET/html/dynsections.js @@ -0,0 +1,198 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +function toggleVisibility(linkObj) { + return dynsection.toggleVisibility(linkObj); +} + +let dynsection = { + + // helper function + updateStripes : function() { + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); + }, + + toggleVisibility : function(linkObj) { + const base = $(linkObj).attr('id'); + const summary = $('#'+base+'-summary'); + const content = $('#'+base+'-content'); + const trigger = $('#'+base+'-trigger'); + const src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; + }, + + toggleLevel : function(level) { + $('table.directory tr').each(function() { + const l = this.id.split('_').length-1; + const i = $('#img'+this.id.substring(3)); + const a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + const id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + const start = $(this).attr('data-start'); + const end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + const line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',codefold.plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); + }, +}; +/* @license-end */ diff --git a/doxygen/doxydoc.NET/html/folderclosed.svg b/doxygen/doxydoc.NET/html/folderclosed.svg new file mode 100644 index 0000000..b04bed2 --- /dev/null +++ b/doxygen/doxydoc.NET/html/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doxygen/doxydoc.NET/html/folderclosedd.svg b/doxygen/doxydoc.NET/html/folderclosedd.svg new file mode 100644 index 0000000..52f0166 --- /dev/null +++ b/doxygen/doxydoc.NET/html/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doxygen/doxydoc.NET/html/folderopen.svg b/doxygen/doxydoc.NET/html/folderopen.svg new file mode 100644 index 0000000..f6896dd --- /dev/null +++ b/doxygen/doxydoc.NET/html/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/doxygen/doxydoc.NET/html/folderopend.svg b/doxygen/doxydoc.NET/html/folderopend.svg new file mode 100644 index 0000000..2d1f06e --- /dev/null +++ b/doxygen/doxydoc.NET/html/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doxygen/doxydoc.NET/html/functions.html b/doxygen/doxydoc.NET/html/functions.html new file mode 100644 index 0000000..30a18e7 --- /dev/null +++ b/doxygen/doxydoc.NET/html/functions.html @@ -0,0 +1,124 @@ + + + + + + + +lib60870.NET: Class Members + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- a -

+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/functions_c.html b/doxygen/doxydoc.NET/html/functions_c.html new file mode 100644 index 0000000..19bb35b --- /dev/null +++ b/doxygen/doxydoc.NET/html/functions_c.html @@ -0,0 +1,130 @@ + + + + + + + +lib60870.NET: Class Members + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- c -

+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/functions_d.html b/doxygen/doxydoc.NET/html/functions_d.html new file mode 100644 index 0000000..f3df4dd --- /dev/null +++ b/doxygen/doxydoc.NET/html/functions_d.html @@ -0,0 +1,118 @@ + + + + + + + +lib60870.NET: Class Members + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- d -

+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/functions_dup.js b/doxygen/doxydoc.NET/html/functions_dup.js new file mode 100644 index 0000000..1b94e73 --- /dev/null +++ b/doxygen/doxydoc.NET/html/functions_dup.js @@ -0,0 +1,25 @@ +var functions_dup = +[ + [ "a", "functions.html", null ], + [ "c", "functions_c.html", null ], + [ "d", "functions_d.html", null ], + [ "e", "functions_e.html", null ], + [ "f", "functions_f.html", null ], + [ "g", "functions_g.html", null ], + [ "h", "functions_h.html", null ], + [ "i", "functions_i.html", null ], + [ "k", "functions_k.html", null ], + [ "l", "functions_l.html", null ], + [ "m", "functions_m.html", null ], + [ "n", "functions_n.html", null ], + [ "o", "functions_o.html", null ], + [ "p", "functions_p.html", null ], + [ "q", "functions_q.html", null ], + [ "r", "functions_r.html", null ], + [ "s", "functions_s.html", null ], + [ "t", "functions_t.html", null ], + [ "u", "functions_u.html", null ], + [ "v", "functions_v.html", null ], + [ "w", "functions_w.html", null ], + [ "y", "functions_y.html", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/functions_e.html b/doxygen/doxydoc.NET/html/functions_e.html new file mode 100644 index 0000000..a88efb3 --- /dev/null +++ b/doxygen/doxydoc.NET/html/functions_e.html @@ -0,0 +1,118 @@ + + + + + + + +lib60870.NET: Class Members + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- e -

+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/functions_f.html b/doxygen/doxydoc.NET/html/functions_f.html new file mode 100644 index 0000000..36a2855 --- /dev/null +++ b/doxygen/doxydoc.NET/html/functions_f.html @@ -0,0 +1,117 @@ + + + + + + + +lib60870.NET: Class Members + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- f -

+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/functions_func.html b/doxygen/doxydoc.NET/html/functions_func.html new file mode 100644 index 0000000..f040a49 --- /dev/null +++ b/doxygen/doxydoc.NET/html/functions_func.html @@ -0,0 +1,250 @@ + + + + + + + +lib60870.NET: Class Members - Functions + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented functions with links to the class documentation for each member:
+ +

- a -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- i -

+ + +

- l -

+ + +

- m -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/functions_g.html b/doxygen/doxydoc.NET/html/functions_g.html new file mode 100644 index 0000000..eda991c --- /dev/null +++ b/doxygen/doxydoc.NET/html/functions_g.html @@ -0,0 +1,134 @@ + + + + + + + +lib60870.NET: Class Members + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- g -

+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/functions_h.html b/doxygen/doxydoc.NET/html/functions_h.html new file mode 100644 index 0000000..69e02b3 --- /dev/null +++ b/doxygen/doxydoc.NET/html/functions_h.html @@ -0,0 +1,115 @@ + + + + + + + +lib60870.NET: Class Members + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- h -

+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/functions_i.html b/doxygen/doxydoc.NET/html/functions_i.html new file mode 100644 index 0000000..fc4d782 --- /dev/null +++ b/doxygen/doxydoc.NET/html/functions_i.html @@ -0,0 +1,124 @@ + + + + + + + +lib60870.NET: Class Members + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- i -

+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/functions_k.html b/doxygen/doxydoc.NET/html/functions_k.html new file mode 100644 index 0000000..ef3e4aa --- /dev/null +++ b/doxygen/doxydoc.NET/html/functions_k.html @@ -0,0 +1,115 @@ + + + + + + + +lib60870.NET: Class Members + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- k -

+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/functions_l.html b/doxygen/doxydoc.NET/html/functions_l.html new file mode 100644 index 0000000..222fa4e --- /dev/null +++ b/doxygen/doxydoc.NET/html/functions_l.html @@ -0,0 +1,120 @@ + + + + + + + +lib60870.NET: Class Members + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- l -

+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/functions_m.html b/doxygen/doxydoc.NET/html/functions_m.html new file mode 100644 index 0000000..964e6b8 --- /dev/null +++ b/doxygen/doxydoc.NET/html/functions_m.html @@ -0,0 +1,122 @@ + + + + + + + +lib60870.NET: Class Members + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- m -

+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/functions_n.html b/doxygen/doxydoc.NET/html/functions_n.html new file mode 100644 index 0000000..7492385 --- /dev/null +++ b/doxygen/doxydoc.NET/html/functions_n.html @@ -0,0 +1,116 @@ + + + + + + + +lib60870.NET: Class Members + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- n -

+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/functions_o.html b/doxygen/doxydoc.NET/html/functions_o.html new file mode 100644 index 0000000..49e6b27 --- /dev/null +++ b/doxygen/doxydoc.NET/html/functions_o.html @@ -0,0 +1,116 @@ + + + + + + + +lib60870.NET: Class Members + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- o -

+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/functions_p.html b/doxygen/doxydoc.NET/html/functions_p.html new file mode 100644 index 0000000..0685423 --- /dev/null +++ b/doxygen/doxydoc.NET/html/functions_p.html @@ -0,0 +1,115 @@ + + + + + + + +lib60870.NET: Class Members + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- p -

+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/functions_prop.html b/doxygen/doxydoc.NET/html/functions_prop.html new file mode 100644 index 0000000..d5a6061 --- /dev/null +++ b/doxygen/doxydoc.NET/html/functions_prop.html @@ -0,0 +1,293 @@ + + + + + + + +lib60870.NET: Class Members - Properties + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented properties with links to the class documentation for each member:
+ +

- a -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- h -

+ + +

- i -

+ + +

- k -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- o -

+ + +

- p -

+ + +

- q -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+ + +

- v -

+ + +

- w -

+ + +

- y -

+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/functions_q.html b/doxygen/doxydoc.NET/html/functions_q.html new file mode 100644 index 0000000..78eeb72 --- /dev/null +++ b/doxygen/doxydoc.NET/html/functions_q.html @@ -0,0 +1,117 @@ + + + + + + + +lib60870.NET: Class Members + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- q -

+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/functions_r.html b/doxygen/doxydoc.NET/html/functions_r.html new file mode 100644 index 0000000..a00d2c5 --- /dev/null +++ b/doxygen/doxydoc.NET/html/functions_r.html @@ -0,0 +1,124 @@ + + + + + + + +lib60870.NET: Class Members + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- r -

+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/functions_s.html b/doxygen/doxydoc.NET/html/functions_s.html new file mode 100644 index 0000000..8eb69cb --- /dev/null +++ b/doxygen/doxydoc.NET/html/functions_s.html @@ -0,0 +1,174 @@ + + + + + + + +lib60870.NET: Class Members + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- s -

+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/functions_t.html b/doxygen/doxydoc.NET/html/functions_t.html new file mode 100644 index 0000000..2427388 --- /dev/null +++ b/doxygen/doxydoc.NET/html/functions_t.html @@ -0,0 +1,128 @@ + + + + + + + +lib60870.NET: Class Members + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- t -

+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/functions_u.html b/doxygen/doxydoc.NET/html/functions_u.html new file mode 100644 index 0000000..d77eff9 --- /dev/null +++ b/doxygen/doxydoc.NET/html/functions_u.html @@ -0,0 +1,117 @@ + + + + + + + +lib60870.NET: Class Members + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- u -

+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/functions_v.html b/doxygen/doxydoc.NET/html/functions_v.html new file mode 100644 index 0000000..3c957c1 --- /dev/null +++ b/doxygen/doxydoc.NET/html/functions_v.html @@ -0,0 +1,118 @@ + + + + + + + +lib60870.NET: Class Members + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- v -

+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/functions_vars.html b/doxygen/doxydoc.NET/html/functions_vars.html new file mode 100644 index 0000000..ddf9322 --- /dev/null +++ b/doxygen/doxydoc.NET/html/functions_vars.html @@ -0,0 +1,115 @@ + + + + + + + +lib60870.NET: Class Members - Variables + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented variables with links to the class documentation for each member:
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/functions_w.html b/doxygen/doxydoc.NET/html/functions_w.html new file mode 100644 index 0000000..7b5b1be --- /dev/null +++ b/doxygen/doxydoc.NET/html/functions_w.html @@ -0,0 +1,115 @@ + + + + + + + +lib60870.NET: Class Members + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- w -

+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/functions_y.html b/doxygen/doxydoc.NET/html/functions_y.html new file mode 100644 index 0000000..6f44ca5 --- /dev/null +++ b/doxygen/doxydoc.NET/html/functions_y.html @@ -0,0 +1,115 @@ + + + + + + + +lib60870.NET: Class Members + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- y -

+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/graph_legend.dot b/doxygen/doxydoc.NET/html/graph_legend.dot new file mode 100644 index 0000000..97a6d61 --- /dev/null +++ b/doxygen/doxydoc.NET/html/graph_legend.dot @@ -0,0 +1,24 @@ +digraph "Graph Legend" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node9 [id="Node000009",label="Inherited",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node10 -> Node9 [dir="back",color="steelblue1",style="solid" tooltip=" "]; + Node10 [id="Node000010",label="PublicBase",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",tooltip=" "]; + Node11 -> Node10 [dir="back",color="steelblue1",style="solid" tooltip=" "]; + Node11 [id="Node000011",label="Truncated",height=0.2,width=0.4,color="red", fillcolor="#FFF0F0", style="filled",tooltip=" "]; + Node13 -> Node9 [dir="back",color="darkgreen",style="solid" tooltip=" "]; + Node13 [label="ProtectedBase",color="gray40",fillcolor="white",style="filled" tooltip=" "]; + Node14 -> Node9 [dir="back",color="firebrick4",style="solid" tooltip=" "]; + Node14 [label="PrivateBase",color="gray40",fillcolor="white",style="filled" tooltip=" "]; + Node15 -> Node9 [dir="back",color="steelblue1",style="solid" tooltip=" "]; + Node15 [id="Node000015",label="Undocumented",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node16 -> Node9 [dir="back",color="steelblue1",style="solid" tooltip=" "]; + Node16 [label="Templ\< int \>",color="gray40",fillcolor="white",style="filled" tooltip=" "]; + Node17 -> Node16 [dir="back",color="orange",style="dashed",label="< int >",fontcolor="grey" tooltip=" "]; + Node17 [label="Templ\< T \>",color="gray40",fillcolor="white",style="filled" tooltip=" "]; + Node18 -> Node9 [dir="back",color="darkorchid3",style="dashed",label="m_usedClass",fontcolor="grey" tooltip=" "]; + Node18 [label="Used",color="gray40",fillcolor="white",style="filled" tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/graph_legend.html b/doxygen/doxydoc.NET/html/graph_legend.html new file mode 100644 index 0000000..ff41a63 --- /dev/null +++ b/doxygen/doxydoc.NET/html/graph_legend.html @@ -0,0 +1,173 @@ + + + + + + + +lib60870.NET: Graph Legend + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Graph Legend
+
+
+

This page explains how to interpret the graphs that are generated by doxygen.

+

Consider the following example:

/*! Invisible class because of truncation */
+
class Invisible { };
+
+
/*! Truncated class, inheritance relation is hidden */
+
class Truncated : public Invisible { };
+
+
/* Class not documented with doxygen comments */
+
class Undocumented { };
+
+
/*! Class that is inherited using public inheritance */
+
class PublicBase : public Truncated { };
+
+
/*! A template class */
+
template<class T> class Templ { };
+
+
/*! Class that is inherited using protected inheritance */
+
class ProtectedBase { };
+
+
/*! Class that is inherited using private inheritance */
+
class PrivateBase { };
+
+
/*! Class that is used by the Inherited class */
+
class Used { };
+
+
/*! Super class that inherits a number of other classes */
+
class Inherited : public PublicBase,
+
protected ProtectedBase,
+
private PrivateBase,
+
public Undocumented,
+
public Templ<int>
+
{
+
private:
+
Used *m_usedClass;
+
};
+

This will result in the following graph:

+

The boxes in the above graph have the following meaning:

+
    +
  • +A filled gray box represents the struct or class for which the graph is generated.
  • +
  • +A box with a black border denotes a documented struct or class.
  • +
  • +A box with a gray border denotes an undocumented struct or class.
  • +
  • +A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
  • +
+

The arrows have the following meaning:

+
    +
  • +A blue arrow is used to visualize a public inheritance relation between two classes.
  • +
  • +A dark green arrow is used for protected inheritance.
  • +
  • +A dark red arrow is used for private inheritance.
  • +
  • +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labelled with the variable(s) through which the pointed class or struct is accessible.
  • +
  • +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labelled with the template parameters of the instance.
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/hierarchy.html b/doxygen/doxydoc.NET/html/hierarchy.html new file mode 100644 index 0000000..565443d --- /dev/null +++ b/doxygen/doxydoc.NET/html/hierarchy.html @@ -0,0 +1,234 @@ + + + + + + + +lib60870.NET: Class Hierarchy + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Hierarchy
+
+
+
+

Go to the graphical class hierarchy

+This inheritance list is sorted roughly, but not completely, alphabetically:
+
[detail level 1234]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Clib60870.CS104.APCIParametersParameters for the CS 104 APCI (Application Protocol Control Information)
 Clib60870.CS101.ApplicationLayerParameters
 Clib60870.CS101.ASDUThis class represents an application layer message. It contains some generic message information and one or more InformationObject instances of the same type. It is used to send and receive messages
 Clib60870.ASDUQueue
 Clib60870.CS101.BinaryCounterReadingBinary counter reading. Used for tranmission of integrated totals
 Clib60870.CS104.ConnectionStatisticsProvides some Connection statistics
 Clib60870.CP16Time2a
 Clib60870.CP24Time2a
 Clib60870.CP32Time2a
 Clib60870.CP56Time2a
 CException
 Clib60870.ASDUParsingException
 Clib60870.CS101.ASDUQueueException
 Clib60870.ConnectionException
 Clib60870.CS101.FilesAvailableRepresents the available files in a file client or file server
 Clib60870.FrameAbstract class to encode an application layer frame
 Clib60870.CS101.IFileProvider
 Clib60870.CS101.TransparentFileSimple implementation of IFileProvider that can be used to provide transparent files. Derived classed should override the TransferComplete method
 Clib60870.CS101.IFileReceiver
 Clib60870.CS101.IMasterConnectionProvides functions to be used in Slave callbacks to send data back to the master
 Clib60870.CS101.CS101SlaveCS 101 slave implementation (implements Slave interface)
 Clib60870.CS104.ClientConnectionRepresents a client (master) connection
 Clib60870.CS101.InformationObject
 Clib60870.CS101.Bitstring32
 Clib60870.CS101.Bitstring32Command
 Clib60870.CS101.ClockSynchronizationCommand
 Clib60870.CS101.CounterInterrogationCommand
 Clib60870.CS101.DelayAcquisitionCommand
 Clib60870.CS101.DoubleCommand
 Clib60870.CS101.DoublePointInformationDouble point information object (M_DP_NA_1)
 Clib60870.CS101.EndOfInitializationEnd of initialization information object (M_EI_NA_1)
 Clib60870.CS101.EventOfProtectionEquipmentEvent of protection equipment information object (M_EP_TA_1)
 Clib60870.CS101.EventOfProtectionEquipmentWithCP56Time2aEvent of protection equipment information object with CP56Time2a time tag (M_EP_TD_1)
 Clib60870.CS101.FileACKACK file/section - F_AF_NA_1 (124)
 Clib60870.CS101.FileCallOrSelectCall/Select directory/file/section - F_SC_NA_1 (122)
 Clib60870.CS101.FileDirectoryFile directory - F_DR_TA_1 (126)
 Clib60870.CS101.FileLastSegmentOrSectionLast segment/section - F_LS_NA_1 (123)
 Clib60870.CS101.FileReadyFile ready - F_FR_NA_1 (120)
 Clib60870.CS101.FileSegmentFile segment - F_SG_NA_1 (125)
 Clib60870.CS101.IntegratedTotalsIntegrated totals information object (M_IT_NA_1)
 Clib60870.CS101.InterrogationCommand
 Clib60870.CS101.MeasuredValueNormalizedWithoutQualityMeasured value normalized without quality information object (M_ME_ND_1)
 Clib60870.CS101.MeasuredValueScaled
 Clib60870.CS101.MeasuredValueShort
 Clib60870.CS101.PackedOutputCircuitInfo
 Clib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a
 Clib60870.CS101.PackedSinglePointWithSCD
 Clib60870.CS101.PackedStartEventsOfProtectionEquipment
 Clib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a
 Clib60870.CS101.ParameterActivation
 Clib60870.CS101.ParameterFloatValue
 Clib60870.CS101.ParameterNormalizedValue
 Clib60870.CS101.ParameterScaledValue
 Clib60870.CS101.ReadCommand
 Clib60870.CS101.ResetProcessCommand
 Clib60870.CS101.SectionReadySection ready - F_SR_NA_1 (121)
 Clib60870.CS101.SetpointCommandNormalized
 Clib60870.CS101.SetpointCommandScaled
 Clib60870.CS101.SetpointCommandShort
 Clib60870.CS101.SingleCommand
 Clib60870.CS101.SinglePointInformation
 Clib60870.CS101.StepPositionInformationStep position information object (M_ST_NA_1)
 Clib60870.CS101.TestCommand
 Clib60870.CS101.TestCommandWithCP56Time2a
 Clib60870.CS101.IPrivateIOFactory
 Clib60870.LibraryCommonCommon information functions about the library
 Clib60870.linklayer.LinkLayerParametersLink layer specific parameters
 Clib60870.CS101.MasterCommon interface for CS104 and CS101 balanced and unbalanced master
 Clib60870.CS101.CS101Master
 Clib60870.CS104.ConnectionA single connection to a CS 104 (IEC 60870-5-104) server. Implements the Master interface
 Clib60870.CS101.OutputCircuitInfoOutput circuit information of protection equipment According to IEC 60870-5-101:2003 7.2.6.12
 Clib60870.CS101.PrivateInformationObjectTypesHold a list of private information object (IO) types to be used for parsing
 Clib60870.CS101.QualifierOfInterrogation
 Clib60870.CS101.QualityDescriptor
 Clib60870.CS101.QualityDescriptorPQDP - Quality descriptor for events of protection equipment according to IEC 60870-5-101:2003 7.2.6.4
 Clib60870.CS104.RedundancyGroupRepresentation of a redundancy group. A redundancy group is a group of connections that share a unique event queue. Only one connection in a redundancy group can be active
 Clib60870.CS101.ScaledValue
 Clib60870.CS101.SetpointCommandQualifier
 Clib60870.SingleCommandQualifier
 Clib60870.CS101.SingleEvent
 Clib60870.CS101.Slave
 Clib60870.CS101.CS101SlaveCS 101 slave implementation (implements Slave interface)
 Clib60870.CS104.ServerThis class represents a single IEC 60870-5 server (slave or controlled station). It is also the main access to the CS 104 server API
 Clib60870.CS101.StartEventSPE - Start events of protection equipment according to IEC 60870-5-101:2003 7.2.6.11
 Clib60870.CS101.StatusAndStatusChangeDetection
 CStream
 Clib60870.linklayer.TcpClientVirtualSerialPortTCP client virtual serial port. Can be used to tunnel CS 101 protocol over TCP/IP
 Clib60870.linklayer.TcpServerVirtualSerialPort
 Clib60870.CS104.TlsSecurityInformation
+
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/hierarchy.js b/doxygen/doxydoc.NET/html/hierarchy.js new file mode 100644 index 0000000..6882ddc --- /dev/null +++ b/doxygen/doxydoc.NET/html/hierarchy.js @@ -0,0 +1,142 @@ +var hierarchy = +[ + [ "lib60870.CS104.APCIParameters", "classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html", null ], + [ "lib60870.CS101.ApplicationLayerParameters", "classlib60870_1_1_c_s101_1_1_application_layer_parameters.html", null ], + [ "lib60870.CS101.ASDU", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html", null ], + [ "lib60870.ASDUQueue", "classlib60870_1_1_a_s_d_u_queue.html", null ], + [ "lib60870.CS101.BinaryCounterReading", "classlib60870_1_1_c_s101_1_1_binary_counter_reading.html", null ], + [ "lib60870.CS104.ConnectionStatistics", "classlib60870_1_1_c_s104_1_1_connection_statistics.html", null ], + [ "lib60870.CP16Time2a", "classlib60870_1_1_c_p16_time2a.html", null ], + [ "lib60870.CP24Time2a", "classlib60870_1_1_c_p24_time2a.html", null ], + [ "lib60870.CP32Time2a", "classlib60870_1_1_c_p32_time2a.html", null ], + [ "lib60870.CP56Time2a", "classlib60870_1_1_c_p56_time2a.html", null ], + [ "Exception", null, [ + [ "lib60870.ASDUParsingException", "classlib60870_1_1_a_s_d_u_parsing_exception.html", null ], + [ "lib60870.CS101.ASDUQueueException", "classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception.html", null ], + [ "lib60870.ConnectionException", "classlib60870_1_1_connection_exception.html", [ + [ "lib60870.linklayer.LinkLayerBusyException", "classlib60870_1_1linklayer_1_1_link_layer_busy_exception.html", null ] + ] ] + ] ], + [ "lib60870.CS101.FilesAvailable", "classlib60870_1_1_c_s101_1_1_files_available.html", null ], + [ "lib60870.Frame", "classlib60870_1_1_frame.html", null ], + [ "lib60870.CS101.IFileProvider", "interfacelib60870_1_1_c_s101_1_1_i_file_provider.html", [ + [ "lib60870.CS101.TransparentFile", "classlib60870_1_1_c_s101_1_1_transparent_file.html", null ] + ] ], + [ "lib60870.CS101.IFileReceiver", "interfacelib60870_1_1_c_s101_1_1_i_file_receiver.html", null ], + [ "lib60870.CS101.IMasterConnection", "interfacelib60870_1_1_c_s101_1_1_i_master_connection.html", [ + [ "lib60870.CS101.CS101Slave", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html", null ], + [ "lib60870.CS104.ClientConnection", "classlib60870_1_1_c_s104_1_1_client_connection.html", null ] + ] ], + [ "lib60870.CS101.InformationObject", "classlib60870_1_1_c_s101_1_1_information_object.html", [ + [ "lib60870.CS101.Bitstring32", "classlib60870_1_1_c_s101_1_1_bitstring32.html", [ + [ "lib60870.CS101.Bitstring32WithCP24Time2a", "classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a.html", null ], + [ "lib60870.CS101.Bitstring32WithCP56Time2a", "classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a.html", null ] + ] ], + [ "lib60870.CS101.Bitstring32Command", "classlib60870_1_1_c_s101_1_1_bitstring32_command.html", [ + [ "lib60870.CS101.Bitstring32CommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a.html", null ] + ] ], + [ "lib60870.CS101.ClockSynchronizationCommand", "classlib60870_1_1_c_s101_1_1_clock_synchronization_command.html", null ], + [ "lib60870.CS101.CounterInterrogationCommand", "classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html", null ], + [ "lib60870.CS101.DelayAcquisitionCommand", "classlib60870_1_1_c_s101_1_1_delay_acquisition_command.html", null ], + [ "lib60870.CS101.DoubleCommand", "classlib60870_1_1_c_s101_1_1_double_command.html", [ + [ "lib60870.CS101.DoubleCommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a.html", null ], + [ "lib60870.CS101.StepCommand", "classlib60870_1_1_c_s101_1_1_step_command.html", [ + [ "lib60870.CS101.StepCommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a.html", null ] + ] ] + ] ], + [ "lib60870.CS101.DoublePointInformation", "classlib60870_1_1_c_s101_1_1_double_point_information.html", [ + [ "lib60870.CS101.DoublePointWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a.html", null ], + [ "lib60870.CS101.DoublePointWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a.html", null ] + ] ], + [ "lib60870.CS101.EndOfInitialization", "classlib60870_1_1_c_s101_1_1_end_of_initialization.html", null ], + [ "lib60870.CS101.EventOfProtectionEquipment", "classlib60870_1_1_c_s101_1_1_event_of_protection_equipment.html", null ], + [ "lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a.html", null ], + [ "lib60870.CS101.FileACK", "classlib60870_1_1_c_s101_1_1_file_a_c_k.html", null ], + [ "lib60870.CS101.FileCallOrSelect", "classlib60870_1_1_c_s101_1_1_file_call_or_select.html", null ], + [ "lib60870.CS101.FileDirectory", "classlib60870_1_1_c_s101_1_1_file_directory.html", null ], + [ "lib60870.CS101.FileLastSegmentOrSection", "classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html", null ], + [ "lib60870.CS101.FileReady", "classlib60870_1_1_c_s101_1_1_file_ready.html", null ], + [ "lib60870.CS101.FileSegment", "classlib60870_1_1_c_s101_1_1_file_segment.html", null ], + [ "lib60870.CS101.IntegratedTotals", "classlib60870_1_1_c_s101_1_1_integrated_totals.html", [ + [ "lib60870.CS101.IntegratedTotalsWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a.html", null ], + [ "lib60870.CS101.IntegratedTotalsWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a.html", null ] + ] ], + [ "lib60870.CS101.InterrogationCommand", "classlib60870_1_1_c_s101_1_1_interrogation_command.html", null ], + [ "lib60870.CS101.MeasuredValueNormalizedWithoutQuality", "classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html", [ + [ "lib60870.CS101.MeasuredValueNormalized", "classlib60870_1_1_c_s101_1_1_measured_value_normalized.html", [ + [ "lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a.html", null ], + [ "lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a.html", null ] + ] ] + ] ], + [ "lib60870.CS101.MeasuredValueScaled", "classlib60870_1_1_c_s101_1_1_measured_value_scaled.html", [ + [ "lib60870.CS101.MeasuredValueScaledWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a.html", null ], + [ "lib60870.CS101.MeasuredValueScaledWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a.html", null ] + ] ], + [ "lib60870.CS101.MeasuredValueShort", "classlib60870_1_1_c_s101_1_1_measured_value_short.html", [ + [ "lib60870.CS101.MeasuredValueShortWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a.html", null ], + [ "lib60870.CS101.MeasuredValueShortWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a.html", null ] + ] ], + [ "lib60870.CS101.PackedOutputCircuitInfo", "classlib60870_1_1_c_s101_1_1_packed_output_circuit_info.html", null ], + [ "lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a.html", null ], + [ "lib60870.CS101.PackedSinglePointWithSCD", "classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d.html", null ], + [ "lib60870.CS101.PackedStartEventsOfProtectionEquipment", "classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment.html", null ], + [ "lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a.html", null ], + [ "lib60870.CS101.ParameterActivation", "classlib60870_1_1_c_s101_1_1_parameter_activation.html", null ], + [ "lib60870.CS101.ParameterFloatValue", "classlib60870_1_1_c_s101_1_1_parameter_float_value.html", null ], + [ "lib60870.CS101.ParameterNormalizedValue", "classlib60870_1_1_c_s101_1_1_parameter_normalized_value.html", null ], + [ "lib60870.CS101.ParameterScaledValue", "classlib60870_1_1_c_s101_1_1_parameter_scaled_value.html", null ], + [ "lib60870.CS101.ReadCommand", "classlib60870_1_1_c_s101_1_1_read_command.html", null ], + [ "lib60870.CS101.ResetProcessCommand", "classlib60870_1_1_c_s101_1_1_reset_process_command.html", null ], + [ "lib60870.CS101.SectionReady", "classlib60870_1_1_c_s101_1_1_section_ready.html", null ], + [ "lib60870.CS101.SetpointCommandNormalized", "classlib60870_1_1_c_s101_1_1_setpoint_command_normalized.html", [ + [ "lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a.html", null ] + ] ], + [ "lib60870.CS101.SetpointCommandScaled", "classlib60870_1_1_c_s101_1_1_setpoint_command_scaled.html", [ + [ "lib60870.CS101.SetpointCommandScaledWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a.html", null ] + ] ], + [ "lib60870.CS101.SetpointCommandShort", "classlib60870_1_1_c_s101_1_1_setpoint_command_short.html", [ + [ "lib60870.CS101.SetpointCommandShortWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a.html", null ] + ] ], + [ "lib60870.CS101.SingleCommand", "classlib60870_1_1_c_s101_1_1_single_command.html", [ + [ "lib60870.CS101.SingleCommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a.html", null ] + ] ], + [ "lib60870.CS101.SinglePointInformation", "classlib60870_1_1_c_s101_1_1_single_point_information.html", [ + [ "lib60870.CS101.SinglePointWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a.html", null ], + [ "lib60870.CS101.SinglePointWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a.html", null ] + ] ], + [ "lib60870.CS101.StepPositionInformation", "classlib60870_1_1_c_s101_1_1_step_position_information.html", [ + [ "lib60870.CS101.StepPositionWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a.html", null ], + [ "lib60870.CS101.StepPositionWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a.html", null ] + ] ], + [ "lib60870.CS101.TestCommand", "classlib60870_1_1_c_s101_1_1_test_command.html", null ], + [ "lib60870.CS101.TestCommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html", null ] + ] ], + [ "lib60870.CS101.IPrivateIOFactory", "interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html", null ], + [ "lib60870.LibraryCommon", "classlib60870_1_1_library_common.html", null ], + [ "lib60870.linklayer.LinkLayerParameters", "classlib60870_1_1linklayer_1_1_link_layer_parameters.html", null ], + [ "lib60870.CS101.Master", "classlib60870_1_1_c_s101_1_1_master.html", [ + [ "lib60870.CS101.CS101Master", "classlib60870_1_1_c_s101_1_1_c_s101_master.html", null ], + [ "lib60870.CS104.Connection", "classlib60870_1_1_c_s104_1_1_connection.html", null ] + ] ], + [ "lib60870.CS101.OutputCircuitInfo", "classlib60870_1_1_c_s101_1_1_output_circuit_info.html", null ], + [ "lib60870.CS101.PrivateInformationObjectTypes", "classlib60870_1_1_c_s101_1_1_private_information_object_types.html", null ], + [ "lib60870.CS101.QualifierOfInterrogation", "classlib60870_1_1_c_s101_1_1_qualifier_of_interrogation.html", null ], + [ "lib60870.CS101.QualityDescriptor", "classlib60870_1_1_c_s101_1_1_quality_descriptor.html", null ], + [ "lib60870.CS101.QualityDescriptorP", "classlib60870_1_1_c_s101_1_1_quality_descriptor_p.html", null ], + [ "lib60870.CS104.RedundancyGroup", "classlib60870_1_1_c_s104_1_1_redundancy_group.html", null ], + [ "lib60870.CS101.ScaledValue", "classlib60870_1_1_c_s101_1_1_scaled_value.html", null ], + [ "lib60870.CS101.SetpointCommandQualifier", "classlib60870_1_1_c_s101_1_1_setpoint_command_qualifier.html", null ], + [ "lib60870.SingleCommandQualifier", "classlib60870_1_1_single_command_qualifier.html", null ], + [ "lib60870.CS101.SingleEvent", "classlib60870_1_1_c_s101_1_1_single_event.html", null ], + [ "lib60870.CS101.Slave", "classlib60870_1_1_c_s101_1_1_slave.html", [ + [ "lib60870.CS101.CS101Slave", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html", null ], + [ "lib60870.CS104.Server", "classlib60870_1_1_c_s104_1_1_server.html", null ] + ] ], + [ "lib60870.CS101.StartEvent", "classlib60870_1_1_c_s101_1_1_start_event.html", null ], + [ "lib60870.CS101.StatusAndStatusChangeDetection", "classlib60870_1_1_c_s101_1_1_status_and_status_change_detection.html", null ], + [ "Stream", null, [ + [ "lib60870.linklayer.TcpClientVirtualSerialPort", "classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html", null ], + [ "lib60870.linklayer.TcpServerVirtualSerialPort", "classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.html", null ] + ] ], + [ "lib60870.CS104.TlsSecurityInformation", "classlib60870_1_1_c_s104_1_1_tls_security_information.html", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/index.html b/doxygen/doxydoc.NET/html/index.html new file mode 100644 index 0000000..2706d82 --- /dev/null +++ b/doxygen/doxydoc.NET/html/index.html @@ -0,0 +1,114 @@ + + + + + + + +lib60870.NET: Main Page + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.NET Documentation
+
+
+ +
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/inherit_graph_0.dot b/doxygen/doxydoc.NET/html/inherit_graph_0.dot new file mode 100644 index 0000000..ff17533 --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_0.dot @@ -0,0 +1,17 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="Exception",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node0 -> Node1 [id="edge1_Node000000_Node000001",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node1 [id="Node000001",label="lib60870.ASDUParsingException",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_a_s_d_u_parsing_exception.html",tooltip=" "]; + Node0 -> Node2 [id="edge2_Node000000_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="lib60870.CS101.ASDUQueue\lException",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception.html",tooltip=" "]; + Node0 -> Node3 [id="edge3_Node000000_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="lib60870.ConnectionException",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_connection_exception.html",tooltip=" "]; + Node3 -> Node4 [id="edge4_Node000003_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="lib60870.linklayer.LinkLayer\lBusyException",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1linklayer_1_1_link_layer_busy_exception.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_1.dot b/doxygen/doxydoc.NET/html/inherit_graph_1.dot new file mode 100644 index 0000000..f88e3a4 --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_1.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.ASDUQueue",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_a_s_d_u_queue.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_10.dot b/doxygen/doxydoc.NET/html/inherit_graph_10.dot new file mode 100644 index 0000000..2d93f2f --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_10.dot @@ -0,0 +1,11 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CS101.IFileProvider",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$interfacelib60870_1_1_c_s101_1_1_i_file_provider.html",tooltip=" "]; + Node0 -> Node1 [id="edge5_Node000000_Node000001",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node1 [id="Node000001",label="lib60870.CS101.TransparentFile",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_transparent_file.html",tooltip="Simple implementation of IFileProvider that can be used to provide transparent files...."]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_11.dot b/doxygen/doxydoc.NET/html/inherit_graph_11.dot new file mode 100644 index 0000000..e353c44 --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_11.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CS101.IFileReceiver",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$interfacelib60870_1_1_c_s101_1_1_i_file_receiver.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_12.dot b/doxygen/doxydoc.NET/html/inherit_graph_12.dot new file mode 100644 index 0000000..97b6e8e --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_12.dot @@ -0,0 +1,17 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CS101.IMasterConnection",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$interfacelib60870_1_1_c_s101_1_1_i_master_connection.html",tooltip="Provides functions to be used in Slave callbacks to send data back to the master."]; + Node0 -> Node1 [id="edge6_Node000000_Node000001",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node1 [id="Node000001",label="lib60870.CS101.CS101Slave",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_c_s101_slave.html",tooltip="CS 101 slave implementation (implements Slave interface)"]; + Node0 -> Node4 [id="edge7_Node000000_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="lib60870.CS104.ClientConnection",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s104_1_1_client_connection.html",tooltip="Represents a client (master) connection."]; + Node2 [id="Node000002",label="lib60870.CS101.Slave",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_slave.html",tooltip=" "]; + Node2 -> Node1 [id="edge8_Node000002_Node000001",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 -> Node3 [id="edge9_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="lib60870.CS104.Server",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s104_1_1_server.html",tooltip="This class represents a single IEC 60870-5 server (slave or controlled station). It is also the main ..."]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_13.dot b/doxygen/doxydoc.NET/html/inherit_graph_13.dot new file mode 100644 index 0000000..b87cd21 --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_13.dot @@ -0,0 +1,141 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CS101.Information\lObject",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; + Node0 -> Node1 [id="edge10_Node000000_Node000001",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node1 [id="Node000001",label="lib60870.CS101.Bitstring32",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32.html",tooltip=" "]; + Node1 -> Node2 [id="edge11_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="lib60870.CS101.Bitstring32\lWithCP24Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a.html",tooltip=" "]; + Node1 -> Node3 [id="edge12_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="lib60870.CS101.Bitstring32\lWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a.html",tooltip=" "]; + Node0 -> Node4 [id="edge13_Node000000_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="lib60870.CS101.Bitstring32\lCommand",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32_command.html",tooltip=" "]; + Node4 -> Node5 [id="edge14_Node000004_Node000005",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="lib60870.CS101.Bitstring32\lCommandWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a.html",tooltip=" "]; + Node0 -> Node6 [id="edge15_Node000000_Node000006",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node6 [id="Node000006",label="lib60870.CS101.ClockSynchronization\lCommand",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_clock_synchronization_command.html",tooltip=" "]; + Node0 -> Node7 [id="edge16_Node000000_Node000007",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node7 [id="Node000007",label="lib60870.CS101.CounterInterrogation\lCommand",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html",tooltip=" "]; + Node0 -> Node8 [id="edge17_Node000000_Node000008",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node8 [id="Node000008",label="lib60870.CS101.DelayAcquisition\lCommand",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_delay_acquisition_command.html",tooltip=" "]; + Node0 -> Node9 [id="edge18_Node000000_Node000009",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node9 [id="Node000009",label="lib60870.CS101.DoubleCommand",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_command.html",tooltip=" "]; + Node9 -> Node10 [id="edge19_Node000009_Node000010",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node10 [id="Node000010",label="lib60870.CS101.DoubleCommand\lWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a.html",tooltip=" "]; + Node9 -> Node11 [id="edge20_Node000009_Node000011",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node11 [id="Node000011",label="lib60870.CS101.StepCommand",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_command.html",tooltip=" "]; + Node11 -> Node12 [id="edge21_Node000011_Node000012",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node12 [id="Node000012",label="lib60870.CS101.StepCommand\lWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a.html",tooltip=" "]; + Node0 -> Node13 [id="edge22_Node000000_Node000013",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node13 [id="Node000013",label="lib60870.CS101.DoublePoint\lInformation",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_point_information.html",tooltip="Double point information object (M_DP_NA_1)"]; + Node13 -> Node14 [id="edge23_Node000013_Node000014",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node14 [id="Node000014",label="lib60870.CS101.DoublePoint\lWithCP24Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a.html",tooltip="Double point information object with CP24Time2a time tag (M_DP_TA_1)"]; + Node13 -> Node15 [id="edge24_Node000013_Node000015",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node15 [id="Node000015",label="lib60870.CS101.DoublePoint\lWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a.html",tooltip="Double point information object with CP56Time2a time tag (M_DP_TB_1)"]; + Node0 -> Node16 [id="edge25_Node000000_Node000016",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node16 [id="Node000016",label="lib60870.CS101.EndOfInitialization",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_end_of_initialization.html",tooltip="End of initialization information object (M_EI_NA_1)"]; + Node0 -> Node17 [id="edge26_Node000000_Node000017",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node17 [id="Node000017",label="lib60870.CS101.EventOfProtection\lEquipment",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_event_of_protection_equipment.html",tooltip="Event of protection equipment information object (M_EP_TA_1)"]; + Node0 -> Node18 [id="edge27_Node000000_Node000018",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node18 [id="Node000018",label="lib60870.CS101.EventOfProtection\lEquipmentWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a.html",tooltip="Event of protection equipment information object with CP56Time2a time tag (M_EP_TD_1)"]; + Node0 -> Node19 [id="edge28_Node000000_Node000019",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node19 [id="Node000019",label="lib60870.CS101.FileACK",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_file_a_c_k.html",tooltip="ACK file/section - F_AF_NA_1 (124)"]; + Node0 -> Node20 [id="edge29_Node000000_Node000020",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node20 [id="Node000020",label="lib60870.CS101.FileCallOr\lSelect",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_file_call_or_select.html",tooltip="Call/Select directory/file/section - F_SC_NA_1 (122)"]; + Node0 -> Node21 [id="edge30_Node000000_Node000021",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node21 [id="Node000021",label="lib60870.CS101.FileDirectory",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_file_directory.html",tooltip="File directory - F_DR_TA_1 (126)"]; + Node0 -> Node22 [id="edge31_Node000000_Node000022",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node22 [id="Node000022",label="lib60870.CS101.FileLastSegment\lOrSection",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html",tooltip="Last segment/section - F_LS_NA_1 (123)"]; + Node0 -> Node23 [id="edge32_Node000000_Node000023",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node23 [id="Node000023",label="lib60870.CS101.FileReady",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_file_ready.html",tooltip="File ready - F_FR_NA_1 (120)"]; + Node0 -> Node24 [id="edge33_Node000000_Node000024",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node24 [id="Node000024",label="lib60870.CS101.FileSegment",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_file_segment.html",tooltip="File segment - F_SG_NA_1 (125)"]; + Node0 -> Node25 [id="edge34_Node000000_Node000025",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node25 [id="Node000025",label="lib60870.CS101.Integrated\lTotals",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_integrated_totals.html",tooltip="Integrated totals information object (M_IT_NA_1)"]; + Node25 -> Node26 [id="edge35_Node000025_Node000026",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node26 [id="Node000026",label="lib60870.CS101.Integrated\lTotalsWithCP24Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a.html",tooltip="Integrated totals information object with CP24Time2a time tag (M_IT_TA_1)"]; + Node25 -> Node27 [id="edge36_Node000025_Node000027",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node27 [id="Node000027",label="lib60870.CS101.Integrated\lTotalsWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a.html",tooltip="Integrated totals information object with CP56Time2a time tag (M_IT_TB_1)"]; + Node0 -> Node28 [id="edge37_Node000000_Node000028",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node28 [id="Node000028",label="lib60870.CS101.Interrogation\lCommand",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_interrogation_command.html",tooltip=" "]; + Node0 -> Node29 [id="edge38_Node000000_Node000029",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node29 [id="Node000029",label="lib60870.CS101.MeasuredValue\lNormalizedWithoutQuality",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html",tooltip="Measured value normalized without quality information object (M_ME_ND_1)"]; + Node29 -> Node30 [id="edge39_Node000029_Node000030",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node30 [id="Node000030",label="lib60870.CS101.MeasuredValue\lNormalized",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized.html",tooltip="Measured value normalized information object (M_ME_NA_1)"]; + Node30 -> Node31 [id="edge40_Node000030_Node000031",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node31 [id="Node000031",label="lib60870.CS101.MeasuredValue\lNormalizedWithCP24Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a.html",tooltip="Measured value normalized with CP24Time2a time tag (M_ME_TA_1)"]; + Node30 -> Node32 [id="edge41_Node000030_Node000032",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node32 [id="Node000032",label="lib60870.CS101.MeasuredValue\lNormalizedWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a.html",tooltip="Measured value normalized with CP56Time2a time tag (M_ME_TD_1)"]; + Node0 -> Node33 [id="edge42_Node000000_Node000033",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node33 [id="Node000033",label="lib60870.CS101.MeasuredValue\lScaled",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_scaled.html",tooltip=" "]; + Node33 -> Node34 [id="edge43_Node000033_Node000034",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node34 [id="Node000034",label="lib60870.CS101.MeasuredValue\lScaledWithCP24Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a.html",tooltip=" "]; + Node33 -> Node35 [id="edge44_Node000033_Node000035",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node35 [id="Node000035",label="lib60870.CS101.MeasuredValue\lScaledWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a.html",tooltip=" "]; + Node0 -> Node36 [id="edge45_Node000000_Node000036",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node36 [id="Node000036",label="lib60870.CS101.MeasuredValue\lShort",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_short.html",tooltip=" "]; + Node36 -> Node37 [id="edge46_Node000036_Node000037",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node37 [id="Node000037",label="lib60870.CS101.MeasuredValue\lShortWithCP24Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a.html",tooltip=" "]; + Node36 -> Node38 [id="edge47_Node000036_Node000038",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node38 [id="Node000038",label="lib60870.CS101.MeasuredValue\lShortWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a.html",tooltip=" "]; + Node0 -> Node39 [id="edge48_Node000000_Node000039",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node39 [id="Node000039",label="lib60870.CS101.PackedOutput\lCircuitInfo",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_packed_output_circuit_info.html",tooltip=" "]; + Node0 -> Node40 [id="edge49_Node000000_Node000040",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node40 [id="Node000040",label="lib60870.CS101.PackedOutput\lCircuitInfoWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a.html",tooltip=" "]; + Node0 -> Node41 [id="edge50_Node000000_Node000041",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node41 [id="Node000041",label="lib60870.CS101.PackedSingle\lPointWithSCD",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d.html",tooltip=" "]; + Node0 -> Node42 [id="edge51_Node000000_Node000042",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node42 [id="Node000042",label="lib60870.CS101.PackedStart\lEventsOfProtectionEquipment",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment.html",tooltip=" "]; + Node0 -> Node43 [id="edge52_Node000000_Node000043",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node43 [id="Node000043",label="lib60870.CS101.PackedStart\lEventsOfProtectionEquipmentWith\lCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a.html",tooltip=" "]; + Node0 -> Node44 [id="edge53_Node000000_Node000044",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node44 [id="Node000044",label="lib60870.CS101.Parameter\lActivation",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_parameter_activation.html",tooltip=" "]; + Node0 -> Node45 [id="edge54_Node000000_Node000045",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node45 [id="Node000045",label="lib60870.CS101.Parameter\lFloatValue",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_parameter_float_value.html",tooltip=" "]; + Node0 -> Node46 [id="edge55_Node000000_Node000046",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node46 [id="Node000046",label="lib60870.CS101.Parameter\lNormalizedValue",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_parameter_normalized_value.html",tooltip=" "]; + Node0 -> Node47 [id="edge56_Node000000_Node000047",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node47 [id="Node000047",label="lib60870.CS101.Parameter\lScaledValue",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_parameter_scaled_value.html",tooltip=" "]; + Node0 -> Node48 [id="edge57_Node000000_Node000048",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node48 [id="Node000048",label="lib60870.CS101.ReadCommand",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_read_command.html",tooltip=" "]; + Node0 -> Node49 [id="edge58_Node000000_Node000049",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node49 [id="Node000049",label="lib60870.CS101.ResetProcess\lCommand",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_reset_process_command.html",tooltip=" "]; + Node0 -> Node50 [id="edge59_Node000000_Node000050",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node50 [id="Node000050",label="lib60870.CS101.SectionReady",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_section_ready.html",tooltip="Section ready - F_SR_NA_1 (121)"]; + Node0 -> Node51 [id="edge60_Node000000_Node000051",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node51 [id="Node000051",label="lib60870.CS101.SetpointCommand\lNormalized",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_normalized.html",tooltip=" "]; + Node51 -> Node52 [id="edge61_Node000051_Node000052",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node52 [id="Node000052",label="lib60870.CS101.SetpointCommand\lNormalizedWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a.html",tooltip=" "]; + Node0 -> Node53 [id="edge62_Node000000_Node000053",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node53 [id="Node000053",label="lib60870.CS101.SetpointCommand\lScaled",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_scaled.html",tooltip=" "]; + Node53 -> Node54 [id="edge63_Node000053_Node000054",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node54 [id="Node000054",label="lib60870.CS101.SetpointCommand\lScaledWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a.html",tooltip=" "]; + Node0 -> Node55 [id="edge64_Node000000_Node000055",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node55 [id="Node000055",label="lib60870.CS101.SetpointCommand\lShort",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_short.html",tooltip=" "]; + Node55 -> Node56 [id="edge65_Node000055_Node000056",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node56 [id="Node000056",label="lib60870.CS101.SetpointCommand\lShortWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a.html",tooltip=" "]; + Node0 -> Node57 [id="edge66_Node000000_Node000057",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node57 [id="Node000057",label="lib60870.CS101.SingleCommand",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_command.html",tooltip=" "]; + Node57 -> Node58 [id="edge67_Node000057_Node000058",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node58 [id="Node000058",label="lib60870.CS101.SingleCommand\lWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a.html",tooltip=" "]; + Node0 -> Node59 [id="edge68_Node000000_Node000059",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node59 [id="Node000059",label="lib60870.CS101.SinglePoint\lInformation",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_point_information.html",tooltip=" "]; + Node59 -> Node60 [id="edge69_Node000059_Node000060",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node60 [id="Node000060",label="lib60870.CS101.SinglePoint\lWithCP24Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a.html",tooltip=" "]; + Node59 -> Node61 [id="edge70_Node000059_Node000061",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node61 [id="Node000061",label="lib60870.CS101.SinglePoint\lWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a.html",tooltip="Single point with CP56Time2a timestamp (M_SP_TB_1)"]; + Node0 -> Node62 [id="edge71_Node000000_Node000062",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node62 [id="Node000062",label="lib60870.CS101.StepPosition\lInformation",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_position_information.html",tooltip="Step position information object (M_ST_NA_1)"]; + Node62 -> Node63 [id="edge72_Node000062_Node000063",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node63 [id="Node000063",label="lib60870.CS101.StepPosition\lWithCP24Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a.html",tooltip="Step position information object with CP24Time2a time tag (M_ST_TA_1)"]; + Node62 -> Node64 [id="edge73_Node000062_Node000064",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node64 [id="Node000064",label="lib60870.CS101.StepPosition\lWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a.html",tooltip="Step position information object with CP56Time2a time tag (M_ST_TB_1)"]; + Node0 -> Node65 [id="edge74_Node000000_Node000065",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node65 [id="Node000065",label="lib60870.CS101.TestCommand",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_test_command.html",tooltip=" "]; + Node0 -> Node66 [id="edge75_Node000000_Node000066",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node66 [id="Node000066",label="lib60870.CS101.TestCommand\lWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_14.dot b/doxygen/doxydoc.NET/html/inherit_graph_14.dot new file mode 100644 index 0000000..f835821 --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_14.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CS101.IPrivateIOFactory",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_15.dot b/doxygen/doxydoc.NET/html/inherit_graph_15.dot new file mode 100644 index 0000000..d97ba3b --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_15.dot @@ -0,0 +1,13 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CS101.Master",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_master.html",tooltip="Common interface for CS104 and CS101 balanced and unbalanced master."]; + Node0 -> Node1 [id="edge76_Node000000_Node000001",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node1 [id="Node000001",label="lib60870.CS101.CS101Master",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_c_s101_master.html",tooltip=" "]; + Node0 -> Node2 [id="edge77_Node000000_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="lib60870.CS104.Connection",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s104_1_1_connection.html",tooltip="A single connection to a CS 104 (IEC 60870-5-104) server. Implements the Master interface."]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_16.dot b/doxygen/doxydoc.NET/html/inherit_graph_16.dot new file mode 100644 index 0000000..fdcf92f --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_16.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CS101.OutputCircuitInfo",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_output_circuit_info.html",tooltip="Output circuit information of protection equipment According to IEC 60870-5-101:2003 7...."]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_17.dot b/doxygen/doxydoc.NET/html/inherit_graph_17.dot new file mode 100644 index 0000000..af34d53 --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_17.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CS101.PrivateInformation\lObjectTypes",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_private_information_object_types.html",tooltip="Hold a list of private information object (IO) types to be used for parsing."]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_18.dot b/doxygen/doxydoc.NET/html/inherit_graph_18.dot new file mode 100644 index 0000000..c553bf8 --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_18.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CS101.Qualifier\lOfInterrogation",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_qualifier_of_interrogation.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_19.dot b/doxygen/doxydoc.NET/html/inherit_graph_19.dot new file mode 100644 index 0000000..fa3defd --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_19.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CS101.QualityDescriptor",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_quality_descriptor.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_2.dot b/doxygen/doxydoc.NET/html/inherit_graph_2.dot new file mode 100644 index 0000000..9b4c4b5 --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_2.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CP16Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_p16_time2a.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_20.dot b/doxygen/doxydoc.NET/html/inherit_graph_20.dot new file mode 100644 index 0000000..f1a3e2f --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_20.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CS101.QualityDescriptorP",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_quality_descriptor_p.html",tooltip="QDP - Quality descriptor for events of protection equipment according to IEC 60870-5-101:2003 7...."]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_21.dot b/doxygen/doxydoc.NET/html/inherit_graph_21.dot new file mode 100644 index 0000000..d7cc977 --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_21.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CS101.ScaledValue",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_scaled_value.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_22.dot b/doxygen/doxydoc.NET/html/inherit_graph_22.dot new file mode 100644 index 0000000..b55c5d8 --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_22.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CS101.SetpointCommand\lQualifier",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_qualifier.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_23.dot b/doxygen/doxydoc.NET/html/inherit_graph_23.dot new file mode 100644 index 0000000..3a18f99 --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_23.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CS101.SingleEvent",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_event.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_24.dot b/doxygen/doxydoc.NET/html/inherit_graph_24.dot new file mode 100644 index 0000000..0b35f85 --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_24.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CS101.StartEvent",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_start_event.html",tooltip="SPE - Start events of protection equipment according to IEC 60870-5-101:2003 7.2.6...."]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_25.dot b/doxygen/doxydoc.NET/html/inherit_graph_25.dot new file mode 100644 index 0000000..9df9e05 --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_25.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CS101.StatusAnd\lStatusChangeDetection",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_status_and_status_change_detection.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_26.dot b/doxygen/doxydoc.NET/html/inherit_graph_26.dot new file mode 100644 index 0000000..6a87a07 --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_26.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CS104.APCIParameters",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html",tooltip="Parameters for the CS 104 APCI (Application Protocol Control Information)"]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_27.dot b/doxygen/doxydoc.NET/html/inherit_graph_27.dot new file mode 100644 index 0000000..9d03519 --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_27.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CS104.Connection\lStatistics",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s104_1_1_connection_statistics.html",tooltip="Provides some Connection statistics."]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_28.dot b/doxygen/doxydoc.NET/html/inherit_graph_28.dot new file mode 100644 index 0000000..858b76e --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_28.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CS104.Redundancy\lGroup",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s104_1_1_redundancy_group.html",tooltip="Representation of a redundancy group. A redundancy group is a group of connections that share a uniqu..."]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_29.dot b/doxygen/doxydoc.NET/html/inherit_graph_29.dot new file mode 100644 index 0000000..2371058 --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_29.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CS104.TlsSecurity\lInformation",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s104_1_1_tls_security_information.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_3.dot b/doxygen/doxydoc.NET/html/inherit_graph_3.dot new file mode 100644 index 0000000..b602d55 --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_3.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CP24Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_p24_time2a.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_30.dot b/doxygen/doxydoc.NET/html/inherit_graph_30.dot new file mode 100644 index 0000000..9aaa9ca --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_30.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.Frame",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_frame.html",tooltip="Abstract class to encode an application layer frame."]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_31.dot b/doxygen/doxydoc.NET/html/inherit_graph_31.dot new file mode 100644 index 0000000..3e796d5 --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_31.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.LibraryCommon",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_library_common.html",tooltip="Common information functions about the library."]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_32.dot b/doxygen/doxydoc.NET/html/inherit_graph_32.dot new file mode 100644 index 0000000..feddf2a --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_32.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.linklayer.LinkLayer\lParameters",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1linklayer_1_1_link_layer_parameters.html",tooltip="Link layer specific parameters."]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_33.dot b/doxygen/doxydoc.NET/html/inherit_graph_33.dot new file mode 100644 index 0000000..025fe80 --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_33.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.SingleCommandQualifier",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_single_command_qualifier.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_34.dot b/doxygen/doxydoc.NET/html/inherit_graph_34.dot new file mode 100644 index 0000000..1b0d5a5 --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_34.dot @@ -0,0 +1,13 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="Stream",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node0 -> Node1 [id="edge78_Node000000_Node000001",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node1 [id="Node000001",label="lib60870.linklayer.TcpClient\lVirtualSerialPort",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html",tooltip="TCP client virtual serial port. Can be used to tunnel CS 101 protocol over TCP/IP."]; + Node0 -> Node2 [id="edge79_Node000000_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="lib60870.linklayer.TcpServer\lVirtualSerialPort",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_4.dot b/doxygen/doxydoc.NET/html/inherit_graph_4.dot new file mode 100644 index 0000000..4d897da --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_4.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CP32Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_p32_time2a.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_5.dot b/doxygen/doxydoc.NET/html/inherit_graph_5.dot new file mode 100644 index 0000000..529590d --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_5.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_p56_time2a.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_6.dot b/doxygen/doxydoc.NET/html/inherit_graph_6.dot new file mode 100644 index 0000000..4d695dd --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_6.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CS101.Application\lLayerParameters",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_application_layer_parameters.html",tooltip=" "]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_7.dot b/doxygen/doxydoc.NET/html/inherit_graph_7.dot new file mode 100644 index 0000000..0c0c424 --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_7.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CS101.ASDU",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_a_s_d_u.html",tooltip="This class represents an application layer message. It contains some generic message information and ..."]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_8.dot b/doxygen/doxydoc.NET/html/inherit_graph_8.dot new file mode 100644 index 0000000..0e0116e --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_8.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CS101.BinaryCounter\lReading",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_binary_counter_reading.html",tooltip="Binary counter reading. Used for tranmission of integrated totals."]; +} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_9.dot b/doxygen/doxydoc.NET/html/inherit_graph_9.dot new file mode 100644 index 0000000..24305fd --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherit_graph_9.dot @@ -0,0 +1,9 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node0 [id="Node000000",label="lib60870.CS101.FilesAvailable",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_files_available.html",tooltip="Represents the available files in a file client or file server."]; +} diff --git a/doxygen/doxydoc.NET/html/inherits.html b/doxygen/doxydoc.NET/html/inherits.html new file mode 100644 index 0000000..064d107 --- /dev/null +++ b/doxygen/doxydoc.NET/html/inherits.html @@ -0,0 +1,187 @@ + + + + + + + +lib60870.NET: Class Hierarchy + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Hierarchy
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider-members.html b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider-members.html new file mode 100644 index 0000000..1cbb7c8 --- /dev/null +++ b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider-members.html @@ -0,0 +1,124 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.IFileProvider Member List
+
+ +
+ + + + diff --git a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider.html b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider.html new file mode 100644 index 0000000..2f653ed --- /dev/null +++ b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider.html @@ -0,0 +1,342 @@ + + + + + + + +lib60870.NET: lib60870.CS101.IFileProvider Interface Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.IFileProvider Interface Reference
+
+
+
+Inheritance diagram for lib60870.CS101.IFileProvider:
+
+
Inheritance graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

int GetCA ()
 Returns the CA (Comman address) of the file.
 
int GetIOA ()
 Returns the IOA (information object address of the file)
 
NameOfFile GetNameOfFile ()
 Gets the type ("name") of the file.
 
+DateTime GetFileDate ()
 
int GetFileSize ()
 Gets the size of the file in bytes.
 
int GetSectionSize (int sectionNumber)
 Gets the size of a section in byzes.
 
bool GetSegmentData (int sectionNumber, int offset, int segmentSize, byte[] segmentData)
 Gets the segment data.
 
void TransferComplete (bool success)
 Indicates that the transfer is complete. When success equals true the file data can be deleted.
 
+

Member Function Documentation

+ +

◆ GetCA()

+ +
+
+ + + + + + + +
int lib60870.CS101.IFileProvider.GetCA ()
+
+ +

Returns the CA (Comman address) of the file.

+
Returns
The CA
+ +

Implemented in lib60870.CS101.TransparentFile.

+ +
+
+ +

◆ GetFileSize()

+ +
+
+ + + + + + + +
int lib60870.CS101.IFileProvider.GetFileSize ()
+
+ +

Gets the size of the file in bytes.

+
Returns
The file size in bytes
+ +

Implemented in lib60870.CS101.TransparentFile.

+ +
+
+ +

◆ GetIOA()

+ +
+
+ + + + + + + +
int lib60870.CS101.IFileProvider.GetIOA ()
+
+ +

Returns the IOA (information object address of the file)

+
Returns
The IOA
+ +

Implemented in lib60870.CS101.TransparentFile.

+ +
+
+ +

◆ GetNameOfFile()

+ +
+
+ + + + + + + +
NameOfFile lib60870.CS101.IFileProvider.GetNameOfFile ()
+
+ +

Gets the type ("name") of the file.

+
Returns
The file type
+ +

Implemented in lib60870.CS101.TransparentFile.

+ +
+
+ +

◆ GetSectionSize()

+ +
+
+ + + + + + + +
int lib60870.CS101.IFileProvider.GetSectionSize (int sectionNumber)
+
+ +

Gets the size of a section in byzes.

+
Returns
The section size in bytes or -1 if the section does not exist
+
Parameters
+ + +
sectionNumberNumber of section (starting with 0)
+
+
+ +

Implemented in lib60870.CS101.TransparentFile.

+ +
+
+ +

◆ GetSegmentData()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
bool lib60870.CS101.IFileProvider.GetSegmentData (int sectionNumber,
int offset,
int segmentSize,
byte[] segmentData )
+
+ +

Gets the segment data.

+
Returns
true, if segment data was gotten, false otherwise.
+
Parameters
+ + + + + +
sectionNumberSection number.
offsetOffset.
segmentSizeSegment size.
segmentDataSegment data.
+
+
+ +

Implemented in lib60870.CS101.TransparentFile.

+ +
+
+ +

◆ TransferComplete()

+ +
+
+ + + + + + + +
void lib60870.CS101.IFileProvider.TransferComplete (bool success)
+
+ +

Indicates that the transfer is complete. When success equals true the file data can be deleted.

+
Parameters
+ + +
successIf set to true success.
+
+
+ +

Implemented in lib60870.CS101.TransparentFile.

+ +
+
+
The documentation for this interface was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/FileServices.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider.js b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider.js new file mode 100644 index 0000000..0218dc5 --- /dev/null +++ b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider.js @@ -0,0 +1,10 @@ +var interfacelib60870_1_1_c_s101_1_1_i_file_provider = +[ + [ "GetCA", "interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a8bd0b5d9ca9019f7f8dab6c43a5d7945", null ], + [ "GetFileSize", "interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a6b9b192c358b22d132893c90a636daf2", null ], + [ "GetIOA", "interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a68c3470850586f634e731dd250c957da", null ], + [ "GetNameOfFile", "interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a9aa9aeb003e1e5726a5b634cfa1c5548", null ], + [ "GetSectionSize", "interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a953c9bc0b2dd47ba192649ce3b954318", null ], + [ "GetSegmentData", "interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a238a851573b79de09af78b4f93deb7f2", null ], + [ "TransferComplete", "interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#ada2d36e95fe8caf9a22d04fcd77b6a8f", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider__inherit__graph.dot b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider__inherit__graph.dot new file mode 100644 index 0000000..d9caa1a --- /dev/null +++ b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider__inherit__graph.dot @@ -0,0 +1,10 @@ +digraph "lib60870.CS101.IFileProvider" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.IFileProvider",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="lib60870.CS101.TransparentFile",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_transparent_file.html",tooltip="Simple implementation of IFileProvider that can be used to provide transparent files...."]; +} diff --git a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_receiver-members.html b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_receiver-members.html new file mode 100644 index 0000000..3156537 --- /dev/null +++ b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_receiver-members.html @@ -0,0 +1,118 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.IFileReceiver Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.IFileReceiver, including all inherited members.

+ + + +
Finished(FileErrorCode result) (defined in lib60870.CS101.IFileReceiver)lib60870.CS101.IFileReceiver
SegmentReceived(byte sectionName, int offset, int size, byte[] data) (defined in lib60870.CS101.IFileReceiver)lib60870.CS101.IFileReceiver
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_receiver.html b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_receiver.html new file mode 100644 index 0000000..cd9eae4 --- /dev/null +++ b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_receiver.html @@ -0,0 +1,130 @@ + + + + + + + +lib60870.NET: lib60870.CS101.IFileReceiver Interface Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.IFileReceiver Interface Reference
+
+
+ + + + + + +

+Public Member Functions

+void Finished (FileErrorCode result)
 
+void SegmentReceived (byte sectionName, int offset, int size, byte[] data)
 
+
The documentation for this interface was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/FileServices.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_master_connection-members.html b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_master_connection-members.html new file mode 100644 index 0000000..e86b383 --- /dev/null +++ b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_master_connection-members.html @@ -0,0 +1,120 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.IMasterConnection Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.IMasterConnection, including all inherited members.

+ + + + + +
GetApplicationLayerParameters() (defined in lib60870.CS101.IMasterConnection)lib60870.CS101.IMasterConnection
SendACT_CON(ASDU asdu, bool negative) (defined in lib60870.CS101.IMasterConnection)lib60870.CS101.IMasterConnection
SendACT_TERM(ASDU asdu) (defined in lib60870.CS101.IMasterConnection)lib60870.CS101.IMasterConnection
SendASDU(ASDU asdu) (defined in lib60870.CS101.IMasterConnection)lib60870.CS101.IMasterConnection
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_master_connection.html b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_master_connection.html new file mode 100644 index 0000000..5735d83 --- /dev/null +++ b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_master_connection.html @@ -0,0 +1,223 @@ + + + + + + + +lib60870.NET: lib60870.CS101.IMasterConnection Interface Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.IMasterConnection Interface Reference
+
+
+ +

Provides functions to be used in Slave callbacks to send data back to the master. + More...

+
+Inheritance diagram for lib60870.CS101.IMasterConnection:
+
+
Inheritance graph
+
[legend]
+ + + + + + + + + + +

+Public Member Functions

void SendASDU (ASDU asdu)
 
void SendACT_CON (ASDU asdu, bool negative)
 
void SendACT_TERM (ASDU asdu)
 
ApplicationLayerParameters GetApplicationLayerParameters ()
 
+

Detailed Description

+

Provides functions to be used in Slave callbacks to send data back to the master.

+

Member Function Documentation

+ +

◆ GetApplicationLayerParameters()

+ +
+
+ + + + + + + +
ApplicationLayerParameters lib60870.CS101.IMasterConnection.GetApplicationLayerParameters ()
+
+ +

Implemented in lib60870.CS104.ClientConnection.

+ +
+
+ +

◆ SendACT_CON()

+ +
+
+ + + + + + + + + + + +
void lib60870.CS101.IMasterConnection.SendACT_CON (ASDU asdu,
bool negative )
+
+ +

Implemented in lib60870.CS104.ClientConnection.

+ +
+
+ +

◆ SendACT_TERM()

+ +
+
+ + + + + + + +
void lib60870.CS101.IMasterConnection.SendACT_TERM (ASDU asdu)
+
+ +

Implemented in lib60870.CS104.ClientConnection.

+ +
+
+ +

◆ SendASDU()

+ +
+
+ + + + + + + +
void lib60870.CS101.IMasterConnection.SendASDU (ASDU asdu)
+
+ +

Implemented in lib60870.CS104.ClientConnection.

+ +
+
+
The documentation for this interface was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/Slave.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_master_connection__inherit__graph.dot b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_master_connection__inherit__graph.dot new file mode 100644 index 0000000..1641e37 --- /dev/null +++ b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_master_connection__inherit__graph.dot @@ -0,0 +1,12 @@ +digraph "lib60870.CS101.IMasterConnection" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="lib60870.CS101.IMasterConnection",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Provides functions to be used in Slave callbacks to send data back to the master."]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="lib60870.CS101.CS101Slave",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_c_s101_slave.html",tooltip="CS 101 slave implementation (implements Slave interface)"]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="lib60870.CS104.ClientConnection",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s104_1_1_client_connection.html",tooltip="Represents a client (master) connection."]; +} diff --git a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory-members.html b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory-members.html new file mode 100644 index 0000000..0db070e --- /dev/null +++ b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory-members.html @@ -0,0 +1,118 @@ + + + + + + + +lib60870.NET: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
lib60870.CS101.IPrivateIOFactory Member List
+
+
+ +

This is the complete list of members for lib60870.CS101.IPrivateIOFactory, including all inherited members.

+ + + +
Decode(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)lib60870.CS101.IPrivateIOFactory
GetEncodedSize()lib60870.CS101.IPrivateIOFactory
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html new file mode 100644 index 0000000..e158ed5 --- /dev/null +++ b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html @@ -0,0 +1,193 @@ + + + + + + + +lib60870.NET: lib60870.CS101.IPrivateIOFactory Interface Reference + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
lib60870.CS101.IPrivateIOFactory Interface Reference
+
+
+ + + + + + + + +

+Public Member Functions

InformationObject Decode (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
 Decode the information object and create a new InformationObject instance.
 
int GetEncodedSize ()
 Gets the encoded payload size of the object (information object size without the IOA)
 
+

Member Function Documentation

+ +

◆ Decode()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
InformationObject lib60870.CS101.IPrivateIOFactory.Decode (ApplicationLayerParameters parameters,
byte[] msg,
int startIndex,
bool isSequence )
+
+ +

Decode the information object and create a new InformationObject instance.

+
Parameters
+ + + + + +
parametersApplication layer parameters required for decoding
msgthe received message
startIndexstart index of the payload in the message
isSequenceIf set to true is sequence.
+
+
+ +
+
+ +

◆ GetEncodedSize()

+ +
+
+ + + + + + + +
int lib60870.CS101.IPrivateIOFactory.GetEncodedSize ()
+
+ +

Gets the encoded payload size of the object (information object size without the IOA)

+
Returns
The encoded size in bytes
+ +
+
+
The documentation for this interface was generated from the following file:
    +
  • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/InformationObject.cs
  • +
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.js b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.js new file mode 100644 index 0000000..bef9f27 --- /dev/null +++ b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.js @@ -0,0 +1,5 @@ +var interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory = +[ + [ "Decode", "interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html#ad705ef8ea182c4977221c7b3cc23d632", null ], + [ "GetEncodedSize", "interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html#a26a0623584b57db1a35b9e8fe1b7e02c", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/jquery.js b/doxygen/doxydoc.NET/html/jquery.js new file mode 100644 index 0000000..1dffb65 --- /dev/null +++ b/doxygen/doxydoc.NET/html/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html b/doxygen/doxydoc.NET/html/md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html new file mode 100644 index 0000000..de5d5bd --- /dev/null +++ b/doxygen/doxydoc.NET/html/md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html @@ -0,0 +1,133 @@ + + + + + + + +lib60870.NET: README lib60870.NET v2.3.0 + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
lib60870.NET 2.3.0 +
+
IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
README lib60870.NET v2.3.0
+
+
+

lib60870.NET library for IEC 60870-5 based protocols in C#

+

The current implementation contains code for the IEC 60870-5-101/104 protocols only.

+

Please also consider the User Guide.

+

+Compiling and running the examples:

+

lib60870.NET:

+

Open the provided solution file in the lib60870.NET folder with MonoDevelop or Visual Studio. You should be able to build and run the library and examples with any recent version of MonoDevelop or Visual Studio

+

+Contact:

+

For bug reports, hints or support please contact info@.nosp@m.mz-a.nosp@m.utoma.nosp@m.tion.nosp@m..de

+

+Licensing

+

This software is licensed under the GPLv3 (https://www.gnu.org/licenses/gpl-3.0.en.html).

+

+Commercial licenses and support

+

Support and commercial license options are provided by MZ Automation GmbH. Please contact info@.nosp@m.mz-a.nosp@m.utoma.nosp@m.tion.nosp@m..de for more details. Support for IEC 60870-5-103 (companion standard for protection devices) is only available with a commercial license.

+

+Contributing

+

If you want to contribute to the improvement and development of the library please send me comments, feature requests, bug reports, or patches. For more than trivial contributions I require you to sign a Contributor License Agreement. Please contact info@.nosp@m.mz-a.nosp@m.utoma.nosp@m.tion.nosp@m..de.

+
+
+
+ + + + diff --git a/doxygen/doxydoc.NET/html/menu.js b/doxygen/doxydoc.NET/html/menu.js new file mode 100644 index 0000000..0fd1e99 --- /dev/null +++ b/doxygen/doxydoc.NET/html/menu.js @@ -0,0 +1,134 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search,treeview) { + function makeTree(data,relPath) { + let result=''; + if ('children' in data) { + result+='
    '; + for (let i in data.children) { + let url; + const link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
  • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
  • '; + } + result+='
'; + } + return result; + } + let searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
'+ + '
'+ + '
 '+ + ''+ + '
'+ + '
'+ + '
'+ + '
'; + } else { + searchBoxHtml='
'+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
'; + } + } + + $('#main-nav').before('
'+ + ''+ + ''+ + '
'); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + const $mainMenuState = $('#main-menu-state'); + let prevWidth = 0; + if ($mainMenuState.length) { + const initResizableIfExists = function() { + if (typeof initResizable==='function') initResizable(treeview); + } + // animate mobile menu + $mainMenuState.change(function() { + const $menu = $('#main-menu'); + let options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = () => $menu.css('display', 'block'); + $menu.hide().slideDown(options); + } else { + options['complete'] = () => $menu.css('display', 'none'); + $menu.show().slideUp(options); + } + }); + // set default menu visibility + const resetState = function() { + const $menu = $('#main-menu'); + const newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/doxygen/doxydoc.NET/html/menudata.js b/doxygen/doxydoc.NET/html/menudata.js new file mode 100644 index 0000000..059e5c8 --- /dev/null +++ b/doxygen/doxydoc.NET/html/menudata.js @@ -0,0 +1,99 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Related Pages",url:"pages.html"}, +{text:"Packages",url:"namespaces.html",children:[ +{text:"Package List",url:"namespaces.html"}, +{text:"Package Members",url:"namespacemembers.html",children:[ +{text:"All",url:"namespacemembers.html"}, +{text:"Functions",url:"namespacemembers_func.html"}, +{text:"Enumerations",url:"namespacemembers_enum.html"}]}]}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Hierarchy",url:"inherits.html"}, +{text:"Class Members",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"a",url:"functions.html#index_a"}, +{text:"c",url:"functions_c.html#index_c"}, +{text:"d",url:"functions_d.html#index_d"}, +{text:"e",url:"functions_e.html#index_e"}, +{text:"f",url:"functions_f.html#index_f"}, +{text:"g",url:"functions_g.html#index_g"}, +{text:"h",url:"functions_h.html#index_h"}, +{text:"i",url:"functions_i.html#index_i"}, +{text:"k",url:"functions_k.html#index_k"}, +{text:"l",url:"functions_l.html#index_l"}, +{text:"m",url:"functions_m.html#index_m"}, +{text:"n",url:"functions_n.html#index_n"}, +{text:"o",url:"functions_o.html#index_o"}, +{text:"p",url:"functions_p.html#index_p"}, +{text:"q",url:"functions_q.html#index_q"}, +{text:"r",url:"functions_r.html#index_r"}, +{text:"s",url:"functions_s.html#index_s"}, +{text:"t",url:"functions_t.html#index_t"}, +{text:"u",url:"functions_u.html#index_u"}, +{text:"v",url:"functions_v.html#index_v"}, +{text:"w",url:"functions_w.html#index_w"}, +{text:"y",url:"functions_y.html#index_y"}]}, +{text:"Functions",url:"functions_func.html",children:[ +{text:"a",url:"functions_func.html#index_a"}, +{text:"c",url:"functions_func.html#index_c"}, +{text:"d",url:"functions_func.html#index_d"}, +{text:"e",url:"functions_func.html#index_e"}, +{text:"f",url:"functions_func.html#index_f"}, +{text:"g",url:"functions_func.html#index_g"}, +{text:"i",url:"functions_func.html#index_i"}, +{text:"l",url:"functions_func.html#index_l"}, +{text:"m",url:"functions_func.html#index_m"}, +{text:"r",url:"functions_func.html#index_r"}, +{text:"s",url:"functions_func.html#index_s"}, +{text:"t",url:"functions_func.html#index_t"}, +{text:"u",url:"functions_func.html#index_u"}]}, +{text:"Variables",url:"functions_vars.html"}, +{text:"Properties",url:"functions_prop.html",children:[ +{text:"a",url:"functions_prop.html#index_a"}, +{text:"c",url:"functions_prop.html#index_c"}, +{text:"d",url:"functions_prop.html#index_d"}, +{text:"e",url:"functions_prop.html#index_e"}, +{text:"f",url:"functions_prop.html#index_f"}, +{text:"g",url:"functions_prop.html#index_g"}, +{text:"h",url:"functions_prop.html#index_h"}, +{text:"i",url:"functions_prop.html#index_i"}, +{text:"k",url:"functions_prop.html#index_k"}, +{text:"l",url:"functions_prop.html#index_l"}, +{text:"m",url:"functions_prop.html#index_m"}, +{text:"n",url:"functions_prop.html#index_n"}, +{text:"o",url:"functions_prop.html#index_o"}, +{text:"p",url:"functions_prop.html#index_p"}, +{text:"q",url:"functions_prop.html#index_q"}, +{text:"r",url:"functions_prop.html#index_r"}, +{text:"s",url:"functions_prop.html#index_s"}, +{text:"t",url:"functions_prop.html#index_t"}, +{text:"u",url:"functions_prop.html#index_u"}, +{text:"v",url:"functions_prop.html#index_v"}, +{text:"w",url:"functions_prop.html#index_w"}, +{text:"y",url:"functions_prop.html#index_y"}]}]}]}]} diff --git a/doxygen/doxydoc.NET/html/minus.svg b/doxygen/doxydoc.NET/html/minus.svg new file mode 100644 index 0000000..f70d0c1 --- /dev/null +++ b/doxygen/doxydoc.NET/html/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doxygen/doxydoc.NET/html/minusd.svg b/doxygen/doxydoc.NET/html/minusd.svg new file mode 100644 index 0000000..5f8e879 --- /dev/null +++ b/doxygen/doxydoc.NET/html/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doxygen/doxydoc.NET/html/mz_logo.ico b/doxygen/doxydoc.NET/html/mz_logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..81b7786bf54b086d8d4dbce2f54bf377a00e2955 GIT binary patch literal 55030 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 QN + + + + + + +lib60870.NET: lib60870 Namespace Reference + + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    lib60870.NET 2.3.0 +
    +
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    lib60870 Namespace Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Classes

    class  ASDUParsingException
     
    class  ASDUQueue
     
    class  BufferFrame
     Implementation of Frame to encode into a given byte array.
     
    class  ConnectionException
     
    class  CP16Time2a
     
    class  CP24Time2a
     
    class  CP32Time2a
     
    class  CP56Time2a
     
    class  Frame
     Abstract class to encode an application layer frame. More...
     
    class  LibraryCommon
     Common information functions about the library. More...
     
    class  SingleCommandQualifier
     
    class  SystemUtils
     Some system related helper functions.
     
    + + + + +

    +Functions

    +delegate bool RawMessageHandler (object parameter, byte[] message, int messageSize)
     Raw message handler. Can be used to access the raw message. Returns true when message should be handled by the protocol stack, false, otherwise.
     
    +
    +
    + + + + diff --git a/doxygen/doxydoc.NET/html/namespacelib60870.js b/doxygen/doxydoc.NET/html/namespacelib60870.js new file mode 100644 index 0000000..f0a8fa7 --- /dev/null +++ b/doxygen/doxydoc.NET/html/namespacelib60870.js @@ -0,0 +1,17 @@ +var namespacelib60870 = +[ + [ "CS101", "namespacelib60870_1_1_c_s101.html", "namespacelib60870_1_1_c_s101" ], + [ "CS104", "namespacelib60870_1_1_c_s104.html", "namespacelib60870_1_1_c_s104" ], + [ "linklayer", "namespacelib60870_1_1linklayer.html", "namespacelib60870_1_1linklayer" ], + [ "ASDUParsingException", "classlib60870_1_1_a_s_d_u_parsing_exception.html", null ], + [ "ASDUQueue", "classlib60870_1_1_a_s_d_u_queue.html", null ], + [ "ConnectionException", "classlib60870_1_1_connection_exception.html", null ], + [ "CP16Time2a", "classlib60870_1_1_c_p16_time2a.html", null ], + [ "CP24Time2a", "classlib60870_1_1_c_p24_time2a.html", "classlib60870_1_1_c_p24_time2a" ], + [ "CP32Time2a", "classlib60870_1_1_c_p32_time2a.html", "classlib60870_1_1_c_p32_time2a" ], + [ "CP56Time2a", "classlib60870_1_1_c_p56_time2a.html", "classlib60870_1_1_c_p56_time2a" ], + [ "Frame", "classlib60870_1_1_frame.html", null ], + [ "LibraryCommon", "classlib60870_1_1_library_common.html", null ], + [ "SingleCommandQualifier", "classlib60870_1_1_single_command_qualifier.html", null ], + [ "RawMessageHandler", "namespacelib60870.html#a059755b125d35287c474551f4ffc619f", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s101.html b/doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s101.html new file mode 100644 index 0000000..f04970d --- /dev/null +++ b/doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s101.html @@ -0,0 +1,648 @@ + + + + + + + +lib60870.NET: lib60870.CS101 Namespace Reference + + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    lib60870.NET 2.3.0 +
    +
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    lib60870.CS101 Namespace Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Classes

    class  ApplicationLayerParameters
     
    class  ASDU
     This class represents an application layer message. It contains some generic message information and one or more InformationObject instances of the same type. It is used to send and receive messages. More...
     
    class  ASDUQueueException
     
    class  BinaryCounterReading
     Binary counter reading. Used for tranmission of integrated totals. More...
     
    class  Bitstring32
     
    class  Bitstring32Command
     
    class  Bitstring32CommandWithCP56Time2a
     
    class  Bitstring32WithCP24Time2a
     
    class  Bitstring32WithCP56Time2a
     
    class  ClockSynchronizationCommand
     
    class  CounterInterrogationCommand
     
    class  CS101Master
     
    class  CS101n104File
     Encapsulates a IFileProvider object to add some state information.
     
    class  CS101Slave
     CS 101 slave implementation (implements Slave interface) More...
     
    class  DelayAcquisitionCommand
     
    class  DoubleCommand
     
    class  DoubleCommandWithCP56Time2a
     
    class  DoublePointInformation
     Double point information object (M_DP_NA_1) More...
     
    class  DoublePointWithCP24Time2a
     Double point information object with CP24Time2a time tag (M_DP_TA_1) More...
     
    class  DoublePointWithCP56Time2a
     Double point information object with CP56Time2a time tag (M_DP_TB_1) More...
     
    class  EndOfInitialization
     End of initialization information object (M_EI_NA_1) More...
     
    class  EventOfProtectionEquipment
     Event of protection equipment information object (M_EP_TA_1) More...
     
    class  EventOfProtectionEquipmentWithCP56Time2a
     Event of protection equipment information object with CP56Time2a time tag (M_EP_TD_1) More...
     
    class  FileACK
     ACK file/section - F_AF_NA_1 (124) More...
     
    class  FileCallOrSelect
     Call/Select directory/file/section - F_SC_NA_1 (122) More...
     
    class  FileClient
     
    class  FileDirectory
     File directory - F_DR_TA_1 (126) More...
     
    class  FileLastSegmentOrSection
     Last segment/section - F_LS_NA_1 (123) More...
     
    class  FileReady
     File ready - F_FR_NA_1 (120) More...
     
    class  FilesAvailable
     Represents the available files in a file client or file server. More...
     
    class  FileSegment
     File segment - F_SG_NA_1 (125) More...
     
    class  FileServer
     
    interface  IFileProvider
     
    interface  IFileReceiver
     
    interface  IMasterConnection
     Provides functions to be used in Slave callbacks to send data back to the master. More...
     
    class  InformationObject
     
    class  IntegratedTotals
     Integrated totals information object (M_IT_NA_1) More...
     
    class  IntegratedTotalsWithCP24Time2a
     Integrated totals information object with CP24Time2a time tag (M_IT_TA_1) More...
     
    class  IntegratedTotalsWithCP56Time2a
     Integrated totals information object with CP56Time2a time tag (M_IT_TB_1) More...
     
    class  InterrogationCommand
     
    interface  IPrivateIOFactory
     
    class  Master
     Common interface for CS104 and CS101 balanced and unbalanced master. More...
     
    class  MeasuredValueNormalized
     Measured value normalized information object (M_ME_NA_1) More...
     
    class  MeasuredValueNormalizedWithCP24Time2a
     Measured value normalized with CP24Time2a time tag (M_ME_TA_1) More...
     
    class  MeasuredValueNormalizedWithCP56Time2a
     Measured value normalized with CP56Time2a time tag (M_ME_TD_1) More...
     
    class  MeasuredValueNormalizedWithoutQuality
     Measured value normalized without quality information object (M_ME_ND_1) More...
     
    class  MeasuredValueScaled
     
    class  MeasuredValueScaledWithCP24Time2a
     
    class  MeasuredValueScaledWithCP56Time2a
     
    class  MeasuredValueShort
     
    class  MeasuredValueShortWithCP24Time2a
     
    class  MeasuredValueShortWithCP56Time2a
     
    class  OutputCircuitInfo
     Output circuit information of protection equipment According to IEC 60870-5-101:2003 7.2.6.12. More...
     
    class  PackedOutputCircuitInfo
     
    class  PackedOutputCircuitInfoWithCP56Time2a
     
    class  PackedSinglePointWithSCD
     
    class  PackedStartEventsOfProtectionEquipment
     
    class  PackedStartEventsOfProtectionEquipmentWithCP56Time2a
     
    class  ParameterActivation
     
    class  ParameterFloatValue
     
    class  ParameterNormalizedValue
     
    class  ParameterScaledValue
     
    class  PrivateInformationObjectTypes
     Hold a list of private information object (IO) types to be used for parsing. More...
     
    class  QualifierOfInterrogation
     
    class  QualityDescriptor
     
    class  QualityDescriptorP
     QDP - Quality descriptor for events of protection equipment according to IEC 60870-5-101:2003 7.2.6.4. More...
     
    class  ReadCommand
     
    class  ResetProcessCommand
     
    class  ScaledValue
     
    class  SectionReady
     Section ready - F_SR_NA_1 (121) More...
     
    class  SetpointCommandNormalized
     
    class  SetpointCommandNormalizedWithCP56Time2a
     
    class  SetpointCommandQualifier
     
    class  SetpointCommandScaled
     
    class  SetpointCommandScaledWithCP56Time2a
     
    class  SetpointCommandShort
     
    class  SetpointCommandShortWithCP56Time2a
     
    class  SingleCommand
     
    class  SingleCommandWithCP56Time2a
     
    class  SingleEvent
     
    class  SinglePointInformation
     
    class  SinglePointWithCP24Time2a
     
    class  SinglePointWithCP56Time2a
     Single point with CP56Time2a timestamp (M_SP_TB_1) More...
     
    class  Slave
     
    class  StartEvent
     SPE - Start events of protection equipment according to IEC 60870-5-101:2003 7.2.6.11. More...
     
    class  StatusAndStatusChangeDetection
     
    class  StepCommand
     
    class  StepCommandWithCP56Time2a
     
    class  StepPositionInformation
     Step position information object (M_ST_NA_1) More...
     
    class  StepPositionWithCP24Time2a
     Step position information object with CP24Time2a time tag (M_ST_TA_1) More...
     
    class  StepPositionWithCP56Time2a
     Step position information object with CP56Time2a time tag (M_ST_TB_1) More...
     
    class  TestCommand
     
    class  TestCommandWithCP56Time2a
     
    class  TransparentFile
     Simple implementation of IFileProvider that can be used to provide transparent files. Derived classed should override the TransferComplete method. More...
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Enumerations

    enum  CauseOfTransmission {
    +  PERIODIC = 1 +, BACKGROUND_SCAN = 2 +, SPONTANEOUS = 3 +, INITIALIZED = 4 +,
    +  REQUEST = 5 +, ACTIVATION = 6 +, ACTIVATION_CON = 7 +, DEACTIVATION = 8 +,
    +  DEACTIVATION_CON = 9 +, ACTIVATION_TERMINATION = 10 +, RETURN_INFO_REMOTE = 11 +, RETURN_INFO_LOCAL = 12 +,
    +  FILE_TRANSFER = 13 +, AUTHENTICATION = 14 +, MAINTENANCE_OF_AUTH_SESSION_KEY = 15 +, MAINTENANCE_OF_USER_ROLE_AND_UPDATE_KEY = 16 +,
    +  INTERROGATED_BY_STATION = 20 +, INTERROGATED_BY_GROUP_1 = 21 +, INTERROGATED_BY_GROUP_2 = 22 +, INTERROGATED_BY_GROUP_3 = 23 +,
    +  INTERROGATED_BY_GROUP_4 = 24 +, INTERROGATED_BY_GROUP_5 = 25 +, INTERROGATED_BY_GROUP_6 = 26 +, INTERROGATED_BY_GROUP_7 = 27 +,
    +  INTERROGATED_BY_GROUP_8 = 28 +, INTERROGATED_BY_GROUP_9 = 29 +, INTERROGATED_BY_GROUP_10 = 30 +, INTERROGATED_BY_GROUP_11 = 31 +,
    +  INTERROGATED_BY_GROUP_12 = 32 +, INTERROGATED_BY_GROUP_13 = 33 +, INTERROGATED_BY_GROUP_14 = 34 +, INTERROGATED_BY_GROUP_15 = 35 +,
    +  INTERROGATED_BY_GROUP_16 = 36 +, REQUESTED_BY_GENERAL_COUNTER = 37 +, REQUESTED_BY_GROUP_1_COUNTER = 38 +, REQUESTED_BY_GROUP_2_COUNTER = 39 +,
    +  REQUESTED_BY_GROUP_3_COUNTER = 40 +, REQUESTED_BY_GROUP_4_COUNTER = 41 +, UNKNOWN_TYPE_ID = 44 +, UNKNOWN_CAUSE_OF_TRANSMISSION = 45 +,
    +  UNKNOWN_COMMON_ADDRESS_OF_ASDU = 46 +, UNKNOWN_INFORMATION_OBJECT_ADDRESS = 47 +
    + }
     The cause of transmission (COT)
     
    enum  DoublePointValue { INTERMEDIATE = 0 +, OFF = 1 +, ON = 2 +, INDETERMINATE = 3 + }
     Double point value.
     
    enum  NameOfFile : ushort {
    +  DEFAULT = 0 +, TRANSPARENT_FILE = 1 +, DISTURBANCE_DATA = 2 +, SEQUENCES_OF_EVENTS = 3 +,
    +  SEQUENCES_OF_ANALOGUE_VALUES = 4 +
    + }
     Name of file (NOF) - describes the type of a file.
     
    enum  SelectAndCallQualifier : byte {
    +  DEFAULT = 0 +, SELECT_FILE = 1 +, REQUEST_FILE = 2 +, DEACTIVATE_FILE = 3 +,
    +  DELETE_FILE = 4 +, SELECT_SECTION = 5 +, REQUEST_SECTION = 6 +, DEACTIVATE_SECTION = 7 +
    + }
     Select and call qualifier (SCQ)
     
    enum  LastSectionOrSegmentQualifier : byte {
    +  NOT_USED = 0 +, FILE_TRANSFER_WITHOUT_DEACT = 1 +, FILE_TRANSFER_WITH_DEACT = 2 +, SECTION_TRANSFER_WITHOUT_DEACT = 3 +,
    +  SECTION_TRANSFER_WITH_DEACT = 4 +
    + }
     Last section or segment qualifier (LSQ)
     
    enum  AcknowledgeQualifier {
    +  NOT_USED = 0 +, POS_ACK_FILE = 1 +, NEG_ACK_FILE = 2 +, POS_ACK_SECTION = 3 +,
    +  NEG_ACK_SECTION = 4 +
    + }
     Acknowledge qualifier (AFQ)
     
    enum  FileError {
    +  DEFAULT = 0 +, REQ_MEMORY_NOT_AVAILABLE = 1 +, CHECKSUM_FAILED = 2 +, UNEXPECTED_COMM_SERVICE = 3 +,
    +  UNEXPECTED_NAME_OF_FILE = 4 +, UNEXPECTED_NAME_OF_SECTION = 5 +
    + }
     File Error.
     
    enum  FileErrorCode {
    +  SUCCESS +, TIMEOUT +, FILE_NOT_READY +, SECTION_NOT_READY +,
    +  UNKNOWN_CA +, UNKNOWN_IOA +, UNKNOWN_SERVICE +, PROTOCOL_ERROR +,
    +  ABORTED_BY_REMOTE +
    + }
     
    enum  StepCommandValue { INVALID_0 = 0 +, LOWER = 1 +, HIGHER = 2 +, INVALID_3 = 3 + }
     Regulating step command state (RCS) according to IEC 60870-5-101:2003 7.2.6.17.
     
    enum  EventState { INDETERMINATE_0 = 0 +, OFF = 1 +, ON = 2 +, INDETERMINATE_3 = 3 + }
     
    enum  TypeID {
    +  M_SP_NA_1 = 1 +, M_SP_TA_1 = 2 +, M_DP_NA_1 = 3 +, M_DP_TA_1 = 4 +,
    +  M_ST_NA_1 = 5 +, M_ST_TA_1 = 6 +, M_BO_NA_1 = 7 +, M_BO_TA_1 = 8 +,
    +  M_ME_NA_1 = 9 +, M_ME_TA_1 = 10 +, M_ME_NB_1 = 11 +, M_ME_TB_1 = 12 +,
    +  M_ME_NC_1 = 13 +, M_ME_TC_1 = 14 +, M_IT_NA_1 = 15 +, M_IT_TA_1 = 16 +,
    +  M_EP_TA_1 = 17 +, M_EP_TB_1 = 18 +, M_EP_TC_1 = 19 +, M_PS_NA_1 = 20 +,
    +  M_ME_ND_1 = 21 +, M_SP_TB_1 = 30 +, M_DP_TB_1 = 31 +, M_ST_TB_1 = 32 +,
    +  M_BO_TB_1 = 33 +, M_ME_TD_1 = 34 +, M_ME_TE_1 = 35 +, M_ME_TF_1 = 36 +,
    +  M_IT_TB_1 = 37 +, M_EP_TD_1 = 38 +, M_EP_TE_1 = 39 +, M_EP_TF_1 = 40 +,
    +  C_SC_NA_1 = 45 +, C_DC_NA_1 = 46 +, C_RC_NA_1 = 47 +, C_SE_NA_1 = 48 +,
    +  C_SE_NB_1 = 49 +, C_SE_NC_1 = 50 +, C_BO_NA_1 = 51 +, C_SC_TA_1 = 58 +,
    +  C_DC_TA_1 = 59 +, C_RC_TA_1 = 60 +, C_SE_TA_1 = 61 +, C_SE_TB_1 = 62 +,
    +  C_SE_TC_1 = 63 +, C_BO_TA_1 = 64 +, M_EI_NA_1 = 70 +, C_IC_NA_1 = 100 +,
    +  C_CI_NA_1 = 101 +, C_RD_NA_1 = 102 +, C_CS_NA_1 = 103 +, C_TS_NA_1 = 104 +,
    +  C_RP_NA_1 = 105 +, C_CD_NA_1 = 106 +, C_TS_TA_1 = 107 +, P_ME_NA_1 = 110 +,
    +  P_ME_NB_1 = 111 +, P_ME_NC_1 = 112 +, P_AC_NA_1 = 113 +, F_FR_NA_1 = 120 +,
    +  F_SR_NA_1 = 121 +, F_SC_NA_1 = 122 +, F_LS_NA_1 = 123 +, F_AF_NA_1 = 124 +,
    +  F_SG_NA_1 = 125 +, F_DR_TA_1 = 126 +, F_SC_NB_1 = 127 +
    + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    +delegate IFileReceiver FileReadyHandler (object parameter, int ca, int ioa, NameOfFile nof, int lengthOfFile)
     File ready handler. Will be called by the FileServer when a master sends a FILE READY (file download announcement) message to the slave.
     
    +delegate void DebugLogger (string message)
     
    +delegate bool ASDUReceivedHandler (object parameter, int slaveAddress, ASDU asdu)
     Handler that is called when a new ASDU is received.
     
    +delegate bool InterrogationHandler (object parameter, IMasterConnection connection, ASDU asdu, byte qoi)
     Handler for interrogation command (C_IC_NA_1 - 100).
     
    +delegate bool CounterInterrogationHandler (object parameter, IMasterConnection connection, ASDU asdu, byte qoi)
     Handler for counter interrogation command (C_CI_NA_1 - 101).
     
    +delegate bool ReadHandler (object parameter, IMasterConnection connection, ASDU asdu, int ioa)
     Handler for read command (C_RD_NA_1 - 102)
     
    +delegate bool ClockSynchronizationHandler (object parameter, IMasterConnection connection, ASDU asdu, CP56Time2a newTime)
     Handler for clock synchronization command (C_CS_NA_1 - 103)
     
    +delegate bool ResetProcessHandler (object parameter, IMasterConnection connection, ASDU asdu, byte qrp)
     Handler for reset process command (C_RP_NA_1 - 105)
     
    +delegate bool DelayAcquisitionHandler (object parameter, IMasterConnection connection, ASDU asdu, CP16Time2a delayTime)
     Handler for delay acquisition command (C_CD_NA:1 - 106)
     
    +delegate bool ASDUHandler (object parameter, IMasterConnection connection, ASDU asdu)
     Handler for ASDUs that are not handled by other handlers (default handler)
     
    +

    Enumeration Type Documentation

    + +

    ◆ TypeID

    + +
    +
    + + + + +
    enum lib60870.CS101.TypeID
    +
    + + +
    Enumerator
    M_ME_NA_1 

    Measured Value, normalized value.

    +
    + +
    +
    +
    +
    + + + + diff --git a/doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s101.js b/doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s101.js new file mode 100644 index 0000000..086a388 --- /dev/null +++ b/doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s101.js @@ -0,0 +1,267 @@ +var namespacelib60870_1_1_c_s101 = +[ + [ "ApplicationLayerParameters", "classlib60870_1_1_c_s101_1_1_application_layer_parameters.html", null ], + [ "ASDU", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html", "classlib60870_1_1_c_s101_1_1_a_s_d_u" ], + [ "ASDUQueueException", "classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception.html", null ], + [ "BinaryCounterReading", "classlib60870_1_1_c_s101_1_1_binary_counter_reading.html", "classlib60870_1_1_c_s101_1_1_binary_counter_reading" ], + [ "Bitstring32", "classlib60870_1_1_c_s101_1_1_bitstring32.html", null ], + [ "Bitstring32Command", "classlib60870_1_1_c_s101_1_1_bitstring32_command.html", null ], + [ "Bitstring32CommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a.html", null ], + [ "Bitstring32WithCP24Time2a", "classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a.html", null ], + [ "Bitstring32WithCP56Time2a", "classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a.html", null ], + [ "ClockSynchronizationCommand", "classlib60870_1_1_c_s101_1_1_clock_synchronization_command.html", null ], + [ "CounterInterrogationCommand", "classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html", "classlib60870_1_1_c_s101_1_1_counter_interrogation_command" ], + [ "CS101Master", "classlib60870_1_1_c_s101_1_1_c_s101_master.html", "classlib60870_1_1_c_s101_1_1_c_s101_master" ], + [ "CS101Slave", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html", "classlib60870_1_1_c_s101_1_1_c_s101_slave" ], + [ "DelayAcquisitionCommand", "classlib60870_1_1_c_s101_1_1_delay_acquisition_command.html", null ], + [ "DoubleCommand", "classlib60870_1_1_c_s101_1_1_double_command.html", null ], + [ "DoubleCommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a.html", null ], + [ "DoublePointInformation", "classlib60870_1_1_c_s101_1_1_double_point_information.html", null ], + [ "DoublePointWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a.html", null ], + [ "DoublePointWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a.html", null ], + [ "EndOfInitialization", "classlib60870_1_1_c_s101_1_1_end_of_initialization.html", "classlib60870_1_1_c_s101_1_1_end_of_initialization" ], + [ "EventOfProtectionEquipment", "classlib60870_1_1_c_s101_1_1_event_of_protection_equipment.html", null ], + [ "EventOfProtectionEquipmentWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a.html", null ], + [ "FileACK", "classlib60870_1_1_c_s101_1_1_file_a_c_k.html", "classlib60870_1_1_c_s101_1_1_file_a_c_k" ], + [ "FileCallOrSelect", "classlib60870_1_1_c_s101_1_1_file_call_or_select.html", "classlib60870_1_1_c_s101_1_1_file_call_or_select" ], + [ "FileDirectory", "classlib60870_1_1_c_s101_1_1_file_directory.html", "classlib60870_1_1_c_s101_1_1_file_directory" ], + [ "FileLastSegmentOrSection", "classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html", "classlib60870_1_1_c_s101_1_1_file_last_segment_or_section" ], + [ "FileReady", "classlib60870_1_1_c_s101_1_1_file_ready.html", "classlib60870_1_1_c_s101_1_1_file_ready" ], + [ "FilesAvailable", "classlib60870_1_1_c_s101_1_1_files_available.html", "classlib60870_1_1_c_s101_1_1_files_available" ], + [ "FileSegment", "classlib60870_1_1_c_s101_1_1_file_segment.html", null ], + [ "IFileProvider", "interfacelib60870_1_1_c_s101_1_1_i_file_provider.html", "interfacelib60870_1_1_c_s101_1_1_i_file_provider" ], + [ "IFileReceiver", "interfacelib60870_1_1_c_s101_1_1_i_file_receiver.html", null ], + [ "IMasterConnection", "interfacelib60870_1_1_c_s101_1_1_i_master_connection.html", null ], + [ "InformationObject", "classlib60870_1_1_c_s101_1_1_information_object.html", "classlib60870_1_1_c_s101_1_1_information_object" ], + [ "IntegratedTotals", "classlib60870_1_1_c_s101_1_1_integrated_totals.html", null ], + [ "IntegratedTotalsWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a.html", null ], + [ "IntegratedTotalsWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a.html", null ], + [ "InterrogationCommand", "classlib60870_1_1_c_s101_1_1_interrogation_command.html", null ], + [ "IPrivateIOFactory", "interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html", "interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory" ], + [ "Master", "classlib60870_1_1_c_s101_1_1_master.html", "classlib60870_1_1_c_s101_1_1_master" ], + [ "MeasuredValueNormalized", "classlib60870_1_1_c_s101_1_1_measured_value_normalized.html", null ], + [ "MeasuredValueNormalizedWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a.html", null ], + [ "MeasuredValueNormalizedWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a.html", null ], + [ "MeasuredValueNormalizedWithoutQuality", "classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html", null ], + [ "MeasuredValueScaled", "classlib60870_1_1_c_s101_1_1_measured_value_scaled.html", "classlib60870_1_1_c_s101_1_1_measured_value_scaled" ], + [ "MeasuredValueScaledWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a.html", null ], + [ "MeasuredValueScaledWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a.html", null ], + [ "MeasuredValueShort", "classlib60870_1_1_c_s101_1_1_measured_value_short.html", null ], + [ "MeasuredValueShortWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a.html", null ], + [ "MeasuredValueShortWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a.html", null ], + [ "OutputCircuitInfo", "classlib60870_1_1_c_s101_1_1_output_circuit_info.html", "classlib60870_1_1_c_s101_1_1_output_circuit_info" ], + [ "PackedOutputCircuitInfo", "classlib60870_1_1_c_s101_1_1_packed_output_circuit_info.html", null ], + [ "PackedOutputCircuitInfoWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a.html", null ], + [ "PackedSinglePointWithSCD", "classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d.html", null ], + [ "PackedStartEventsOfProtectionEquipment", "classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment.html", null ], + [ "PackedStartEventsOfProtectionEquipmentWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a.html", null ], + [ "ParameterActivation", "classlib60870_1_1_c_s101_1_1_parameter_activation.html", "classlib60870_1_1_c_s101_1_1_parameter_activation" ], + [ "ParameterFloatValue", "classlib60870_1_1_c_s101_1_1_parameter_float_value.html", null ], + [ "ParameterNormalizedValue", "classlib60870_1_1_c_s101_1_1_parameter_normalized_value.html", null ], + [ "ParameterScaledValue", "classlib60870_1_1_c_s101_1_1_parameter_scaled_value.html", null ], + [ "PrivateInformationObjectTypes", "classlib60870_1_1_c_s101_1_1_private_information_object_types.html", null ], + [ "QualifierOfInterrogation", "classlib60870_1_1_c_s101_1_1_qualifier_of_interrogation.html", null ], + [ "QualityDescriptor", "classlib60870_1_1_c_s101_1_1_quality_descriptor.html", null ], + [ "QualityDescriptorP", "classlib60870_1_1_c_s101_1_1_quality_descriptor_p.html", null ], + [ "ReadCommand", "classlib60870_1_1_c_s101_1_1_read_command.html", null ], + [ "ResetProcessCommand", "classlib60870_1_1_c_s101_1_1_reset_process_command.html", "classlib60870_1_1_c_s101_1_1_reset_process_command" ], + [ "ScaledValue", "classlib60870_1_1_c_s101_1_1_scaled_value.html", null ], + [ "SectionReady", "classlib60870_1_1_c_s101_1_1_section_ready.html", "classlib60870_1_1_c_s101_1_1_section_ready" ], + [ "SetpointCommandNormalized", "classlib60870_1_1_c_s101_1_1_setpoint_command_normalized.html", null ], + [ "SetpointCommandNormalizedWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a.html", null ], + [ "SetpointCommandQualifier", "classlib60870_1_1_c_s101_1_1_setpoint_command_qualifier.html", null ], + [ "SetpointCommandScaled", "classlib60870_1_1_c_s101_1_1_setpoint_command_scaled.html", null ], + [ "SetpointCommandScaledWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a.html", null ], + [ "SetpointCommandShort", "classlib60870_1_1_c_s101_1_1_setpoint_command_short.html", null ], + [ "SetpointCommandShortWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a.html", null ], + [ "SingleCommand", "classlib60870_1_1_c_s101_1_1_single_command.html", "classlib60870_1_1_c_s101_1_1_single_command" ], + [ "SingleCommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a.html", null ], + [ "SingleEvent", "classlib60870_1_1_c_s101_1_1_single_event.html", null ], + [ "SinglePointInformation", "classlib60870_1_1_c_s101_1_1_single_point_information.html", null ], + [ "SinglePointWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a.html", null ], + [ "SinglePointWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a.html", null ], + [ "Slave", "classlib60870_1_1_c_s101_1_1_slave.html", "classlib60870_1_1_c_s101_1_1_slave" ], + [ "StartEvent", "classlib60870_1_1_c_s101_1_1_start_event.html", "classlib60870_1_1_c_s101_1_1_start_event" ], + [ "StatusAndStatusChangeDetection", "classlib60870_1_1_c_s101_1_1_status_and_status_change_detection.html", null ], + [ "StepCommand", "classlib60870_1_1_c_s101_1_1_step_command.html", null ], + [ "StepCommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a.html", null ], + [ "StepPositionInformation", "classlib60870_1_1_c_s101_1_1_step_position_information.html", "classlib60870_1_1_c_s101_1_1_step_position_information" ], + [ "StepPositionWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a.html", null ], + [ "StepPositionWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a.html", null ], + [ "TestCommand", "classlib60870_1_1_c_s101_1_1_test_command.html", null ], + [ "TestCommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html", "classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a" ], + [ "TransparentFile", "classlib60870_1_1_c_s101_1_1_transparent_file.html", "classlib60870_1_1_c_s101_1_1_transparent_file" ], + [ "AcknowledgeQualifier", "namespacelib60870_1_1_c_s101.html#af2506d56be1cd94a330f0f26d45ececc", [ + [ "NOT_USED", "namespacelib60870_1_1_c_s101.html#af2506d56be1cd94a330f0f26d45ececca29b49ac013c4624b51d17a503baf07d1", null ], + [ "POS_ACK_FILE", "namespacelib60870_1_1_c_s101.html#af2506d56be1cd94a330f0f26d45ececca49be006d9bd0a9c532d1e26f241877a6", null ], + [ "NEG_ACK_FILE", "namespacelib60870_1_1_c_s101.html#af2506d56be1cd94a330f0f26d45ececca22eb29b0b62a6538c9a67e3bab7d6729", null ], + [ "POS_ACK_SECTION", "namespacelib60870_1_1_c_s101.html#af2506d56be1cd94a330f0f26d45ececca2581eea24ac7f24203fa2c244eead58e", null ], + [ "NEG_ACK_SECTION", "namespacelib60870_1_1_c_s101.html#af2506d56be1cd94a330f0f26d45ececca977593995bf100b51e24460e374820fe", null ] + ] ], + [ "CauseOfTransmission", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cc", [ + [ "PERIODIC", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccad9d83fc826ae0d42075af007a477e2c9", null ], + [ "BACKGROUND_SCAN", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca0d00e22b7d8fd09ee49bf50f7f1c5210", null ], + [ "SPONTANEOUS", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccab737bea05b06a56b320bc5c93f114331", null ], + [ "INITIALIZED", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccadee5f03c2c4e73657824e028494b18c0", null ], + [ "REQUEST", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccaad6c35880c58d97c03d60a6ad0f23737", null ], + [ "ACTIVATION", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccaa62e9496bde05da2a14255d4a533bab9", null ], + [ "ACTIVATION_CON", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca07122f304b1ce18d4decd99129e122c3", null ], + [ "DEACTIVATION", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccac12cd7e956b40f674ea37329d588d086", null ], + [ "DEACTIVATION_CON", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca1931fde91833781b7200f44e261d54cb", null ], + [ "ACTIVATION_TERMINATION", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca13f0e69255aebb2b29e8f324cab9c087", null ], + [ "RETURN_INFO_REMOTE", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca64bc588ed54506354c78e2d78b5ab9a5", null ], + [ "RETURN_INFO_LOCAL", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca79f6db516cbe95b755539cb279da54e7", null ], + [ "FILE_TRANSFER", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca1435335ae73283d491ff80015d540c41", null ], + [ "AUTHENTICATION", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccac1f244be04c43841756fff0cdb74f994", null ], + [ "MAINTENANCE_OF_AUTH_SESSION_KEY", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca33cf657d0fa462fbe504bd426649ade2", null ], + [ "MAINTENANCE_OF_USER_ROLE_AND_UPDATE_KEY", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccacfcea62f5090675fd048a8395f8aded7", null ], + [ "INTERROGATED_BY_STATION", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca97af44147bf0e196870dfaf43f733823", null ], + [ "INTERROGATED_BY_GROUP_1", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccade0439d37ad6c9ed3c5781892221ca01", null ], + [ "INTERROGATED_BY_GROUP_2", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca2bdcdbffa3a8b791ec02fd56710f8e67", null ], + [ "INTERROGATED_BY_GROUP_3", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccaa17779b8ba08ddb51b856c99f6c52d7a", null ], + [ "INTERROGATED_BY_GROUP_4", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca786eaa3f3715492f0aabea0417b9920b", null ], + [ "INTERROGATED_BY_GROUP_5", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca259d7c0d0814f335583b7341797a1248", null ], + [ "INTERROGATED_BY_GROUP_6", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccad94d68c7cb935b28f14e49f52e7ac034", null ], + [ "INTERROGATED_BY_GROUP_7", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca2b2f592977dcfd82521b1084d565f628", null ], + [ "INTERROGATED_BY_GROUP_8", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccab90252c3a74afebfd4c09ded5a9ddf56", null ], + [ "INTERROGATED_BY_GROUP_9", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca76543764a887ecd7b43bd413c5358fbc", null ], + [ "INTERROGATED_BY_GROUP_10", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccac6f6cf5db98948ad72cfa743546da51c", null ], + [ "INTERROGATED_BY_GROUP_11", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca846080f0be72abc949a6d8054e35d85c", null ], + [ "INTERROGATED_BY_GROUP_12", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccafba7475c103af5daafb3a13d614df030", null ], + [ "INTERROGATED_BY_GROUP_13", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccac878dfeeddf94ab18ee7fd6a42e66800", null ], + [ "INTERROGATED_BY_GROUP_14", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccacbcdfb5fa9a1074f4773fe374b8a1b2a", null ], + [ "INTERROGATED_BY_GROUP_15", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccab822360ee6d4dd4641616cfa0a888f96", null ], + [ "INTERROGATED_BY_GROUP_16", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca4d45f86dcf150feafc31571831aec60c", null ], + [ "REQUESTED_BY_GENERAL_COUNTER", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca4ea758ddeaf232c4be02f12f17cc2f3f", null ], + [ "REQUESTED_BY_GROUP_1_COUNTER", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca8f23fe2479b84e5d5381881c874e8339", null ], + [ "REQUESTED_BY_GROUP_2_COUNTER", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca465e2b77ee700544a37e8dc0fe811858", null ], + [ "REQUESTED_BY_GROUP_3_COUNTER", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca53ec0b40996e51b17c1fc32b7b1b7c1e", null ], + [ "REQUESTED_BY_GROUP_4_COUNTER", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca6d8fff24a6a56d7d57250cdb0b5d2656", null ], + [ "UNKNOWN_TYPE_ID", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca10fe0de0548e6a9816513500231b7872", null ], + [ "UNKNOWN_CAUSE_OF_TRANSMISSION", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccaa9f052e684420f3cfc12361759645ec3", null ], + [ "UNKNOWN_COMMON_ADDRESS_OF_ASDU", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca9f88466a9e519fc7955ab0bab7ac153c", null ], + [ "UNKNOWN_INFORMATION_OBJECT_ADDRESS", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca0cb02b2fc8dad3ee00753192f00d3a74", null ] + ] ], + [ "DoublePointValue", "namespacelib60870_1_1_c_s101.html#aff74ed75cebe96a815464d1ef856e3ad", [ + [ "INTERMEDIATE", "namespacelib60870_1_1_c_s101.html#aff74ed75cebe96a815464d1ef856e3ada41dc7c9e385c4d2b6c1f7836973951bf", null ], + [ "OFF", "namespacelib60870_1_1_c_s101.html#aff74ed75cebe96a815464d1ef856e3ada88559a0cfd8250c9d65970cc145c92d4", null ], + [ "ON", "namespacelib60870_1_1_c_s101.html#aff74ed75cebe96a815464d1ef856e3ada90651ebea9a35ec4e018c8157492e17c", null ], + [ "INDETERMINATE", "namespacelib60870_1_1_c_s101.html#aff74ed75cebe96a815464d1ef856e3ada717bb676b27571e4f5392a911194842a", null ] + ] ], + [ "FileError", "namespacelib60870_1_1_c_s101.html#a69c8264ee40e2407023b71a5dfd09e0f", [ + [ "DEFAULT", "namespacelib60870_1_1_c_s101.html#a69c8264ee40e2407023b71a5dfd09e0fa5b39c8b553c821e7cddc6da64b5bd2ee", null ], + [ "REQ_MEMORY_NOT_AVAILABLE", "namespacelib60870_1_1_c_s101.html#a69c8264ee40e2407023b71a5dfd09e0fae0a0fbb6d576b0ebc57da0717c9b1943", null ], + [ "CHECKSUM_FAILED", "namespacelib60870_1_1_c_s101.html#a69c8264ee40e2407023b71a5dfd09e0fa0aaa16e0a9def62ff9f96c5db827fd78", null ], + [ "UNEXPECTED_COMM_SERVICE", "namespacelib60870_1_1_c_s101.html#a69c8264ee40e2407023b71a5dfd09e0faea3cb6be1ec819d1f0bbf8f1b143890c", null ], + [ "UNEXPECTED_NAME_OF_FILE", "namespacelib60870_1_1_c_s101.html#a69c8264ee40e2407023b71a5dfd09e0fa6b87ef1b6f4a063d1154bb666e5b6306", null ], + [ "UNEXPECTED_NAME_OF_SECTION", "namespacelib60870_1_1_c_s101.html#a69c8264ee40e2407023b71a5dfd09e0fa4d56c751e7fbf4b6ff7b18d5e8c2882a", null ] + ] ], + [ "LastSectionOrSegmentQualifier", "namespacelib60870_1_1_c_s101.html#a7030b42dc57243516c07cb22a1992183", [ + [ "NOT_USED", "namespacelib60870_1_1_c_s101.html#a7030b42dc57243516c07cb22a1992183a29b49ac013c4624b51d17a503baf07d1", null ], + [ "FILE_TRANSFER_WITHOUT_DEACT", "namespacelib60870_1_1_c_s101.html#a7030b42dc57243516c07cb22a1992183a3e4fcf2723d3e8b8e35c5bea443c2fd3", null ], + [ "FILE_TRANSFER_WITH_DEACT", "namespacelib60870_1_1_c_s101.html#a7030b42dc57243516c07cb22a1992183a6e32e506b3aacff63d0d16390e1ccb3f", null ], + [ "SECTION_TRANSFER_WITHOUT_DEACT", "namespacelib60870_1_1_c_s101.html#a7030b42dc57243516c07cb22a1992183a5eb6c7bbbcb88adf2465ba3f306856bd", null ], + [ "SECTION_TRANSFER_WITH_DEACT", "namespacelib60870_1_1_c_s101.html#a7030b42dc57243516c07cb22a1992183a19264adc13cb89a2b0d4d6c7e126db51", null ] + ] ], + [ "NameOfFile", "namespacelib60870_1_1_c_s101.html#a5da0329a39b420cbbf859758eaceba93", [ + [ "DEFAULT", "namespacelib60870_1_1_c_s101.html#a5da0329a39b420cbbf859758eaceba93a5b39c8b553c821e7cddc6da64b5bd2ee", null ], + [ "TRANSPARENT_FILE", "namespacelib60870_1_1_c_s101.html#a5da0329a39b420cbbf859758eaceba93a2d18e760bfde6792ec47ea638bca1419", null ], + [ "DISTURBANCE_DATA", "namespacelib60870_1_1_c_s101.html#a5da0329a39b420cbbf859758eaceba93af8a8531f269526e2cdd6cb67d5661734", null ], + [ "SEQUENCES_OF_EVENTS", "namespacelib60870_1_1_c_s101.html#a5da0329a39b420cbbf859758eaceba93ab981d9d396d5ee12e44b9ff0a44c915e", null ], + [ "SEQUENCES_OF_ANALOGUE_VALUES", "namespacelib60870_1_1_c_s101.html#a5da0329a39b420cbbf859758eaceba93a27f3376781085bbcdbb69412b826a437", null ] + ] ], + [ "SelectAndCallQualifier", "namespacelib60870_1_1_c_s101.html#ac5a919dfe39a648cc5ea40d072ca98a3", [ + [ "DEFAULT", "namespacelib60870_1_1_c_s101.html#ac5a919dfe39a648cc5ea40d072ca98a3a5b39c8b553c821e7cddc6da64b5bd2ee", null ], + [ "SELECT_FILE", "namespacelib60870_1_1_c_s101.html#ac5a919dfe39a648cc5ea40d072ca98a3a0a5636b3d4a92cb2d2765d5942d10827", null ], + [ "REQUEST_FILE", "namespacelib60870_1_1_c_s101.html#ac5a919dfe39a648cc5ea40d072ca98a3abbe83a2308504c9892ab86eb39f11e3c", null ], + [ "DEACTIVATE_FILE", "namespacelib60870_1_1_c_s101.html#ac5a919dfe39a648cc5ea40d072ca98a3a5e0a8537b237cd36e5a3cf5c81269957", null ], + [ "DELETE_FILE", "namespacelib60870_1_1_c_s101.html#ac5a919dfe39a648cc5ea40d072ca98a3a1fffa6180b5fb6b758779d01127ae95a", null ], + [ "SELECT_SECTION", "namespacelib60870_1_1_c_s101.html#ac5a919dfe39a648cc5ea40d072ca98a3a0be513e7635e75e9c385ce71ffd890a9", null ], + [ "REQUEST_SECTION", "namespacelib60870_1_1_c_s101.html#ac5a919dfe39a648cc5ea40d072ca98a3ae457052e488d117b6795d622aa91f9b5", null ], + [ "DEACTIVATE_SECTION", "namespacelib60870_1_1_c_s101.html#ac5a919dfe39a648cc5ea40d072ca98a3a86d7f9901e2f3300ce34ab6baf10bf48", null ] + ] ], + [ "StepCommandValue", "namespacelib60870_1_1_c_s101.html#a8b8573d2c7289fab9db7a1ce5ff40286", [ + [ "INVALID_0", "namespacelib60870_1_1_c_s101.html#a8b8573d2c7289fab9db7a1ce5ff40286a2d89af028887e2c01151359084134305", null ], + [ "LOWER", "namespacelib60870_1_1_c_s101.html#a8b8573d2c7289fab9db7a1ce5ff40286aa7c48ba367e019d004bfb0239b85f2b3", null ], + [ "HIGHER", "namespacelib60870_1_1_c_s101.html#a8b8573d2c7289fab9db7a1ce5ff40286a5bc0a7ce2c77ccd49169277e9289e5d1", null ], + [ "INVALID_3", "namespacelib60870_1_1_c_s101.html#a8b8573d2c7289fab9db7a1ce5ff40286a5f48180707bf286894e0357c3e390cd0", null ] + ] ], + [ "TypeID", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bb", [ + [ "M_SP_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba51cbc2bb20a7470300bfa2139279b635", null ], + [ "M_SP_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba9a40fcd6cc2c2347830d278c30b45826", null ], + [ "M_DP_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba1ba0ca670f21d77d31ee36a9ca39b4ab", null ], + [ "M_DP_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba03860275ea0672ca47dae2d3e13fbd97", null ], + [ "M_ST_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba312b24d11baa01ebaf2a7fd34945767a", null ], + [ "M_ST_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba3f1c295c65a5a044176367add39913b0", null ], + [ "M_BO_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbaf0c04d33dee33c790cd1ba86d48c974d", null ], + [ "M_BO_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbae213bf9dd1a002a5a08452a88f7f49eb", null ], + [ "M_ME_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba6725773b3371787d2445c3dfad2d68fb", null ], + [ "M_ME_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba8a6f3f970ec2efcdefe4855c7bbc67ea", null ], + [ "M_ME_NB_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbaa94001a74a0db3aaa21fa1e27e9e9cab", null ], + [ "M_ME_TB_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbae139f46e3919f06d95fad3bd62c8a8c5", null ], + [ "M_ME_NC_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba272ed5a9d710f1d314cb1273c58cd2f3", null ], + [ "M_ME_TC_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbad652cd758a1b9db2b4939e08bcd5fd3a", null ], + [ "M_IT_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbac9f49bf985741005acba52c23c0b1a89", null ], + [ "M_IT_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbaf84329f985e4c2b74b9fde3570ab4109", null ], + [ "M_EP_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbabd0487ea6253a1a7415da39ff8b7160c", null ], + [ "M_EP_TB_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbad4f16952e560700878634df949e714e9", null ], + [ "M_EP_TC_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba72d79e34c64068abb2623e9010f5cfb9", null ], + [ "M_PS_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba452d4b64bdbb96703f823d8b07920c39", null ], + [ "M_ME_ND_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba1ae741202506f138c68d10dbc79908bf", null ], + [ "M_SP_TB_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba0b1ad1295a141bef31e2d896395a10dd", null ], + [ "M_DP_TB_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba15be3fbeead3dcc6060fdf4fabc1b955", null ], + [ "M_ST_TB_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbae94c695bf05bb3690f20bf9b16f34110", null ], + [ "M_BO_TB_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba932c149f2bd3f13dde06d0c51538473c", null ], + [ "M_ME_TD_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba4a65e6ef8205d9e4d9b5c0d1198ca88e", null ], + [ "M_ME_TE_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbaec990bb5f91926bc2f37be606ae48ba7", null ], + [ "M_ME_TF_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba030c30f68889dacd0b4f169b8bda0a20", null ], + [ "M_IT_TB_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba533e06821b2eeb5f4e562fe719eb0b22", null ], + [ "M_EP_TD_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbafcd4dec2edff21e5353ff8e31686fa1d", null ], + [ "M_EP_TE_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba4e4f1cec2277b3873a1d8ed3f9eee010", null ], + [ "M_EP_TF_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba238f4e12ebca75c50c61e6ae87d9fb63", null ], + [ "C_SC_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba9e0ad39b75b5c81abd517f3e5939d77f", null ], + [ "C_DC_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbade3036df871f3be580cd56c60f7e7bff", null ], + [ "C_RC_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba8e5710d257fa976d73b6239f9fe90569", null ], + [ "C_SE_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba473cb4056bfe4c9a5d5a3644cbe17b25", null ], + [ "C_SE_NB_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba2854665c5115d211e1421ca77e021132", null ], + [ "C_SE_NC_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba17b3631f0b9408de5013e42a0358465d", null ], + [ "C_BO_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbafb307fe0afd430c437d35d2072099741", null ], + [ "C_SC_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba0a70f4b2c38ad070fcd0b46f4969300b", null ], + [ "C_DC_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba411938aa15eb565aefd906b0ac6e8df9", null ], + [ "C_RC_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba955a9f2b8ae96fa1e2e44e04d07f7b2c", null ], + [ "C_SE_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba6d9b75f7665fe9ad1963adab172a3924", null ], + [ "C_SE_TB_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba446a07353342023c25a92b6e92558700", null ], + [ "C_SE_TC_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba3b359bd5fadae64f3d163d6cfac44aef", null ], + [ "C_BO_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba6346a6dc822ed3e3601099f31a4175a7", null ], + [ "M_EI_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba9dc5edec294a862070eabdf26366f28f", null ], + [ "C_IC_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba8f3d441ec3f0d327736385acc4dd2519", null ], + [ "C_CI_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba6e91c35eef0635c0c86d507134737554", null ], + [ "C_RD_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba8f5fd97859f3b19245a0fa1e6ce21ec5", null ], + [ "C_CS_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba706da99c602be47c51b9950ce70226c8", null ], + [ "C_TS_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbaed3d31337627588b5b3fce7d959bdf10", null ], + [ "C_RP_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba40cdb88317753c429951f9cc43c0ed4b", null ], + [ "C_CD_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbacecd68f3d67f171ee614325036a9862a", null ], + [ "C_TS_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba12e3e5c1e7275659b8eb304b75bae928", null ], + [ "P_ME_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbab3c51291bd896a3ec2b3fc4e855ee33f", null ], + [ "P_ME_NB_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbaf4cf070e543b656b211c091792d75697", null ], + [ "P_ME_NC_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbae4bdff67aa8ffdbdb8fd5343fe561167", null ], + [ "P_AC_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba640f62d1046ea6718391bf82b325f7cc", null ], + [ "F_FR_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba798c94f729782a7a5793267c1e7d915a", null ], + [ "F_SR_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba6a5fadc289fb4549c286c8a47e7e2f52", null ], + [ "F_SC_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba7f72c269c2e8704722b8aaeacaa68c75", null ], + [ "F_LS_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba82be50d32717bbd38d8500b2cf7a5003", null ], + [ "F_AF_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbafe14df78b3e61b965aa9f7ece94a509c", null ], + [ "F_SG_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba52643361131bc5fac37e04522c9c4468", null ], + [ "F_DR_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba73787f14bc1e199afa281279a0243b7b", null ], + [ "F_SC_NB_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba2dc2e7379c07af393d3c9c2b6f5235d0", null ] + ] ], + [ "ASDUHandler", "namespacelib60870_1_1_c_s101.html#a494130feab85dbe337f659d383e4e8c5", null ], + [ "ASDUReceivedHandler", "namespacelib60870_1_1_c_s101.html#a95f9a71d670882525fbe3bf342cdf54e", null ], + [ "ClockSynchronizationHandler", "namespacelib60870_1_1_c_s101.html#a1d5c09e5cefc2e9711adad5ce978f0e7", null ], + [ "CounterInterrogationHandler", "namespacelib60870_1_1_c_s101.html#a027c45142e293bb4601aa52dd83c5d15", null ], + [ "DelayAcquisitionHandler", "namespacelib60870_1_1_c_s101.html#ad94b7a69be5b593e6e694b884206d184", null ], + [ "FileReadyHandler", "namespacelib60870_1_1_c_s101.html#a0c7346f0e183f14b92c4fc6c373678e9", null ], + [ "InterrogationHandler", "namespacelib60870_1_1_c_s101.html#a94c2e7c6e902d29db88c7a1d512099ed", null ], + [ "ReadHandler", "namespacelib60870_1_1_c_s101.html#a9230fe256069619a54c2c428acc32e06", null ], + [ "ResetProcessHandler", "namespacelib60870_1_1_c_s101.html#ad784b6cb8b22c0417207232c8d98e2db", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s104.html b/doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s104.html new file mode 100644 index 0000000..82a437b --- /dev/null +++ b/doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s104.html @@ -0,0 +1,342 @@ + + + + + + + +lib60870.NET: lib60870.CS104 Namespace Reference + + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    lib60870.NET 2.3.0 +
    +
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    lib60870.CS104 Namespace Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + +

    +Classes

    class  APCIParameters
     Parameters for the CS 104 APCI (Application Protocol Control Information) More...
     
    class  ClientConnection
     Represents a client (master) connection. More...
     
    class  Connection
     A single connection to a CS 104 (IEC 60870-5-104) server. Implements the Master interface. More...
     
    class  ConnectionStatistics
     Provides some Connection statistics. More...
     
    class  RedundancyGroup
     Representation of a redundancy group. A redundancy group is a group of connections that share a unique event queue. Only one connection in a redundancy group can be active. More...
     
    class  Server
     This class represents a single IEC 60870-5 server (slave or controlled station). It is also the main access to the CS 104 server API. More...
     
    class  TlsSecurityInformation
     
    + + + + + + + + + + + + + + + + + +

    +Enumerations

    enum  MasterConnectionState { M_CON_STATE_STOPPED = 0 +, M_CON_STATE_STARTED = 1 +, M_CON_STATE_UNCONFIRMED_STOPPED = 2 + }
     
    enum  ConnectionEvent {
    +  OPENED = 0 +, CLOSED = 1 +, STARTDT_CON_RECEIVED = 2 +, STOPDT_CON_RECEIVED = 3 +,
    +  CONNECT_FAILED = 4 +
    + }
     Connection event for CS 104 client (Connection) More...
     
    enum  CS104_ConState {
    +  STATE_IDLE = 0 +, STATE_INACTIVE = 1 +, STATE_ACTIVE = 2 +, STATE_WAITING_FOR_STARTDT_CON = 3 +,
    +  STATE_WAITING_FOR_STOPDT_CON = 4 +
    + }
     
    enum  ClientConnectionEvent { OPENED +, ACTIVE +, INACTIVE +, CLOSED + }
     Connection events for the Server. More...
     
    enum  ServerMode { SINGLE_REDUNDANCY_GROUP +, CONNECTION_IS_REDUNDANCY_GROUP +, MULTIPLE_REDUNDANCY_GROUPS + }
     Server mode (redundancy group support) More...
     
    enum  EnqueueMode { REMOVE_OLDEST +, IGNORE +, THROW_EXCEPTION + }
     Specifies queue behavior when queue is full. More...
     
    + + + + + + + + + + + + +

    +Functions

    +delegate bool ASDUReceivedHandler (object parameter, ASDU asdu)
     ASDU received handler.
     
    +delegate void ConnectionHandler (object parameter, ConnectionEvent connectionEvent)
     Callback handler for connection events.
     
    delegate bool ConnectionRequestHandler (object parameter, IPAddress ipAddress)
     Connection request handler is called when a client tries to connect to the server.
     
    +delegate void ConnectionEventHandler (object parameter, ClientConnection connection, ClientConnectionEvent eventType)
     
    +

    Enumeration Type Documentation

    + +

    ◆ ClientConnectionEvent

    + +
    +
    + +

    Connection events for the Server.

    + + + + + +
    Enumerator
    OPENED 

    A new connection is opened.

    +
    ACTIVE 

    The connection entered active state.

    +
    INACTIVE 

    The connection entered inactive state.

    +
    CLOSED 

    The connection is closed.

    +
    + +
    +
    + +

    ◆ ConnectionEvent

    + +
    +
    + +

    Connection event for CS 104 client (Connection)

    + + + + + + +
    Enumerator
    OPENED 

    The connection has been opened.

    +
    CLOSED 

    The connection has been closed.

    +
    STARTDT_CON_RECEIVED 

    Conformation of START DT command received (server will send and accept application layer messages)

    +
    STOPDT_CON_RECEIVED 

    Conformation of STOP DT command received (server will no longer send or accept application layer messages)

    +
    CONNECT_FAILED 

    The connect attempt has failed.

    +
    + +
    +
    + +

    ◆ EnqueueMode

    + +
    +
    + + + + +
    enum lib60870.CS104.EnqueueMode
    +
    + +

    Specifies queue behavior when queue is full.

    + + + + +
    Enumerator
    REMOVE_OLDEST 

    Remove the oldest ASDU from the queue and add the new ASDU.

    +
    IGNORE 

    Don't add the new ASDU when the queue is full.

    +
    THROW_EXCEPTION 

    Don't add the new ASDU when the queue is full and throw an exception.

    +
    + +
    +
    + +

    ◆ ServerMode

    + +
    +
    + + + + +
    enum lib60870.CS104.ServerMode
    +
    + +

    Server mode (redundancy group support)

    + + + + +
    Enumerator
    SINGLE_REDUNDANCY_GROUP 

    There is only one redundancy group. There can only be one active connections. All other connections are standy connections.

    +
    CONNECTION_IS_REDUNDANCY_GROUP 

    Every connection is an own redundancy group. This enables simple multi-client server.

    +
    MULTIPLE_REDUNDANCY_GROUPS 

    Mutliple redundancy groups. Each redundancy group can have only a single active connection. Each redundancy group has its own event queue.

    +
    + +
    +
    +

    Function Documentation

    + +

    ◆ ConnectionRequestHandler()

    + +
    +
    + + + + + + + + + + + +
    delegate bool lib60870.CS104.ConnectionRequestHandler (object parameter,
    IPAddress ipAddress )
    +
    + +

    Connection request handler is called when a client tries to connect to the server.

    +
    Parameters
    + + + +
    parameterUser provided parameter
    ipAddressIP address of the connecting client
    +
    +
    +
    Returns
    true if the connection has to be accepted, false otherwise
    + +
    +
    +
    +
    + + + + diff --git a/doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s104.js b/doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s104.js new file mode 100644 index 0000000..432a837 --- /dev/null +++ b/doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s104.js @@ -0,0 +1,36 @@ +var namespacelib60870_1_1_c_s104 = +[ + [ "APCIParameters", "classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html", "classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters" ], + [ "ClientConnection", "classlib60870_1_1_c_s104_1_1_client_connection.html", "classlib60870_1_1_c_s104_1_1_client_connection" ], + [ "Connection", "classlib60870_1_1_c_s104_1_1_connection.html", "classlib60870_1_1_c_s104_1_1_connection" ], + [ "ConnectionStatistics", "classlib60870_1_1_c_s104_1_1_connection_statistics.html", "classlib60870_1_1_c_s104_1_1_connection_statistics" ], + [ "RedundancyGroup", "classlib60870_1_1_c_s104_1_1_redundancy_group.html", "classlib60870_1_1_c_s104_1_1_redundancy_group" ], + [ "Server", "classlib60870_1_1_c_s104_1_1_server.html", "classlib60870_1_1_c_s104_1_1_server" ], + [ "TlsSecurityInformation", "classlib60870_1_1_c_s104_1_1_tls_security_information.html", "classlib60870_1_1_c_s104_1_1_tls_security_information" ], + [ "ClientConnectionEvent", "namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015d", [ + [ "OPENED", "namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015dae670c2408064392c6da7d0b721f7349c", null ], + [ "ACTIVE", "namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015da18ff74f43da410c5529f7d6fca84f115", null ], + [ "INACTIVE", "namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015da6b273343c454f9c53dcfc9c4ccf171d2", null ], + [ "CLOSED", "namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015da110ccf2f5d2ff4eda1fd1a494293467d", null ] + ] ], + [ "ConnectionEvent", "namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3", [ + [ "OPENED", "namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3ae670c2408064392c6da7d0b721f7349c", null ], + [ "CLOSED", "namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3a110ccf2f5d2ff4eda1fd1a494293467d", null ], + [ "STARTDT_CON_RECEIVED", "namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3abd9bb95a16a48d296aa230827d9c966b", null ], + [ "STOPDT_CON_RECEIVED", "namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3a98f20c03aaaaa367a27938cfb6b6d1da", null ], + [ "CONNECT_FAILED", "namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3a4820f088c518fab18fe3d9ca70fa7f64", null ] + ] ], + [ "EnqueueMode", "namespacelib60870_1_1_c_s104.html#ac35ab675c5aa217ded7ded419a5557df", [ + [ "REMOVE_OLDEST", "namespacelib60870_1_1_c_s104.html#ac35ab675c5aa217ded7ded419a5557dfac2bdd6ff983cc664116781c3a3dc0a83", null ], + [ "IGNORE", "namespacelib60870_1_1_c_s104.html#ac35ab675c5aa217ded7ded419a5557dfaa2e843feab94ef623fea888f07c28696", null ], + [ "THROW_EXCEPTION", "namespacelib60870_1_1_c_s104.html#ac35ab675c5aa217ded7ded419a5557dfa5c2e82fadad4dae10ff499facac4ab02", null ] + ] ], + [ "ServerMode", "namespacelib60870_1_1_c_s104.html#a40215e8d03911ca6748ebfd78218d744", [ + [ "SINGLE_REDUNDANCY_GROUP", "namespacelib60870_1_1_c_s104.html#a40215e8d03911ca6748ebfd78218d744aa3afc5caf4e3e1af74862fca807d9ba0", null ], + [ "CONNECTION_IS_REDUNDANCY_GROUP", "namespacelib60870_1_1_c_s104.html#a40215e8d03911ca6748ebfd78218d744a9d445a07d2444cf077d5b4a53243916a", null ], + [ "MULTIPLE_REDUNDANCY_GROUPS", "namespacelib60870_1_1_c_s104.html#a40215e8d03911ca6748ebfd78218d744a07a1fe963762929879e3998233ae368c", null ] + ] ], + [ "ASDUReceivedHandler", "namespacelib60870_1_1_c_s104.html#afb099e1be184222c607404d595cd6992", null ], + [ "ConnectionHandler", "namespacelib60870_1_1_c_s104.html#aa16788ce99f06cdcca23787226650a74", null ], + [ "ConnectionRequestHandler", "namespacelib60870_1_1_c_s104.html#ac8c6f665636c4cd4938333429bc9b03f", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/namespacelib60870_1_1linklayer.html b/doxygen/doxydoc.NET/html/namespacelib60870_1_1linklayer.html new file mode 100644 index 0000000..82f1254 --- /dev/null +++ b/doxygen/doxydoc.NET/html/namespacelib60870_1_1linklayer.html @@ -0,0 +1,249 @@ + + + + + + + +lib60870.NET: lib60870.linklayer Namespace Reference + + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    lib60870.NET 2.3.0 +
    +
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    lib60870.linklayer Namespace Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Classes

    interface  IPrimaryLinkLayerCallbacks
     
    interface  IPrimaryLinkLayerUnbalanced
     
    interface  ISecondaryApplicationLayer
     
    class  LinkLayer
     
    class  LinkLayerBusyException
     
    class  LinkLayerParameters
     Link layer specific parameters. More...
     
    class  PrimaryLinkLayer
     
    class  PrimaryLinkLayerBalanced
     
    class  PrimaryLinkLayerUnbalanced
     
    class  SecondaryLinkLayer
     
    class  SecondaryLinkLayerBalanced
     
    class  SecondaryLinkLayerUnbalanced
     
    class  SerialTransceiverFT12
     Serial transceiver for FT 1.2 type frames.
     
    class  TcpClientVirtualSerialPort
     TCP client virtual serial port. Can be used to tunnel CS 101 protocol over TCP/IP. More...
     
    class  TcpServerVirtualSerialPort
     
    + + + + + +

    +Enumerations

    enum  LinkLayerState { IDLE +, ERROR +, BUSY +, AVAILABLE + }
     
    enum  LinkLayerMode { UNBALANCED +, BALANCED + }
     
    + + + + + + + +

    +Functions

    delegate void LinkLayerStateChanged (object parameter, int address, LinkLayerState newState)
     Will be called by the stack when the state of a link layer connection changes.
     
    delegate bool TcpConnectionEventHandler (object parameter, IPAddress ipAddress, bool connect)
     Connection event handler. Can be used to track connections and accept/deny specific clients.
     
    +

    Function Documentation

    + +

    ◆ LinkLayerStateChanged()

    + +
    +
    + + + + + + + + + + + + + + + + +
    delegate void lib60870.linklayer.LinkLayerStateChanged (object parameter,
    int address,
    LinkLayerState newState )
    +
    + +

    Will be called by the stack when the state of a link layer connection changes.

    +
    Parameters
    + + +
    addressAddress of the slave (only used for unbalanced master mode)
    +
    +
    + +
    +
    + +

    ◆ TcpConnectionEventHandler()

    + +
    +
    + + + + + + + + + + + + + + + + +
    delegate bool lib60870.linklayer.TcpConnectionEventHandler (object parameter,
    IPAddress ipAddress,
    bool connect )
    +
    + +

    Connection event handler. Can be used to track connections and accept/deny specific clients.

    +
    Parameters
    + + + + +
    parameterUser provided paramter
    ipAddressIP address of the client
    connecttrue when client is connecting, false when disconnected
    +
    +
    +
    Returns
    true when connection is accepted, false otherwise
    + +
    +
    +
    +
    + + + + diff --git a/doxygen/doxydoc.NET/html/namespacelib60870_1_1linklayer.js b/doxygen/doxydoc.NET/html/namespacelib60870_1_1linklayer.js new file mode 100644 index 0000000..2ebc411 --- /dev/null +++ b/doxygen/doxydoc.NET/html/namespacelib60870_1_1linklayer.js @@ -0,0 +1,9 @@ +var namespacelib60870_1_1linklayer = +[ + [ "LinkLayerBusyException", "classlib60870_1_1linklayer_1_1_link_layer_busy_exception.html", null ], + [ "LinkLayerParameters", "classlib60870_1_1linklayer_1_1_link_layer_parameters.html", "classlib60870_1_1linklayer_1_1_link_layer_parameters" ], + [ "TcpClientVirtualSerialPort", "classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html", "classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port" ], + [ "TcpServerVirtualSerialPort", "classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.html", "classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port" ], + [ "LinkLayerStateChanged", "namespacelib60870_1_1linklayer.html#aeca494b2e7a508585564b223d2f7851b", null ], + [ "TcpConnectionEventHandler", "namespacelib60870_1_1linklayer.html#a4bb957c442dc029dac0241ceef925e65", null ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/namespacemembers.html b/doxygen/doxydoc.NET/html/namespacemembers.html new file mode 100644 index 0000000..a7ccafc --- /dev/null +++ b/doxygen/doxydoc.NET/html/namespacemembers.html @@ -0,0 +1,139 @@ + + + + + + + +lib60870.NET: Package Members + + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    lib60870.NET 2.3.0 +
    +
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented namespace members with links to the namespaces they belong to:
    +
    +
    + + + + diff --git a/doxygen/doxydoc.NET/html/namespacemembers_enum.html b/doxygen/doxydoc.NET/html/namespacemembers_enum.html new file mode 100644 index 0000000..3df7024 --- /dev/null +++ b/doxygen/doxydoc.NET/html/namespacemembers_enum.html @@ -0,0 +1,125 @@ + + + + + + + +lib60870.NET: Package Members + + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    lib60870.NET 2.3.0 +
    +
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented namespace enums with links to the namespaces they belong to:
    +
    +
    + + + + diff --git a/doxygen/doxydoc.NET/html/namespacemembers_func.html b/doxygen/doxydoc.NET/html/namespacemembers_func.html new file mode 100644 index 0000000..5fa6686 --- /dev/null +++ b/doxygen/doxydoc.NET/html/namespacemembers_func.html @@ -0,0 +1,126 @@ + + + + + + + +lib60870.NET: Package Members + + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    lib60870.NET 2.3.0 +
    +
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented namespace functions with links to the namespaces they belong to:
    +
    +
    + + + + diff --git a/doxygen/doxydoc.NET/html/namespaces.html b/doxygen/doxydoc.NET/html/namespaces.html new file mode 100644 index 0000000..48718a1 --- /dev/null +++ b/doxygen/doxydoc.NET/html/namespaces.html @@ -0,0 +1,233 @@ + + + + + + + +lib60870.NET: Package List + + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    lib60870.NET 2.3.0 +
    +
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Package List
    +
    +
    +
    Here are the packages with brief descriptions (if available):
    +
    [detail level 123]
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     Nlib60870
     NCS101
     NCS104
     Nlinklayer
     CASDUParsingException
     CASDUQueue
     CConnectionException
     CCP16Time2a
     CCP24Time2a
     CCP32Time2a
     CCP56Time2a
     CFrameAbstract class to encode an application layer frame
     CLibraryCommonCommon information functions about the library
     CSingleCommandQualifier
    +
    +
    +
    + + + + diff --git a/doxygen/doxydoc.NET/html/namespaces_dup.js b/doxygen/doxydoc.NET/html/namespaces_dup.js new file mode 100644 index 0000000..cb94ce4 --- /dev/null +++ b/doxygen/doxydoc.NET/html/namespaces_dup.js @@ -0,0 +1,4 @@ +var namespaces_dup = +[ + [ "lib60870", "namespacelib60870.html", "namespacelib60870" ] +]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/nav_f.png b/doxygen/doxydoc.NET/html/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 HcmV?d00001 diff --git a/doxygen/doxydoc.NET/html/nav_fd.png b/doxygen/doxydoc.NET/html/nav_fd.png new file mode 100644 index 0000000000000000000000000000000000000000..032fbdd4c54f54fa9a2e6423b94ef4b2ebdfaceb GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQU#tajv*C{Z|C~*H7f|XvG1G8 zt7aS*L7xwMeS}!z6R#{C5tIw-s~AJ==F^i}x3XyJseHR@yF& zerFf(Zf;Dd{+(0lDIROL@Sj-Ju2JQ8&-n%4%q?>|^bShc&lR?}7HeMo@BDl5N(aHY Uj$gdr1MOz;boFyt=akR{0D!zeaR2}S literal 0 HcmV?d00001 diff --git a/doxygen/doxydoc.NET/html/nav_g.png b/doxygen/doxydoc.NET/html/nav_g.png new file mode 100644 index 0000000000000000000000000000000000000000..2093a237a94f6c83e19ec6e5fd42f7ddabdafa81 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1ilyoDK$?Q$B+ufw|5PB85lU25BhtE tr?otc=hd~V+ws&_A@j8Fiv!KF$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL6W-eg#Jd_@e6*DPn)w;=|1H}Zvm9l6xXXB%>yL=NQU;mg M>FVdQ&MBb@0Bdt1Qvd(} literal 0 HcmV?d00001 diff --git a/doxygen/doxydoc.NET/html/navtree.css b/doxygen/doxydoc.NET/html/navtree.css new file mode 100644 index 0000000..69211d4 --- /dev/null +++ b/doxygen/doxydoc.NET/html/navtree.css @@ -0,0 +1,149 @@ +#nav-tree .children_ul { + margin:0; + padding:4px; +} + +#nav-tree ul { + list-style:none outside none; + margin:0px; + padding:0px; +} + +#nav-tree li { + white-space:nowrap; + margin:0px; + padding:0px; +} + +#nav-tree .plus { + margin:0px; +} + +#nav-tree .selected { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + color: var(--nav-text-active-color); + text-shadow: var(--nav-text-active-shadow); +} + +#nav-tree .selected .arrow { + color: var(--nav-arrow-selected-color); + text-shadow: none; +} + +#nav-tree img { + margin:0px; + padding:0px; + border:0px; + vertical-align: middle; +} + +#nav-tree a { + text-decoration:none; + padding:0px; + margin:0px; +} + +#nav-tree .label { + margin:0px; + padding:0px; + font: 12px var(--font-family-nav); +} + +#nav-tree .label a { + padding:2px; +} + +#nav-tree .selected a { + text-decoration:none; + color:var(--nav-text-active-color); +} + +#nav-tree .children_ul { + margin:0px; + padding:0px; +} + +#nav-tree .item { + margin:0px; + padding:0px; +} + +#nav-tree { + padding: 0px 0px; + font-size:14px; + overflow:auto; +} + +#doc-content { + overflow:auto; + display:block; + padding:0px; + margin:0px; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#side-nav { + padding:0 6px 0 0; + margin: 0px; + display:block; + position: absolute; + left: 0px; + width: $width; + overflow : hidden; +} + +.ui-resizable .ui-resizable-handle { + display:block; +} + +.ui-resizable-e { + background-image:var(--nav-splitbar-image); + background-size:100%; + background-repeat:repeat-y; + background-attachment: scroll; + cursor:ew-resize; + height:100%; + right:0; + top:0; + width:6px; +} + +.ui-resizable-handle { + display:none; + font-size:0.1px; + position:absolute; + z-index:1; +} + +#nav-tree-contents { + margin: 6px 0px 0px 0px; +} + +#nav-tree { + background-repeat:repeat-x; + background-color: var(--nav-background-color); + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#nav-sync { + position:absolute; + top:5px; + right:24px; + z-index:0; +} + +#nav-sync img { + opacity:0.3; +} + +#nav-sync img:hover { + opacity:0.9; +} + +@media print +{ + #nav-tree { display: none; } + div.ui-resizable-handle { display: none; position: relative; } +} + diff --git a/doxygen/doxydoc.NET/html/navtree.js b/doxygen/doxydoc.NET/html/navtree.js new file mode 100644 index 0000000..9027ce6 --- /dev/null +++ b/doxygen/doxydoc.NET/html/navtree.js @@ -0,0 +1,483 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +function initNavTree(toroot,relpath) { + let navTreeSubIndices = []; + const ARROW_DOWN = '▼'; + const ARROW_RIGHT = '►'; + const NAVPATH_COOKIE_NAME = ''+'navpath'; + + const getData = function(varName) { + const i = varName.lastIndexOf('/'); + const n = i>=0 ? varName.substring(i+1) : varName; + return eval(n.replace(/-/g,'_')); + } + + const stripPath = function(uri) { + return uri.substring(uri.lastIndexOf('/')+1); + } + + const stripPath2 = function(uri) { + const i = uri.lastIndexOf('/'); + const s = uri.substring(i+1); + const m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/); + return m ? uri.substring(i-6) : s; + } + + const hashValue = function() { + return $(location).attr('hash').substring(1).replace(/[^\w-]/g,''); + } + + const hashUrl = function() { + return '#'+hashValue(); + } + + const pathName = function() { + return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;()]/g, ''); + } + + const storeLink = function(link) { + if (!$("#nav-sync").hasClass('sync')) { + Cookie.writeSetting(NAVPATH_COOKIE_NAME,link,0); + } + } + + const deleteLink = function() { + Cookie.eraseSetting(NAVPATH_COOKIE_NAME); + } + + const cachedLink = function() { + return Cookie.readSetting(NAVPATH_COOKIE_NAME,''); + } + + const getScript = function(scriptName,func) { + const head = document.getElementsByTagName("head")[0]; + const script = document.createElement('script'); + script.id = scriptName; + script.type = 'text/javascript'; + script.onload = func; + script.src = scriptName+'.js'; + head.appendChild(script); + } + + const createIndent = function(o,domNode,node) { + let level=-1; + let n = node; + while (n.parentNode) { level++; n=n.parentNode; } + if (node.childrenData) { + const imgNode = document.createElement("span"); + imgNode.className = 'arrow'; + imgNode.style.paddingLeft=(16*level).toString()+'px'; + imgNode.innerHTML=ARROW_RIGHT; + node.plus_img = imgNode; + node.expandToggle = document.createElement("a"); + node.expandToggle.href = "javascript:void(0)"; + node.expandToggle.onclick = function() { + if (node.expanded) { + $(node.getChildrenUL()).slideUp("fast"); + node.plus_img.innerHTML=ARROW_RIGHT; + node.expanded = false; + } else { + expandNode(o, node, false, true); + } + } + node.expandToggle.appendChild(imgNode); + domNode.appendChild(node.expandToggle); + } else { + let span = document.createElement("span"); + span.className = 'arrow'; + span.style.width = 16*(level+1)+'px'; + span.innerHTML = ' '; + domNode.appendChild(span); + } + } + + let animationInProgress = false; + + const gotoAnchor = function(anchor,aname) { + let pos, docContent = $('#doc-content'); + let ancParent = $(anchor.parent()); + if (ancParent.hasClass('memItemLeft') || ancParent.hasClass('memtitle') || + ancParent.hasClass('fieldname') || ancParent.hasClass('fieldtype') || + ancParent.is(':header')) { + pos = ancParent.position().top; + } else if (anchor.position()) { + pos = anchor.position().top; + } + if (pos) { + const dcOffset = docContent.offset().top; + const dcHeight = docContent.height(); + const dcScrHeight = docContent[0].scrollHeight + const dcScrTop = docContent.scrollTop(); + let dist = Math.abs(Math.min(pos-dcOffset,dcScrHeight-dcHeight-dcScrTop)); + animationInProgress = true; + docContent.animate({ + scrollTop: pos + dcScrTop - dcOffset + },Math.max(50,Math.min(500,dist)),function() { + animationInProgress=false; + if (anchor.parent().attr('class')=='memItemLeft') { + let rows = $('.memberdecls tr[class$="'+hashValue()+'"]'); + glowEffect(rows.children(),300); // member without details + } else if (anchor.parent().attr('class')=='fieldname') { + glowEffect(anchor.parent().parent(),1000); // enum value + } else if (anchor.parent().attr('class')=='fieldtype') { + glowEffect(anchor.parent().parent(),1000); // struct field + } else if (anchor.parent().is(":header")) { + glowEffect(anchor.parent(),1000); // section header + } else { + glowEffect(anchor.next(),1000); // normal member + } + }); + } + } + + const newNode = function(o, po, text, link, childrenData, lastNode) { + const node = { + children : [], + childrenData : childrenData, + depth : po.depth + 1, + relpath : po.relpath, + isLast : lastNode, + li : document.createElement("li"), + parentNode : po, + itemDiv : document.createElement("div"), + labelSpan : document.createElement("span"), + label : document.createTextNode(text), + expanded : false, + childrenUL : null, + getChildrenUL : function() { + if (!this.childrenUL) { + this.childrenUL = document.createElement("ul"); + this.childrenUL.className = "children_ul"; + this.childrenUL.style.display = "none"; + this.li.appendChild(node.childrenUL); + } + return node.childrenUL; + }, + }; + + node.itemDiv.className = "item"; + node.labelSpan.className = "label"; + createIndent(o,node.itemDiv,node); + node.itemDiv.appendChild(node.labelSpan); + node.li.appendChild(node.itemDiv); + + const a = document.createElement("a"); + node.labelSpan.appendChild(a); + po.getChildrenUL().appendChild(node.li); + a.appendChild(node.label); + if (link) { + let url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + link = url; + } else { + url = node.relpath+link; + } + a.className = stripPath(link.replace('#',':')); + if (link.indexOf('#')!=-1) { + const aname = '#'+link.split('#')[1]; + const srcPage = stripPath(pathName()); + const targetPage = stripPath(link.split('#')[0]); + a.href = srcPage!=targetPage ? url : aname; + a.onclick = function() { + storeLink(link); + aPPar = $(a).parent().parent(); + if (!aPPar.hasClass('selected')) { + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + aPPar.addClass('selected'); + aPPar.attr('id','selected'); + } + const anchor = $(aname); + gotoAnchor(anchor,aname); + }; + } else { + a.href = url; + a.onclick = () => storeLink(link); + } + } else if (childrenData != null) { + a.className = "nolink"; + a.href = "javascript:void(0)"; + a.onclick = node.expandToggle.onclick; + } + return node; + } + + const showRoot = function() { + const headerHeight = $("#top").height(); + const footerHeight = $("#nav-path").height(); + const windowHeight = $(window).height() - headerHeight - footerHeight; + (function() { // retry until we can scroll to the selected item + try { + const navtree=$('#nav-tree'); + navtree.scrollTo('#selected',100,{offset:-windowHeight/2}); + } catch (err) { + setTimeout(arguments.callee, 0); + } + })(); + } + + const expandNode = function(o, node, imm, setFocus) { + if (node.childrenData && !node.expanded) { + if (typeof(node.childrenData)==='string') { + const varName = node.childrenData; + getScript(node.relpath+varName,function() { + node.childrenData = getData(varName); + expandNode(o, node, imm, setFocus); + }); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).slideDown("fast"); + node.plus_img.innerHTML = ARROW_DOWN; + node.expanded = true; + if (setFocus) { + $(node.expandToggle).focus(); + } + } + } + } + + const glowEffect = function(n,duration) { + n.addClass('glow').delay(duration).queue(function(next) { + $(this).removeClass('glow');next(); + }); + } + + const highlightAnchor = function() { + const aname = hashUrl(); + const anchor = $(aname); + gotoAnchor(anchor,aname); + } + + const selectAndHighlight = function(hash,n) { + let a; + if (hash) { + const link=stripPath(pathName())+':'+hash.substring(1); + a=$('.item a[class$="'+link+'"]'); + } + if (a && a.length) { + a.parent().parent().addClass('selected'); + a.parent().parent().attr('id','selected'); + highlightAnchor(); + } else if (n) { + $(n.itemDiv).addClass('selected'); + $(n.itemDiv).attr('id','selected'); + } + let topOffset=5; + if ($('#nav-tree-contents .item:first').hasClass('selected')) { + topOffset+=25; + } + $('#nav-sync').css('top',topOffset+'px'); + showRoot(); + } + + const showNode = function(o, node, index, hash) { + if (node && node.childrenData) { + if (typeof(node.childrenData)==='string') { + const varName = node.childrenData; + getScript(node.relpath+varName,function() { + node.childrenData = getData(varName); + showNode(o,node,index,hash); + }); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).css({'display':'block'}); + node.plus_img.innerHTML = ARROW_DOWN; + node.expanded = true; + const n = node.children[o.breadcrumbs[index]]; + if (index+11 ? '#'+parts[1].replace(/[^\w-]/g,'') : ''; + } + if (hash.match(/^#l\d+$/)) { + const anchor=$('a[name='+hash.substring(1)+']'); + glowEffect(anchor.parent(),1000); // line number + hash=''; // strip line number anchors + } + const url=root+hash; + let i=-1; + while (NAVTREEINDEX[i+1]<=url) i++; + if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath) + } else { + getScript(relpath+'navtreeindex'+i,function() { + navTreeSubIndices[i] = eval('NAVTREEINDEX'+i); + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath); + } + }); + } + } + + const showSyncOff = function(n,relpath) { + n.html(''); + } + + const showSyncOn = function(n,relpath) { + n.html(''); + } + + const o = { + toroot : toroot, + node : { + childrenData : NAVTREE, + children : [], + childrenUL : document.createElement("ul"), + getChildrenUL : function() { return this.childrenUL }, + li : document.getElementById("nav-tree-contents"), + depth : 0, + relpath : relpath, + expanded : false, + isLast : true, + plus_img : document.createElement("span"), + }, + }; + o.node.li.appendChild(o.node.childrenUL); + o.node.plus_img.className = 'arrow'; + o.node.plus_img.innerHTML = ARROW_RIGHT; + + const navSync = $('#nav-sync'); + if (cachedLink()) { + showSyncOff(navSync,relpath); + navSync.removeClass('sync'); + } else { + showSyncOn(navSync,relpath); + } + + navSync.click(() => { + const navSync = $('#nav-sync'); + if (navSync.hasClass('sync')) { + navSync.removeClass('sync'); + showSyncOff(navSync,relpath); + storeLink(stripPath2(pathName())+hashUrl()); + } else { + navSync.addClass('sync'); + showSyncOn(navSync,relpath); + deleteLink(); + } + }); + + navTo(o,toroot,hashUrl(),relpath); + showRoot(); + + $(window).bind('hashchange', () => { + if (!animationInProgress) { + if (window.location.hash && window.location.hash.length>1) { + let a; + if ($(location).attr('hash')) { + const clslink=stripPath(pathName())+':'+hashValue(); + a=$('.item a[class$="'+clslink.replace(/1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM + + + + + + +lib60870.NET: Related Pages + + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    lib60870.NET 2.3.0 +
    +
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Related Pages
    +
    +
    +
    Here is a list of all related documentation pages:
    +
    +
    + + + + diff --git a/doxygen/doxydoc.NET/html/plus.svg b/doxygen/doxydoc.NET/html/plus.svg new file mode 100644 index 0000000..0752016 --- /dev/null +++ b/doxygen/doxydoc.NET/html/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doxygen/doxydoc.NET/html/plusd.svg b/doxygen/doxydoc.NET/html/plusd.svg new file mode 100644 index 0000000..0c65bfe --- /dev/null +++ b/doxygen/doxydoc.NET/html/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doxygen/doxydoc.NET/html/resize.js b/doxygen/doxydoc.NET/html/resize.js new file mode 100644 index 0000000..7d8cdc7 --- /dev/null +++ b/doxygen/doxydoc.NET/html/resize.js @@ -0,0 +1,145 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +function initResizable(treeview) { + let sidenav,navtree,content,header,footer,barWidth=6; + const RESIZE_COOKIE_NAME = ''+'width'; + + function resizeWidth() { + const sidenavWidth = $(sidenav).outerWidth(); + content.css({marginLeft:parseInt(sidenavWidth)+"px"}); + if (typeof page_layout!=='undefined' && page_layout==1) { + footer.css({marginLeft:parseInt(sidenavWidth)+"px"}); + } + Cookie.writeSetting(RESIZE_COOKIE_NAME,sidenavWidth-barWidth); + } + + function restoreWidth(navWidth) { + content.css({marginLeft:parseInt(navWidth)+barWidth+"px"}); + if (typeof page_layout!=='undefined' && page_layout==1) { + footer.css({marginLeft:parseInt(navWidth)+barWidth+"px"}); + } + sidenav.css({width:navWidth + "px"}); + } + + function resizeHeight(treeview) { + const headerHeight = header.outerHeight(); + const windowHeight = $(window).height(); + let contentHeight; + if (treeview) + { + const footerHeight = footer.outerHeight(); + let navtreeHeight,sideNavHeight; + if (typeof page_layout==='undefined' || page_layout==0) { /* DISABLE_INDEX=NO */ + contentHeight = windowHeight - headerHeight - footerHeight; + navtreeHeight = contentHeight; + sideNavHeight = contentHeight; + } else if (page_layout==1) { /* DISABLE_INDEX=YES */ + contentHeight = windowHeight - footerHeight; + navtreeHeight = windowHeight - headerHeight; + sideNavHeight = windowHeight; + } + navtree.css({height:navtreeHeight + "px"}); + sidenav.css({height:sideNavHeight + "px"}); + } + else + { + contentHeight = windowHeight - headerHeight; + } + content.css({height:contentHeight + "px"}); + if (location.hash.slice(1)) { + (document.getElementById(location.hash.slice(1))||document.body).scrollIntoView(); + } + } + + function collapseExpand() { + let newWidth; + if (sidenav.width()>0) { + newWidth=0; + } else { + const width = Cookie.readSetting(RESIZE_COOKIE_NAME,250); + newWidth = (width>250 && width<$(window).width()) ? width : 250; + } + restoreWidth(newWidth); + const sidenavWidth = $(sidenav).outerWidth(); + Cookie.writeSetting(RESIZE_COOKIE_NAME,sidenavWidth-barWidth); + } + + header = $("#top"); + content = $("#doc-content"); + footer = $("#nav-path"); + sidenav = $("#side-nav"); + if (!treeview) { +// title = $("#titlearea"); +// titleH = $(title).height(); +// let animating = false; +// content.on("scroll", function() { +// slideOpts = { duration: 200, +// step: function() { +// contentHeight = $(window).height() - header.outerHeight(); +// content.css({ height : contentHeight + "px" }); +// }, +// done: function() { animating=false; } +// }; +// if (content.scrollTop()>titleH && title.css('display')!='none' && !animating) { +// title.slideUp(slideOpts); +// animating=true; +// } else if (content.scrollTop()<=titleH && title.css('display')=='none' && !animating) { +// title.slideDown(slideOpts); +// animating=true; +// } +// }); + } else { + navtree = $("#nav-tree"); + $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } }); + $(sidenav).resizable({ minWidth: 0 }); + } + $(window).resize(function() { resizeHeight(treeview); }); + if (treeview) + { + const device = navigator.userAgent.toLowerCase(); + const touch_device = device.match(/(iphone|ipod|ipad|android)/); + if (touch_device) { /* wider split bar for touch only devices */ + $(sidenav).css({ paddingRight:'20px' }); + $('.ui-resizable-e').css({ width:'20px' }); + $('#nav-sync').css({ right:'34px' }); + barWidth=20; + } + const width = Cookie.readSetting(RESIZE_COOKIE_NAME,250); + if (width) { restoreWidth(width); } else { resizeWidth(); } + } + resizeHeight(treeview); + const url = location.href; + const i=url.indexOf("#"); + if (i>=0) window.location.hash=url.substr(i); + const _preventDefault = function(evt) { evt.preventDefault(); }; + if (treeview) + { + $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); + $(".ui-resizable-handle").dblclick(collapseExpand); + } + $(window).on('load',resizeHeight); +} +/* @license-end */ diff --git a/doxygen/doxydoc.NET/html/search/all_0.js b/doxygen/doxydoc.NET/html/search/all_0.js new file mode 100644 index 0000000..0eff422 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['0_0',['README lib60870.NET v2.3.0',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html',1,'']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/all_1.js b/doxygen/doxydoc.NET/html/search/all_1.js new file mode 100644 index 0000000..a6774a2 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['3_200_0',['README lib60870.NET v2.3.0',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html',1,'']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/all_10.js b/doxygen/doxydoc.NET/html/search/all_10.js new file mode 100644 index 0000000..d16ee87 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/all_10.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['packedoutputcircuitinfo_0',['PackedOutputCircuitInfo',['../classlib60870_1_1_c_s101_1_1_packed_output_circuit_info.html',1,'lib60870::CS101']]], + ['packedoutputcircuitinfowithcp56time2a_1',['PackedOutputCircuitInfoWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['packedsinglepointwithscd_2',['PackedSinglePointWithSCD',['../classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d.html',1,'lib60870::CS101']]], + ['packedstarteventsofprotectionequipment_3',['PackedStartEventsOfProtectionEquipment',['../classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment.html',1,'lib60870::CS101']]], + ['packedstarteventsofprotectionequipmentwithcp56time2a_4',['PackedStartEventsOfProtectionEquipmentWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['parameteractivation_5',['ParameterActivation',['../classlib60870_1_1_c_s101_1_1_parameter_activation.html',1,'lib60870::CS101']]], + ['parameterfloatvalue_6',['ParameterFloatValue',['../classlib60870_1_1_c_s101_1_1_parameter_float_value.html',1,'lib60870::CS101']]], + ['parameternormalizedvalue_7',['ParameterNormalizedValue',['../classlib60870_1_1_c_s101_1_1_parameter_normalized_value.html',1,'lib60870::CS101']]], + ['parameters_8',['Parameters',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#ab063f08cb01b7c3ca5bdc86cbafec7d2',1,'lib60870::CS101::CS101Slave']]], + ['parameterscaledvalue_9',['ParameterScaledValue',['../classlib60870_1_1_c_s101_1_1_parameter_scaled_value.html',1,'lib60870::CS101']]], + ['privateinformationobjecttypes_10',['PrivateInformationObjectTypes',['../classlib60870_1_1_c_s101_1_1_private_information_object_types.html',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/all_11.js b/doxygen/doxydoc.NET/html/search/all_11.js new file mode 100644 index 0000000..14ae30e --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/all_11.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['qcc_0',['QCC',['../classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html#a839093d6c7666896a4bcf2c9b079564e',1,'lib60870::CS101::CounterInterrogationCommand']]], + ['qpa_1',['QPA',['../classlib60870_1_1_c_s101_1_1_parameter_activation.html#ab541aa687b71edc3411f12acd9adb618',1,'lib60870::CS101::ParameterActivation']]], + ['qrp_2',['QRP',['../classlib60870_1_1_c_s101_1_1_reset_process_command.html#ab87ef8bc0fa796dd5544ef39df6db59a',1,'lib60870::CS101::ResetProcessCommand']]], + ['qualifierofinterrogation_3',['QualifierOfInterrogation',['../classlib60870_1_1_c_s101_1_1_qualifier_of_interrogation.html',1,'lib60870::CS101']]], + ['qualitydescriptor_4',['QualityDescriptor',['../classlib60870_1_1_c_s101_1_1_quality_descriptor.html',1,'lib60870::CS101']]], + ['qualitydescriptorp_5',['QualityDescriptorP',['../classlib60870_1_1_c_s101_1_1_quality_descriptor_p.html',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/all_12.js b/doxygen/doxydoc.NET/html/search/all_12.js new file mode 100644 index 0000000..8bffee3 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/all_12.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['rawmessagehandler_0',['RawMessageHandler',['../namespacelib60870.html#a059755b125d35287c474551f4ffc619f',1,'lib60870']]], + ['rcvdmsgcounter_1',['RcvdMsgCounter',['../classlib60870_1_1_c_s104_1_1_connection_statistics.html#a763d4accdb60725988746edc43675f2e',1,'lib60870::CS104::ConnectionStatistics']]], + ['rcvdtestfractcounter_2',['RcvdTestFrActCounter',['../classlib60870_1_1_c_s104_1_1_connection_statistics.html#aba25451b06261758d07cc6d0f64292bd',1,'lib60870::CS104::ConnectionStatistics']]], + ['rcvdtestfrconcounter_3',['RcvdTestFrConCounter',['../classlib60870_1_1_c_s104_1_1_connection_statistics.html#a4aef0532af04bf8cc51ab76069845eb8',1,'lib60870::CS104::ConnectionStatistics']]], + ['readcommand_4',['ReadCommand',['../classlib60870_1_1_c_s101_1_1_read_command.html',1,'lib60870::CS101']]], + ['readhandler_5',['ReadHandler',['../namespacelib60870_1_1_c_s101.html#a9230fe256069619a54c2c428acc32e06',1,'lib60870::CS101']]], + ['readme_20lib60870_20net_20v2_203_200_6',['README lib60870.NET v2.3.0',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html',1,'']]], + ['receivemessageloop_7',['ReceiveMessageLoop',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a19871be23f60399362713e78b8c07404',1,'lib60870::CS101::CS101Slave']]], + ['receivesequencenumber_8',['ReceiveSequenceNumber',['../classlib60870_1_1_c_s104_1_1_connection.html#ab6a705b8f4d600160fa842031363e63e',1,'lib60870::CS104::Connection']]], + ['receivetimeout_9',['ReceiveTimeout',['../classlib60870_1_1_c_s104_1_1_connection.html#a3bf1bdcc082cd5347acb0fcb29078000',1,'lib60870.CS104.Connection.ReceiveTimeout'],['../classlib60870_1_1_c_s104_1_1_server.html#a5cbb4d451a08d3b381fce39b5bf4ed3e',1,'lib60870.CS104.Server.ReceiveTimeout']]], + ['redundancygroup_10',['RedundancyGroup',['../classlib60870_1_1_c_s104_1_1_redundancy_group.html',1,'lib60870.CS104.RedundancyGroup'],['../classlib60870_1_1_c_s104_1_1_redundancy_group.html#a3bfc0c71f3919a451288a9b2581e6560',1,'lib60870.CS104.RedundancyGroup.RedundancyGroup()']]], + ['remoteendpoint_11',['RemoteEndpoint',['../classlib60870_1_1_c_s104_1_1_client_connection.html#ad59a914894aa422d1bff8b601cc100f3',1,'lib60870::CS104::ClientConnection']]], + ['remove_5foldest_12',['REMOVE_OLDEST',['../namespacelib60870_1_1_c_s104.html#ac35ab675c5aa217ded7ded419a5557dfac2bdd6ff983cc664116781c3a3dc0a83',1,'lib60870::CS104']]], + ['removefile_13',['RemoveFile',['../classlib60870_1_1_c_s101_1_1_files_available.html#a894040bf5b71a47feaa4eab80cf7a0d9',1,'lib60870::CS101::FilesAvailable']]], + ['resetprocesscommand_14',['ResetProcessCommand',['../classlib60870_1_1_c_s101_1_1_reset_process_command.html',1,'lib60870::CS101']]], + ['resetprocesshandler_15',['ResetProcessHandler',['../namespacelib60870_1_1_c_s101.html#ad784b6cb8b22c0417207232c8d98e2db',1,'lib60870::CS101']]], + ['run_16',['Run',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#a4f258e8494717432a01be4ee1fcb5063',1,'lib60870.CS101.CS101Master.Run()'],['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#adeb6feabfe4b01f17bc863ea0281d79c',1,'lib60870.CS101.CS101Slave.Run()']]], + ['running_20the_20examples_3a_17',['Compiling and running the examples:',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html#autotoc_md1',1,'']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/all_13.js b/doxygen/doxydoc.NET/html/search/all_13.js new file mode 100644 index 0000000..cc2f531 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/all_13.js @@ -0,0 +1,93 @@ +var searchData= +[ + ['scaledvalue_0',['ScaledValue',['../classlib60870_1_1_c_s101_1_1_scaled_value.html',1,'lib60870::CS101']]], + ['scq_1',['SCQ',['../classlib60870_1_1_c_s101_1_1_file_call_or_select.html#a6acae49243536a7db32643ffccdc17c8',1,'lib60870::CS101::FileCallOrSelect']]], + ['second_2',['Second',['../classlib60870_1_1_c_p24_time2a.html#a44e08d428c8cbb76a84836b2ed19ae60',1,'lib60870.CP24Time2a.Second'],['../classlib60870_1_1_c_p32_time2a.html#ae0c845c0ce9555c5ea2dd8514b6222dd',1,'lib60870.CP32Time2a.Second'],['../classlib60870_1_1_c_p56_time2a.html#a02627aa0a76a5e3bfd4007a07f042a2c',1,'lib60870.CP56Time2a.Second']]], + ['sectionready_3',['SectionReady',['../classlib60870_1_1_c_s101_1_1_section_ready.html',1,'lib60870::CS101']]], + ['select_4',['Select',['../classlib60870_1_1_c_s101_1_1_single_command.html#a1829a95a868ed80cae41cc66f8d23867',1,'lib60870::CS101::SingleCommand']]], + ['selectandcallqualifier_5',['SelectAndCallQualifier',['../namespacelib60870_1_1_c_s101.html#ac5a919dfe39a648cc5ea40d072ca98a3',1,'lib60870::CS101']]], + ['sendact_5fcon_6',['SendACT_CON',['../classlib60870_1_1_c_s104_1_1_client_connection.html#a677c04ff5484b981e8464af8d9f86540',1,'lib60870::CS104::ClientConnection']]], + ['sendact_5fterm_7',['SendACT_TERM',['../classlib60870_1_1_c_s104_1_1_client_connection.html#aa5d85670797c2046051a4a10071fe611',1,'lib60870::CS104::ClientConnection']]], + ['sendasdu_8',['SendASDU',['../classlib60870_1_1_c_s101_1_1_master.html#a6917b74951e51d7e80bd0ae352bd6147',1,'lib60870.CS101.Master.SendASDU()'],['../classlib60870_1_1_c_s104_1_1_client_connection.html#a92362655a693e3081af86a00a24955ef',1,'lib60870.CS104.ClientConnection.SendASDU()'],['../classlib60870_1_1_c_s104_1_1_connection.html#ac8604cef7b2781cb63a16de0bff9a308',1,'lib60870.CS104.Connection.SendASDU()']]], + ['sendclocksynccommand_9',['SendClockSyncCommand',['../classlib60870_1_1_c_s101_1_1_master.html#a71ae908a23d89528f78f061fa466104f',1,'lib60870.CS101.Master.SendClockSyncCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#aa91efa113abc4e69578a487a2a934871',1,'lib60870.CS104.Connection.SendClockSyncCommand()']]], + ['sendcontrolcommand_10',['SendControlCommand',['../classlib60870_1_1_c_s101_1_1_master.html#a83a31edf0e9e4360e4dc613735f851d5',1,'lib60870.CS101.Master.SendControlCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a5f1458066ec9a11a12ff68c7416071fa',1,'lib60870.CS104.Connection.SendControlCommand()']]], + ['sendcounterinterrogationcommand_11',['SendCounterInterrogationCommand',['../classlib60870_1_1_c_s101_1_1_master.html#a6b9a6af0acad8fa03468630363eb99a8',1,'lib60870.CS101.Master.SendCounterInterrogationCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#ae8629df4fb0e9cf3868728e52ec995ca',1,'lib60870.CS104.Connection.SendCounterInterrogationCommand()']]], + ['senddelayacquisitioncommand_12',['SendDelayAcquisitionCommand',['../classlib60870_1_1_c_s101_1_1_master.html#afbc769788f9720e9a3d63268500b8710',1,'lib60870.CS101.Master.SendDelayAcquisitionCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#af178dab629740182d7c7e07eb32a4117',1,'lib60870.CS104.Connection.SendDelayAcquisitionCommand()']]], + ['sendfile_13',['SendFile',['../classlib60870_1_1_c_s101_1_1_master.html#ad988de86e0a0ed0d052dc599b3fc98f3',1,'lib60870.CS101.Master.SendFile()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a889e1aef3301cb272286a1279ae6caa3',1,'lib60870.CS104.Connection.SendFile()']]], + ['sendinterrogationcommand_14',['SendInterrogationCommand',['../classlib60870_1_1_c_s101_1_1_master.html#ab25cd6997967e5a60943f391c2b2ddc0',1,'lib60870.CS101.Master.SendInterrogationCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a25c57d614b315bad886edbaead69bd3d',1,'lib60870.CS104.Connection.SendInterrogationCommand()']]], + ['sendlinklayertestfunction_15',['SendLinkLayerTestFunction',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a1ee5095020096c7958e2230dbd273100',1,'lib60870::CS101::CS101Slave']]], + ['sendreadcommand_16',['SendReadCommand',['../classlib60870_1_1_c_s101_1_1_master.html#a52bcf5912b59e4ac44061730c3702eb4',1,'lib60870.CS101.Master.SendReadCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#aeaa8a8dbf8e2449d0222837b9d5ae3d8',1,'lib60870.CS104.Connection.SendReadCommand()']]], + ['sendresetprocesscommand_17',['SendResetProcessCommand',['../classlib60870_1_1_c_s101_1_1_master.html#a6440a2d388ca610f80190dda3c11b623',1,'lib60870.CS101.Master.SendResetProcessCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#ab615b3065cf5248d9b9951c4e178fa80',1,'lib60870.CS104.Connection.SendResetProcessCommand(CauseOfTransmission cot, int ca, byte qrp)']]], + ['sendsequencenumber_18',['SendSequenceNumber',['../classlib60870_1_1_c_s104_1_1_connection.html#a38bffb6d3d17033d40383529aa69c105',1,'lib60870::CS104::Connection']]], + ['sendstartdt_19',['SendStartDT',['../classlib60870_1_1_c_s104_1_1_connection.html#a57d40edfe14bfe66f832a7647e3173ae',1,'lib60870::CS104::Connection']]], + ['sendstartdt_5fcon_20',['SendStartDT_CON',['../classlib60870_1_1_c_s104_1_1_connection.html#a65d8586e819b9c537b2461611b0bb9ca',1,'lib60870::CS104::Connection']]], + ['sendstopdt_21',['SendStopDT',['../classlib60870_1_1_c_s104_1_1_connection.html#a2510773333d6aaea354c5730f2bc139f',1,'lib60870::CS104::Connection']]], + ['sendstopdt_5fcon_22',['SendStopDT_CON',['../classlib60870_1_1_c_s104_1_1_connection.html#a6723565d01d05539a320810217955743',1,'lib60870::CS104::Connection']]], + ['sendtestcommand_23',['SendTestCommand',['../classlib60870_1_1_c_s101_1_1_master.html#a77d37b1e27cdd4eec1a314f3e2a09432',1,'lib60870.CS101.Master.SendTestCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a310efefcea197178942abe509b04f463',1,'lib60870.CS104.Connection.SendTestCommand()']]], + ['sendtestcommandwithcp56time2a_24',['SendTestCommandWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_master.html#a97c6f3b896c0588761bb1b113ef7f7be',1,'lib60870.CS101.Master.SendTestCommandWithCP56Time2a()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a3d38dafcc825eb9bba7258c2525a56ad',1,'lib60870.CS104.Connection.SendTestCommandWithCP56Time2a(int ca, ushort tsc, CP56Time2a time)']]], + ['sendtestfr_5fact_25',['SendTestFR_ACT',['../classlib60870_1_1_c_s104_1_1_connection.html#afe81514340488a718a49706233816052',1,'lib60870::CS104::Connection']]], + ['sendtestfr_5fcon_26',['SendTestFR_CON',['../classlib60870_1_1_c_s104_1_1_connection.html#a876db462369040f272cddd144833ab56',1,'lib60870::CS104::Connection']]], + ['sentmsgcounter_27',['SentMsgCounter',['../classlib60870_1_1_c_s104_1_1_connection_statistics.html#ad04c56b6a2a9520d5296c56d12f2b5b0',1,'lib60870::CS104::ConnectionStatistics']]], + ['sequencenumber_28',['SequenceNumber',['../classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#ae04563ca55ecc0df58e80263d50db184',1,'lib60870::CS101::BinaryCounterReading']]], + ['server_29',['Server',['../classlib60870_1_1_c_s104_1_1_server.html',1,'lib60870.CS104.Server'],['../classlib60870_1_1_c_s104_1_1_server.html#aae44fa0f507ea4b8d343686a9345e419',1,'lib60870.CS104.Server.Server()'],['../classlib60870_1_1_c_s104_1_1_server.html#a12b5bdf509e0b569295b8821c016770b',1,'lib60870.CS104.Server.Server(TlsSecurityInformation securityInfo)'],['../classlib60870_1_1_c_s104_1_1_server.html#a4b25619314b9e2586d21d83f3ed9fcd0',1,'lib60870.CS104.Server.Server(APCIParameters apciParameters, ApplicationLayerParameters alParameters)'],['../classlib60870_1_1_c_s104_1_1_server.html#a4a25393ccd928dc4abbb13c14e3579c2',1,'lib60870.CS104.Server.Server(APCIParameters apciParameters, ApplicationLayerParameters alParameters, TlsSecurityInformation securityInfo)']]], + ['servermode_30',['ServerMode',['../classlib60870_1_1_c_s104_1_1_server.html#a9c05718964db1a69771955715585c4da',1,'lib60870.CS104.Server.ServerMode'],['../namespacelib60870_1_1_c_s104.html#a40215e8d03911ca6748ebfd78218d744',1,'lib60870.CS104.ServerMode']]], + ['setasduhandler_31',['SetASDUHandler',['../classlib60870_1_1_c_s101_1_1_slave.html#a5bde494544e568d0d9c25b43449eb8ee',1,'lib60870::CS101::Slave']]], + ['setasdureceivedhandler_32',['SetASDUReceivedHandler',['../classlib60870_1_1_c_s104_1_1_connection.html#a7fd6fb3ca802d91197f1927f2e4f8712',1,'lib60870::CS104::Connection']]], + ['setclocksynchronizationhandler_33',['SetClockSynchronizationHandler',['../classlib60870_1_1_c_s101_1_1_slave.html#a83b600bacb0829048c432686991db8a7',1,'lib60870::CS101::Slave']]], + ['setconnectioneventhandler_34',['SetConnectionEventHandler',['../classlib60870_1_1_c_s104_1_1_server.html#afa4ae496c2260bc6b501a60259c35282',1,'lib60870::CS104::Server']]], + ['setconnectionhandler_35',['SetConnectionHandler',['../classlib60870_1_1_c_s104_1_1_connection.html#afa545f647708d76bc23b3e5cbad1ac46',1,'lib60870::CS104::Connection']]], + ['setconnectionrequesthandler_36',['SetConnectionRequestHandler',['../classlib60870_1_1_c_s104_1_1_server.html#a8c3dbeea77158bb5014d9739bb8f1116',1,'lib60870::CS104::Server']]], + ['setconnecttimeout_37',['SetConnectTimeout',['../classlib60870_1_1_c_s104_1_1_connection.html#af5de8a91a2f77bfa69421b3e3da9276e',1,'lib60870::CS104::Connection']]], + ['setcounterinterrogationhandler_38',['SetCounterInterrogationHandler',['../classlib60870_1_1_c_s101_1_1_slave.html#ad6e8b2878a13fea3b23b0b41b4da2983',1,'lib60870::CS101::Slave']]], + ['setfilereadyhandler_39',['SetFileReadyHandler',['../classlib60870_1_1_c_s101_1_1_slave.html#a3d25c95061010fa26c02cca5de0ae3cd',1,'lib60870::CS101::Slave']]], + ['setinterrogationhandler_40',['SetInterrogationHandler',['../classlib60870_1_1_c_s101_1_1_slave.html#af5871de4b26756b7b6f88e7acdc96e84',1,'lib60870::CS101::Slave']]], + ['setlocaladdress_41',['SetLocalAddress',['../classlib60870_1_1_c_s104_1_1_server.html#af7db8efa36f1bfc559ac96308a907d07',1,'lib60870.CS104.Server.SetLocalAddress()'],['../classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.html#a52cf94c390fdb9de1da505a259dc85a1',1,'lib60870.linklayer.TcpServerVirtualSerialPort.SetLocalAddress()']]], + ['setlocalport_42',['SetLocalPort',['../classlib60870_1_1_c_s104_1_1_server.html#aa3ddaa0a4c43ca80f35f523d84347753',1,'lib60870::CS104::Server']]], + ['setpointcommandnormalized_43',['SetpointCommandNormalized',['../classlib60870_1_1_c_s101_1_1_setpoint_command_normalized.html',1,'lib60870::CS101']]], + ['setpointcommandnormalizedwithcp56time2a_44',['SetpointCommandNormalizedWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['setpointcommandqualifier_45',['SetpointCommandQualifier',['../classlib60870_1_1_c_s101_1_1_setpoint_command_qualifier.html',1,'lib60870::CS101']]], + ['setpointcommandscaled_46',['SetpointCommandScaled',['../classlib60870_1_1_c_s101_1_1_setpoint_command_scaled.html',1,'lib60870::CS101']]], + ['setpointcommandscaledwithcp56time2a_47',['SetpointCommandScaledWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['setpointcommandshort_48',['SetpointCommandShort',['../classlib60870_1_1_c_s101_1_1_setpoint_command_short.html',1,'lib60870::CS101']]], + ['setpointcommandshortwithcp56time2a_49',['SetpointCommandShortWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['setreadhandler_50',['SetReadHandler',['../classlib60870_1_1_c_s101_1_1_slave.html#a7f0490bec09dbf3a8fb1e1e8e21503c0',1,'lib60870::CS101::Slave']]], + ['setreceivedrawmessagehandler_51',['SetReceivedRawMessageHandler',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a01bd8b909386de3b9426d5c953a716e3',1,'lib60870.CS101.CS101Slave.SetReceivedRawMessageHandler()'],['../classlib60870_1_1_c_s101_1_1_master.html#a43ddedf33710bf27df6f10265787d359',1,'lib60870.CS101.Master.SetReceivedRawMessageHandler()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a54fa6f1012457a6e0f492441cc4bfa23',1,'lib60870.CS104.Connection.SetReceivedRawMessageHandler()']]], + ['setsentrawmessagehandler_52',['SetSentRawMessageHandler',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a0fa4e121ca94fc5a017587c1382d7f42',1,'lib60870.CS101.CS101Slave.SetSentRawMessageHandler()'],['../classlib60870_1_1_c_s101_1_1_master.html#ac850d2199ac83075bfe52648eec57993',1,'lib60870.CS101.Master.SetSentRawMessageHandler()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a787c8ff4943b9991328550f69807ef6e',1,'lib60870.CS104.Connection.SetSentRawMessageHandler()']]], + ['settimeouts_53',['SetTimeouts',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#a1a60eeb2565d2111ecea43db4e4b1909',1,'lib60870::CS101::CS101Master']]], + ['settlssecurity_54',['SetTlsSecurity',['../classlib60870_1_1_c_s104_1_1_connection.html#a33eae01473eb5dc6545a74601b3d9a85',1,'lib60870::CS104::Connection']]], + ['setuserdataqueuesizes_55',['SetUserDataQueueSizes',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a6c28db4c5b92dbc3b67e25d86c5a19df',1,'lib60870::CS101::CS101Slave']]], + ['sie_56',['SIE',['../classlib60870_1_1_c_s101_1_1_start_event.html#a63a1bca793fe829680fc745c8b537b1d',1,'lib60870::CS101::StartEvent']]], + ['single_5fredundancy_5fgroup_57',['SINGLE_REDUNDANCY_GROUP',['../namespacelib60870_1_1_c_s104.html#a40215e8d03911ca6748ebfd78218d744aa3afc5caf4e3e1af74862fca807d9ba0',1,'lib60870::CS104']]], + ['singlecommand_58',['SingleCommand',['../classlib60870_1_1_c_s101_1_1_single_command.html',1,'lib60870::CS101']]], + ['singlecommandqualifier_59',['SingleCommandQualifier',['../classlib60870_1_1_single_command_qualifier.html',1,'lib60870']]], + ['singlecommandwithcp56time2a_60',['SingleCommandWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['singleevent_61',['SingleEvent',['../classlib60870_1_1_c_s101_1_1_single_event.html',1,'lib60870::CS101']]], + ['singlepointinformation_62',['SinglePointInformation',['../classlib60870_1_1_c_s101_1_1_single_point_information.html',1,'lib60870::CS101']]], + ['singlepointwithcp24time2a_63',['SinglePointWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a.html',1,'lib60870::CS101']]], + ['singlepointwithcp56time2a_64',['SinglePointWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['sl1_65',['SL1',['../classlib60870_1_1_c_s101_1_1_start_event.html#a53c47cb469138b00f2d266da9ee91338',1,'lib60870::CS101::StartEvent']]], + ['sl2_66',['SL2',['../classlib60870_1_1_c_s101_1_1_start_event.html#a43c8205b9e5b018a89c57658d2fc7443',1,'lib60870::CS101::StartEvent']]], + ['sl3_67',['SL3',['../classlib60870_1_1_c_s101_1_1_start_event.html#a686791b47a50ff83badd20384b00a604',1,'lib60870::CS101::StartEvent']]], + ['slave_68',['Slave',['../classlib60870_1_1_c_s101_1_1_slave.html',1,'lib60870::CS101']]], + ['slaveaddress_69',['SlaveAddress',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#aa7d93ac85baacaeaa6c70abce6856f58',1,'lib60870::CS101::CS101Master']]], + ['sof_70',['SOF',['../classlib60870_1_1_c_s101_1_1_file_directory.html#af1f8d171f735aae0eed368015a3be40d',1,'lib60870::CS101::FileDirectory']]], + ['srd_71',['SRD',['../classlib60870_1_1_c_s101_1_1_start_event.html#a058cea08569048ffde04da4dab3630d7',1,'lib60870::CS101::StartEvent']]], + ['srq_72',['SRQ',['../classlib60870_1_1_c_s101_1_1_section_ready.html#a5bbd3b419683eaa394c20ca9e3f1ba34',1,'lib60870::CS101::SectionReady']]], + ['start_73',['Start',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#a5bcaaddeb16ce3472d5567d430cf304d',1,'lib60870.CS101.CS101Master.Start()'],['../classlib60870_1_1_c_s104_1_1_server.html#af8d37c78f23fafbb74091b7d3d0ed684',1,'lib60870.CS104.Server.Start()'],['../classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html#a1417a91389e864dd32cff7e80def1021',1,'lib60870.linklayer.TcpClientVirtualSerialPort.Start()']]], + ['startdt_5fcon_5freceived_74',['STARTDT_CON_RECEIVED',['../namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3abd9bb95a16a48d296aa230827d9c966b',1,'lib60870::CS104']]], + ['startevent_75',['StartEvent',['../classlib60870_1_1_c_s101_1_1_start_event.html',1,'lib60870::CS101']]], + ['state_76',['State',['../classlib60870_1_1_c_s101_1_1_single_command.html#ae642167ac8c59c6a2f5552919c3606a4',1,'lib60870::CS101::SingleCommand']]], + ['statusandstatuschangedetection_77',['StatusAndStatusChangeDetection',['../classlib60870_1_1_c_s101_1_1_status_and_status_change_detection.html',1,'lib60870::CS101']]], + ['stepcommand_78',['StepCommand',['../classlib60870_1_1_c_s101_1_1_step_command.html',1,'lib60870::CS101']]], + ['stepcommandvalue_79',['StepCommandValue',['../namespacelib60870_1_1_c_s101.html#a8b8573d2c7289fab9db7a1ce5ff40286',1,'lib60870::CS101']]], + ['stepcommandwithcp56time2a_80',['StepCommandWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['steppositioninformation_81',['StepPositionInformation',['../classlib60870_1_1_c_s101_1_1_step_position_information.html',1,'lib60870::CS101']]], + ['steppositionwithcp24time2a_82',['StepPositionWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a.html',1,'lib60870::CS101']]], + ['steppositionwithcp56time2a_83',['StepPositionWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['stop_84',['Stop',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#a4b4ca2b56ec115d9b5f1eba13ff5c22a',1,'lib60870.CS101.CS101Master.Stop()'],['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a6502368270e7b7efa3a59778d58bda3a',1,'lib60870.CS101.CS101Slave.Stop()'],['../classlib60870_1_1_c_s104_1_1_server.html#a07fc33e78e4b8d156e1bbe08170c62cf',1,'lib60870.CS104.Server.Stop()'],['../classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html#aba1035cd8d8a91290dd7d19ec48bfb34',1,'lib60870.linklayer.TcpClientVirtualSerialPort.Stop()']]], + ['stopdt_5fcon_5freceived_85',['STOPDT_CON_RECEIVED',['../namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3a98f20c03aaaaa367a27938cfb6b6d1da',1,'lib60870::CS104']]], + ['substitued_86',['Substitued',['../classlib60870_1_1_c_p24_time2a.html#a4400a44009413f637412cb34d7d73820',1,'lib60870::CP24Time2a']]], + ['substituted_87',['Substituted',['../classlib60870_1_1_c_p32_time2a.html#ae4e8f2da41474e5fbeb67412cb1a1523',1,'lib60870.CP32Time2a.Substituted'],['../classlib60870_1_1_c_p56_time2a.html#a3b8f17e2e0ea8e6482dfae2fbea87173',1,'lib60870.CP56Time2a.Substituted']]], + ['support_88',['Commercial licenses and support',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html#autotoc_md4',1,'']]], + ['supportssequence_89',['SupportsSequence',['../classlib60870_1_1_c_s101_1_1_information_object.html#a8e277f6a5d421d25ae9c9eb9b169887e',1,'lib60870::CS101::InformationObject']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/all_14.js b/doxygen/doxydoc.NET/html/search/all_14.js new file mode 100644 index 0000000..b8934cd --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/all_14.js @@ -0,0 +1,26 @@ +var searchData= +[ + ['t0_0',['T0',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#adb7f9816ddbbf8925f5372308efed78f',1,'lib60870::CS104::APCIParameters']]], + ['t1_1',['T1',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#a11f40dff24e0352eb76b4d456afe9e68',1,'lib60870::CS104::APCIParameters']]], + ['t2_2',['T2',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#a0320d85982ccb2814e8829c51d4eb7b8',1,'lib60870::CS104::APCIParameters']]], + ['t3_3',['T3',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#ad68a65bbce99a4a7533a8c1291a52e0a',1,'lib60870::CS104::APCIParameters']]], + ['tcpclientvirtualserialport_4',['TcpClientVirtualSerialPort',['../classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html',1,'lib60870.linklayer.TcpClientVirtualSerialPort'],['../classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html#a38baef0d15205486d0f5d07106473836',1,'lib60870.linklayer.TcpClientVirtualSerialPort.TcpClientVirtualSerialPort()']]], + ['tcpconnectioneventhandler_5',['TcpConnectionEventHandler',['../namespacelib60870_1_1linklayer.html#a4bb957c442dc029dac0241ceef925e65',1,'lib60870::linklayer']]], + ['tcpservervirtualserialport_6',['TcpServerVirtualSerialPort',['../classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.html',1,'lib60870::linklayer']]], + ['testcommand_7',['TestCommand',['../classlib60870_1_1_c_s101_1_1_test_command.html',1,'lib60870::CS101']]], + ['testcommandwithcp56time2a_8',['TestCommandWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['the_20examples_3a_9',['Compiling and running the examples:',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html#autotoc_md1',1,'']]], + ['throw_5fexception_10',['THROW_EXCEPTION',['../namespacelib60870_1_1_c_s104.html#ac35ab675c5aa217ded7ded419a5557dfa5c2e82fadad4dae10ff499facac4ab02',1,'lib60870::CS104']]], + ['time_11',['Time',['../classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html#abcedc8616644f69702da1eb4dddb1860',1,'lib60870::CS101::TestCommandWithCP56Time2a']]], + ['timeoutforack_12',['TimeoutForACK',['../classlib60870_1_1linklayer_1_1_link_layer_parameters.html#a2f97069460fa1a3873ca1cf91331d739',1,'lib60870::linklayer::LinkLayerParameters']]], + ['timeoutlinkstate_13',['TimeoutLinkState',['../classlib60870_1_1linklayer_1_1_link_layer_parameters.html#ac79c13d5078a838e029e78a588e261a1',1,'lib60870::linklayer::LinkLayerParameters']]], + ['timeoutrepeat_14',['TimeoutRepeat',['../classlib60870_1_1linklayer_1_1_link_layer_parameters.html#a8907a50f70413012cf82de440e2b5581',1,'lib60870::linklayer::LinkLayerParameters']]], + ['tlssecurityinformation_15',['TlsSecurityInformation',['../classlib60870_1_1_c_s104_1_1_tls_security_information.html',1,'lib60870::CS104']]], + ['transfercomplete_16',['TransferComplete',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#ada2d36e95fe8caf9a22d04fcd77b6a8f',1,'lib60870.CS101.IFileProvider.TransferComplete()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#a533ea7bd0c80d98d5ea48748c14ee376',1,'lib60870.CS101.TransparentFile.TransferComplete()']]], + ['transient_17',['Transient',['../classlib60870_1_1_c_s101_1_1_step_position_information.html#aba392b47665d183b882892dc252f285f',1,'lib60870::CS101::StepPositionInformation']]], + ['transparentfile_18',['TransparentFile',['../classlib60870_1_1_c_s101_1_1_transparent_file.html',1,'lib60870::CS101']]], + ['tsc_19',['TSC',['../classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html#ae5a610ff07bf26fbc6eb1e54efbd99df',1,'lib60870::CS101::TestCommandWithCP56Time2a']]], + ['type_20',['Type',['../classlib60870_1_1_c_s101_1_1_information_object.html#af2eba7ad5825d5d34258ce9747a615be',1,'lib60870::CS101::InformationObject']]], + ['typeid_21',['TypeID',['../namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bb',1,'lib60870::CS101']]], + ['typeid_22',['TypeId',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#ab0c3a8cae06afc0eea93c454815feb23',1,'lib60870::CS101::ASDU']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/all_15.js b/doxygen/doxydoc.NET/html/search/all_15.js new file mode 100644 index 0000000..596270f --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/all_15.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['usesendmessagequeue_0',['UseSendMessageQueue',['../classlib60870_1_1_c_s104_1_1_connection.html#a452b4617dc369f3e9d6f509a0634fc21',1,'lib60870::CS104::Connection']]], + ['usesinglecharack_1',['UseSingleCharACK',['../classlib60870_1_1linklayer_1_1_link_layer_parameters.html#a35b88393725992cef49bbf6f7e196c5b',1,'lib60870::linklayer::LinkLayerParameters']]], + ['useslaveaddress_2',['UseSlaveAddress',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#a9923e8174758fdfa15198fcbde7502de',1,'lib60870::CS101::CS101Master']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/all_16.js b/doxygen/doxydoc.NET/html/search/all_16.js new file mode 100644 index 0000000..0d54d5a --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/all_16.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['v2_203_200_0',['README lib60870.NET v2.3.0',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html',1,'']]], + ['value_1',['Value',['../classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#a548b83c567fc345f85573f31d3a71f03',1,'lib60870.CS101.BinaryCounterReading.Value'],['../classlib60870_1_1_c_s101_1_1_step_position_information.html#a00370bb63d3ec53ded04f4d8108990cf',1,'lib60870.CS101.StepPositionInformation.Value']]], + ['version_5fmajor_2',['VERSION_MAJOR',['../classlib60870_1_1_library_common.html#a6802d07db8d3ceb789e272fa0fece307',1,'lib60870::LibraryCommon']]], + ['version_5fminor_3',['VERSION_MINOR',['../classlib60870_1_1_library_common.html#adb58059e12584a6dc84d4f8dbdcd8b2c',1,'lib60870::LibraryCommon']]], + ['version_5fpatch_4',['VERSION_PATCH',['../classlib60870_1_1_library_common.html#a4c87994c9e83099e161330a4ec39857c',1,'lib60870::LibraryCommon']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/all_17.js b/doxygen/doxydoc.NET/html/search/all_17.js new file mode 100644 index 0000000..ceac164 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/all_17.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['w_0',['W',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#ac86b4a16c31fd7ad6af55e6c7b6f048b',1,'lib60870::CS104::APCIParameters']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/all_18.js b/doxygen/doxydoc.NET/html/search/all_18.js new file mode 100644 index 0000000..9eedd8c --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/all_18.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['year_0',['Year',['../classlib60870_1_1_c_p56_time2a.html#acd2210101a5b5235b4779e3ecf00527e',1,'lib60870::CP56Time2a']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/all_2.js b/doxygen/doxydoc.NET/html/search/all_2.js new file mode 100644 index 0000000..c1b40d2 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/all_2.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['acknowledgequalifier_0',['AcknowledgeQualifier',['../namespacelib60870_1_1_c_s101.html#af2506d56be1cd94a330f0f26d45ececc',1,'lib60870::CS101']]], + ['ackqualifier_1',['AckQualifier',['../classlib60870_1_1_c_s101_1_1_file_a_c_k.html#a9f6b95cc90ebe3515dff6af81c294d81',1,'lib60870::CS101::FileACK']]], + ['active_2',['ACTIVE',['../namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015da18ff74f43da410c5529f7d6fca84f115',1,'lib60870::CS104']]], + ['addallowedclient_3',['AddAllowedClient',['../classlib60870_1_1_c_s104_1_1_redundancy_group.html#a971ee15ef8b50bf62d75e552dbc5a118',1,'lib60870.CS104.RedundancyGroup.AddAllowedClient(IPAddress ipAddress)'],['../classlib60870_1_1_c_s104_1_1_redundancy_group.html#a30f6faca907a9496271e7c43e12ba220',1,'lib60870.CS104.RedundancyGroup.AddAllowedClient(string ipString)']]], + ['addfile_4',['AddFile',['../classlib60870_1_1_c_s101_1_1_files_available.html#a72840ada81d664c1d63531ce022e57e5',1,'lib60870::CS101::FilesAvailable']]], + ['addinformationobject_5',['AddInformationObject',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a2cc4f6257884b76e9e9f6b40cd3037c2',1,'lib60870::CS101::ASDU']]], + ['addredundancygroup_6',['AddRedundancyGroup',['../classlib60870_1_1_c_s104_1_1_server.html#af970d8d63a4d220d54e213250e90eada',1,'lib60870::CS104::Server']]], + ['addresslength_7',['AddressLength',['../classlib60870_1_1linklayer_1_1_link_layer_parameters.html#abfa30c4ae394e96224933817b768d248',1,'lib60870::linklayer::LinkLayerParameters']]], + ['adjusted_8',['Adjusted',['../classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#aacf2720e880dbb0f70ea212c59c8e31f',1,'lib60870::CS101::BinaryCounterReading']]], + ['allowonlyspecificcertificates_9',['AllowOnlySpecificCertificates',['../classlib60870_1_1_c_s104_1_1_tls_security_information.html#aecf70336635c0bfe0fe713a5e427fa3e',1,'lib60870::CS104::TlsSecurityInformation']]], + ['and_20running_20the_20examples_3a_10',['Compiling and running the examples:',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html#autotoc_md1',1,'']]], + ['and_20support_11',['Commercial licenses and support',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html#autotoc_md4',1,'']]], + ['apciparameters_12',['APCIParameters',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html',1,'lib60870::CS104']]], + ['applicationlayerparameters_13',['ApplicationLayerParameters',['../classlib60870_1_1_c_s101_1_1_application_layer_parameters.html',1,'lib60870::CS101']]], + ['asdu_14',['ASDU',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html',1,'lib60870.CS101.ASDU'],['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a921d30b69cb8515973939210c0fd23b6',1,'lib60870.CS101.ASDU.ASDU()']]], + ['asduhandler_15',['ASDUHandler',['../namespacelib60870_1_1_c_s101.html#a494130feab85dbe337f659d383e4e8c5',1,'lib60870::CS101']]], + ['asduparsingexception_16',['ASDUParsingException',['../classlib60870_1_1_a_s_d_u_parsing_exception.html',1,'lib60870']]], + ['asduqueue_17',['ASDUQueue',['../classlib60870_1_1_a_s_d_u_queue.html',1,'lib60870']]], + ['asduqueueexception_18',['ASDUQueueException',['../classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception.html',1,'lib60870::CS101']]], + ['asdureceivedhandler_19',['ASDUReceivedHandler',['../namespacelib60870_1_1_c_s101.html#a95f9a71d670882525fbe3bf342cdf54e',1,'lib60870.CS101.ASDUReceivedHandler()'],['../namespacelib60870_1_1_c_s104.html#afb099e1be184222c607404d595cd6992',1,'lib60870.CS104.ASDUReceivedHandler()']]], + ['autostart_20',['Autostart',['../classlib60870_1_1_c_s104_1_1_connection.html#aa941946c92bfe52f71c137c3fbf6d601',1,'lib60870::CS104::Connection']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/all_3.js b/doxygen/doxydoc.NET/html/search/all_3.js new file mode 100644 index 0000000..ef923eb --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/all_3.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['binarycounterreading_0',['BinaryCounterReading',['../classlib60870_1_1_c_s101_1_1_binary_counter_reading.html',1,'lib60870::CS101']]], + ['bitstring32_1',['Bitstring32',['../classlib60870_1_1_c_s101_1_1_bitstring32.html',1,'lib60870::CS101']]], + ['bitstring32command_2',['Bitstring32Command',['../classlib60870_1_1_c_s101_1_1_bitstring32_command.html',1,'lib60870::CS101']]], + ['bitstring32commandwithcp56time2a_3',['Bitstring32CommandWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['bitstring32withcp24time2a_4',['Bitstring32WithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a.html',1,'lib60870::CS101']]], + ['bitstring32withcp56time2a_5',['Bitstring32WithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a.html',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/all_4.js b/doxygen/doxydoc.NET/html/search/all_4.js new file mode 100644 index 0000000..a9336b3 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/all_4.js @@ -0,0 +1,43 @@ +var searchData= +[ + ['ca_0',['Ca',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a5d217b9cc0ecf22e127aa25c89e8a2f1',1,'lib60870::CS101::ASDU']]], + ['carry_1',['Carry',['../classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#a8d73e781be2f98f00d09f91e0c3d774a',1,'lib60870::CS101::BinaryCounterReading']]], + ['causeoftransmission_2',['CauseOfTransmission',['../namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cc',1,'lib60870::CS101']]], + ['certificatevalidationcallback_3',['CertificateValidationCallback',['../classlib60870_1_1_c_s104_1_1_tls_security_information.html#ab90e1e052fa15e1b211109d30529b491',1,'lib60870.CS104.TlsSecurityInformation.CertificateValidationCallback'],['../classlib60870_1_1_c_s104_1_1_client_connection.html#aa936b912c162118b6a9834030f924491',1,'lib60870.CS104.ClientConnection.CertificateValidationCallback()']]], + ['chainvalidation_4',['ChainValidation',['../classlib60870_1_1_c_s104_1_1_tls_security_information.html#a2b367122104e8ac1469d6240c427fe86',1,'lib60870::CS104::TlsSecurityInformation']]], + ['chs_5',['CHS',['../classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html#af2302361352eb1447b4bfb6541772c50',1,'lib60870::CS101::FileLastSegmentOrSection']]], + ['cl1_6',['CL1',['../classlib60870_1_1_c_s101_1_1_output_circuit_info.html#ac474a5e41cac7e82a2225cb27792fcf7',1,'lib60870::CS101::OutputCircuitInfo']]], + ['cl2_7',['CL2',['../classlib60870_1_1_c_s101_1_1_output_circuit_info.html#a6507ca6be64921d3931911033d496661',1,'lib60870::CS101::OutputCircuitInfo']]], + ['cl3_8',['CL3',['../classlib60870_1_1_c_s101_1_1_output_circuit_info.html#ad9d84ee2a4315546c531867e4d9a5e28',1,'lib60870::CS101::OutputCircuitInfo']]], + ['clientconnection_9',['ClientConnection',['../classlib60870_1_1_c_s104_1_1_client_connection.html',1,'lib60870::CS104']]], + ['clientconnectionevent_10',['ClientConnectionEvent',['../namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015d',1,'lib60870::CS104']]], + ['clocksynchronizationcommand_11',['ClockSynchronizationCommand',['../classlib60870_1_1_c_s101_1_1_clock_synchronization_command.html',1,'lib60870::CS101']]], + ['clocksynchronizationhandler_12',['ClockSynchronizationHandler',['../namespacelib60870_1_1_c_s101.html#a1d5c09e5cefc2e9711adad5ce978f0e7',1,'lib60870::CS101']]], + ['closed_13',['CLOSED',['../namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3a110ccf2f5d2ff4eda1fd1a494293467d',1,'lib60870.CS104.CLOSED'],['../namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015da110ccf2f5d2ff4eda1fd1a494293467d',1,'lib60870.CS104.CLOSED']]], + ['coi_14',['COI',['../classlib60870_1_1_c_s101_1_1_end_of_initialization.html#ad48e8ec133c8bf5ed7f389063492d67b',1,'lib60870::CS101::EndOfInitialization']]], + ['commercial_20licenses_20and_20support_15',['Commercial licenses and support',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html#autotoc_md4',1,'']]], + ['compiling_20and_20running_20the_20examples_3a_16',['Compiling and running the examples:',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html#autotoc_md1',1,'']]], + ['connect_17',['Connect',['../classlib60870_1_1_c_s104_1_1_connection.html#a2f21059cd28bf0a85f9ed4a666c6e96f',1,'lib60870::CS104::Connection']]], + ['connect_5ffailed_18',['CONNECT_FAILED',['../namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3a4820f088c518fab18fe3d9ca70fa7f64',1,'lib60870::CS104']]], + ['connectasync_19',['ConnectAsync',['../classlib60870_1_1_c_s104_1_1_connection.html#af8aed177bd279389527cbfa8eede3ba6',1,'lib60870::CS104::Connection']]], + ['connected_20',['Connected',['../classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html#a8e6479066b29f09067340b7fc1b29cbc',1,'lib60870::linklayer::TcpClientVirtualSerialPort']]], + ['connection_21',['Connection',['../classlib60870_1_1_c_s104_1_1_connection.html',1,'lib60870.CS104.Connection'],['../classlib60870_1_1_c_s104_1_1_connection.html#a6fe992399ec28f325cb953737e4006a0',1,'lib60870.CS104.Connection.Connection(string hostname, int tcpPort=2404)'],['../classlib60870_1_1_c_s104_1_1_connection.html#a3eae55571e202eb6736600f1e77ebe39',1,'lib60870.CS104.Connection.Connection(string hostname, APCIParameters apciParameters, ApplicationLayerParameters alParameters)'],['../classlib60870_1_1_c_s104_1_1_connection.html#a02efd3de4daa87455c94621c8a225eda',1,'lib60870.CS104.Connection.Connection(string hostname, int tcpPort, APCIParameters apciParameters, ApplicationLayerParameters alParameters)'],['../classlib60870_1_1_c_s104_1_1_connection.html#ab6fa4b93d7a17e5eb0eabb97e0e8360f',1,'lib60870.CS104.Connection.Connection(string hostname, TlsSecurityInformation tlsInfo, int tcpPort=19998)'],['../classlib60870_1_1_c_s104_1_1_connection.html#a54aa828ed44ffbc63fdd71d3860bf541',1,'lib60870.CS104.Connection.Connection(string hostname, int tcpPort, APCIParameters apciParameters, ApplicationLayerParameters alParameters, TlsSecurityInformation tlsInfo)']]], + ['connection_5fis_5fredundancy_5fgroup_22',['CONNECTION_IS_REDUNDANCY_GROUP',['../namespacelib60870_1_1_c_s104.html#a40215e8d03911ca6748ebfd78218d744a9d445a07d2444cf077d5b4a53243916a',1,'lib60870::CS104']]], + ['connectionevent_23',['ConnectionEvent',['../namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3',1,'lib60870::CS104']]], + ['connectionexception_24',['ConnectionException',['../classlib60870_1_1_connection_exception.html',1,'lib60870']]], + ['connectionhandler_25',['ConnectionHandler',['../namespacelib60870_1_1_c_s104.html#aa16788ce99f06cdcca23787226650a74',1,'lib60870::CS104']]], + ['connectionrequesthandler_26',['ConnectionRequestHandler',['../namespacelib60870_1_1_c_s104.html#ac8c6f665636c4cd4938333429bc9b03f',1,'lib60870::CS104']]], + ['connectionstatistics_27',['ConnectionStatistics',['../classlib60870_1_1_c_s104_1_1_connection_statistics.html',1,'lib60870::CS104']]], + ['connecttimeout_28',['ConnectTimeout',['../classlib60870_1_1_c_s104_1_1_connection.html#a5bc80935ee36a7bcca2c4807f0abeed4',1,'lib60870::CS104::Connection']]], + ['contact_3a_29',['Contact:',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html#autotoc_md2',1,'']]], + ['contributing_30',['Contributing',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html#autotoc_md5',1,'']]], + ['cot_31',['Cot',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a68dd2e6df66c5c4298a357ac5da8fed1',1,'lib60870::CS101::ASDU']]], + ['counterinterrogationcommand_32',['CounterInterrogationCommand',['../classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html',1,'lib60870::CS101']]], + ['counterinterrogationhandler_33',['CounterInterrogationHandler',['../namespacelib60870_1_1_c_s101.html#a027c45142e293bb4601aa52dd83c5d15',1,'lib60870::CS101']]], + ['cp16time2a_34',['CP16Time2a',['../classlib60870_1_1_c_p16_time2a.html',1,'lib60870']]], + ['cp24time2a_35',['CP24Time2a',['../classlib60870_1_1_c_p24_time2a.html',1,'lib60870']]], + ['cp32time2a_36',['CP32Time2a',['../classlib60870_1_1_c_p32_time2a.html',1,'lib60870']]], + ['cp56time2a_37',['CP56Time2a',['../classlib60870_1_1_c_p56_time2a.html',1,'lib60870']]], + ['cs101master_38',['CS101Master',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html',1,'lib60870::CS101']]], + ['cs101slave_39',['CS101Slave',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html',1,'lib60870.CS101.CS101Slave'],['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a2e94b7ad7d65489e0dbe94fb76d79420',1,'lib60870.CS101.CS101Slave.CS101Slave(SerialPort port, LinkLayerParameters parameters=null)'],['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a7d63775d354c7e0b9a3b50927ed74134',1,'lib60870.CS101.CS101Slave.CS101Slave(Stream serialStream, LinkLayerParameters parameters=null)']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/all_5.js b/doxygen/doxydoc.NET/html/search/all_5.js new file mode 100644 index 0000000..3e38554 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/all_5.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['dayofmonth_0',['DayOfMonth',['../classlib60870_1_1_c_p56_time2a.html#a533808a9bd35fd250ff3197ce8b4e8fa',1,'lib60870::CP56Time2a']]], + ['dayofweek_1',['DayOfWeek',['../classlib60870_1_1_c_p56_time2a.html#afddcdbd7c4557c88032eb519a57b4019',1,'lib60870::CP56Time2a']]], + ['decode_2',['Decode',['../interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html#ad705ef8ea182c4977221c7b3cc23d632',1,'lib60870::CS101::IPrivateIOFactory']]], + ['delayacquisitioncommand_3',['DelayAcquisitionCommand',['../classlib60870_1_1_c_s101_1_1_delay_acquisition_command.html',1,'lib60870::CS101']]], + ['delayacquisitionhandler_4',['DelayAcquisitionHandler',['../namespacelib60870_1_1_c_s101.html#ad94b7a69be5b593e6e694b884206d184',1,'lib60870::CS101']]], + ['dir_5',['DIR',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#aceff4f3985519a296c989418c7ad71b0',1,'lib60870.CS101.CS101Master.DIR'],['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#ae1d00e6ee950d56d5487384070651148',1,'lib60870.CS101.CS101Slave.DIR']]], + ['doublecommand_6',['DoubleCommand',['../classlib60870_1_1_c_s101_1_1_double_command.html',1,'lib60870::CS101']]], + ['doublecommandwithcp56time2a_7',['DoubleCommandWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['doublepointinformation_8',['DoublePointInformation',['../classlib60870_1_1_c_s101_1_1_double_point_information.html',1,'lib60870::CS101']]], + ['doublepointvalue_9',['DoublePointValue',['../namespacelib60870_1_1_c_s101.html#aff74ed75cebe96a815464d1ef856e3ad',1,'lib60870::CS101']]], + ['doublepointwithcp24time2a_10',['DoublePointWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a.html',1,'lib60870::CS101']]], + ['doublepointwithcp56time2a_11',['DoublePointWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a.html',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/all_6.js b/doxygen/doxydoc.NET/html/search/all_6.js new file mode 100644 index 0000000..566a60b --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/all_6.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['endofinitialization_0',['EndOfInitialization',['../classlib60870_1_1_c_s101_1_1_end_of_initialization.html',1,'lib60870::CS101']]], + ['enqueueasdu_1',['EnqueueASDU',['../classlib60870_1_1_c_s104_1_1_redundancy_group.html#af72be4629377a6c78f4f9733f4e251b4',1,'lib60870.CS104.RedundancyGroup.EnqueueASDU()'],['../classlib60870_1_1_c_s104_1_1_server.html#aa6f1a77ab87c08ca663ab88dcf1b9dbe',1,'lib60870.CS104.Server.EnqueueASDU(ASDU asdu)']]], + ['enqueuemode_2',['EnqueueMode',['../classlib60870_1_1_c_s104_1_1_server.html#a102d175703f4f357e5749265352ce71e',1,'lib60870.CS104.Server.EnqueueMode'],['../namespacelib60870_1_1_c_s104.html#ac35ab675c5aa217ded7ded419a5557df',1,'lib60870.CS104.EnqueueMode']]], + ['enqueueuserdataclass1_3',['EnqueueUserDataClass1',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a5a8573dbafd2ce027d9d7603b3347211',1,'lib60870::CS101::CS101Slave']]], + ['enqueueuserdataclass2_4',['EnqueueUserDataClass2',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a605411588ecb89ab825520cac38d547e',1,'lib60870::CS101::CS101Slave']]], + ['eventofprotectionequipment_5',['EventOfProtectionEquipment',['../classlib60870_1_1_c_s101_1_1_event_of_protection_equipment.html',1,'lib60870::CS101']]], + ['eventofprotectionequipmentwithcp56time2a_6',['EventOfProtectionEquipmentWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['examples_3a_7',['Compiling and running the examples:',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html#autotoc_md1',1,'']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/all_7.js b/doxygen/doxydoc.NET/html/search/all_7.js new file mode 100644 index 0000000..4fca83f --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/all_7.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['fileack_0',['FileACK',['../classlib60870_1_1_c_s101_1_1_file_a_c_k.html',1,'lib60870::CS101']]], + ['filecallorselect_1',['FileCallOrSelect',['../classlib60870_1_1_c_s101_1_1_file_call_or_select.html',1,'lib60870::CS101']]], + ['filedirectory_2',['FileDirectory',['../classlib60870_1_1_c_s101_1_1_file_directory.html',1,'lib60870::CS101']]], + ['fileerror_3',['FileError',['../namespacelib60870_1_1_c_s101.html#a69c8264ee40e2407023b71a5dfd09e0f',1,'lib60870::CS101']]], + ['filelastsegmentorsection_4',['FileLastSegmentOrSection',['../classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html',1,'lib60870::CS101']]], + ['fileready_5',['FileReady',['../classlib60870_1_1_c_s101_1_1_file_ready.html',1,'lib60870.CS101.FileReady'],['../classlib60870_1_1_c_s101_1_1_file_ready.html#a109625172b98152e626a426c260295e6',1,'lib60870.CS101.FileReady.FileReady()']]], + ['filereadyhandler_6',['FileReadyHandler',['../namespacelib60870_1_1_c_s101.html#a0c7346f0e183f14b92c4fc6c373678e9',1,'lib60870::CS101']]], + ['filesavailable_7',['FilesAvailable',['../classlib60870_1_1_c_s101_1_1_files_available.html',1,'lib60870::CS101']]], + ['filesegment_8',['FileSegment',['../classlib60870_1_1_c_s101_1_1_file_segment.html',1,'lib60870::CS101']]], + ['filetimeout_9',['FileTimeout',['../classlib60870_1_1_c_s101_1_1_slave.html#a063b9d1a19a2960a91afc69204cc11f7',1,'lib60870::CS101::Slave']]], + ['frame_10',['Frame',['../classlib60870_1_1_frame.html',1,'lib60870']]], + ['frq_11',['FRQ',['../classlib60870_1_1_c_s101_1_1_file_ready.html#a68e7d332f311fb83d9bb617b6e54ec0a',1,'lib60870::CS101::FileReady']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/all_8.js b/doxygen/doxydoc.NET/html/search/all_8.js new file mode 100644 index 0000000..289738a --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/all_8.js @@ -0,0 +1,23 @@ +var searchData= +[ + ['gc_0',['GC',['../classlib60870_1_1_c_s101_1_1_output_circuit_info.html#a1eeab57adef2da4f97af4fc96b07ad6c',1,'lib60870::CS101::OutputCircuitInfo']]], + ['getapciparameters_1',['GetAPCIParameters',['../classlib60870_1_1_c_s104_1_1_server.html#a859b8ac2c4b9cd87efc490173c8cd38a',1,'lib60870::CS104::Server']]], + ['getapplicationlayerparameters_2',['GetApplicationLayerParameters',['../classlib60870_1_1_c_s101_1_1_master.html#ac8f077926245f7194b3aba089a7ce520',1,'lib60870.CS101.Master.GetApplicationLayerParameters()'],['../classlib60870_1_1_c_s104_1_1_client_connection.html#a92d801095c3038a96b26093e7d38628a',1,'lib60870.CS104.ClientConnection.GetApplicationLayerParameters()'],['../classlib60870_1_1_c_s104_1_1_server.html#a21f35d1f590dae3b557c413e2f05d01d',1,'lib60870.CS104.Server.GetApplicationLayerParameters()']]], + ['getavailablefiles_3',['GetAvailableFiles',['../classlib60870_1_1_c_s101_1_1_slave.html#a5e85ada660492fecd182e654a75c8b42',1,'lib60870::CS101::Slave']]], + ['getca_4',['GetCA',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a8bd0b5d9ca9019f7f8dab6c43a5d7945',1,'lib60870.CS101.IFileProvider.GetCA()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#a7f9d7004443cb8285f67ef8362544313',1,'lib60870.CS101.TransparentFile.GetCA()']]], + ['getdatetime_5',['GetDateTime',['../classlib60870_1_1_c_p32_time2a.html#a57711ec4af4479936d10b2bf6df355a4',1,'lib60870.CP32Time2a.GetDateTime()'],['../classlib60870_1_1_c_p56_time2a.html#a83f9707e94051e90f0ab9b2f5dc1b3df',1,'lib60870.CP56Time2a.GetDateTime()']]], + ['getdirectory_6',['GetDirectory',['../classlib60870_1_1_c_s104_1_1_connection.html#a131c3dd3059b67c6ec0b2351c5e1e50c',1,'lib60870::CS104::Connection']]], + ['getelement_7',['GetElement',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a3d57c6dab7100c5933373231c459d31f',1,'lib60870.CS101.ASDU.GetElement(int index, PrivateInformationObjectTypes privateObjectTypes)'],['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a752cdac37f9f37c859eb4de5bf01c746',1,'lib60870.CS101.ASDU.GetElement(int index, IPrivateIOFactory ioFactory)'],['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a163ff2a748b560ecd08692a00ce83d57',1,'lib60870.CS101.ASDU.GetElement(int index)']]], + ['getencodedsize_8',['GetEncodedSize',['../classlib60870_1_1_c_s101_1_1_information_object.html#a2e5cb4ff206963db465c10d06c6e1954',1,'lib60870.CS101.InformationObject.GetEncodedSize()'],['../interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html#a26a0623584b57db1a35b9e8fe1b7e02c',1,'lib60870.CS101.IPrivateIOFactory.GetEncodedSize()']]], + ['getfile_9',['GetFile',['../classlib60870_1_1_c_s101_1_1_master.html#a67284f6ec618c943766040e3877acc7b',1,'lib60870.CS101.Master.GetFile()'],['../classlib60870_1_1_c_s104_1_1_connection.html#adca074f2aa74aae897fbfc85a4bbe6d5',1,'lib60870.CS104.Connection.GetFile(int ca, int ioa, NameOfFile nof, IFileReceiver receiver)'],['../classlib60870_1_1_c_s104_1_1_connection.html#a25c9f162dfde01896bb30e8f61092183',1,'lib60870.CS104.Connection.GetFile(int ca, int ioa, NameOfFile nof, IFileReceiver receiver, int timeout)']]], + ['getfiles_10',['GetFiles',['../classlib60870_1_1_c_s101_1_1_files_available.html#ad07db9fbd1ca2f1643991d7b446bf7c4',1,'lib60870::CS101::FilesAvailable']]], + ['getfilesize_11',['GetFileSize',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a6b9b192c358b22d132893c90a636daf2',1,'lib60870.CS101.IFileProvider.GetFileSize()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#a7eaa164b404cd4f32302c7f044b774ab',1,'lib60870.CS101.TransparentFile.GetFileSize()']]], + ['getioa_12',['GetIOA',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a68c3470850586f634e731dd250c957da',1,'lib60870.CS101.IFileProvider.GetIOA()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#a955484a99eb32c9a8c37a76959add633',1,'lib60870.CS101.TransparentFile.GetIOA()']]], + ['getlibraryversionstring_13',['GetLibraryVersionString',['../classlib60870_1_1_library_common.html#a3de9d184ceeaeaa3ad95bdfea5f0d902',1,'lib60870::LibraryCommon']]], + ['getmilliseconds_14',['GetMilliseconds',['../classlib60870_1_1_c_p24_time2a.html#afa47b9c056d5787d0368779f462fd2ff',1,'lib60870::CP24Time2a']]], + ['getnameoffile_15',['GetNameOfFile',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a9aa9aeb003e1e5726a5b634cfa1c5548',1,'lib60870.CS101.IFileProvider.GetNameOfFile()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#a069c64d7b35226bb030fc5e0dfcbd5bd',1,'lib60870.CS101.TransparentFile.GetNameOfFile()']]], + ['getsectionsize_16',['GetSectionSize',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a953c9bc0b2dd47ba192649ce3b954318',1,'lib60870.CS101.IFileProvider.GetSectionSize()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#a4a53ae94f1bc4d70ebac30d1af9ba596',1,'lib60870.CS101.TransparentFile.GetSectionSize()']]], + ['getsegmentdata_17',['GetSegmentData',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a238a851573b79de09af78b4f93deb7f2',1,'lib60870.CS101.IFileProvider.GetSegmentData()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#adefa9e2224dba9bb842481db21e94216',1,'lib60870.CS101.TransparentFile.GetSegmentData()']]], + ['getstatistics_18',['GetStatistics',['../classlib60870_1_1_c_s104_1_1_connection.html#a5867e9bda4cf3d6647ebf50603e1be17',1,'lib60870::CS104::Connection']]], + ['gs_19',['GS',['../classlib60870_1_1_c_s101_1_1_start_event.html#a6cf3d354c2df01eb808748353f743b33',1,'lib60870::CS101::StartEvent']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/all_9.js b/doxygen/doxydoc.NET/html/search/all_9.js new file mode 100644 index 0000000..d6aecbc --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/all_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['hour_0',['Hour',['../classlib60870_1_1_c_p32_time2a.html#a4cfa66063d1b214990d69515af388552',1,'lib60870.CP32Time2a.Hour'],['../classlib60870_1_1_c_p56_time2a.html#a34891c411294a0cb5bf2f1d4adb3286a',1,'lib60870.CP56Time2a.Hour']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/all_a.js b/doxygen/doxydoc.NET/html/search/all_a.js new file mode 100644 index 0000000..fb508da --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/all_a.js @@ -0,0 +1,25 @@ +var searchData= +[ + ['ifileprovider_0',['IFileProvider',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html',1,'lib60870::CS101']]], + ['ifilereceiver_1',['IFileReceiver',['../interfacelib60870_1_1_c_s101_1_1_i_file_receiver.html',1,'lib60870::CS101']]], + ['ignore_2',['IGNORE',['../namespacelib60870_1_1_c_s104.html#ac35ab675c5aa217ded7ded419a5557dfaa2e843feab94ef623fea888f07c28696',1,'lib60870::CS104']]], + ['imasterconnection_3',['IMasterConnection',['../interfacelib60870_1_1_c_s101_1_1_i_master_connection.html',1,'lib60870::CS101']]], + ['inactive_4',['INACTIVE',['../namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015da6b273343c454f9c53dcfc9c4ccf171d2',1,'lib60870::CS104']]], + ['informationobject_5',['InformationObject',['../classlib60870_1_1_c_s101_1_1_information_object.html',1,'lib60870::CS101']]], + ['integratedtotals_6',['IntegratedTotals',['../classlib60870_1_1_c_s101_1_1_integrated_totals.html',1,'lib60870::CS101']]], + ['integratedtotalswithcp24time2a_7',['IntegratedTotalsWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a.html',1,'lib60870::CS101']]], + ['integratedtotalswithcp56time2a_8',['IntegratedTotalsWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['interrogationcommand_9',['InterrogationCommand',['../classlib60870_1_1_c_s101_1_1_interrogation_command.html',1,'lib60870::CS101']]], + ['interrogationhandler_10',['InterrogationHandler',['../namespacelib60870_1_1_c_s101.html#a94c2e7c6e902d29db88c7a1d512099ed',1,'lib60870::CS101']]], + ['invalid_11',['Invalid',['../classlib60870_1_1_c_p24_time2a.html#acb0606324a0b221df177d242cd97f7c7',1,'lib60870.CP24Time2a.Invalid'],['../classlib60870_1_1_c_p32_time2a.html#a9bc00071f0d79994977adcc9ea1564b4',1,'lib60870.CP32Time2a.Invalid'],['../classlib60870_1_1_c_p56_time2a.html#a7c00ef3b8b3f7fb1bb9a6cad0440f6dd',1,'lib60870.CP56Time2a.Invalid'],['../classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#a9c84bd5840b810546affba3f452b11e0',1,'lib60870.CS101.BinaryCounterReading.Invalid']]], + ['iprivateiofactory_12',['IPrivateIOFactory',['../interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html',1,'lib60870::CS101']]], + ['isactive_13',['IsActive',['../classlib60870_1_1_c_s104_1_1_client_connection.html#afa8806c545bf905a3548afa9732de38b',1,'lib60870::CS104::ClientConnection']]], + ['iscatchall_14',['IsCatchAll',['../classlib60870_1_1_c_s104_1_1_redundancy_group.html#aa09df33fcd23dcf486800f45f3d41d32',1,'lib60870::CS104::RedundancyGroup']]], + ['isnegative_15',['IsNegative',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a808a4ea51526b2ecbe0d9e23df1a018b',1,'lib60870::CS101::ASDU']]], + ['isrunning_16',['IsRunning',['../classlib60870_1_1_c_s104_1_1_connection.html#a83f3dfb64fa61b1d3fef93e938c692a1',1,'lib60870.CS104.Connection.IsRunning'],['../classlib60870_1_1_c_s104_1_1_server.html#a8d16b6e5d54bee55912a00c0cb3b28fc',1,'lib60870.CS104.Server.IsRunning()']]], + ['issequence_17',['IsSequence',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a874af72bec9618876b47a8da155de96f',1,'lib60870::CS101::ASDU']]], + ['istest_18',['IsTest',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#ae315fe2504e41a213cd76330cb56cc24',1,'lib60870::CS101::ASDU']]], + ['istransmitbufferfull_19',['IsTransmitBufferFull',['../classlib60870_1_1_c_s104_1_1_connection.html#a079f96f5d2be9416e9c0c4518542eb07',1,'lib60870::CS104::Connection']]], + ['isuserdataclass1queuefull_20',['IsUserDataClass1QueueFull',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a9903e812bc9779389eb09e855ae3dd74',1,'lib60870::CS101::CS101Slave']]], + ['isuserdataclass2queuefull_21',['IsUserDataClass2QueueFull',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a24cdca7a10754390b15ce735f848cdb3',1,'lib60870::CS101::CS101Slave']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/all_b.js b/doxygen/doxydoc.NET/html/search/all_b.js new file mode 100644 index 0000000..bf97588 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/all_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['k_0',['K',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#a0e3fc557d1c66308e6e38383ec9a5287',1,'lib60870::CS104::APCIParameters']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/all_c.js b/doxygen/doxydoc.NET/html/search/all_c.js new file mode 100644 index 0000000..bf0a22f --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/all_c.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['lastsectionorsegmentqualifier_0',['LastSectionOrSegmentQualifier',['../namespacelib60870_1_1_c_s101.html#a7030b42dc57243516c07cb22a1992183',1,'lib60870::CS101']]], + ['lib60870_1',['lib60870',['../namespacelib60870.html',1,'']]], + ['lib60870_20net_20v2_203_200_2',['README lib60870.NET v2.3.0',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html',1,'']]], + ['lib60870_3a_3acs101_3',['CS101',['../namespacelib60870_1_1_c_s101.html',1,'lib60870']]], + ['lib60870_3a_3acs104_4',['CS104',['../namespacelib60870_1_1_c_s104.html',1,'lib60870']]], + ['lib60870_3a_3alinklayer_5',['linklayer',['../namespacelib60870_1_1linklayer.html',1,'lib60870']]], + ['librarycommon_6',['LibraryCommon',['../classlib60870_1_1_library_common.html',1,'lib60870']]], + ['licenses_20and_20support_7',['Commercial licenses and support',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html#autotoc_md4',1,'']]], + ['licensing_8',['Licensing',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html#autotoc_md3',1,'']]], + ['linklayeraddress_9',['LinkLayerAddress',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#aeb21ec9a8522c48ad37c263762d300a4',1,'lib60870::CS101::CS101Slave']]], + ['linklayeraddressotherstation_10',['LinkLayerAddressOtherStation',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#aa3c5ac017a1ea8fdbbb686c52076cc75',1,'lib60870::CS101::CS101Slave']]], + ['linklayerbusyexception_11',['LinkLayerBusyException',['../classlib60870_1_1linklayer_1_1_link_layer_busy_exception.html',1,'lib60870::linklayer']]], + ['linklayermode_12',['LinkLayerMode',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#ad9d9bad745efb1fd3ce5bcbe894f6d97',1,'lib60870::CS101::CS101Slave']]], + ['linklayerparameters_13',['LinkLayerParameters',['../classlib60870_1_1linklayer_1_1_link_layer_parameters.html',1,'lib60870::linklayer']]], + ['linklayerstatechanged_14',['LinkLayerStateChanged',['../namespacelib60870_1_1linklayer.html#aeca494b2e7a508585564b223d2f7851b',1,'lib60870::linklayer']]], + ['localcertificateselectioncallback_15',['LocalCertificateSelectionCallback',['../classlib60870_1_1_c_s104_1_1_connection.html#ab773a1837cbbd532d5406f05b9d3cf3f',1,'lib60870::CS104::Connection']]], + ['localipaddress_16',['LocalIpAddress',['../classlib60870_1_1_c_s104_1_1_connection.html#abfa6d1581b6702a9f1dbdb96a79f5bc3',1,'lib60870::CS104::Connection']]], + ['localtcpport_17',['LocalTcpPort',['../classlib60870_1_1_c_s104_1_1_connection.html#a871e51aa4130ab9185014a4a845fdd2a',1,'lib60870::CS104::Connection']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/all_d.js b/doxygen/doxydoc.NET/html/search/all_d.js new file mode 100644 index 0000000..59b0604 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/all_d.js @@ -0,0 +1,23 @@ +var searchData= +[ + ['m_5fme_5fna_5f1_0',['M_ME_NA_1',['../namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba6725773b3371787d2445c3dfad2d68fb',1,'lib60870::CS101']]], + ['master_1',['Master',['../classlib60870_1_1_c_s101_1_1_master.html',1,'lib60870::CS101']]], + ['masterconnection_5fhasunconfirmedmessages_2',['MasterConnection_hasUnconfirmedMessages',['../classlib60870_1_1_c_s104_1_1_client_connection.html#a16acd0a66071c7d1f4d111fafd7a2421',1,'lib60870::CS104::ClientConnection']]], + ['maxhighprioqueuesize_3',['MaxHighPrioQueueSize',['../classlib60870_1_1_c_s104_1_1_server.html#a408a31dd3cf6e781d7295804bd96d767',1,'lib60870::CS104::Server']]], + ['maxopenconnections_4',['MaxOpenConnections',['../classlib60870_1_1_c_s104_1_1_server.html#adcea16c6c2db799bc5b6750e82ca2235',1,'lib60870::CS104::Server']]], + ['maxqueuesize_5',['MaxQueueSize',['../classlib60870_1_1_c_s104_1_1_server.html#acef2c82d580d17114847df8409f6bf4f',1,'lib60870::CS104::Server']]], + ['measuredvaluenormalized_6',['MeasuredValueNormalized',['../classlib60870_1_1_c_s101_1_1_measured_value_normalized.html',1,'lib60870::CS101']]], + ['measuredvaluenormalizedwithcp24time2a_7',['MeasuredValueNormalizedWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a.html',1,'lib60870::CS101']]], + ['measuredvaluenormalizedwithcp56time2a_8',['MeasuredValueNormalizedWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['measuredvaluenormalizedwithoutquality_9',['MeasuredValueNormalizedWithoutQuality',['../classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html',1,'lib60870::CS101']]], + ['measuredvaluescaled_10',['MeasuredValueScaled',['../classlib60870_1_1_c_s101_1_1_measured_value_scaled.html',1,'lib60870.CS101.MeasuredValueScaled'],['../classlib60870_1_1_c_s101_1_1_measured_value_scaled.html#a05819e48801faf682acea7f5c53d93e7',1,'lib60870.CS101.MeasuredValueScaled.MeasuredValueScaled()']]], + ['measuredvaluescaledwithcp24time2a_11',['MeasuredValueScaledWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a.html',1,'lib60870::CS101']]], + ['measuredvaluescaledwithcp56time2a_12',['MeasuredValueScaledWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['measuredvalueshort_13',['MeasuredValueShort',['../classlib60870_1_1_c_s101_1_1_measured_value_short.html',1,'lib60870::CS101']]], + ['measuredvalueshortwithcp24time2a_14',['MeasuredValueShortWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a.html',1,'lib60870::CS101']]], + ['measuredvalueshortwithcp56time2a_15',['MeasuredValueShortWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['millisecond_16',['Millisecond',['../classlib60870_1_1_c_p24_time2a.html#a54e60600dccb34252b428488223f419e',1,'lib60870.CP24Time2a.Millisecond'],['../classlib60870_1_1_c_p32_time2a.html#a144afbb4092fbe1a3196f30cba13fc37',1,'lib60870.CP32Time2a.Millisecond'],['../classlib60870_1_1_c_p56_time2a.html#a2e0c82ecba6b07880f9416101f004ecc',1,'lib60870.CP56Time2a.Millisecond']]], + ['minute_17',['Minute',['../classlib60870_1_1_c_p24_time2a.html#a1bdb66a13e77ea4ca5938c7609a38225',1,'lib60870.CP24Time2a.Minute'],['../classlib60870_1_1_c_p32_time2a.html#a723b8ffeb4915b7347aa97c65b2f4365',1,'lib60870.CP32Time2a.Minute'],['../classlib60870_1_1_c_p56_time2a.html#af5a5ead5f041e47e0f4e201acb707d13',1,'lib60870.CP56Time2a.Minute']]], + ['month_18',['Month',['../classlib60870_1_1_c_p56_time2a.html#aeda1719c2e81de05a616f166036ef1f7',1,'lib60870::CP56Time2a']]], + ['multiple_5fredundancy_5fgroups_19',['MULTIPLE_REDUNDANCY_GROUPS',['../namespacelib60870_1_1_c_s104.html#a40215e8d03911ca6748ebfd78218d744a07a1fe963762929879e3998233ae368c',1,'lib60870::CS104']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/all_e.js b/doxygen/doxydoc.NET/html/search/all_e.js new file mode 100644 index 0000000..492a33d --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/all_e.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['name_0',['Name',['../classlib60870_1_1_c_s104_1_1_redundancy_group.html#ab5d3a9a8d2fcca1e07fbb547cd072248',1,'lib60870::CS104::RedundancyGroup']]], + ['nameoffile_1',['NameOfFile',['../namespacelib60870_1_1_c_s101.html#a5da0329a39b420cbbf859758eaceba93',1,'lib60870::CS101']]], + ['net_20v2_203_200_2',['README lib60870.NET v2.3.0',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html',1,'']]], + ['numberofelements_3',['NumberOfElements',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a8ab49764dd886c58be639d229e664af5',1,'lib60870::CS101::ASDU']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/all_f.js b/doxygen/doxydoc.NET/html/search/all_f.js new file mode 100644 index 0000000..efaecc1 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/all_f.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['oa_0',['Oa',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a73566a1f53fc1c1492804c4bcf068438',1,'lib60870::CS101::ASDU']]], + ['openconnections_1',['OpenConnections',['../classlib60870_1_1_c_s104_1_1_server.html#a63dda97b27c78743dee7374d66cdda53',1,'lib60870::CS104::Server']]], + ['opened_2',['OPENED',['../namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3ae670c2408064392c6da7d0b721f7349c',1,'lib60870.CS104.OPENED'],['../namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015dae670c2408064392c6da7d0b721f7349c',1,'lib60870.CS104.OPENED']]], + ['outputcircuitinfo_3',['OutputCircuitInfo',['../classlib60870_1_1_c_s101_1_1_output_circuit_info.html',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/classes_0.js b/doxygen/doxydoc.NET/html/search/classes_0.js new file mode 100644 index 0000000..3f5b5bc --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/classes_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['apciparameters_0',['APCIParameters',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html',1,'lib60870::CS104']]], + ['applicationlayerparameters_1',['ApplicationLayerParameters',['../classlib60870_1_1_c_s101_1_1_application_layer_parameters.html',1,'lib60870::CS101']]], + ['asdu_2',['ASDU',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html',1,'lib60870::CS101']]], + ['asduparsingexception_3',['ASDUParsingException',['../classlib60870_1_1_a_s_d_u_parsing_exception.html',1,'lib60870']]], + ['asduqueue_4',['ASDUQueue',['../classlib60870_1_1_a_s_d_u_queue.html',1,'lib60870']]], + ['asduqueueexception_5',['ASDUQueueException',['../classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception.html',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/classes_1.js b/doxygen/doxydoc.NET/html/search/classes_1.js new file mode 100644 index 0000000..ef923eb --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/classes_1.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['binarycounterreading_0',['BinaryCounterReading',['../classlib60870_1_1_c_s101_1_1_binary_counter_reading.html',1,'lib60870::CS101']]], + ['bitstring32_1',['Bitstring32',['../classlib60870_1_1_c_s101_1_1_bitstring32.html',1,'lib60870::CS101']]], + ['bitstring32command_2',['Bitstring32Command',['../classlib60870_1_1_c_s101_1_1_bitstring32_command.html',1,'lib60870::CS101']]], + ['bitstring32commandwithcp56time2a_3',['Bitstring32CommandWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['bitstring32withcp24time2a_4',['Bitstring32WithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a.html',1,'lib60870::CS101']]], + ['bitstring32withcp56time2a_5',['Bitstring32WithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a.html',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/classes_2.js b/doxygen/doxydoc.NET/html/search/classes_2.js new file mode 100644 index 0000000..3e62f2a --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/classes_2.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['clientconnection_0',['ClientConnection',['../classlib60870_1_1_c_s104_1_1_client_connection.html',1,'lib60870::CS104']]], + ['clocksynchronizationcommand_1',['ClockSynchronizationCommand',['../classlib60870_1_1_c_s101_1_1_clock_synchronization_command.html',1,'lib60870::CS101']]], + ['connection_2',['Connection',['../classlib60870_1_1_c_s104_1_1_connection.html',1,'lib60870::CS104']]], + ['connectionexception_3',['ConnectionException',['../classlib60870_1_1_connection_exception.html',1,'lib60870']]], + ['connectionstatistics_4',['ConnectionStatistics',['../classlib60870_1_1_c_s104_1_1_connection_statistics.html',1,'lib60870::CS104']]], + ['counterinterrogationcommand_5',['CounterInterrogationCommand',['../classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html',1,'lib60870::CS101']]], + ['cp16time2a_6',['CP16Time2a',['../classlib60870_1_1_c_p16_time2a.html',1,'lib60870']]], + ['cp24time2a_7',['CP24Time2a',['../classlib60870_1_1_c_p24_time2a.html',1,'lib60870']]], + ['cp32time2a_8',['CP32Time2a',['../classlib60870_1_1_c_p32_time2a.html',1,'lib60870']]], + ['cp56time2a_9',['CP56Time2a',['../classlib60870_1_1_c_p56_time2a.html',1,'lib60870']]], + ['cs101master_10',['CS101Master',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html',1,'lib60870::CS101']]], + ['cs101slave_11',['CS101Slave',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/classes_3.js b/doxygen/doxydoc.NET/html/search/classes_3.js new file mode 100644 index 0000000..b7e4559 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/classes_3.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['delayacquisitioncommand_0',['DelayAcquisitionCommand',['../classlib60870_1_1_c_s101_1_1_delay_acquisition_command.html',1,'lib60870::CS101']]], + ['doublecommand_1',['DoubleCommand',['../classlib60870_1_1_c_s101_1_1_double_command.html',1,'lib60870::CS101']]], + ['doublecommandwithcp56time2a_2',['DoubleCommandWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['doublepointinformation_3',['DoublePointInformation',['../classlib60870_1_1_c_s101_1_1_double_point_information.html',1,'lib60870::CS101']]], + ['doublepointwithcp24time2a_4',['DoublePointWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a.html',1,'lib60870::CS101']]], + ['doublepointwithcp56time2a_5',['DoublePointWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a.html',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/classes_4.js b/doxygen/doxydoc.NET/html/search/classes_4.js new file mode 100644 index 0000000..e2f51ce --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/classes_4.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['endofinitialization_0',['EndOfInitialization',['../classlib60870_1_1_c_s101_1_1_end_of_initialization.html',1,'lib60870::CS101']]], + ['eventofprotectionequipment_1',['EventOfProtectionEquipment',['../classlib60870_1_1_c_s101_1_1_event_of_protection_equipment.html',1,'lib60870::CS101']]], + ['eventofprotectionequipmentwithcp56time2a_2',['EventOfProtectionEquipmentWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a.html',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/classes_5.js b/doxygen/doxydoc.NET/html/search/classes_5.js new file mode 100644 index 0000000..6f60443 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/classes_5.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['fileack_0',['FileACK',['../classlib60870_1_1_c_s101_1_1_file_a_c_k.html',1,'lib60870::CS101']]], + ['filecallorselect_1',['FileCallOrSelect',['../classlib60870_1_1_c_s101_1_1_file_call_or_select.html',1,'lib60870::CS101']]], + ['filedirectory_2',['FileDirectory',['../classlib60870_1_1_c_s101_1_1_file_directory.html',1,'lib60870::CS101']]], + ['filelastsegmentorsection_3',['FileLastSegmentOrSection',['../classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html',1,'lib60870::CS101']]], + ['fileready_4',['FileReady',['../classlib60870_1_1_c_s101_1_1_file_ready.html',1,'lib60870::CS101']]], + ['filesavailable_5',['FilesAvailable',['../classlib60870_1_1_c_s101_1_1_files_available.html',1,'lib60870::CS101']]], + ['filesegment_6',['FileSegment',['../classlib60870_1_1_c_s101_1_1_file_segment.html',1,'lib60870::CS101']]], + ['frame_7',['Frame',['../classlib60870_1_1_frame.html',1,'lib60870']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/classes_6.js b/doxygen/doxydoc.NET/html/search/classes_6.js new file mode 100644 index 0000000..330c939 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/classes_6.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['ifileprovider_0',['IFileProvider',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html',1,'lib60870::CS101']]], + ['ifilereceiver_1',['IFileReceiver',['../interfacelib60870_1_1_c_s101_1_1_i_file_receiver.html',1,'lib60870::CS101']]], + ['imasterconnection_2',['IMasterConnection',['../interfacelib60870_1_1_c_s101_1_1_i_master_connection.html',1,'lib60870::CS101']]], + ['informationobject_3',['InformationObject',['../classlib60870_1_1_c_s101_1_1_information_object.html',1,'lib60870::CS101']]], + ['integratedtotals_4',['IntegratedTotals',['../classlib60870_1_1_c_s101_1_1_integrated_totals.html',1,'lib60870::CS101']]], + ['integratedtotalswithcp24time2a_5',['IntegratedTotalsWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a.html',1,'lib60870::CS101']]], + ['integratedtotalswithcp56time2a_6',['IntegratedTotalsWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['interrogationcommand_7',['InterrogationCommand',['../classlib60870_1_1_c_s101_1_1_interrogation_command.html',1,'lib60870::CS101']]], + ['iprivateiofactory_8',['IPrivateIOFactory',['../interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/classes_7.js b/doxygen/doxydoc.NET/html/search/classes_7.js new file mode 100644 index 0000000..3770299 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/classes_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['librarycommon_0',['LibraryCommon',['../classlib60870_1_1_library_common.html',1,'lib60870']]], + ['linklayerbusyexception_1',['LinkLayerBusyException',['../classlib60870_1_1linklayer_1_1_link_layer_busy_exception.html',1,'lib60870::linklayer']]], + ['linklayerparameters_2',['LinkLayerParameters',['../classlib60870_1_1linklayer_1_1_link_layer_parameters.html',1,'lib60870::linklayer']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/classes_8.js b/doxygen/doxydoc.NET/html/search/classes_8.js new file mode 100644 index 0000000..b7f2361 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/classes_8.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['master_0',['Master',['../classlib60870_1_1_c_s101_1_1_master.html',1,'lib60870::CS101']]], + ['measuredvaluenormalized_1',['MeasuredValueNormalized',['../classlib60870_1_1_c_s101_1_1_measured_value_normalized.html',1,'lib60870::CS101']]], + ['measuredvaluenormalizedwithcp24time2a_2',['MeasuredValueNormalizedWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a.html',1,'lib60870::CS101']]], + ['measuredvaluenormalizedwithcp56time2a_3',['MeasuredValueNormalizedWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['measuredvaluenormalizedwithoutquality_4',['MeasuredValueNormalizedWithoutQuality',['../classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html',1,'lib60870::CS101']]], + ['measuredvaluescaled_5',['MeasuredValueScaled',['../classlib60870_1_1_c_s101_1_1_measured_value_scaled.html',1,'lib60870::CS101']]], + ['measuredvaluescaledwithcp24time2a_6',['MeasuredValueScaledWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a.html',1,'lib60870::CS101']]], + ['measuredvaluescaledwithcp56time2a_7',['MeasuredValueScaledWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['measuredvalueshort_8',['MeasuredValueShort',['../classlib60870_1_1_c_s101_1_1_measured_value_short.html',1,'lib60870::CS101']]], + ['measuredvalueshortwithcp24time2a_9',['MeasuredValueShortWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a.html',1,'lib60870::CS101']]], + ['measuredvalueshortwithcp56time2a_10',['MeasuredValueShortWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a.html',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/classes_9.js b/doxygen/doxydoc.NET/html/search/classes_9.js new file mode 100644 index 0000000..ef286c0 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/classes_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['outputcircuitinfo_0',['OutputCircuitInfo',['../classlib60870_1_1_c_s101_1_1_output_circuit_info.html',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/classes_a.js b/doxygen/doxydoc.NET/html/search/classes_a.js new file mode 100644 index 0000000..340d010 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/classes_a.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['packedoutputcircuitinfo_0',['PackedOutputCircuitInfo',['../classlib60870_1_1_c_s101_1_1_packed_output_circuit_info.html',1,'lib60870::CS101']]], + ['packedoutputcircuitinfowithcp56time2a_1',['PackedOutputCircuitInfoWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['packedsinglepointwithscd_2',['PackedSinglePointWithSCD',['../classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d.html',1,'lib60870::CS101']]], + ['packedstarteventsofprotectionequipment_3',['PackedStartEventsOfProtectionEquipment',['../classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment.html',1,'lib60870::CS101']]], + ['packedstarteventsofprotectionequipmentwithcp56time2a_4',['PackedStartEventsOfProtectionEquipmentWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['parameteractivation_5',['ParameterActivation',['../classlib60870_1_1_c_s101_1_1_parameter_activation.html',1,'lib60870::CS101']]], + ['parameterfloatvalue_6',['ParameterFloatValue',['../classlib60870_1_1_c_s101_1_1_parameter_float_value.html',1,'lib60870::CS101']]], + ['parameternormalizedvalue_7',['ParameterNormalizedValue',['../classlib60870_1_1_c_s101_1_1_parameter_normalized_value.html',1,'lib60870::CS101']]], + ['parameterscaledvalue_8',['ParameterScaledValue',['../classlib60870_1_1_c_s101_1_1_parameter_scaled_value.html',1,'lib60870::CS101']]], + ['privateinformationobjecttypes_9',['PrivateInformationObjectTypes',['../classlib60870_1_1_c_s101_1_1_private_information_object_types.html',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/classes_b.js b/doxygen/doxydoc.NET/html/search/classes_b.js new file mode 100644 index 0000000..6f013af --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/classes_b.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['qualifierofinterrogation_0',['QualifierOfInterrogation',['../classlib60870_1_1_c_s101_1_1_qualifier_of_interrogation.html',1,'lib60870::CS101']]], + ['qualitydescriptor_1',['QualityDescriptor',['../classlib60870_1_1_c_s101_1_1_quality_descriptor.html',1,'lib60870::CS101']]], + ['qualitydescriptorp_2',['QualityDescriptorP',['../classlib60870_1_1_c_s101_1_1_quality_descriptor_p.html',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/classes_c.js b/doxygen/doxydoc.NET/html/search/classes_c.js new file mode 100644 index 0000000..f756bcd --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/classes_c.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['readcommand_0',['ReadCommand',['../classlib60870_1_1_c_s101_1_1_read_command.html',1,'lib60870::CS101']]], + ['redundancygroup_1',['RedundancyGroup',['../classlib60870_1_1_c_s104_1_1_redundancy_group.html',1,'lib60870::CS104']]], + ['resetprocesscommand_2',['ResetProcessCommand',['../classlib60870_1_1_c_s101_1_1_reset_process_command.html',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/classes_d.js b/doxygen/doxydoc.NET/html/search/classes_d.js new file mode 100644 index 0000000..e84b961 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/classes_d.js @@ -0,0 +1,28 @@ +var searchData= +[ + ['scaledvalue_0',['ScaledValue',['../classlib60870_1_1_c_s101_1_1_scaled_value.html',1,'lib60870::CS101']]], + ['sectionready_1',['SectionReady',['../classlib60870_1_1_c_s101_1_1_section_ready.html',1,'lib60870::CS101']]], + ['server_2',['Server',['../classlib60870_1_1_c_s104_1_1_server.html',1,'lib60870::CS104']]], + ['setpointcommandnormalized_3',['SetpointCommandNormalized',['../classlib60870_1_1_c_s101_1_1_setpoint_command_normalized.html',1,'lib60870::CS101']]], + ['setpointcommandnormalizedwithcp56time2a_4',['SetpointCommandNormalizedWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['setpointcommandqualifier_5',['SetpointCommandQualifier',['../classlib60870_1_1_c_s101_1_1_setpoint_command_qualifier.html',1,'lib60870::CS101']]], + ['setpointcommandscaled_6',['SetpointCommandScaled',['../classlib60870_1_1_c_s101_1_1_setpoint_command_scaled.html',1,'lib60870::CS101']]], + ['setpointcommandscaledwithcp56time2a_7',['SetpointCommandScaledWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['setpointcommandshort_8',['SetpointCommandShort',['../classlib60870_1_1_c_s101_1_1_setpoint_command_short.html',1,'lib60870::CS101']]], + ['setpointcommandshortwithcp56time2a_9',['SetpointCommandShortWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['singlecommand_10',['SingleCommand',['../classlib60870_1_1_c_s101_1_1_single_command.html',1,'lib60870::CS101']]], + ['singlecommandqualifier_11',['SingleCommandQualifier',['../classlib60870_1_1_single_command_qualifier.html',1,'lib60870']]], + ['singlecommandwithcp56time2a_12',['SingleCommandWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['singleevent_13',['SingleEvent',['../classlib60870_1_1_c_s101_1_1_single_event.html',1,'lib60870::CS101']]], + ['singlepointinformation_14',['SinglePointInformation',['../classlib60870_1_1_c_s101_1_1_single_point_information.html',1,'lib60870::CS101']]], + ['singlepointwithcp24time2a_15',['SinglePointWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a.html',1,'lib60870::CS101']]], + ['singlepointwithcp56time2a_16',['SinglePointWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['slave_17',['Slave',['../classlib60870_1_1_c_s101_1_1_slave.html',1,'lib60870::CS101']]], + ['startevent_18',['StartEvent',['../classlib60870_1_1_c_s101_1_1_start_event.html',1,'lib60870::CS101']]], + ['statusandstatuschangedetection_19',['StatusAndStatusChangeDetection',['../classlib60870_1_1_c_s101_1_1_status_and_status_change_detection.html',1,'lib60870::CS101']]], + ['stepcommand_20',['StepCommand',['../classlib60870_1_1_c_s101_1_1_step_command.html',1,'lib60870::CS101']]], + ['stepcommandwithcp56time2a_21',['StepCommandWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['steppositioninformation_22',['StepPositionInformation',['../classlib60870_1_1_c_s101_1_1_step_position_information.html',1,'lib60870::CS101']]], + ['steppositionwithcp24time2a_23',['StepPositionWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a.html',1,'lib60870::CS101']]], + ['steppositionwithcp56time2a_24',['StepPositionWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a.html',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/classes_e.js b/doxygen/doxydoc.NET/html/search/classes_e.js new file mode 100644 index 0000000..5a9f58b --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/classes_e.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['tcpclientvirtualserialport_0',['TcpClientVirtualSerialPort',['../classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html',1,'lib60870::linklayer']]], + ['tcpservervirtualserialport_1',['TcpServerVirtualSerialPort',['../classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.html',1,'lib60870::linklayer']]], + ['testcommand_2',['TestCommand',['../classlib60870_1_1_c_s101_1_1_test_command.html',1,'lib60870::CS101']]], + ['testcommandwithcp56time2a_3',['TestCommandWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html',1,'lib60870::CS101']]], + ['tlssecurityinformation_4',['TlsSecurityInformation',['../classlib60870_1_1_c_s104_1_1_tls_security_information.html',1,'lib60870::CS104']]], + ['transparentfile_5',['TransparentFile',['../classlib60870_1_1_c_s101_1_1_transparent_file.html',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/close.svg b/doxygen/doxydoc.NET/html/search/close.svg new file mode 100644 index 0000000..337d6cc --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/doxygen/doxydoc.NET/html/search/enums_0.js b/doxygen/doxydoc.NET/html/search/enums_0.js new file mode 100644 index 0000000..6971cb3 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['acknowledgequalifier_0',['AcknowledgeQualifier',['../namespacelib60870_1_1_c_s101.html#af2506d56be1cd94a330f0f26d45ececc',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/enums_1.js b/doxygen/doxydoc.NET/html/search/enums_1.js new file mode 100644 index 0000000..71b2c84 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/enums_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['causeoftransmission_0',['CauseOfTransmission',['../namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cc',1,'lib60870::CS101']]], + ['clientconnectionevent_1',['ClientConnectionEvent',['../namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015d',1,'lib60870::CS104']]], + ['connectionevent_2',['ConnectionEvent',['../namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3',1,'lib60870::CS104']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/enums_2.js b/doxygen/doxydoc.NET/html/search/enums_2.js new file mode 100644 index 0000000..2ae0de2 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/enums_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['doublepointvalue_0',['DoublePointValue',['../namespacelib60870_1_1_c_s101.html#aff74ed75cebe96a815464d1ef856e3ad',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/enums_3.js b/doxygen/doxydoc.NET/html/search/enums_3.js new file mode 100644 index 0000000..6850829 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/enums_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['enqueuemode_0',['EnqueueMode',['../namespacelib60870_1_1_c_s104.html#ac35ab675c5aa217ded7ded419a5557df',1,'lib60870::CS104']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/enums_4.js b/doxygen/doxydoc.NET/html/search/enums_4.js new file mode 100644 index 0000000..2d1a06b --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/enums_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['fileerror_0',['FileError',['../namespacelib60870_1_1_c_s101.html#a69c8264ee40e2407023b71a5dfd09e0f',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/enums_5.js b/doxygen/doxydoc.NET/html/search/enums_5.js new file mode 100644 index 0000000..a1bdf1e --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/enums_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['lastsectionorsegmentqualifier_0',['LastSectionOrSegmentQualifier',['../namespacelib60870_1_1_c_s101.html#a7030b42dc57243516c07cb22a1992183',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/enums_6.js b/doxygen/doxydoc.NET/html/search/enums_6.js new file mode 100644 index 0000000..abc40e3 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/enums_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['nameoffile_0',['NameOfFile',['../namespacelib60870_1_1_c_s101.html#a5da0329a39b420cbbf859758eaceba93',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/enums_7.js b/doxygen/doxydoc.NET/html/search/enums_7.js new file mode 100644 index 0000000..6c7fecc --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/enums_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['selectandcallqualifier_0',['SelectAndCallQualifier',['../namespacelib60870_1_1_c_s101.html#ac5a919dfe39a648cc5ea40d072ca98a3',1,'lib60870::CS101']]], + ['servermode_1',['ServerMode',['../namespacelib60870_1_1_c_s104.html#a40215e8d03911ca6748ebfd78218d744',1,'lib60870::CS104']]], + ['stepcommandvalue_2',['StepCommandValue',['../namespacelib60870_1_1_c_s101.html#a8b8573d2c7289fab9db7a1ce5ff40286',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/enums_8.js b/doxygen/doxydoc.NET/html/search/enums_8.js new file mode 100644 index 0000000..f54e6a0 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/enums_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['typeid_0',['TypeID',['../namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bb',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/enumvalues_0.js b/doxygen/doxydoc.NET/html/search/enumvalues_0.js new file mode 100644 index 0000000..f6b3b01 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/enumvalues_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['active_0',['ACTIVE',['../namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015da18ff74f43da410c5529f7d6fca84f115',1,'lib60870::CS104']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/enumvalues_1.js b/doxygen/doxydoc.NET/html/search/enumvalues_1.js new file mode 100644 index 0000000..0dcb786 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/enumvalues_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['closed_0',['CLOSED',['../namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3a110ccf2f5d2ff4eda1fd1a494293467d',1,'lib60870.CS104.CLOSED'],['../namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015da110ccf2f5d2ff4eda1fd1a494293467d',1,'lib60870.CS104.CLOSED']]], + ['connect_5ffailed_1',['CONNECT_FAILED',['../namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3a4820f088c518fab18fe3d9ca70fa7f64',1,'lib60870::CS104']]], + ['connection_5fis_5fredundancy_5fgroup_2',['CONNECTION_IS_REDUNDANCY_GROUP',['../namespacelib60870_1_1_c_s104.html#a40215e8d03911ca6748ebfd78218d744a9d445a07d2444cf077d5b4a53243916a',1,'lib60870::CS104']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/enumvalues_2.js b/doxygen/doxydoc.NET/html/search/enumvalues_2.js new file mode 100644 index 0000000..a4a417d --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/enumvalues_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ignore_0',['IGNORE',['../namespacelib60870_1_1_c_s104.html#ac35ab675c5aa217ded7ded419a5557dfaa2e843feab94ef623fea888f07c28696',1,'lib60870::CS104']]], + ['inactive_1',['INACTIVE',['../namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015da6b273343c454f9c53dcfc9c4ccf171d2',1,'lib60870::CS104']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/enumvalues_3.js b/doxygen/doxydoc.NET/html/search/enumvalues_3.js new file mode 100644 index 0000000..d9c9cf3 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/enumvalues_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['m_5fme_5fna_5f1_0',['M_ME_NA_1',['../namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba6725773b3371787d2445c3dfad2d68fb',1,'lib60870::CS101']]], + ['multiple_5fredundancy_5fgroups_1',['MULTIPLE_REDUNDANCY_GROUPS',['../namespacelib60870_1_1_c_s104.html#a40215e8d03911ca6748ebfd78218d744a07a1fe963762929879e3998233ae368c',1,'lib60870::CS104']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/enumvalues_4.js b/doxygen/doxydoc.NET/html/search/enumvalues_4.js new file mode 100644 index 0000000..4fdded2 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/enumvalues_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['opened_0',['OPENED',['../namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3ae670c2408064392c6da7d0b721f7349c',1,'lib60870.CS104.OPENED'],['../namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015dae670c2408064392c6da7d0b721f7349c',1,'lib60870.CS104.OPENED']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/enumvalues_5.js b/doxygen/doxydoc.NET/html/search/enumvalues_5.js new file mode 100644 index 0000000..889ca99 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/enumvalues_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['remove_5foldest_0',['REMOVE_OLDEST',['../namespacelib60870_1_1_c_s104.html#ac35ab675c5aa217ded7ded419a5557dfac2bdd6ff983cc664116781c3a3dc0a83',1,'lib60870::CS104']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/enumvalues_6.js b/doxygen/doxydoc.NET/html/search/enumvalues_6.js new file mode 100644 index 0000000..fa4a965 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/enumvalues_6.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['single_5fredundancy_5fgroup_0',['SINGLE_REDUNDANCY_GROUP',['../namespacelib60870_1_1_c_s104.html#a40215e8d03911ca6748ebfd78218d744aa3afc5caf4e3e1af74862fca807d9ba0',1,'lib60870::CS104']]], + ['startdt_5fcon_5freceived_1',['STARTDT_CON_RECEIVED',['../namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3abd9bb95a16a48d296aa230827d9c966b',1,'lib60870::CS104']]], + ['stopdt_5fcon_5freceived_2',['STOPDT_CON_RECEIVED',['../namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3a98f20c03aaaaa367a27938cfb6b6d1da',1,'lib60870::CS104']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/enumvalues_7.js b/doxygen/doxydoc.NET/html/search/enumvalues_7.js new file mode 100644 index 0000000..5534cfb --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/enumvalues_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['throw_5fexception_0',['THROW_EXCEPTION',['../namespacelib60870_1_1_c_s104.html#ac35ab675c5aa217ded7ded419a5557dfa5c2e82fadad4dae10ff499facac4ab02',1,'lib60870::CS104']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/functions_0.js b/doxygen/doxydoc.NET/html/search/functions_0.js new file mode 100644 index 0000000..3b735d7 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/functions_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['addallowedclient_0',['AddAllowedClient',['../classlib60870_1_1_c_s104_1_1_redundancy_group.html#a971ee15ef8b50bf62d75e552dbc5a118',1,'lib60870.CS104.RedundancyGroup.AddAllowedClient(IPAddress ipAddress)'],['../classlib60870_1_1_c_s104_1_1_redundancy_group.html#a30f6faca907a9496271e7c43e12ba220',1,'lib60870.CS104.RedundancyGroup.AddAllowedClient(string ipString)']]], + ['addfile_1',['AddFile',['../classlib60870_1_1_c_s101_1_1_files_available.html#a72840ada81d664c1d63531ce022e57e5',1,'lib60870::CS101::FilesAvailable']]], + ['addinformationobject_2',['AddInformationObject',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a2cc4f6257884b76e9e9f6b40cd3037c2',1,'lib60870::CS101::ASDU']]], + ['addredundancygroup_3',['AddRedundancyGroup',['../classlib60870_1_1_c_s104_1_1_server.html#af970d8d63a4d220d54e213250e90eada',1,'lib60870::CS104::Server']]], + ['asdu_4',['ASDU',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a921d30b69cb8515973939210c0fd23b6',1,'lib60870::CS101::ASDU']]], + ['asduhandler_5',['ASDUHandler',['../namespacelib60870_1_1_c_s101.html#a494130feab85dbe337f659d383e4e8c5',1,'lib60870::CS101']]], + ['asdureceivedhandler_6',['ASDUReceivedHandler',['../namespacelib60870_1_1_c_s101.html#a95f9a71d670882525fbe3bf342cdf54e',1,'lib60870.CS101.ASDUReceivedHandler()'],['../namespacelib60870_1_1_c_s104.html#afb099e1be184222c607404d595cd6992',1,'lib60870.CS104.ASDUReceivedHandler()']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/functions_1.js b/doxygen/doxydoc.NET/html/search/functions_1.js new file mode 100644 index 0000000..a4a3b72 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/functions_1.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['certificatevalidationcallback_0',['CertificateValidationCallback',['../classlib60870_1_1_c_s104_1_1_client_connection.html#aa936b912c162118b6a9834030f924491',1,'lib60870::CS104::ClientConnection']]], + ['clocksynchronizationhandler_1',['ClockSynchronizationHandler',['../namespacelib60870_1_1_c_s101.html#a1d5c09e5cefc2e9711adad5ce978f0e7',1,'lib60870::CS101']]], + ['connect_2',['Connect',['../classlib60870_1_1_c_s104_1_1_connection.html#a2f21059cd28bf0a85f9ed4a666c6e96f',1,'lib60870::CS104::Connection']]], + ['connectasync_3',['ConnectAsync',['../classlib60870_1_1_c_s104_1_1_connection.html#af8aed177bd279389527cbfa8eede3ba6',1,'lib60870::CS104::Connection']]], + ['connection_4',['Connection',['../classlib60870_1_1_c_s104_1_1_connection.html#a6fe992399ec28f325cb953737e4006a0',1,'lib60870.CS104.Connection.Connection(string hostname, int tcpPort=2404)'],['../classlib60870_1_1_c_s104_1_1_connection.html#a3eae55571e202eb6736600f1e77ebe39',1,'lib60870.CS104.Connection.Connection(string hostname, APCIParameters apciParameters, ApplicationLayerParameters alParameters)'],['../classlib60870_1_1_c_s104_1_1_connection.html#a02efd3de4daa87455c94621c8a225eda',1,'lib60870.CS104.Connection.Connection(string hostname, int tcpPort, APCIParameters apciParameters, ApplicationLayerParameters alParameters)'],['../classlib60870_1_1_c_s104_1_1_connection.html#ab6fa4b93d7a17e5eb0eabb97e0e8360f',1,'lib60870.CS104.Connection.Connection(string hostname, TlsSecurityInformation tlsInfo, int tcpPort=19998)'],['../classlib60870_1_1_c_s104_1_1_connection.html#a54aa828ed44ffbc63fdd71d3860bf541',1,'lib60870.CS104.Connection.Connection(string hostname, int tcpPort, APCIParameters apciParameters, ApplicationLayerParameters alParameters, TlsSecurityInformation tlsInfo)']]], + ['connectionhandler_5',['ConnectionHandler',['../namespacelib60870_1_1_c_s104.html#aa16788ce99f06cdcca23787226650a74',1,'lib60870::CS104']]], + ['connectionrequesthandler_6',['ConnectionRequestHandler',['../namespacelib60870_1_1_c_s104.html#ac8c6f665636c4cd4938333429bc9b03f',1,'lib60870::CS104']]], + ['counterinterrogationhandler_7',['CounterInterrogationHandler',['../namespacelib60870_1_1_c_s101.html#a027c45142e293bb4601aa52dd83c5d15',1,'lib60870::CS101']]], + ['cs101slave_8',['CS101Slave',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a2e94b7ad7d65489e0dbe94fb76d79420',1,'lib60870.CS101.CS101Slave.CS101Slave(SerialPort port, LinkLayerParameters parameters=null)'],['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a7d63775d354c7e0b9a3b50927ed74134',1,'lib60870.CS101.CS101Slave.CS101Slave(Stream serialStream, LinkLayerParameters parameters=null)']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/functions_2.js b/doxygen/doxydoc.NET/html/search/functions_2.js new file mode 100644 index 0000000..6a95d33 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/functions_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['decode_0',['Decode',['../interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html#ad705ef8ea182c4977221c7b3cc23d632',1,'lib60870::CS101::IPrivateIOFactory']]], + ['delayacquisitionhandler_1',['DelayAcquisitionHandler',['../namespacelib60870_1_1_c_s101.html#ad94b7a69be5b593e6e694b884206d184',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/functions_3.js b/doxygen/doxydoc.NET/html/search/functions_3.js new file mode 100644 index 0000000..4e10a32 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/functions_3.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['enqueueasdu_0',['EnqueueASDU',['../classlib60870_1_1_c_s104_1_1_redundancy_group.html#af72be4629377a6c78f4f9733f4e251b4',1,'lib60870.CS104.RedundancyGroup.EnqueueASDU()'],['../classlib60870_1_1_c_s104_1_1_server.html#aa6f1a77ab87c08ca663ab88dcf1b9dbe',1,'lib60870.CS104.Server.EnqueueASDU()']]], + ['enqueueuserdataclass1_1',['EnqueueUserDataClass1',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a5a8573dbafd2ce027d9d7603b3347211',1,'lib60870::CS101::CS101Slave']]], + ['enqueueuserdataclass2_2',['EnqueueUserDataClass2',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a605411588ecb89ab825520cac38d547e',1,'lib60870::CS101::CS101Slave']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/functions_4.js b/doxygen/doxydoc.NET/html/search/functions_4.js new file mode 100644 index 0000000..9661ebd --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/functions_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['fileready_0',['FileReady',['../classlib60870_1_1_c_s101_1_1_file_ready.html#a109625172b98152e626a426c260295e6',1,'lib60870::CS101::FileReady']]], + ['filereadyhandler_1',['FileReadyHandler',['../namespacelib60870_1_1_c_s101.html#a0c7346f0e183f14b92c4fc6c373678e9',1,'lib60870::CS101']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/functions_5.js b/doxygen/doxydoc.NET/html/search/functions_5.js new file mode 100644 index 0000000..43ccb3e --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/functions_5.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['getapciparameters_0',['GetAPCIParameters',['../classlib60870_1_1_c_s104_1_1_server.html#a859b8ac2c4b9cd87efc490173c8cd38a',1,'lib60870::CS104::Server']]], + ['getapplicationlayerparameters_1',['GetApplicationLayerParameters',['../classlib60870_1_1_c_s101_1_1_master.html#ac8f077926245f7194b3aba089a7ce520',1,'lib60870.CS101.Master.GetApplicationLayerParameters()'],['../classlib60870_1_1_c_s104_1_1_client_connection.html#a92d801095c3038a96b26093e7d38628a',1,'lib60870.CS104.ClientConnection.GetApplicationLayerParameters()'],['../classlib60870_1_1_c_s104_1_1_server.html#a21f35d1f590dae3b557c413e2f05d01d',1,'lib60870.CS104.Server.GetApplicationLayerParameters()']]], + ['getavailablefiles_2',['GetAvailableFiles',['../classlib60870_1_1_c_s101_1_1_slave.html#a5e85ada660492fecd182e654a75c8b42',1,'lib60870::CS101::Slave']]], + ['getca_3',['GetCA',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a8bd0b5d9ca9019f7f8dab6c43a5d7945',1,'lib60870.CS101.IFileProvider.GetCA()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#a7f9d7004443cb8285f67ef8362544313',1,'lib60870.CS101.TransparentFile.GetCA()']]], + ['getdatetime_4',['GetDateTime',['../classlib60870_1_1_c_p32_time2a.html#a57711ec4af4479936d10b2bf6df355a4',1,'lib60870.CP32Time2a.GetDateTime()'],['../classlib60870_1_1_c_p56_time2a.html#a83f9707e94051e90f0ab9b2f5dc1b3df',1,'lib60870.CP56Time2a.GetDateTime()']]], + ['getdirectory_5',['GetDirectory',['../classlib60870_1_1_c_s104_1_1_connection.html#a131c3dd3059b67c6ec0b2351c5e1e50c',1,'lib60870::CS104::Connection']]], + ['getelement_6',['GetElement',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a3d57c6dab7100c5933373231c459d31f',1,'lib60870.CS101.ASDU.GetElement(int index, PrivateInformationObjectTypes privateObjectTypes)'],['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a752cdac37f9f37c859eb4de5bf01c746',1,'lib60870.CS101.ASDU.GetElement(int index, IPrivateIOFactory ioFactory)'],['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a163ff2a748b560ecd08692a00ce83d57',1,'lib60870.CS101.ASDU.GetElement(int index)']]], + ['getencodedsize_7',['GetEncodedSize',['../classlib60870_1_1_c_s101_1_1_information_object.html#a2e5cb4ff206963db465c10d06c6e1954',1,'lib60870.CS101.InformationObject.GetEncodedSize()'],['../interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html#a26a0623584b57db1a35b9e8fe1b7e02c',1,'lib60870.CS101.IPrivateIOFactory.GetEncodedSize()']]], + ['getfile_8',['GetFile',['../classlib60870_1_1_c_s101_1_1_master.html#a67284f6ec618c943766040e3877acc7b',1,'lib60870.CS101.Master.GetFile()'],['../classlib60870_1_1_c_s104_1_1_connection.html#adca074f2aa74aae897fbfc85a4bbe6d5',1,'lib60870.CS104.Connection.GetFile(int ca, int ioa, NameOfFile nof, IFileReceiver receiver)'],['../classlib60870_1_1_c_s104_1_1_connection.html#a25c9f162dfde01896bb30e8f61092183',1,'lib60870.CS104.Connection.GetFile(int ca, int ioa, NameOfFile nof, IFileReceiver receiver, int timeout)']]], + ['getfiles_9',['GetFiles',['../classlib60870_1_1_c_s101_1_1_files_available.html#ad07db9fbd1ca2f1643991d7b446bf7c4',1,'lib60870::CS101::FilesAvailable']]], + ['getfilesize_10',['GetFileSize',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a6b9b192c358b22d132893c90a636daf2',1,'lib60870.CS101.IFileProvider.GetFileSize()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#a7eaa164b404cd4f32302c7f044b774ab',1,'lib60870.CS101.TransparentFile.GetFileSize()']]], + ['getioa_11',['GetIOA',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a68c3470850586f634e731dd250c957da',1,'lib60870.CS101.IFileProvider.GetIOA()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#a955484a99eb32c9a8c37a76959add633',1,'lib60870.CS101.TransparentFile.GetIOA()']]], + ['getlibraryversionstring_12',['GetLibraryVersionString',['../classlib60870_1_1_library_common.html#a3de9d184ceeaeaa3ad95bdfea5f0d902',1,'lib60870::LibraryCommon']]], + ['getmilliseconds_13',['GetMilliseconds',['../classlib60870_1_1_c_p24_time2a.html#afa47b9c056d5787d0368779f462fd2ff',1,'lib60870::CP24Time2a']]], + ['getnameoffile_14',['GetNameOfFile',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a9aa9aeb003e1e5726a5b634cfa1c5548',1,'lib60870.CS101.IFileProvider.GetNameOfFile()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#a069c64d7b35226bb030fc5e0dfcbd5bd',1,'lib60870.CS101.TransparentFile.GetNameOfFile()']]], + ['getsectionsize_15',['GetSectionSize',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a953c9bc0b2dd47ba192649ce3b954318',1,'lib60870.CS101.IFileProvider.GetSectionSize()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#a4a53ae94f1bc4d70ebac30d1af9ba596',1,'lib60870.CS101.TransparentFile.GetSectionSize()']]], + ['getsegmentdata_16',['GetSegmentData',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a238a851573b79de09af78b4f93deb7f2',1,'lib60870.CS101.IFileProvider.GetSegmentData()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#adefa9e2224dba9bb842481db21e94216',1,'lib60870.CS101.TransparentFile.GetSegmentData()']]], + ['getstatistics_17',['GetStatistics',['../classlib60870_1_1_c_s104_1_1_connection.html#a5867e9bda4cf3d6647ebf50603e1be17',1,'lib60870::CS104::Connection']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/functions_6.js b/doxygen/doxydoc.NET/html/search/functions_6.js new file mode 100644 index 0000000..c4f9915 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/functions_6.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['interrogationhandler_0',['InterrogationHandler',['../namespacelib60870_1_1_c_s101.html#a94c2e7c6e902d29db88c7a1d512099ed',1,'lib60870::CS101']]], + ['isrunning_1',['IsRunning',['../classlib60870_1_1_c_s104_1_1_server.html#a8d16b6e5d54bee55912a00c0cb3b28fc',1,'lib60870::CS104::Server']]], + ['istransmitbufferfull_2',['IsTransmitBufferFull',['../classlib60870_1_1_c_s104_1_1_connection.html#a079f96f5d2be9416e9c0c4518542eb07',1,'lib60870::CS104::Connection']]], + ['isuserdataclass1queuefull_3',['IsUserDataClass1QueueFull',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a9903e812bc9779389eb09e855ae3dd74',1,'lib60870::CS101::CS101Slave']]], + ['isuserdataclass2queuefull_4',['IsUserDataClass2QueueFull',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a24cdca7a10754390b15ce735f848cdb3',1,'lib60870::CS101::CS101Slave']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/functions_7.js b/doxygen/doxydoc.NET/html/search/functions_7.js new file mode 100644 index 0000000..d39551e --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/functions_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['linklayerstatechanged_0',['LinkLayerStateChanged',['../namespacelib60870_1_1linklayer.html#aeca494b2e7a508585564b223d2f7851b',1,'lib60870::linklayer']]], + ['localcertificateselectioncallback_1',['LocalCertificateSelectionCallback',['../classlib60870_1_1_c_s104_1_1_connection.html#ab773a1837cbbd532d5406f05b9d3cf3f',1,'lib60870::CS104::Connection']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/functions_8.js b/doxygen/doxydoc.NET/html/search/functions_8.js new file mode 100644 index 0000000..b3bb742 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/functions_8.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['masterconnection_5fhasunconfirmedmessages_0',['MasterConnection_hasUnconfirmedMessages',['../classlib60870_1_1_c_s104_1_1_client_connection.html#a16acd0a66071c7d1f4d111fafd7a2421',1,'lib60870::CS104::ClientConnection']]], + ['measuredvaluescaled_1',['MeasuredValueScaled',['../classlib60870_1_1_c_s101_1_1_measured_value_scaled.html#a05819e48801faf682acea7f5c53d93e7',1,'lib60870::CS101::MeasuredValueScaled']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/functions_9.js b/doxygen/doxydoc.NET/html/search/functions_9.js new file mode 100644 index 0000000..ae44ec0 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/functions_9.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['rawmessagehandler_0',['RawMessageHandler',['../namespacelib60870.html#a059755b125d35287c474551f4ffc619f',1,'lib60870']]], + ['readhandler_1',['ReadHandler',['../namespacelib60870_1_1_c_s101.html#a9230fe256069619a54c2c428acc32e06',1,'lib60870::CS101']]], + ['receivemessageloop_2',['ReceiveMessageLoop',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a19871be23f60399362713e78b8c07404',1,'lib60870::CS101::CS101Slave']]], + ['redundancygroup_3',['RedundancyGroup',['../classlib60870_1_1_c_s104_1_1_redundancy_group.html#a3bfc0c71f3919a451288a9b2581e6560',1,'lib60870::CS104::RedundancyGroup']]], + ['removefile_4',['RemoveFile',['../classlib60870_1_1_c_s101_1_1_files_available.html#a894040bf5b71a47feaa4eab80cf7a0d9',1,'lib60870::CS101::FilesAvailable']]], + ['resetprocesshandler_5',['ResetProcessHandler',['../namespacelib60870_1_1_c_s101.html#ad784b6cb8b22c0417207232c8d98e2db',1,'lib60870::CS101']]], + ['run_6',['Run',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#a4f258e8494717432a01be4ee1fcb5063',1,'lib60870.CS101.CS101Master.Run()'],['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#adeb6feabfe4b01f17bc863ea0281d79c',1,'lib60870.CS101.CS101Slave.Run()']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/functions_a.js b/doxygen/doxydoc.NET/html/search/functions_a.js new file mode 100644 index 0000000..3bb6b25 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/functions_a.js @@ -0,0 +1,44 @@ +var searchData= +[ + ['sendact_5fcon_0',['SendACT_CON',['../classlib60870_1_1_c_s104_1_1_client_connection.html#a677c04ff5484b981e8464af8d9f86540',1,'lib60870::CS104::ClientConnection']]], + ['sendact_5fterm_1',['SendACT_TERM',['../classlib60870_1_1_c_s104_1_1_client_connection.html#aa5d85670797c2046051a4a10071fe611',1,'lib60870::CS104::ClientConnection']]], + ['sendasdu_2',['SendASDU',['../classlib60870_1_1_c_s101_1_1_master.html#a6917b74951e51d7e80bd0ae352bd6147',1,'lib60870.CS101.Master.SendASDU()'],['../classlib60870_1_1_c_s104_1_1_client_connection.html#a92362655a693e3081af86a00a24955ef',1,'lib60870.CS104.ClientConnection.SendASDU()'],['../classlib60870_1_1_c_s104_1_1_connection.html#ac8604cef7b2781cb63a16de0bff9a308',1,'lib60870.CS104.Connection.SendASDU()']]], + ['sendclocksynccommand_3',['SendClockSyncCommand',['../classlib60870_1_1_c_s101_1_1_master.html#a71ae908a23d89528f78f061fa466104f',1,'lib60870.CS101.Master.SendClockSyncCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#aa91efa113abc4e69578a487a2a934871',1,'lib60870.CS104.Connection.SendClockSyncCommand()']]], + ['sendcontrolcommand_4',['SendControlCommand',['../classlib60870_1_1_c_s101_1_1_master.html#a83a31edf0e9e4360e4dc613735f851d5',1,'lib60870.CS101.Master.SendControlCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a5f1458066ec9a11a12ff68c7416071fa',1,'lib60870.CS104.Connection.SendControlCommand()']]], + ['sendcounterinterrogationcommand_5',['SendCounterInterrogationCommand',['../classlib60870_1_1_c_s101_1_1_master.html#a6b9a6af0acad8fa03468630363eb99a8',1,'lib60870.CS101.Master.SendCounterInterrogationCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#ae8629df4fb0e9cf3868728e52ec995ca',1,'lib60870.CS104.Connection.SendCounterInterrogationCommand()']]], + ['senddelayacquisitioncommand_6',['SendDelayAcquisitionCommand',['../classlib60870_1_1_c_s101_1_1_master.html#afbc769788f9720e9a3d63268500b8710',1,'lib60870.CS101.Master.SendDelayAcquisitionCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#af178dab629740182d7c7e07eb32a4117',1,'lib60870.CS104.Connection.SendDelayAcquisitionCommand()']]], + ['sendfile_7',['SendFile',['../classlib60870_1_1_c_s101_1_1_master.html#ad988de86e0a0ed0d052dc599b3fc98f3',1,'lib60870.CS101.Master.SendFile()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a889e1aef3301cb272286a1279ae6caa3',1,'lib60870.CS104.Connection.SendFile()']]], + ['sendinterrogationcommand_8',['SendInterrogationCommand',['../classlib60870_1_1_c_s101_1_1_master.html#ab25cd6997967e5a60943f391c2b2ddc0',1,'lib60870.CS101.Master.SendInterrogationCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a25c57d614b315bad886edbaead69bd3d',1,'lib60870.CS104.Connection.SendInterrogationCommand()']]], + ['sendlinklayertestfunction_9',['SendLinkLayerTestFunction',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a1ee5095020096c7958e2230dbd273100',1,'lib60870::CS101::CS101Slave']]], + ['sendreadcommand_10',['SendReadCommand',['../classlib60870_1_1_c_s101_1_1_master.html#a52bcf5912b59e4ac44061730c3702eb4',1,'lib60870.CS101.Master.SendReadCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#aeaa8a8dbf8e2449d0222837b9d5ae3d8',1,'lib60870.CS104.Connection.SendReadCommand()']]], + ['sendresetprocesscommand_11',['SendResetProcessCommand',['../classlib60870_1_1_c_s101_1_1_master.html#a6440a2d388ca610f80190dda3c11b623',1,'lib60870.CS101.Master.SendResetProcessCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#ab615b3065cf5248d9b9951c4e178fa80',1,'lib60870.CS104.Connection.SendResetProcessCommand(CauseOfTransmission cot, int ca, byte qrp)']]], + ['sendstartdt_12',['SendStartDT',['../classlib60870_1_1_c_s104_1_1_connection.html#a57d40edfe14bfe66f832a7647e3173ae',1,'lib60870::CS104::Connection']]], + ['sendstartdt_5fcon_13',['SendStartDT_CON',['../classlib60870_1_1_c_s104_1_1_connection.html#a65d8586e819b9c537b2461611b0bb9ca',1,'lib60870::CS104::Connection']]], + ['sendstopdt_14',['SendStopDT',['../classlib60870_1_1_c_s104_1_1_connection.html#a2510773333d6aaea354c5730f2bc139f',1,'lib60870::CS104::Connection']]], + ['sendstopdt_5fcon_15',['SendStopDT_CON',['../classlib60870_1_1_c_s104_1_1_connection.html#a6723565d01d05539a320810217955743',1,'lib60870::CS104::Connection']]], + ['sendtestcommand_16',['SendTestCommand',['../classlib60870_1_1_c_s101_1_1_master.html#a77d37b1e27cdd4eec1a314f3e2a09432',1,'lib60870.CS101.Master.SendTestCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a310efefcea197178942abe509b04f463',1,'lib60870.CS104.Connection.SendTestCommand()']]], + ['sendtestcommandwithcp56time2a_17',['SendTestCommandWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_master.html#a97c6f3b896c0588761bb1b113ef7f7be',1,'lib60870.CS101.Master.SendTestCommandWithCP56Time2a()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a3d38dafcc825eb9bba7258c2525a56ad',1,'lib60870.CS104.Connection.SendTestCommandWithCP56Time2a(int ca, ushort tsc, CP56Time2a time)']]], + ['sendtestfr_5fact_18',['SendTestFR_ACT',['../classlib60870_1_1_c_s104_1_1_connection.html#afe81514340488a718a49706233816052',1,'lib60870::CS104::Connection']]], + ['sendtestfr_5fcon_19',['SendTestFR_CON',['../classlib60870_1_1_c_s104_1_1_connection.html#a876db462369040f272cddd144833ab56',1,'lib60870::CS104::Connection']]], + ['server_20',['Server',['../classlib60870_1_1_c_s104_1_1_server.html#aae44fa0f507ea4b8d343686a9345e419',1,'lib60870.CS104.Server.Server()'],['../classlib60870_1_1_c_s104_1_1_server.html#a12b5bdf509e0b569295b8821c016770b',1,'lib60870.CS104.Server.Server(TlsSecurityInformation securityInfo)'],['../classlib60870_1_1_c_s104_1_1_server.html#a4b25619314b9e2586d21d83f3ed9fcd0',1,'lib60870.CS104.Server.Server(APCIParameters apciParameters, ApplicationLayerParameters alParameters)'],['../classlib60870_1_1_c_s104_1_1_server.html#a4a25393ccd928dc4abbb13c14e3579c2',1,'lib60870.CS104.Server.Server(APCIParameters apciParameters, ApplicationLayerParameters alParameters, TlsSecurityInformation securityInfo)']]], + ['setasduhandler_21',['SetASDUHandler',['../classlib60870_1_1_c_s101_1_1_slave.html#a5bde494544e568d0d9c25b43449eb8ee',1,'lib60870::CS101::Slave']]], + ['setasdureceivedhandler_22',['SetASDUReceivedHandler',['../classlib60870_1_1_c_s104_1_1_connection.html#a7fd6fb3ca802d91197f1927f2e4f8712',1,'lib60870::CS104::Connection']]], + ['setclocksynchronizationhandler_23',['SetClockSynchronizationHandler',['../classlib60870_1_1_c_s101_1_1_slave.html#a83b600bacb0829048c432686991db8a7',1,'lib60870::CS101::Slave']]], + ['setconnectioneventhandler_24',['SetConnectionEventHandler',['../classlib60870_1_1_c_s104_1_1_server.html#afa4ae496c2260bc6b501a60259c35282',1,'lib60870::CS104::Server']]], + ['setconnectionhandler_25',['SetConnectionHandler',['../classlib60870_1_1_c_s104_1_1_connection.html#afa545f647708d76bc23b3e5cbad1ac46',1,'lib60870::CS104::Connection']]], + ['setconnectionrequesthandler_26',['SetConnectionRequestHandler',['../classlib60870_1_1_c_s104_1_1_server.html#a8c3dbeea77158bb5014d9739bb8f1116',1,'lib60870::CS104::Server']]], + ['setconnecttimeout_27',['SetConnectTimeout',['../classlib60870_1_1_c_s104_1_1_connection.html#af5de8a91a2f77bfa69421b3e3da9276e',1,'lib60870::CS104::Connection']]], + ['setcounterinterrogationhandler_28',['SetCounterInterrogationHandler',['../classlib60870_1_1_c_s101_1_1_slave.html#ad6e8b2878a13fea3b23b0b41b4da2983',1,'lib60870::CS101::Slave']]], + ['setfilereadyhandler_29',['SetFileReadyHandler',['../classlib60870_1_1_c_s101_1_1_slave.html#a3d25c95061010fa26c02cca5de0ae3cd',1,'lib60870::CS101::Slave']]], + ['setinterrogationhandler_30',['SetInterrogationHandler',['../classlib60870_1_1_c_s101_1_1_slave.html#af5871de4b26756b7b6f88e7acdc96e84',1,'lib60870::CS101::Slave']]], + ['setlocaladdress_31',['SetLocalAddress',['../classlib60870_1_1_c_s104_1_1_server.html#af7db8efa36f1bfc559ac96308a907d07',1,'lib60870.CS104.Server.SetLocalAddress()'],['../classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.html#a52cf94c390fdb9de1da505a259dc85a1',1,'lib60870.linklayer.TcpServerVirtualSerialPort.SetLocalAddress()']]], + ['setlocalport_32',['SetLocalPort',['../classlib60870_1_1_c_s104_1_1_server.html#aa3ddaa0a4c43ca80f35f523d84347753',1,'lib60870::CS104::Server']]], + ['setreadhandler_33',['SetReadHandler',['../classlib60870_1_1_c_s101_1_1_slave.html#a7f0490bec09dbf3a8fb1e1e8e21503c0',1,'lib60870::CS101::Slave']]], + ['setreceivedrawmessagehandler_34',['SetReceivedRawMessageHandler',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a01bd8b909386de3b9426d5c953a716e3',1,'lib60870.CS101.CS101Slave.SetReceivedRawMessageHandler()'],['../classlib60870_1_1_c_s101_1_1_master.html#a43ddedf33710bf27df6f10265787d359',1,'lib60870.CS101.Master.SetReceivedRawMessageHandler()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a54fa6f1012457a6e0f492441cc4bfa23',1,'lib60870.CS104.Connection.SetReceivedRawMessageHandler()']]], + ['setsentrawmessagehandler_35',['SetSentRawMessageHandler',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a0fa4e121ca94fc5a017587c1382d7f42',1,'lib60870.CS101.CS101Slave.SetSentRawMessageHandler()'],['../classlib60870_1_1_c_s101_1_1_master.html#ac850d2199ac83075bfe52648eec57993',1,'lib60870.CS101.Master.SetSentRawMessageHandler()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a787c8ff4943b9991328550f69807ef6e',1,'lib60870.CS104.Connection.SetSentRawMessageHandler()']]], + ['settimeouts_36',['SetTimeouts',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#a1a60eeb2565d2111ecea43db4e4b1909',1,'lib60870::CS101::CS101Master']]], + ['settlssecurity_37',['SetTlsSecurity',['../classlib60870_1_1_c_s104_1_1_connection.html#a33eae01473eb5dc6545a74601b3d9a85',1,'lib60870::CS104::Connection']]], + ['setuserdataqueuesizes_38',['SetUserDataQueueSizes',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a6c28db4c5b92dbc3b67e25d86c5a19df',1,'lib60870::CS101::CS101Slave']]], + ['start_39',['Start',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#a5bcaaddeb16ce3472d5567d430cf304d',1,'lib60870.CS101.CS101Master.Start()'],['../classlib60870_1_1_c_s104_1_1_server.html#af8d37c78f23fafbb74091b7d3d0ed684',1,'lib60870.CS104.Server.Start()'],['../classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html#a1417a91389e864dd32cff7e80def1021',1,'lib60870.linklayer.TcpClientVirtualSerialPort.Start()']]], + ['stop_40',['Stop',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#a4b4ca2b56ec115d9b5f1eba13ff5c22a',1,'lib60870.CS101.CS101Master.Stop()'],['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a6502368270e7b7efa3a59778d58bda3a',1,'lib60870.CS101.CS101Slave.Stop()'],['../classlib60870_1_1_c_s104_1_1_server.html#a07fc33e78e4b8d156e1bbe08170c62cf',1,'lib60870.CS104.Server.Stop()'],['../classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html#aba1035cd8d8a91290dd7d19ec48bfb34',1,'lib60870.linklayer.TcpClientVirtualSerialPort.Stop()']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/functions_b.js b/doxygen/doxydoc.NET/html/search/functions_b.js new file mode 100644 index 0000000..7d95a96 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/functions_b.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['tcpclientvirtualserialport_0',['TcpClientVirtualSerialPort',['../classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html#a38baef0d15205486d0f5d07106473836',1,'lib60870::linklayer::TcpClientVirtualSerialPort']]], + ['tcpconnectioneventhandler_1',['TcpConnectionEventHandler',['../namespacelib60870_1_1linklayer.html#a4bb957c442dc029dac0241ceef925e65',1,'lib60870::linklayer']]], + ['transfercomplete_2',['TransferComplete',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#ada2d36e95fe8caf9a22d04fcd77b6a8f',1,'lib60870.CS101.IFileProvider.TransferComplete()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#a533ea7bd0c80d98d5ea48748c14ee376',1,'lib60870.CS101.TransparentFile.TransferComplete()']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/functions_c.js b/doxygen/doxydoc.NET/html/search/functions_c.js new file mode 100644 index 0000000..1be07f4 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/functions_c.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['useslaveaddress_0',['UseSlaveAddress',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#a9923e8174758fdfa15198fcbde7502de',1,'lib60870::CS101::CS101Master']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/mag.svg b/doxygen/doxydoc.NET/html/search/mag.svg new file mode 100644 index 0000000..ffb6cf0 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doxygen/doxydoc.NET/html/search/mag_d.svg b/doxygen/doxydoc.NET/html/search/mag_d.svg new file mode 100644 index 0000000..4122773 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doxygen/doxydoc.NET/html/search/mag_sel.svg b/doxygen/doxydoc.NET/html/search/mag_sel.svg new file mode 100644 index 0000000..553dba8 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doxygen/doxydoc.NET/html/search/mag_seld.svg b/doxygen/doxydoc.NET/html/search/mag_seld.svg new file mode 100644 index 0000000..c906f84 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doxygen/doxydoc.NET/html/search/namespaces_0.js b/doxygen/doxydoc.NET/html/search/namespaces_0.js new file mode 100644 index 0000000..1b59335 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/namespaces_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['lib60870_0',['lib60870',['../namespacelib60870.html',1,'']]], + ['lib60870_3a_3acs101_1',['CS101',['../namespacelib60870_1_1_c_s101.html',1,'lib60870']]], + ['lib60870_3a_3acs104_2',['CS104',['../namespacelib60870_1_1_c_s104.html',1,'lib60870']]], + ['lib60870_3a_3alinklayer_3',['linklayer',['../namespacelib60870_1_1linklayer.html',1,'lib60870']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/pages_0.js b/doxygen/doxydoc.NET/html/search/pages_0.js new file mode 100644 index 0000000..0eff422 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['0_0',['README lib60870.NET v2.3.0',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html',1,'']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/pages_1.js b/doxygen/doxydoc.NET/html/search/pages_1.js new file mode 100644 index 0000000..a6774a2 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['3_200_0',['README lib60870.NET v2.3.0',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html',1,'']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/pages_2.js b/doxygen/doxydoc.NET/html/search/pages_2.js new file mode 100644 index 0000000..80f0821 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['lib60870_20net_20v2_203_200_0',['README lib60870.NET v2.3.0',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html',1,'']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/pages_3.js b/doxygen/doxydoc.NET/html/search/pages_3.js new file mode 100644 index 0000000..4357da0 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['net_20v2_203_200_0',['README lib60870.NET v2.3.0',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html',1,'']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/pages_4.js b/doxygen/doxydoc.NET/html/search/pages_4.js new file mode 100644 index 0000000..cce4970 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/pages_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['readme_20lib60870_20net_20v2_203_200_0',['README lib60870.NET v2.3.0',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html',1,'']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/pages_5.js b/doxygen/doxydoc.NET/html/search/pages_5.js new file mode 100644 index 0000000..2e7c1fa --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/pages_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['v2_203_200_0',['README lib60870.NET v2.3.0',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html',1,'']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/properties_0.js b/doxygen/doxydoc.NET/html/search/properties_0.js new file mode 100644 index 0000000..bc9f4cb --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/properties_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['ackqualifier_0',['AckQualifier',['../classlib60870_1_1_c_s101_1_1_file_a_c_k.html#a9f6b95cc90ebe3515dff6af81c294d81',1,'lib60870::CS101::FileACK']]], + ['addresslength_1',['AddressLength',['../classlib60870_1_1linklayer_1_1_link_layer_parameters.html#abfa30c4ae394e96224933817b768d248',1,'lib60870::linklayer::LinkLayerParameters']]], + ['adjusted_2',['Adjusted',['../classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#aacf2720e880dbb0f70ea212c59c8e31f',1,'lib60870::CS101::BinaryCounterReading']]], + ['allowonlyspecificcertificates_3',['AllowOnlySpecificCertificates',['../classlib60870_1_1_c_s104_1_1_tls_security_information.html#aecf70336635c0bfe0fe713a5e427fa3e',1,'lib60870::CS104::TlsSecurityInformation']]], + ['autostart_4',['Autostart',['../classlib60870_1_1_c_s104_1_1_connection.html#aa941946c92bfe52f71c137c3fbf6d601',1,'lib60870::CS104::Connection']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/properties_1.js b/doxygen/doxydoc.NET/html/search/properties_1.js new file mode 100644 index 0000000..8b42780 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/properties_1.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['ca_0',['Ca',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a5d217b9cc0ecf22e127aa25c89e8a2f1',1,'lib60870::CS101::ASDU']]], + ['carry_1',['Carry',['../classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#a8d73e781be2f98f00d09f91e0c3d774a',1,'lib60870::CS101::BinaryCounterReading']]], + ['certificatevalidationcallback_2',['CertificateValidationCallback',['../classlib60870_1_1_c_s104_1_1_tls_security_information.html#ab90e1e052fa15e1b211109d30529b491',1,'lib60870::CS104::TlsSecurityInformation']]], + ['chainvalidation_3',['ChainValidation',['../classlib60870_1_1_c_s104_1_1_tls_security_information.html#a2b367122104e8ac1469d6240c427fe86',1,'lib60870::CS104::TlsSecurityInformation']]], + ['chs_4',['CHS',['../classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html#af2302361352eb1447b4bfb6541772c50',1,'lib60870::CS101::FileLastSegmentOrSection']]], + ['cl1_5',['CL1',['../classlib60870_1_1_c_s101_1_1_output_circuit_info.html#ac474a5e41cac7e82a2225cb27792fcf7',1,'lib60870::CS101::OutputCircuitInfo']]], + ['cl2_6',['CL2',['../classlib60870_1_1_c_s101_1_1_output_circuit_info.html#a6507ca6be64921d3931911033d496661',1,'lib60870::CS101::OutputCircuitInfo']]], + ['cl3_7',['CL3',['../classlib60870_1_1_c_s101_1_1_output_circuit_info.html#ad9d84ee2a4315546c531867e4d9a5e28',1,'lib60870::CS101::OutputCircuitInfo']]], + ['coi_8',['COI',['../classlib60870_1_1_c_s101_1_1_end_of_initialization.html#ad48e8ec133c8bf5ed7f389063492d67b',1,'lib60870::CS101::EndOfInitialization']]], + ['connected_9',['Connected',['../classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html#a8e6479066b29f09067340b7fc1b29cbc',1,'lib60870::linklayer::TcpClientVirtualSerialPort']]], + ['connecttimeout_10',['ConnectTimeout',['../classlib60870_1_1_c_s104_1_1_connection.html#a5bc80935ee36a7bcca2c4807f0abeed4',1,'lib60870::CS104::Connection']]], + ['cot_11',['Cot',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a68dd2e6df66c5c4298a357ac5da8fed1',1,'lib60870::CS101::ASDU']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/properties_10.js b/doxygen/doxydoc.NET/html/search/properties_10.js new file mode 100644 index 0000000..01a289c --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/properties_10.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['scq_0',['SCQ',['../classlib60870_1_1_c_s101_1_1_file_call_or_select.html#a6acae49243536a7db32643ffccdc17c8',1,'lib60870::CS101::FileCallOrSelect']]], + ['second_1',['Second',['../classlib60870_1_1_c_p24_time2a.html#a44e08d428c8cbb76a84836b2ed19ae60',1,'lib60870.CP24Time2a.Second'],['../classlib60870_1_1_c_p32_time2a.html#ae0c845c0ce9555c5ea2dd8514b6222dd',1,'lib60870.CP32Time2a.Second'],['../classlib60870_1_1_c_p56_time2a.html#a02627aa0a76a5e3bfd4007a07f042a2c',1,'lib60870.CP56Time2a.Second']]], + ['select_2',['Select',['../classlib60870_1_1_c_s101_1_1_single_command.html#a1829a95a868ed80cae41cc66f8d23867',1,'lib60870::CS101::SingleCommand']]], + ['sendsequencenumber_3',['SendSequenceNumber',['../classlib60870_1_1_c_s104_1_1_connection.html#a38bffb6d3d17033d40383529aa69c105',1,'lib60870::CS104::Connection']]], + ['sentmsgcounter_4',['SentMsgCounter',['../classlib60870_1_1_c_s104_1_1_connection_statistics.html#ad04c56b6a2a9520d5296c56d12f2b5b0',1,'lib60870::CS104::ConnectionStatistics']]], + ['sequencenumber_5',['SequenceNumber',['../classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#ae04563ca55ecc0df58e80263d50db184',1,'lib60870::CS101::BinaryCounterReading']]], + ['servermode_6',['ServerMode',['../classlib60870_1_1_c_s104_1_1_server.html#a9c05718964db1a69771955715585c4da',1,'lib60870::CS104::Server']]], + ['sie_7',['SIE',['../classlib60870_1_1_c_s101_1_1_start_event.html#a63a1bca793fe829680fc745c8b537b1d',1,'lib60870::CS101::StartEvent']]], + ['sl1_8',['SL1',['../classlib60870_1_1_c_s101_1_1_start_event.html#a53c47cb469138b00f2d266da9ee91338',1,'lib60870::CS101::StartEvent']]], + ['sl2_9',['SL2',['../classlib60870_1_1_c_s101_1_1_start_event.html#a43c8205b9e5b018a89c57658d2fc7443',1,'lib60870::CS101::StartEvent']]], + ['sl3_10',['SL3',['../classlib60870_1_1_c_s101_1_1_start_event.html#a686791b47a50ff83badd20384b00a604',1,'lib60870::CS101::StartEvent']]], + ['slaveaddress_11',['SlaveAddress',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#aa7d93ac85baacaeaa6c70abce6856f58',1,'lib60870::CS101::CS101Master']]], + ['sof_12',['SOF',['../classlib60870_1_1_c_s101_1_1_file_directory.html#af1f8d171f735aae0eed368015a3be40d',1,'lib60870::CS101::FileDirectory']]], + ['srd_13',['SRD',['../classlib60870_1_1_c_s101_1_1_start_event.html#a058cea08569048ffde04da4dab3630d7',1,'lib60870::CS101::StartEvent']]], + ['srq_14',['SRQ',['../classlib60870_1_1_c_s101_1_1_section_ready.html#a5bbd3b419683eaa394c20ca9e3f1ba34',1,'lib60870::CS101::SectionReady']]], + ['state_15',['State',['../classlib60870_1_1_c_s101_1_1_single_command.html#ae642167ac8c59c6a2f5552919c3606a4',1,'lib60870::CS101::SingleCommand']]], + ['substitued_16',['Substitued',['../classlib60870_1_1_c_p24_time2a.html#a4400a44009413f637412cb34d7d73820',1,'lib60870::CP24Time2a']]], + ['substituted_17',['Substituted',['../classlib60870_1_1_c_p32_time2a.html#ae4e8f2da41474e5fbeb67412cb1a1523',1,'lib60870.CP32Time2a.Substituted'],['../classlib60870_1_1_c_p56_time2a.html#a3b8f17e2e0ea8e6482dfae2fbea87173',1,'lib60870.CP56Time2a.Substituted']]], + ['supportssequence_18',['SupportsSequence',['../classlib60870_1_1_c_s101_1_1_information_object.html#a8e277f6a5d421d25ae9c9eb9b169887e',1,'lib60870::CS101::InformationObject']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/properties_11.js b/doxygen/doxydoc.NET/html/search/properties_11.js new file mode 100644 index 0000000..34a7ecd --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/properties_11.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['t0_0',['T0',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#adb7f9816ddbbf8925f5372308efed78f',1,'lib60870::CS104::APCIParameters']]], + ['t1_1',['T1',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#a11f40dff24e0352eb76b4d456afe9e68',1,'lib60870::CS104::APCIParameters']]], + ['t2_2',['T2',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#a0320d85982ccb2814e8829c51d4eb7b8',1,'lib60870::CS104::APCIParameters']]], + ['t3_3',['T3',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#ad68a65bbce99a4a7533a8c1291a52e0a',1,'lib60870::CS104::APCIParameters']]], + ['time_4',['Time',['../classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html#abcedc8616644f69702da1eb4dddb1860',1,'lib60870::CS101::TestCommandWithCP56Time2a']]], + ['timeoutforack_5',['TimeoutForACK',['../classlib60870_1_1linklayer_1_1_link_layer_parameters.html#a2f97069460fa1a3873ca1cf91331d739',1,'lib60870::linklayer::LinkLayerParameters']]], + ['timeoutlinkstate_6',['TimeoutLinkState',['../classlib60870_1_1linklayer_1_1_link_layer_parameters.html#ac79c13d5078a838e029e78a588e261a1',1,'lib60870::linklayer::LinkLayerParameters']]], + ['timeoutrepeat_7',['TimeoutRepeat',['../classlib60870_1_1linklayer_1_1_link_layer_parameters.html#a8907a50f70413012cf82de440e2b5581',1,'lib60870::linklayer::LinkLayerParameters']]], + ['transient_8',['Transient',['../classlib60870_1_1_c_s101_1_1_step_position_information.html#aba392b47665d183b882892dc252f285f',1,'lib60870::CS101::StepPositionInformation']]], + ['tsc_9',['TSC',['../classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html#ae5a610ff07bf26fbc6eb1e54efbd99df',1,'lib60870::CS101::TestCommandWithCP56Time2a']]], + ['type_10',['Type',['../classlib60870_1_1_c_s101_1_1_information_object.html#af2eba7ad5825d5d34258ce9747a615be',1,'lib60870::CS101::InformationObject']]], + ['typeid_11',['TypeId',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#ab0c3a8cae06afc0eea93c454815feb23',1,'lib60870::CS101::ASDU']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/properties_12.js b/doxygen/doxydoc.NET/html/search/properties_12.js new file mode 100644 index 0000000..f5d271e --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/properties_12.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['usesendmessagequeue_0',['UseSendMessageQueue',['../classlib60870_1_1_c_s104_1_1_connection.html#a452b4617dc369f3e9d6f509a0634fc21',1,'lib60870::CS104::Connection']]], + ['usesinglecharack_1',['UseSingleCharACK',['../classlib60870_1_1linklayer_1_1_link_layer_parameters.html#a35b88393725992cef49bbf6f7e196c5b',1,'lib60870::linklayer::LinkLayerParameters']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/properties_13.js b/doxygen/doxydoc.NET/html/search/properties_13.js new file mode 100644 index 0000000..78a5e60 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/properties_13.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['value_0',['Value',['../classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#a548b83c567fc345f85573f31d3a71f03',1,'lib60870.CS101.BinaryCounterReading.Value'],['../classlib60870_1_1_c_s101_1_1_step_position_information.html#a00370bb63d3ec53ded04f4d8108990cf',1,'lib60870.CS101.StepPositionInformation.Value']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/properties_14.js b/doxygen/doxydoc.NET/html/search/properties_14.js new file mode 100644 index 0000000..ceac164 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/properties_14.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['w_0',['W',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#ac86b4a16c31fd7ad6af55e6c7b6f048b',1,'lib60870::CS104::APCIParameters']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/properties_15.js b/doxygen/doxydoc.NET/html/search/properties_15.js new file mode 100644 index 0000000..9eedd8c --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/properties_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['year_0',['Year',['../classlib60870_1_1_c_p56_time2a.html#acd2210101a5b5235b4779e3ecf00527e',1,'lib60870::CP56Time2a']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/properties_2.js b/doxygen/doxydoc.NET/html/search/properties_2.js new file mode 100644 index 0000000..ab84257 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/properties_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['dayofmonth_0',['DayOfMonth',['../classlib60870_1_1_c_p56_time2a.html#a533808a9bd35fd250ff3197ce8b4e8fa',1,'lib60870::CP56Time2a']]], + ['dayofweek_1',['DayOfWeek',['../classlib60870_1_1_c_p56_time2a.html#afddcdbd7c4557c88032eb519a57b4019',1,'lib60870::CP56Time2a']]], + ['dir_2',['DIR',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#aceff4f3985519a296c989418c7ad71b0',1,'lib60870.CS101.CS101Master.DIR'],['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#ae1d00e6ee950d56d5487384070651148',1,'lib60870.CS101.CS101Slave.DIR']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/properties_3.js b/doxygen/doxydoc.NET/html/search/properties_3.js new file mode 100644 index 0000000..2af59bf --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/properties_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['enqueuemode_0',['EnqueueMode',['../classlib60870_1_1_c_s104_1_1_server.html#a102d175703f4f357e5749265352ce71e',1,'lib60870::CS104::Server']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/properties_4.js b/doxygen/doxydoc.NET/html/search/properties_4.js new file mode 100644 index 0000000..1545973 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/properties_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['filetimeout_0',['FileTimeout',['../classlib60870_1_1_c_s101_1_1_slave.html#a063b9d1a19a2960a91afc69204cc11f7',1,'lib60870::CS101::Slave']]], + ['frq_1',['FRQ',['../classlib60870_1_1_c_s101_1_1_file_ready.html#a68e7d332f311fb83d9bb617b6e54ec0a',1,'lib60870::CS101::FileReady']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/properties_5.js b/doxygen/doxydoc.NET/html/search/properties_5.js new file mode 100644 index 0000000..b1ceec5 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/properties_5.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['gc_0',['GC',['../classlib60870_1_1_c_s101_1_1_output_circuit_info.html#a1eeab57adef2da4f97af4fc96b07ad6c',1,'lib60870::CS101::OutputCircuitInfo']]], + ['gs_1',['GS',['../classlib60870_1_1_c_s101_1_1_start_event.html#a6cf3d354c2df01eb808748353f743b33',1,'lib60870::CS101::StartEvent']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/properties_6.js b/doxygen/doxydoc.NET/html/search/properties_6.js new file mode 100644 index 0000000..d6aecbc --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/properties_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['hour_0',['Hour',['../classlib60870_1_1_c_p32_time2a.html#a4cfa66063d1b214990d69515af388552',1,'lib60870.CP32Time2a.Hour'],['../classlib60870_1_1_c_p56_time2a.html#a34891c411294a0cb5bf2f1d4adb3286a',1,'lib60870.CP56Time2a.Hour']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/properties_7.js b/doxygen/doxydoc.NET/html/search/properties_7.js new file mode 100644 index 0000000..e151091 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/properties_7.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['invalid_0',['Invalid',['../classlib60870_1_1_c_p24_time2a.html#acb0606324a0b221df177d242cd97f7c7',1,'lib60870.CP24Time2a.Invalid'],['../classlib60870_1_1_c_p32_time2a.html#a9bc00071f0d79994977adcc9ea1564b4',1,'lib60870.CP32Time2a.Invalid'],['../classlib60870_1_1_c_p56_time2a.html#a7c00ef3b8b3f7fb1bb9a6cad0440f6dd',1,'lib60870.CP56Time2a.Invalid'],['../classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#a9c84bd5840b810546affba3f452b11e0',1,'lib60870.CS101.BinaryCounterReading.Invalid']]], + ['isactive_1',['IsActive',['../classlib60870_1_1_c_s104_1_1_client_connection.html#afa8806c545bf905a3548afa9732de38b',1,'lib60870::CS104::ClientConnection']]], + ['iscatchall_2',['IsCatchAll',['../classlib60870_1_1_c_s104_1_1_redundancy_group.html#aa09df33fcd23dcf486800f45f3d41d32',1,'lib60870::CS104::RedundancyGroup']]], + ['isnegative_3',['IsNegative',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a808a4ea51526b2ecbe0d9e23df1a018b',1,'lib60870::CS101::ASDU']]], + ['isrunning_4',['IsRunning',['../classlib60870_1_1_c_s104_1_1_connection.html#a83f3dfb64fa61b1d3fef93e938c692a1',1,'lib60870::CS104::Connection']]], + ['issequence_5',['IsSequence',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a874af72bec9618876b47a8da155de96f',1,'lib60870::CS101::ASDU']]], + ['istest_6',['IsTest',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#ae315fe2504e41a213cd76330cb56cc24',1,'lib60870::CS101::ASDU']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/properties_8.js b/doxygen/doxydoc.NET/html/search/properties_8.js new file mode 100644 index 0000000..bf97588 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/properties_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['k_0',['K',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#a0e3fc557d1c66308e6e38383ec9a5287',1,'lib60870::CS104::APCIParameters']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/properties_9.js b/doxygen/doxydoc.NET/html/search/properties_9.js new file mode 100644 index 0000000..f4ef325 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/properties_9.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['linklayeraddress_0',['LinkLayerAddress',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#aeb21ec9a8522c48ad37c263762d300a4',1,'lib60870::CS101::CS101Slave']]], + ['linklayeraddressotherstation_1',['LinkLayerAddressOtherStation',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#aa3c5ac017a1ea8fdbbb686c52076cc75',1,'lib60870::CS101::CS101Slave']]], + ['linklayermode_2',['LinkLayerMode',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#ad9d9bad745efb1fd3ce5bcbe894f6d97',1,'lib60870::CS101::CS101Slave']]], + ['localipaddress_3',['LocalIpAddress',['../classlib60870_1_1_c_s104_1_1_connection.html#abfa6d1581b6702a9f1dbdb96a79f5bc3',1,'lib60870::CS104::Connection']]], + ['localtcpport_4',['LocalTcpPort',['../classlib60870_1_1_c_s104_1_1_connection.html#a871e51aa4130ab9185014a4a845fdd2a',1,'lib60870::CS104::Connection']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/properties_a.js b/doxygen/doxydoc.NET/html/search/properties_a.js new file mode 100644 index 0000000..4209a12 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/properties_a.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['maxhighprioqueuesize_0',['MaxHighPrioQueueSize',['../classlib60870_1_1_c_s104_1_1_server.html#a408a31dd3cf6e781d7295804bd96d767',1,'lib60870::CS104::Server']]], + ['maxopenconnections_1',['MaxOpenConnections',['../classlib60870_1_1_c_s104_1_1_server.html#adcea16c6c2db799bc5b6750e82ca2235',1,'lib60870::CS104::Server']]], + ['maxqueuesize_2',['MaxQueueSize',['../classlib60870_1_1_c_s104_1_1_server.html#acef2c82d580d17114847df8409f6bf4f',1,'lib60870::CS104::Server']]], + ['millisecond_3',['Millisecond',['../classlib60870_1_1_c_p24_time2a.html#a54e60600dccb34252b428488223f419e',1,'lib60870.CP24Time2a.Millisecond'],['../classlib60870_1_1_c_p32_time2a.html#a144afbb4092fbe1a3196f30cba13fc37',1,'lib60870.CP32Time2a.Millisecond'],['../classlib60870_1_1_c_p56_time2a.html#a2e0c82ecba6b07880f9416101f004ecc',1,'lib60870.CP56Time2a.Millisecond']]], + ['minute_4',['Minute',['../classlib60870_1_1_c_p24_time2a.html#a1bdb66a13e77ea4ca5938c7609a38225',1,'lib60870.CP24Time2a.Minute'],['../classlib60870_1_1_c_p32_time2a.html#a723b8ffeb4915b7347aa97c65b2f4365',1,'lib60870.CP32Time2a.Minute'],['../classlib60870_1_1_c_p56_time2a.html#af5a5ead5f041e47e0f4e201acb707d13',1,'lib60870.CP56Time2a.Minute']]], + ['month_5',['Month',['../classlib60870_1_1_c_p56_time2a.html#aeda1719c2e81de05a616f166036ef1f7',1,'lib60870::CP56Time2a']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/properties_b.js b/doxygen/doxydoc.NET/html/search/properties_b.js new file mode 100644 index 0000000..73f7af5 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/properties_b.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['name_0',['Name',['../classlib60870_1_1_c_s104_1_1_redundancy_group.html#ab5d3a9a8d2fcca1e07fbb547cd072248',1,'lib60870::CS104::RedundancyGroup']]], + ['numberofelements_1',['NumberOfElements',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a8ab49764dd886c58be639d229e664af5',1,'lib60870::CS101::ASDU']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/properties_c.js b/doxygen/doxydoc.NET/html/search/properties_c.js new file mode 100644 index 0000000..2d1ad2c --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/properties_c.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['oa_0',['Oa',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a73566a1f53fc1c1492804c4bcf068438',1,'lib60870::CS101::ASDU']]], + ['openconnections_1',['OpenConnections',['../classlib60870_1_1_c_s104_1_1_server.html#a63dda97b27c78743dee7374d66cdda53',1,'lib60870::CS104::Server']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/properties_d.js b/doxygen/doxydoc.NET/html/search/properties_d.js new file mode 100644 index 0000000..0391ace --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/properties_d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['parameters_0',['Parameters',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#ab063f08cb01b7c3ca5bdc86cbafec7d2',1,'lib60870::CS101::CS101Slave']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/properties_e.js b/doxygen/doxydoc.NET/html/search/properties_e.js new file mode 100644 index 0000000..970012d --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/properties_e.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['qcc_0',['QCC',['../classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html#a839093d6c7666896a4bcf2c9b079564e',1,'lib60870::CS101::CounterInterrogationCommand']]], + ['qpa_1',['QPA',['../classlib60870_1_1_c_s101_1_1_parameter_activation.html#ab541aa687b71edc3411f12acd9adb618',1,'lib60870::CS101::ParameterActivation']]], + ['qrp_2',['QRP',['../classlib60870_1_1_c_s101_1_1_reset_process_command.html#ab87ef8bc0fa796dd5544ef39df6db59a',1,'lib60870::CS101::ResetProcessCommand']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/properties_f.js b/doxygen/doxydoc.NET/html/search/properties_f.js new file mode 100644 index 0000000..aa9ff1a --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/properties_f.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['rcvdmsgcounter_0',['RcvdMsgCounter',['../classlib60870_1_1_c_s104_1_1_connection_statistics.html#a763d4accdb60725988746edc43675f2e',1,'lib60870::CS104::ConnectionStatistics']]], + ['rcvdtestfractcounter_1',['RcvdTestFrActCounter',['../classlib60870_1_1_c_s104_1_1_connection_statistics.html#aba25451b06261758d07cc6d0f64292bd',1,'lib60870::CS104::ConnectionStatistics']]], + ['rcvdtestfrconcounter_2',['RcvdTestFrConCounter',['../classlib60870_1_1_c_s104_1_1_connection_statistics.html#a4aef0532af04bf8cc51ab76069845eb8',1,'lib60870::CS104::ConnectionStatistics']]], + ['receivesequencenumber_3',['ReceiveSequenceNumber',['../classlib60870_1_1_c_s104_1_1_connection.html#ab6a705b8f4d600160fa842031363e63e',1,'lib60870::CS104::Connection']]], + ['receivetimeout_4',['ReceiveTimeout',['../classlib60870_1_1_c_s104_1_1_connection.html#a3bf1bdcc082cd5347acb0fcb29078000',1,'lib60870.CS104.Connection.ReceiveTimeout'],['../classlib60870_1_1_c_s104_1_1_server.html#a5cbb4d451a08d3b381fce39b5bf4ed3e',1,'lib60870.CS104.Server.ReceiveTimeout']]], + ['remoteendpoint_5',['RemoteEndpoint',['../classlib60870_1_1_c_s104_1_1_client_connection.html#ad59a914894aa422d1bff8b601cc100f3',1,'lib60870::CS104::ClientConnection']]] +]; diff --git a/doxygen/doxydoc.NET/html/search/search.css b/doxygen/doxydoc.NET/html/search/search.css new file mode 100644 index 0000000..19f76f9 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doxygen/doxydoc.NET/html/search/search.js b/doxygen/doxydoc.NET/html/search/search.js new file mode 100644 index 0000000..666af01 --- /dev/null +++ b/doxygen/doxydoc.NET/html/search/search.js @@ -0,0 +1,694 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +const SEARCH_COOKIE_NAME = ''+'search_grp'; + +const searchResults = new SearchResults(); + +/* A class handling everything associated with the search panel. + + Parameters: + name - The name of the global variable that will be + storing this instance. Is needed to be able to set timeouts. + resultPath - path to use for external files +*/ +function SearchBox(name, resultsPath, extension) { + if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); } + if (!extension || extension == "") { extension = ".html"; } + + function getXPos(item) { + let x = 0; + if (item.offsetWidth) { + while (item && item!=document.body) { + x += item.offsetLeft; + item = item.offsetParent; + } + } + return x; + } + + function getYPos(item) { + let y = 0; + if (item.offsetWidth) { + while (item && item!=document.body) { + y += item.offsetTop; + item = item.offsetParent; + } + } + return y; + } + + // ---------- Instance variables + this.name = name; + this.resultsPath = resultsPath; + this.keyTimeout = 0; + this.keyTimeoutLength = 500; + this.closeSelectionTimeout = 300; + this.lastSearchValue = ""; + this.lastResultsPage = ""; + this.hideTimeout = 0; + this.searchIndex = 0; + this.searchActive = false; + this.extension = extension; + + // ----------- DOM Elements + + this.DOMSearchField = () => document.getElementById("MSearchField"); + this.DOMSearchSelect = () => document.getElementById("MSearchSelect"); + this.DOMSearchSelectWindow = () => document.getElementById("MSearchSelectWindow"); + this.DOMPopupSearchResults = () => document.getElementById("MSearchResults"); + this.DOMPopupSearchResultsWindow = () => document.getElementById("MSearchResultsWindow"); + this.DOMSearchClose = () => document.getElementById("MSearchClose"); + this.DOMSearchBox = () => document.getElementById("MSearchBox"); + + // ------------ Event Handlers + + // Called when focus is added or removed from the search field. + this.OnSearchFieldFocus = function(isActive) { + this.Activate(isActive); + } + + this.OnSearchSelectShow = function() { + const searchSelectWindow = this.DOMSearchSelectWindow(); + const searchField = this.DOMSearchSelect(); + + const left = getXPos(searchField); + const top = getYPos(searchField) + searchField.offsetHeight; + + // show search selection popup + searchSelectWindow.style.display='block'; + searchSelectWindow.style.left = left + 'px'; + searchSelectWindow.style.top = top + 'px'; + + // stop selection hide timer + if (this.hideTimeout) { + clearTimeout(this.hideTimeout); + this.hideTimeout=0; + } + return false; // to avoid "image drag" default event + } + + this.OnSearchSelectHide = function() { + this.hideTimeout = setTimeout(this.CloseSelectionWindow.bind(this), + this.closeSelectionTimeout); + } + + // Called when the content of the search field is changed. + this.OnSearchFieldChange = function(evt) { + if (this.keyTimeout) { // kill running timer + clearTimeout(this.keyTimeout); + this.keyTimeout = 0; + } + + const e = evt ? evt : window.event; // for IE + if (e.keyCode==40 || e.keyCode==13) { + if (e.shiftKey==1) { + this.OnSearchSelectShow(); + const win=this.DOMSearchSelectWindow(); + for (let i=0;i do a search + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) { // Up + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } else if (e.keyCode==13 || e.keyCode==27) { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() { + this.keyTimeout = 0; + + // strip leading whitespace + const searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + const code = searchValue.toLowerCase().charCodeAt(0); + let idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) { // surrogate pair + idxChar = searchValue.substr(0, 2); + } + + let jsFile; + let idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) { + const hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + const loadJS = function(url, impl, loc) { + const scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + const domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + const domSearchBox = this.DOMSearchBox(); + const domPopupSearchResults = this.DOMPopupSearchResults(); + const domSearchClose = this.DOMSearchClose(); + const resultsPath = this.resultsPath; + + const handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') { + domSearchClose.style.display = 'inline-block'; + let left = getXPos(domSearchBox) + 150; + let top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + const maxWidth = document.body.clientWidth; + const maxHeight = document.body.clientHeight; + let width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + let height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } else if (!isActive) { // directly remove the panel + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults() { + + function convertToId(search) { + let result = ''; + for (let i=0;i. + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) { + const parentElement = document.getElementById(id); + let element = parentElement.firstChild; + + while (element && element!=parentElement) { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) { + element = element.firstChild; + } else if (element.nextSibling) { + element = element.nextSibling; + } else { + do { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) { + const element = this.FindChildElement(id); + if (element) { + if (element.style.display == 'block') { + element.style.display = 'none'; + } else { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) { + if (!search) { // get search word from URL + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + const resultRows = document.getElementsByTagName("div"); + let matches = 0; + + let i = 0; + while (i < resultRows.length) { + const row = resultRows.item(i); + if (row.className == "SRResult") { + let rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) { + row.style.display = 'block'; + matches++; + } else { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) { // no results + document.getElementById("NoMatches").style.display='block'; + } else { // at least one result + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) { + if (e.type == "keydown") { + this.repeatOn = false; + this.lastKey = e.keyCode; + } else if (e.type == "keypress") { + if (!this.repeatOn) { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } else if (e.type == "keyup") { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + const newIndex = itemIndex-1; + let focusItem = this.NavPrev(newIndex); + if (focusItem) { + let child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') { // children visible + let n=0; + let tmpElem; + for (;;) { // search for last child + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) { + focusItem = tmpElem; + } else { // found it! + break; + } + n++; + } + } + } + if (focusItem) { + focusItem.focus(); + } else { // return focus to search field + document.getElementById("MSearchField").focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = itemIndex+1; + let focusItem; + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') { // children visible + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } else if (this.lastKey==39) { // Right + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } else if (this.lastKey==37) { // Left + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + if (childIndex>0) { + const newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } else { // already at first child, jump to parent + document.getElementById('Item'+itemIndex).focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = childIndex+1; + let elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) { // last child, jump to parent next parent + elem = this.NavNext(itemIndex+1); + } + if (elem) { + elem.focus(); + } + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; + } + return false; + } +} + +function createResults(resultsPath) { + + function setKeyActions(elem,action) { + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); + } + + function setClassAttr(elem,attr) { + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); + } + + const results = document.getElementById("SRResults"); + results.innerHTML = ''; + searchData.forEach((elem,index) => { + const id = elem[0]; + const srResult = document.createElement('div'); + srResult.setAttribute('id','SR_'+id); + setClassAttr(srResult,'SRResult'); + const srEntry = document.createElement('div'); + setClassAttr(srEntry,'SREntry'); + const srLink = document.createElement('a'); + srLink.setAttribute('id','Item'+index); + setKeyActions(srLink,'return searchResults.Nav(event,'+index+')'); + setClassAttr(srLink,'SRSymbol'); + srLink.innerHTML = elem[1][0]; + srEntry.appendChild(srLink); + if (elem[1].length==2) { // single result + srLink.setAttribute('href',resultsPath+elem[1][1][0]); + srLink.setAttribute('onclick','searchBox.CloseResultsWindow()'); + if (elem[1][1][1]) { + srLink.setAttribute('target','_parent'); + } else { + srLink.setAttribute('target','_blank'); + } + const srScope = document.createElement('span'); + setClassAttr(srScope,'SRScope'); + srScope.innerHTML = elem[1][1][2]; + srEntry.appendChild(srScope); + } else { // multiple results + srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")'); + const srChildren = document.createElement('div'); + setClassAttr(srChildren,'SRChildren'); + for (let c=0; c-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 HcmV?d00001 diff --git a/doxygen/doxydoc.NET/html/splitbard.png b/doxygen/doxydoc.NET/html/splitbard.png new file mode 100644 index 0000000000000000000000000000000000000000..8367416d757fd7b6dc4272b6432dc75a75abd068 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf@VhhFKy35^fiT zT~&lUj3=cDh^%3HDY9k5CEku}PHXNoNC(_$U3XPb&Q*ME25pT;2(*BOgAf<+R$lzakPG`kF31()Fx{L5Wrac|GQzjeE= zueY1`Ze{#x<8=S|`~MgGetGce)#vN&|J{Cd^tS%;tBYTo?+^d68<#n_Y_xx`J||4O V@QB{^CqU0Kc)I$ztaD0e0svEzbJzd? literal 0 HcmV?d00001 diff --git a/doxygen/doxydoc.NET/html/sync_off.png b/doxygen/doxydoc.NET/html/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 HcmV?d00001 diff --git a/doxygen/doxydoc.NET/html/sync_on.png b/doxygen/doxydoc.NET/html/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e08320fb64e6fa33b573005ed6d8fe294e19db76 GIT binary patch literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 HcmV?d00001 diff --git a/doxygen/doxydoc.NET/html/tab_a.png b/doxygen/doxydoc.NET/html/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..3b725c41c5a527a3a3e40097077d0e206a681247 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 HcmV?d00001 diff --git a/doxygen/doxydoc.NET/html/tab_ad.png b/doxygen/doxydoc.NET/html/tab_ad.png new file mode 100644 index 0000000000000000000000000000000000000000..e34850acfc24be58da6d2fd1ccc6b29cc84fe34d GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QhuH;jv*C{Z|5d*H3V=pKi{In zd2jxLclDRPylmD}^l7{QOtL{vUjO{-WqItb5sQp2h-99b8^^Scr-=2mblCdZuUm?4 jzOJvgvt3{(cjKLW5(A@0qPS@<&}0TrS3j3^P6y&q2{!U5bk+Tso_B!YCpDh>v z{CM*1U8YvQRyBUHt^Ju0W_sq-?;9@_4equ-bavTs=gk796zopr0EBT&m;e9( literal 0 HcmV?d00001 diff --git a/doxygen/doxydoc.NET/html/tab_s.png b/doxygen/doxydoc.NET/html/tab_s.png new file mode 100644 index 0000000000000000000000000000000000000000..ab478c95b67371d700a20869f7de1ddd73522d50 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QuUrLjv*C{Z|^p8HaRdjTwH7) zC?wLlL}}I{)n%R&r+1}IGmDnq;&J#%V6)9VsYhS`O^BVBQlxOUep0c$RENLq#g8A$ z)z7%K_bI&n@J+X_=x}fJoEKed-$<>=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ literal 0 HcmV?d00001 diff --git a/doxygen/doxydoc.NET/html/tab_sd.png b/doxygen/doxydoc.NET/html/tab_sd.png new file mode 100644 index 0000000000000000000000000000000000000000..757a565ced4730f85c833fb2547d8e199ae68f19 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!Qq7(&jv*C{Z|_!fH5o7*c=%9% zcILh!EA=pAQKdx-Cdiev=v{eg{8Ht<{e8_NAN~b=)%W>-WDCE0PyDHGemi$BoXwcK z{>e9^za6*c1ilttWw&V+U;WCPlV9{LdC~Ey%_H(qj`xgfES(4Yz5jSTZfCt`4E$0YRsR*S^mTCR^;V&sxC8{l_Cp7w8-YPgg&ebxsLQ00$vXK>z>% literal 0 HcmV?d00001 diff --git a/doxygen/doxydoc.NET/html/tabs.css b/doxygen/doxydoc.NET/html/tabs.css new file mode 100644 index 0000000..fe4854a --- /dev/null +++ b/doxygen/doxydoc.NET/html/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} \ No newline at end of file diff --git a/doxygen/logo.png b/doxygen/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..bd0925a890070be6098b0ec2f03e897e74c3f274 GIT binary patch literal 782363 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%0A*bJn~YMXSd& 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 C-D?v7 literal 0 HcmV?d00001 From 3dfe86c648013d31643960d897e12264491152b5 Mon Sep 17 00:00:00 2001 From: Maxson Ramon dos Anjos Medeiros Date: Fri, 21 Mar 2025 13:57:09 +0100 Subject: [PATCH 63/83] Merge bug fixed --- lib60870/CS104/Server.cs | 56 ---------------------------------------- 1 file changed, 56 deletions(-) diff --git a/lib60870/CS104/Server.cs b/lib60870/CS104/Server.cs index c639f25..3cbde47 100644 --- a/lib60870/CS104/Server.cs +++ b/lib60870/CS104/Server.cs @@ -544,62 +544,6 @@ private int GetEntryCount(ASDUQueue queue) return count; } - public int GetNumberOfQueueEntries(RedundancyGroup redundancyGroup = null) - { - if (serverMode == ServerMode.CONNECTION_IS_REDUNDANCY_GROUP) - { - foreach (ClientConnection connection in allOpenConnections) - { - if (connection.IsActive) - { - return GetEntryCount(connection.GetASDUQueue()); - - } - } - } - - else if (serverMode == ServerMode.MULTIPLE_REDUNDANCY_GROUPS) - { - if (redundancyGroup != null) - { - return GetEntryCount(redundancyGroup.asduQueue); - } - - else - { - return -1; - } - } - - else - { - RedundancyGroup singleGroup = redGroups[0]; - return GetEntryCount(singleGroup.asduQueue); - } - - - return 0; - } - - private int GetEntryCount(ASDUQueue queue) - { - int count = 0; - - if (queue != null) - { - try - { - count = queue.NumberOfAsduInQueue; - } - catch (Exception ex) - { - Console.WriteLine(ex.Message); - } - } - - return count; - } - ///

    /// Returns the number of elements in the low priority queue /// From c51ca861c698447848b5ab40e4241337ad629bc4 Mon Sep 17 00:00:00 2001 From: Maxson Ramon dos Anjos Medeiros Date: Fri, 21 Mar 2025 14:27:55 +0100 Subject: [PATCH 64/83] user guide update --- user_guide_dotnet.adoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user_guide_dotnet.adoc b/user_guide_dotnet.adoc index df983c8..b4662bf 100644 --- a/user_guide_dotnet.adoc +++ b/user_guide_dotnet.adoc @@ -1,5 +1,7 @@ = lib60870.NET 2.3.0 User Guide +*Copyright 2025 MZ Automation GmbH* + == Introduction lib60870.NET is an implementation of the IEC 60870-5 protocol for client (master station) and server (controlled station). From c0534230f06d1cb688dd4b90de23667961fb7392 Mon Sep 17 00:00:00 2001 From: Maxson Ramon dos Anjos Medeiros Date: Fri, 21 Mar 2025 15:12:31 +0100 Subject: [PATCH 65/83] Add dotnet 8 lib project --- .net8/lib60870.csproj | 94 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 .net8/lib60870.csproj diff --git a/.net8/lib60870.csproj b/.net8/lib60870.csproj new file mode 100644 index 0000000..8ade006 --- /dev/null +++ b/.net8/lib60870.csproj @@ -0,0 +1,94 @@ + + + Library + Michael Zillgith + MZ Automation + lib60870 + 2.3.0 + lib60870 + lib60870 + 2.3.0 + net8.0 + false + icon.png + + lib60870.NET library for IEC 60870-5 based protocols in C# + The current implementation contains code for the IEC 60870-5-101/104 protocols only. + + readme.md + nupkg + true + GPL-3.0-only + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 1d3395b166d0905fe5e235b979fb5ae93773976d Mon Sep 17 00:00:00 2001 From: Maxson Ramon dos Anjos Medeiros Date: Fri, 21 Mar 2025 15:23:27 +0100 Subject: [PATCH 66/83] Add framework project --- framework/lib60870/lib60870.csproj | 96 ++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 framework/lib60870/lib60870.csproj diff --git a/framework/lib60870/lib60870.csproj b/framework/lib60870/lib60870.csproj new file mode 100644 index 0000000..2581e9b --- /dev/null +++ b/framework/lib60870/lib60870.csproj @@ -0,0 +1,96 @@ + + + Library + Michael Zillgith + MZ Automation + lib60870 + 2.3.0 + lib60870 + lib60870 + 2.3.0 + net472 + false + icon.png + + lib60870.NET library for IEC 60870-5 based protocols in C# + The current implementation contains code for the IEC 60870-5-101/104 protocols only. + + readme.md + nupkg + true + GPL-3.0-only + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 416aff7cf3ec6f3aacc156b89ffb6b844db555a2 Mon Sep 17 00:00:00 2001 From: Maxson Ramon dos Anjos Medeiros Date: Fri, 21 Mar 2025 15:27:03 +0100 Subject: [PATCH 67/83] remove doxigen html pages --- doxygen/doxydoc.NET/html/annotated.html | 233 -- doxygen/doxydoc.NET/html/annotated_dup.js | 123 - doxygen/doxydoc.NET/html/bc_s.png | Bin 676 -> 0 bytes doxygen/doxydoc.NET/html/bc_sd.png | Bin 635 -> 0 bytes doxygen/doxydoc.NET/html/classes.html | 161 -- ...1_1_a_s_d_u_parsing_exception-members.html | 117 - ...ib60870_1_1_a_s_d_u_parsing_exception.html | 137 - ...a_s_d_u_parsing_exception__coll__graph.dot | 10 - ..._d_u_parsing_exception__inherit__graph.dot | 10 - ...asslib60870_1_1_a_s_d_u_queue-members.html | 125 - .../html/classlib60870_1_1_a_s_d_u_queue.html | 159 -- ...lasslib60870_1_1_c_p16_time2a-members.html | 125 - .../html/classlib60870_1_1_c_p16_time2a.html | 152 -- ...lasslib60870_1_1_c_p24_time2a-members.html | 130 - .../html/classlib60870_1_1_c_p24_time2a.html | 314 --- .../html/classlib60870_1_1_c_p24_time2a.js | 9 - ...lasslib60870_1_1_c_p32_time2a-members.html | 133 - .../html/classlib60870_1_1_c_p32_time2a.html | 354 --- .../html/classlib60870_1_1_c_p32_time2a.js | 10 - ...lasslib60870_1_1_c_p56_time2a-members.html | 137 - .../html/classlib60870_1_1_c_p56_time2a.html | 466 ---- .../html/classlib60870_1_1_c_p56_time2a.js | 14 - ...b60870_1_1_c_s101_1_1_a_s_d_u-members.html | 132 - .../classlib60870_1_1_c_s101_1_1_a_s_d_u.html | 577 ----- .../classlib60870_1_1_c_s101_1_1_a_s_d_u.js | 16 - ...1_1_1_a_s_d_u_queue_exception-members.html | 119 - ..._1_c_s101_1_1_a_s_d_u_queue_exception.html | 140 - ...1_a_s_d_u_queue_exception__coll__graph.dot | 10 - ..._s_d_u_queue_exception__inherit__graph.dot | 10 - ..._application_layer_parameters-members.html | 126 - ...s101_1_1_application_layer_parameters.html | 159 -- ...01_1_1_binary_counter_reading-members.html | 125 - ...1_1_c_s101_1_1_binary_counter_reading.html | 283 --- ...0_1_1_c_s101_1_1_binary_counter_reading.js | 8 - ...70_1_1_c_s101_1_1_bitstring32-members.html | 128 - ...sslib60870_1_1_c_s101_1_1_bitstring32.html | 225 -- ..._1_c_s101_1_1_bitstring32__coll__graph.dot | 10 - ...c_s101_1_1_bitstring32__inherit__graph.dot | 14 - ..._s101_1_1_bitstring32_command-members.html | 126 - ...70_1_1_c_s101_1_1_bitstring32_command.html | 219 -- ...1_1_1_bitstring32_command__coll__graph.dot | 10 - ..._1_bitstring32_command__inherit__graph.dot | 12 - ...g32_command_with_c_p56_time2a-members.html | 128 - ...bitstring32_command_with_c_p56_time2a.html | 236 -- ...command_with_c_p56_time2a__coll__graph.dot | 12 - ...mand_with_c_p56_time2a__inherit__graph.dot | 12 - ...bitstring32_with_c_p24_time2a-members.html | 131 - ...101_1_1_bitstring32_with_c_p24_time2a.html | 245 -- ...tring32_with_c_p24_time2a__coll__graph.dot | 12 - ...ng32_with_c_p24_time2a__inherit__graph.dot | 12 - ...bitstring32_with_c_p56_time2a-members.html | 131 - ...101_1_1_bitstring32_with_c_p56_time2a.html | 245 -- ...tring32_with_c_p56_time2a__coll__graph.dot | 12 - ...ng32_with_c_p56_time2a__inherit__graph.dot | 12 - ..._1_1_c_s101_1_1_c_s101_master-members.html | 155 -- ...lib60870_1_1_c_s101_1_1_c_s101_master.html | 393 --- ...sslib60870_1_1_c_s101_1_1_c_s101_master.js | 10 - ..._c_s101_1_1_c_s101_master__coll__graph.dot | 21 - ...s101_1_1_c_s101_master__inherit__graph.dot | 12 - ...0_1_1_c_s101_1_1_c_s101_slave-members.html | 161 -- ...slib60870_1_1_c_s101_1_1_c_s101_slave.html | 680 ----- ...asslib60870_1_1_c_s101_1_1_c_s101_slave.js | 21 - ...1_c_s101_1_1_c_s101_slave__coll__graph.dot | 16 - ..._s101_1_1_c_s101_slave__inherit__graph.dot | 14 - ...clock_synchronization_command-members.html | 126 - ...101_1_1_clock_synchronization_command.html | 219 -- ...k_synchronization_command__coll__graph.dot | 10 - ...ynchronization_command__inherit__graph.dot | 10 - ...counter_interrogation_command-members.html | 126 - ...101_1_1_counter_interrogation_command.html | 245 -- ..._s101_1_1_counter_interrogation_command.js | 4 - ...ter_interrogation_command__coll__graph.dot | 10 - ..._interrogation_command__inherit__graph.dot | 10 - ...1_1_delay_acquisition_command-members.html | 126 - ..._c_s101_1_1_delay_acquisition_command.html | 219 -- ...delay_acquisition_command__coll__graph.dot | 10 - ...ay_acquisition_command__inherit__graph.dot | 10 - ...1_1_c_s101_1_1_double_command-members.html | 131 - ...ib60870_1_1_c_s101_1_1_double_command.html | 238 -- ...c_s101_1_1_double_command__coll__graph.dot | 10 - ...101_1_1_double_command__inherit__graph.dot | 16 - ...ble_command_with_c_p56_time2a-members.html | 134 - ..._1_1_double_command_with_c_p56_time2a.html | 252 -- ...command_with_c_p56_time2a__coll__graph.dot | 12 - ...mand_with_c_p56_time2a__inherit__graph.dot | 12 - ..._1_1_double_point_information-members.html | 128 - ...1_c_s101_1_1_double_point_information.html | 230 -- ..._double_point_information__coll__graph.dot | 10 - ...uble_point_information__inherit__graph.dot | 14 - ...ouble_point_with_c_p24_time2a-members.html | 131 - ...01_1_1_double_point_with_c_p24_time2a.html | 250 -- ...e_point_with_c_p24_time2a__coll__graph.dot | 12 - ...oint_with_c_p24_time2a__inherit__graph.dot | 12 - ...ouble_point_with_c_p56_time2a-members.html | 131 - ...01_1_1_double_point_with_c_p56_time2a.html | 250 -- ...e_point_with_c_p56_time2a__coll__graph.dot | 12 - ...oint_with_c_p56_time2a__inherit__graph.dot | 12 - ...101_1_1_end_of_initialization-members.html | 127 - ..._1_1_c_s101_1_1_end_of_initialization.html | 228 -- ...70_1_1_c_s101_1_1_end_of_initialization.js | 4 - ...1_1_end_of_initialization__coll__graph.dot | 10 - ..._end_of_initialization__inherit__graph.dot | 10 - ...event_of_protection_equipment-members.html | 129 - ...101_1_1_event_of_protection_equipment.html | 233 -- ...t_of_protection_equipment__coll__graph.dot | 10 - ...f_protection_equipment__inherit__graph.dot | 10 - ...n_equipment_with_c_p56_time2a-members.html | 129 - ...rotection_equipment_with_c_p56_time2a.html | 233 -- ...uipment_with_c_p56_time2a__coll__graph.dot | 10 - ...ment_with_c_p56_time2a__inherit__graph.dot | 10 - ...870_1_1_c_s101_1_1_file_a_c_k-members.html | 130 - ...asslib60870_1_1_c_s101_1_1_file_a_c_k.html | 262 -- ...classlib60870_1_1_c_s101_1_1_file_a_c_k.js | 4 - ...1_1_c_s101_1_1_file_a_c_k__coll__graph.dot | 10 - ..._c_s101_1_1_file_a_c_k__inherit__graph.dot | 10 - ..._s101_1_1_file_call_or_select-members.html | 128 - ...70_1_1_c_s101_1_1_file_call_or_select.html | 256 -- ...0870_1_1_c_s101_1_1_file_call_or_select.js | 4 - ...1_1_1_file_call_or_select__coll__graph.dot | 10 - ..._1_file_call_or_select__inherit__graph.dot | 10 - ...1_1_c_s101_1_1_file_directory-members.html | 133 - ...ib60870_1_1_c_s101_1_1_file_directory.html | 271 -- ...slib60870_1_1_c_s101_1_1_file_directory.js | 4 - ...c_s101_1_1_file_directory__coll__graph.dot | 10 - ...101_1_1_file_directory__inherit__graph.dot | 10 - ..._file_last_segment_or_section-members.html | 129 - ...s101_1_1_file_last_segment_or_section.html | 259 -- ...c_s101_1_1_file_last_segment_or_section.js | 4 - ...e_last_segment_or_section__coll__graph.dot | 10 - ...ast_segment_or_section__inherit__graph.dot | 10 - ...870_1_1_c_s101_1_1_file_ready-members.html | 129 - ...asslib60870_1_1_c_s101_1_1_file_ready.html | 277 -- ...classlib60870_1_1_c_s101_1_1_file_ready.js | 5 - ...1_1_c_s101_1_1_file_ready__coll__graph.dot | 10 - ..._c_s101_1_1_file_ready__inherit__graph.dot | 10 - ...0_1_1_c_s101_1_1_file_segment-members.html | 130 - ...slib60870_1_1_c_s101_1_1_file_segment.html | 240 -- ...1_c_s101_1_1_file_segment__coll__graph.dot | 10 - ..._s101_1_1_file_segment__inherit__graph.dot | 10 - ..._1_c_s101_1_1_files_available-members.html | 119 - ...b60870_1_1_c_s101_1_1_files_available.html | 209 -- ...lib60870_1_1_c_s101_1_1_files_available.js | 6 - ...c_s101_1_1_information_object-members.html | 124 - ...870_1_1_c_s101_1_1_information_object.html | 241 -- ...60870_1_1_c_s101_1_1_information_object.js | 6 - ...1_1_information_object__inherit__graph.dot | 105 - ..._c_s101_1_1_integrated_totals-members.html | 127 - ...0870_1_1_c_s101_1_1_integrated_totals.html | 227 -- ...101_1_1_integrated_totals__coll__graph.dot | 10 - ..._1_1_integrated_totals__inherit__graph.dot | 15 - ...ated_totals_with_c_p24_time2a-members.html | 131 - ...1_integrated_totals_with_c_p24_time2a.html | 250 -- ..._totals_with_c_p24_time2a__coll__graph.dot | 12 - ...tals_with_c_p24_time2a__inherit__graph.dot | 12 - ...ated_totals_with_c_p56_time2a-members.html | 132 - ...1_integrated_totals_with_c_p56_time2a.html | 253 -- ..._totals_with_c_p56_time2a__coll__graph.dot | 12 - ...tals_with_c_p56_time2a__inherit__graph.dot | 12 - ...101_1_1_interrogation_command-members.html | 126 - ..._1_1_c_s101_1_1_interrogation_command.html | 219 -- ...1_1_interrogation_command__coll__graph.dot | 10 - ..._interrogation_command__inherit__graph.dot | 10 - ...ib60870_1_1_c_s101_1_1_master-members.html | 133 - .../classlib60870_1_1_c_s101_1_1_master.html | 862 ------- .../classlib60870_1_1_c_s101_1_1_master.js | 18 - ..._1_1_c_s101_1_1_master__inherit__graph.dot | 12 - ...1_1_measured_value_normalized-members.html | 133 - ..._c_s101_1_1_measured_value_normalized.html | 258 -- ...measured_value_normalized__coll__graph.dot | 12 - ...sured_value_normalized__inherit__graph.dot | 17 - ..._normalized_with_c_p24_time2a-members.html | 137 - ...ed_value_normalized_with_c_p24_time2a.html | 281 --- ...malized_with_c_p24_time2a__coll__graph.dot | 14 - ...ized_with_c_p24_time2a__inherit__graph.dot | 14 - ..._normalized_with_c_p56_time2a-members.html | 137 - ...ed_value_normalized_with_c_p56_time2a.html | 281 --- ...malized_with_c_p56_time2a__coll__graph.dot | 14 - ...ized_with_c_p56_time2a__inherit__graph.dot | 14 - ...ue_normalized_without_quality-members.html | 129 - ...ured_value_normalized_without_quality.html | 233 -- ...ormalized_without_quality__coll__graph.dot | 10 - ...alized_without_quality__inherit__graph.dot | 17 - ...101_1_1_measured_value_scaled-members.html | 128 - ..._1_1_c_s101_1_1_measured_value_scaled.html | 262 -- ...70_1_1_c_s101_1_1_measured_value_scaled.js | 4 - ...1_1_measured_value_scaled__coll__graph.dot | 10 - ..._measured_value_scaled__inherit__graph.dot | 15 - ...alue_scaled_with_c_p24_time2a-members.html | 131 - ...asured_value_scaled_with_c_p24_time2a.html | 245 -- ..._scaled_with_c_p24_time2a__coll__graph.dot | 12 - ...aled_with_c_p24_time2a__inherit__graph.dot | 12 - ...alue_scaled_with_c_p56_time2a-members.html | 131 - ...asured_value_scaled_with_c_p56_time2a.html | 245 -- ..._scaled_with_c_p56_time2a__coll__graph.dot | 12 - ...aled_with_c_p56_time2a__inherit__graph.dot | 12 - ...s101_1_1_measured_value_short-members.html | 128 - ...0_1_1_c_s101_1_1_measured_value_short.html | 225 -- ..._1_1_measured_value_short__coll__graph.dot | 10 - ...1_measured_value_short__inherit__graph.dot | 15 - ...value_short_with_c_p24_time2a-members.html | 131 - ...easured_value_short_with_c_p24_time2a.html | 245 -- ...e_short_with_c_p24_time2a__coll__graph.dot | 12 - ...hort_with_c_p24_time2a__inherit__graph.dot | 12 - ...value_short_with_c_p56_time2a-members.html | 131 - ...easured_value_short_with_c_p56_time2a.html | 245 -- ...e_short_with_c_p56_time2a__coll__graph.dot | 12 - ...hort_with_c_p56_time2a__inherit__graph.dot | 12 - ..._s101_1_1_output_circuit_info-members.html | 128 - ...70_1_1_c_s101_1_1_output_circuit_info.html | 267 -- ...0870_1_1_c_s101_1_1_output_circuit_info.js | 7 - ..._1_packed_output_circuit_info-members.html | 130 - ...c_s101_1_1_packed_output_circuit_info.html | 231 -- ...acked_output_circuit_info__coll__graph.dot | 10 - ...ed_output_circuit_info__inherit__graph.dot | 10 - ...ircuit_info_with_c_p56_time2a-members.html | 130 - ...output_circuit_info_with_c_p56_time2a.html | 231 -- ...it_info_with_c_p56_time2a__coll__graph.dot | 10 - ...info_with_c_p56_time2a__inherit__graph.dot | 10 - ...acked_single_point_with_s_c_d-members.html | 128 - ...01_1_1_packed_single_point_with_s_c_d.html | 225 -- ...d_single_point_with_s_c_d__coll__graph.dot | 10 - ...ingle_point_with_s_c_d__inherit__graph.dot | 10 - ...vents_of_protection_equipment-members.html | 130 - ..._start_events_of_protection_equipment.html | 231 -- ...s_of_protection_equipment__coll__graph.dot | 10 - ...f_protection_equipment__inherit__graph.dot | 10 - ...n_equipment_with_c_p56_time2a-members.html | 130 - ...rotection_equipment_with_c_p56_time2a.html | 231 -- ...uipment_with_c_p56_time2a__coll__graph.dot | 10 - ...ment_with_c_p56_time2a__inherit__graph.dot | 10 - ...s101_1_1_parameter_activation-members.html | 130 - ...0_1_1_c_s101_1_1_parameter_activation.html | 261 -- ...870_1_1_c_s101_1_1_parameter_activation.js | 4 - ..._1_1_parameter_activation__coll__graph.dot | 10 - ...1_parameter_activation__inherit__graph.dot | 10 - ...101_1_1_parameter_float_value-members.html | 127 - ..._1_1_c_s101_1_1_parameter_float_value.html | 222 -- ...1_1_parameter_float_value__coll__graph.dot | 10 - ..._parameter_float_value__inherit__graph.dot | 10 - ..._1_parameter_normalized_value-members.html | 129 - ...c_s101_1_1_parameter_normalized_value.html | 228 -- ...arameter_normalized_value__coll__graph.dot | 10 - ...meter_normalized_value__inherit__graph.dot | 10 - ...01_1_1_parameter_scaled_value-members.html | 127 - ...1_1_c_s101_1_1_parameter_scaled_value.html | 222 -- ..._1_parameter_scaled_value__coll__graph.dot | 10 - ...parameter_scaled_value__inherit__graph.dot | 10 - ...vate_information_object_types-members.html | 117 - ..._1_1_private_information_object_types.html | 132 - ..._1_qualifier_of_interrogation-members.html | 133 - ...c_s101_1_1_qualifier_of_interrogation.html | 175 -- ...c_s101_1_1_quality_descriptor-members.html | 130 - ...870_1_1_c_s101_1_1_quality_descriptor.html | 171 -- ...s101_1_1_quality_descriptor_p-members.html | 128 - ...0_1_1_c_s101_1_1_quality_descriptor_p.html | 166 -- ...0_1_1_c_s101_1_1_read_command-members.html | 125 - ...slib60870_1_1_c_s101_1_1_read_command.html | 180 -- ...1_c_s101_1_1_read_command__coll__graph.dot | 10 - ..._s101_1_1_read_command__inherit__graph.dot | 10 - ...101_1_1_reset_process_command-members.html | 126 - ..._1_1_c_s101_1_1_reset_process_command.html | 245 -- ...70_1_1_c_s101_1_1_reset_process_command.js | 4 - ...1_1_reset_process_command__coll__graph.dot | 10 - ..._reset_process_command__inherit__graph.dot | 10 - ...0_1_1_c_s101_1_1_scaled_value-members.html | 128 - ...slib60870_1_1_c_s101_1_1_scaled_value.html | 161 -- ..._1_1_c_s101_1_1_section_ready-members.html | 130 - ...lib60870_1_1_c_s101_1_1_section_ready.html | 262 -- ...sslib60870_1_1_c_s101_1_1_section_ready.js | 4 - ..._c_s101_1_1_section_ready__coll__graph.dot | 10 - ...s101_1_1_section_ready__inherit__graph.dot | 10 - ...1_setpoint_command_normalized-members.html | 129 - ..._s101_1_1_setpoint_command_normalized.html | 228 -- ...tpoint_command_normalized__coll__graph.dot | 10 - ...int_command_normalized__inherit__graph.dot | 12 - ..._normalized_with_c_p56_time2a-members.html | 132 - ..._command_normalized_with_c_p56_time2a.html | 248 -- ...malized_with_c_p56_time2a__coll__graph.dot | 12 - ...ized_with_c_p56_time2a__inherit__graph.dot | 12 - ..._1_setpoint_command_qualifier-members.html | 121 - ...c_s101_1_1_setpoint_command_qualifier.html | 143 -- ...1_1_1_setpoint_command_scaled-members.html | 127 - ..._1_c_s101_1_1_setpoint_command_scaled.html | 222 -- ...1_setpoint_command_scaled__coll__graph.dot | 10 - ...etpoint_command_scaled__inherit__graph.dot | 12 - ...mand_scaled_with_c_p56_time2a-members.html | 129 - ...oint_command_scaled_with_c_p56_time2a.html | 239 -- ..._scaled_with_c_p56_time2a__coll__graph.dot | 12 - ...aled_with_c_p56_time2a__inherit__graph.dot | 12 - ...01_1_1_setpoint_command_short-members.html | 127 - ...1_1_c_s101_1_1_setpoint_command_short.html | 222 -- ..._1_setpoint_command_short__coll__graph.dot | 10 - ...setpoint_command_short__inherit__graph.dot | 12 - ...mmand_short_with_c_p56_time2a-members.html | 129 - ...point_command_short_with_c_p56_time2a.html | 239 -- ...d_short_with_c_p56_time2a__coll__graph.dot | 12 - ...hort_with_c_p56_time2a__inherit__graph.dot | 12 - ...1_1_c_s101_1_1_single_command-members.html | 129 - ...ib60870_1_1_c_s101_1_1_single_command.html | 282 --- ...slib60870_1_1_c_s101_1_1_single_command.js | 5 - ...c_s101_1_1_single_command__coll__graph.dot | 10 - ...101_1_1_single_command__inherit__graph.dot | 12 - ...gle_command_with_c_p56_time2a-members.html | 132 - ..._1_1_single_command_with_c_p56_time2a.html | 248 -- ...command_with_c_p56_time2a__coll__graph.dot | 12 - ...mand_with_c_p56_time2a__inherit__graph.dot | 12 - ...0_1_1_c_s101_1_1_single_event-members.html | 124 - ...slib60870_1_1_c_s101_1_1_single_event.html | 149 -- ..._1_1_single_point_information-members.html | 128 - ...1_c_s101_1_1_single_point_information.html | 225 -- ..._single_point_information__coll__graph.dot | 10 - ...ngle_point_information__inherit__graph.dot | 14 - ...ingle_point_with_c_p24_time2a-members.html | 131 - ...01_1_1_single_point_with_c_p24_time2a.html | 245 -- ...e_point_with_c_p24_time2a__coll__graph.dot | 12 - ...oint_with_c_p24_time2a__inherit__graph.dot | 12 - ...ingle_point_with_c_p56_time2a-members.html | 131 - ...01_1_1_single_point_with_c_p56_time2a.html | 250 -- ...e_point_with_c_p56_time2a__coll__graph.dot | 12 - ...oint_with_c_p56_time2a__inherit__graph.dot | 12 - ...lib60870_1_1_c_s101_1_1_slave-members.html | 143 -- .../classlib60870_1_1_c_s101_1_1_slave.html | 454 ---- .../classlib60870_1_1_c_s101_1_1_slave.js | 11 - ...0870_1_1_c_s101_1_1_slave__coll__graph.dot | 10 - ...0_1_1_c_s101_1_1_slave__inherit__graph.dot | 12 - ...70_1_1_c_s101_1_1_start_event-members.html | 131 - ...sslib60870_1_1_c_s101_1_1_start_event.html | 326 --- ...lasslib60870_1_1_c_s101_1_1_start_event.js | 9 - ...s_and_status_change_detection-members.html | 127 - ..._1_status_and_status_change_detection.html | 158 -- ...0_1_1_c_s101_1_1_step_command-members.html | 133 - ...slib60870_1_1_c_s101_1_1_step_command.html | 215 -- ...1_c_s101_1_1_step_command__coll__graph.dot | 12 - ..._s101_1_1_step_command__inherit__graph.dot | 14 - ...tep_command_with_c_p56_time2a-members.html | 136 - ...01_1_1_step_command_with_c_p56_time2a.html | 269 -- ...command_with_c_p56_time2a__coll__graph.dot | 14 - ...mand_with_c_p56_time2a__inherit__graph.dot | 14 - ...1_1_step_position_information-members.html | 129 - ..._c_s101_1_1_step_position_information.html | 284 --- ..._1_c_s101_1_1_step_position_information.js | 5 - ...step_position_information__coll__graph.dot | 10 - ...p_position_information__inherit__graph.dot | 15 - ...ep_position_with_c_p24_time2a-members.html | 132 - ...1_1_1_step_position_with_c_p24_time2a.html | 253 -- ...osition_with_c_p24_time2a__coll__graph.dot | 12 - ...tion_with_c_p24_time2a__inherit__graph.dot | 12 - ...ep_position_with_c_p56_time2a-members.html | 132 - ...1_1_1_step_position_with_c_p56_time2a.html | 253 -- ...osition_with_c_p56_time2a__coll__graph.dot | 12 - ...tion_with_c_p56_time2a__inherit__graph.dot | 12 - ...0_1_1_c_s101_1_1_test_command-members.html | 126 - ...slib60870_1_1_c_s101_1_1_test_command.html | 216 -- ...1_c_s101_1_1_test_command__coll__graph.dot | 10 - ..._s101_1_1_test_command__inherit__graph.dot | 10 - ...est_command_with_c_p56_time2a-members.html | 128 - ...01_1_1_test_command_with_c_p56_time2a.html | 224 -- ...s101_1_1_test_command_with_c_p56_time2a.js | 5 - ...command_with_c_p56_time2a__coll__graph.dot | 10 - ...mand_with_c_p56_time2a__inherit__graph.dot | 10 - ...1_c_s101_1_1_transparent_file-members.html | 126 - ...60870_1_1_c_s101_1_1_transparent_file.html | 384 --- ...ib60870_1_1_c_s101_1_1_transparent_file.js | 10 - ...s101_1_1_transparent_file__coll__graph.dot | 10 - ...1_1_1_transparent_file__inherit__graph.dot | 10 - ...c_s104_1_1_a_p_c_i_parameters-members.html | 124 - ...870_1_1_c_s104_1_1_a_p_c_i_parameters.html | 257 -- ...60870_1_1_c_s104_1_1_a_p_c_i_parameters.js | 9 - ..._c_s104_1_1_client_connection-members.html | 127 - ...0870_1_1_c_s104_1_1_client_connection.html | 405 --- ...b60870_1_1_c_s104_1_1_client_connection.js | 11 - ...104_1_1_client_connection__coll__graph.dot | 10 - ..._1_1_client_connection__inherit__graph.dot | 10 - ...870_1_1_c_s104_1_1_connection-members.html | 169 -- ...asslib60870_1_1_c_s104_1_1_connection.html | 1539 ----------- ...classlib60870_1_1_c_s104_1_1_connection.js | 48 - ...1_1_c_s104_1_1_connection__coll__graph.dot | 10 - ..._c_s104_1_1_connection__inherit__graph.dot | 10 - ...104_1_1_connection_statistics-members.html | 120 - ..._1_1_c_s104_1_1_connection_statistics.html | 242 -- ...70_1_1_c_s104_1_1_connection_statistics.js | 7 - ...1_c_s104_1_1_redundancy_group-members.html | 123 - ...60870_1_1_c_s104_1_1_redundancy_group.html | 309 --- ...ib60870_1_1_c_s104_1_1_redundancy_group.js | 9 - ...s104_1_1_redundancy_group__coll__graph.dot | 16 - ...ib60870_1_1_c_s104_1_1_server-members.html | 168 -- .../classlib60870_1_1_c_s104_1_1_server.html | 786 ------ .../classlib60870_1_1_c_s104_1_1_server.js | 25 - ...870_1_1_c_s104_1_1_server__coll__graph.dot | 12 - ..._1_1_c_s104_1_1_server__inherit__graph.dot | 10 - ..._1_1_tls_security_information-members.html | 128 - ...1_c_s104_1_1_tls_security_information.html | 240 -- ...1_1_c_s104_1_1_tls_security_information.js | 6 - ...0870_1_1_connection_exception-members.html | 118 - ...lasslib60870_1_1_connection_exception.html | 140 - ..._1_1_connection_exception__coll__graph.dot | 10 - ...1_connection_exception__inherit__graph.dot | 12 - .../html/classlib60870_1_1_frame-members.html | 121 - .../html/classlib60870_1_1_frame.html | 149 -- ...lasslib60870_1_1_frame__inherit__graph.dot | 10 - ...sslib60870_1_1_library_common-members.html | 120 - .../classlib60870_1_1_library_common.html | 177 -- ..._1_1_single_command_qualifier-members.html | 122 - ...lib60870_1_1_single_command_qualifier.html | 146 -- ...1_1_link_layer_busy_exception-members.html | 120 - ...nklayer_1_1_link_layer_busy_exception.html | 147 -- ...link_layer_busy_exception__coll__graph.dot | 12 - ...k_layer_busy_exception__inherit__graph.dot | 12 - ...yer_1_1_link_layer_parameters-members.html | 121 - ..._1linklayer_1_1_link_layer_parameters.html | 271 -- ..._1_1linklayer_1_1_link_layer_parameters.js | 8 - ...cp_client_virtual_serial_port-members.html | 134 - ...er_1_1_tcp_client_virtual_serial_port.html | 256 -- ...ayer_1_1_tcp_client_virtual_serial_port.js | 7 - ...lient_virtual_serial_port__coll__graph.dot | 10 - ...nt_virtual_serial_port__inherit__graph.dot | 10 - ...cp_server_virtual_serial_port-members.html | 136 - ...er_1_1_tcp_server_virtual_serial_port.html | 221 -- ...ayer_1_1_tcp_server_virtual_serial_port.js | 4 - ...erver_virtual_serial_port__coll__graph.dot | 10 - ...er_virtual_serial_port__inherit__graph.dot | 10 - doxygen/doxydoc.NET/html/clipboard.js | 61 - doxygen/doxydoc.NET/html/closed.png | Bin 132 -> 0 bytes doxygen/doxydoc.NET/html/cookie.js | 58 - .../dir_1426ccace41ffc2cc2eca9b41b45b309.html | 119 - ...r_1426ccace41ffc2cc2eca9b41b45b309_dep.dot | 17 - .../dir_3a7e63ee7cf2b5c4d7f4a7d7af5f0b48.html | 119 - ...r_3a7e63ee7cf2b5c4d7f4a7d7af5f0b48_dep.dot | 12 - .../dir_78da73360675c066effe4a54d369d8c9.html | 119 - ...r_78da73360675c066effe4a54d369d8c9_dep.dot | 12 - .../dir_81ad2ef2a5969c1913fa2b2ec7ae6d60.html | 119 - ...r_81ad2ef2a5969c1913fa2b2ec7ae6d60_dep.dot | 12 - .../dir_8ef50c26ad56f3b20d037a50a7a693a6.html | 119 - ...r_8ef50c26ad56f3b20d037a50a7a693a6_dep.dot | 12 - .../dir_93f3e8569115651ede3b56a0e65cbd1f.html | 119 - ...r_93f3e8569115651ede3b56a0e65cbd1f_dep.dot | 12 - .../dir_b0a5ae503da9b14c7a6f4a2af13537d9.html | 125 - ...r_b0a5ae503da9b14c7a6f4a2af13537d9_dep.dot | 16 - .../dir_b850c7c61d39a008cf3688cd306216ed.html | 125 - ...r_b850c7c61d39a008cf3688cd306216ed_dep.dot | 16 - .../dir_d8978c4994c85815b95534f7a21d38a3.html | 126 - .../dir_e363fa5d362eba4388eff3f3f5e37912.html | 119 - ...r_e363fa5d362eba4388eff3f3f5e37912_dep.dot | 12 - doxygen/doxydoc.NET/html/doc.svg | 12 - doxygen/doxydoc.NET/html/docd.svg | 12 - doxygen/doxydoc.NET/html/doxygen.css | 2244 ----------------- doxygen/doxydoc.NET/html/doxygen.svg | 28 - doxygen/doxydoc.NET/html/doxygen_crawl.html | 937 ------- doxygen/doxydoc.NET/html/dynsections.js | 198 -- doxygen/doxydoc.NET/html/folderclosed.svg | 11 - doxygen/doxydoc.NET/html/folderclosedd.svg | 11 - doxygen/doxydoc.NET/html/folderopen.svg | 17 - doxygen/doxydoc.NET/html/folderopend.svg | 12 - doxygen/doxydoc.NET/html/functions.html | 124 - doxygen/doxydoc.NET/html/functions_c.html | 130 - doxygen/doxydoc.NET/html/functions_d.html | 118 - doxygen/doxydoc.NET/html/functions_dup.js | 25 - doxygen/doxydoc.NET/html/functions_e.html | 118 - doxygen/doxydoc.NET/html/functions_f.html | 117 - doxygen/doxydoc.NET/html/functions_func.html | 250 -- doxygen/doxydoc.NET/html/functions_g.html | 134 - doxygen/doxydoc.NET/html/functions_h.html | 115 - doxygen/doxydoc.NET/html/functions_i.html | 124 - doxygen/doxydoc.NET/html/functions_k.html | 115 - doxygen/doxydoc.NET/html/functions_l.html | 120 - doxygen/doxydoc.NET/html/functions_m.html | 122 - doxygen/doxydoc.NET/html/functions_n.html | 116 - doxygen/doxydoc.NET/html/functions_o.html | 116 - doxygen/doxydoc.NET/html/functions_p.html | 115 - doxygen/doxydoc.NET/html/functions_prop.html | 293 --- doxygen/doxydoc.NET/html/functions_q.html | 117 - doxygen/doxydoc.NET/html/functions_r.html | 124 - doxygen/doxydoc.NET/html/functions_s.html | 174 -- doxygen/doxydoc.NET/html/functions_t.html | 128 - doxygen/doxydoc.NET/html/functions_u.html | 117 - doxygen/doxydoc.NET/html/functions_v.html | 118 - doxygen/doxydoc.NET/html/functions_vars.html | 115 - doxygen/doxydoc.NET/html/functions_w.html | 115 - doxygen/doxydoc.NET/html/functions_y.html | 115 - doxygen/doxydoc.NET/html/graph_legend.dot | 24 - doxygen/doxydoc.NET/html/graph_legend.html | 173 -- doxygen/doxydoc.NET/html/hierarchy.html | 234 -- doxygen/doxydoc.NET/html/hierarchy.js | 142 -- doxygen/doxydoc.NET/html/index.html | 114 - doxygen/doxydoc.NET/html/inherit_graph_0.dot | 17 - doxygen/doxydoc.NET/html/inherit_graph_1.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_10.dot | 11 - doxygen/doxydoc.NET/html/inherit_graph_11.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_12.dot | 17 - doxygen/doxydoc.NET/html/inherit_graph_13.dot | 141 -- doxygen/doxydoc.NET/html/inherit_graph_14.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_15.dot | 13 - doxygen/doxydoc.NET/html/inherit_graph_16.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_17.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_18.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_19.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_2.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_20.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_21.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_22.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_23.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_24.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_25.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_26.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_27.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_28.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_29.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_3.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_30.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_31.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_32.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_33.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_34.dot | 13 - doxygen/doxydoc.NET/html/inherit_graph_4.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_5.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_6.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_7.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_8.dot | 9 - doxygen/doxydoc.NET/html/inherit_graph_9.dot | 9 - doxygen/doxydoc.NET/html/inherits.html | 187 -- ..._1_c_s101_1_1_i_file_provider-members.html | 124 - ...b60870_1_1_c_s101_1_1_i_file_provider.html | 342 --- ...lib60870_1_1_c_s101_1_1_i_file_provider.js | 10 - ...01_1_1_i_file_provider__inherit__graph.dot | 10 - ..._1_c_s101_1_1_i_file_receiver-members.html | 118 - ...b60870_1_1_c_s101_1_1_i_file_receiver.html | 130 - ..._s101_1_1_i_master_connection-members.html | 120 - ...70_1_1_c_s101_1_1_i_master_connection.html | 223 -- ..._1_i_master_connection__inherit__graph.dot | 12 - ...101_1_1_i_private_i_o_factory-members.html | 118 - ..._1_1_c_s101_1_1_i_private_i_o_factory.html | 193 -- ...70_1_1_c_s101_1_1_i_private_i_o_factory.js | 5 - doxygen/doxydoc.NET/html/jquery.js | 34 - ...pace_2lib60870_8net_2lib60870_2readme.html | 133 - doxygen/doxydoc.NET/html/menu.js | 134 - doxygen/doxydoc.NET/html/menudata.js | 99 - doxygen/doxydoc.NET/html/minus.svg | 8 - doxygen/doxydoc.NET/html/minusd.svg | 8 - doxygen/doxydoc.NET/html/mz_logo.ico | Bin 55030 -> 0 bytes .../doxydoc.NET/html/namespacelib60870.html | 156 -- doxygen/doxydoc.NET/html/namespacelib60870.js | 17 - .../html/namespacelib60870_1_1_c_s101.html | 648 ----- .../html/namespacelib60870_1_1_c_s101.js | 267 -- .../html/namespacelib60870_1_1_c_s104.html | 342 --- .../html/namespacelib60870_1_1_c_s104.js | 36 - .../html/namespacelib60870_1_1linklayer.html | 249 -- .../html/namespacelib60870_1_1linklayer.js | 9 - .../doxydoc.NET/html/namespacemembers.html | 139 - .../html/namespacemembers_enum.html | 125 - .../html/namespacemembers_func.html | 126 - doxygen/doxydoc.NET/html/namespaces.html | 233 -- doxygen/doxydoc.NET/html/namespaces_dup.js | 4 - doxygen/doxydoc.NET/html/nav_f.png | Bin 153 -> 0 bytes doxygen/doxydoc.NET/html/nav_fd.png | Bin 169 -> 0 bytes doxygen/doxydoc.NET/html/nav_g.png | Bin 95 -> 0 bytes doxygen/doxydoc.NET/html/nav_h.png | Bin 98 -> 0 bytes doxygen/doxydoc.NET/html/nav_hd.png | Bin 114 -> 0 bytes doxygen/doxydoc.NET/html/navtree.css | 149 -- doxygen/doxydoc.NET/html/navtree.js | 483 ---- doxygen/doxydoc.NET/html/navtreedata.js | 66 - doxygen/doxydoc.NET/html/navtreeindex0.js | 253 -- doxygen/doxydoc.NET/html/navtreeindex1.js | 253 -- doxygen/doxydoc.NET/html/navtreeindex2.js | 253 -- doxygen/doxydoc.NET/html/navtreeindex3.js | 199 -- doxygen/doxydoc.NET/html/open.png | Bin 123 -> 0 bytes doxygen/doxydoc.NET/html/pages.html | 118 - doxygen/doxydoc.NET/html/plus.svg | 9 - doxygen/doxydoc.NET/html/plusd.svg | 9 - doxygen/doxydoc.NET/html/resize.js | 145 -- doxygen/doxydoc.NET/html/search/all_0.js | 4 - doxygen/doxydoc.NET/html/search/all_1.js | 4 - doxygen/doxydoc.NET/html/search/all_10.js | 14 - doxygen/doxydoc.NET/html/search/all_11.js | 9 - doxygen/doxydoc.NET/html/search/all_12.js | 21 - doxygen/doxydoc.NET/html/search/all_13.js | 93 - doxygen/doxydoc.NET/html/search/all_14.js | 26 - doxygen/doxydoc.NET/html/search/all_15.js | 6 - doxygen/doxydoc.NET/html/search/all_16.js | 8 - doxygen/doxydoc.NET/html/search/all_17.js | 4 - doxygen/doxydoc.NET/html/search/all_18.js | 4 - doxygen/doxydoc.NET/html/search/all_2.js | 24 - doxygen/doxydoc.NET/html/search/all_3.js | 9 - doxygen/doxydoc.NET/html/search/all_4.js | 43 - doxygen/doxydoc.NET/html/search/all_5.js | 15 - doxygen/doxydoc.NET/html/search/all_6.js | 11 - doxygen/doxydoc.NET/html/search/all_7.js | 15 - doxygen/doxydoc.NET/html/search/all_8.js | 23 - doxygen/doxydoc.NET/html/search/all_9.js | 4 - doxygen/doxydoc.NET/html/search/all_a.js | 25 - doxygen/doxydoc.NET/html/search/all_b.js | 4 - doxygen/doxydoc.NET/html/search/all_c.js | 21 - doxygen/doxydoc.NET/html/search/all_d.js | 23 - doxygen/doxydoc.NET/html/search/all_e.js | 7 - doxygen/doxydoc.NET/html/search/all_f.js | 7 - doxygen/doxydoc.NET/html/search/classes_0.js | 9 - doxygen/doxydoc.NET/html/search/classes_1.js | 9 - doxygen/doxydoc.NET/html/search/classes_2.js | 15 - doxygen/doxydoc.NET/html/search/classes_3.js | 9 - doxygen/doxydoc.NET/html/search/classes_4.js | 6 - doxygen/doxydoc.NET/html/search/classes_5.js | 11 - doxygen/doxydoc.NET/html/search/classes_6.js | 12 - doxygen/doxydoc.NET/html/search/classes_7.js | 6 - doxygen/doxydoc.NET/html/search/classes_8.js | 14 - doxygen/doxydoc.NET/html/search/classes_9.js | 4 - doxygen/doxydoc.NET/html/search/classes_a.js | 13 - doxygen/doxydoc.NET/html/search/classes_b.js | 6 - doxygen/doxydoc.NET/html/search/classes_c.js | 6 - doxygen/doxydoc.NET/html/search/classes_d.js | 28 - doxygen/doxydoc.NET/html/search/classes_e.js | 9 - doxygen/doxydoc.NET/html/search/close.svg | 18 - doxygen/doxydoc.NET/html/search/enums_0.js | 4 - doxygen/doxydoc.NET/html/search/enums_1.js | 6 - doxygen/doxydoc.NET/html/search/enums_2.js | 4 - doxygen/doxydoc.NET/html/search/enums_3.js | 4 - doxygen/doxydoc.NET/html/search/enums_4.js | 4 - doxygen/doxydoc.NET/html/search/enums_5.js | 4 - doxygen/doxydoc.NET/html/search/enums_6.js | 4 - doxygen/doxydoc.NET/html/search/enums_7.js | 6 - doxygen/doxydoc.NET/html/search/enums_8.js | 4 - .../doxydoc.NET/html/search/enumvalues_0.js | 4 - .../doxydoc.NET/html/search/enumvalues_1.js | 6 - .../doxydoc.NET/html/search/enumvalues_2.js | 5 - .../doxydoc.NET/html/search/enumvalues_3.js | 5 - .../doxydoc.NET/html/search/enumvalues_4.js | 4 - .../doxydoc.NET/html/search/enumvalues_5.js | 4 - .../doxydoc.NET/html/search/enumvalues_6.js | 6 - .../doxydoc.NET/html/search/enumvalues_7.js | 4 - .../doxydoc.NET/html/search/functions_0.js | 10 - .../doxydoc.NET/html/search/functions_1.js | 12 - .../doxydoc.NET/html/search/functions_2.js | 5 - .../doxydoc.NET/html/search/functions_3.js | 6 - .../doxydoc.NET/html/search/functions_4.js | 5 - .../doxydoc.NET/html/search/functions_5.js | 21 - .../doxydoc.NET/html/search/functions_6.js | 8 - .../doxydoc.NET/html/search/functions_7.js | 5 - .../doxydoc.NET/html/search/functions_8.js | 5 - .../doxydoc.NET/html/search/functions_9.js | 10 - .../doxydoc.NET/html/search/functions_a.js | 44 - .../doxydoc.NET/html/search/functions_b.js | 6 - .../doxydoc.NET/html/search/functions_c.js | 4 - doxygen/doxydoc.NET/html/search/mag.svg | 24 - doxygen/doxydoc.NET/html/search/mag_d.svg | 24 - doxygen/doxydoc.NET/html/search/mag_sel.svg | 31 - doxygen/doxydoc.NET/html/search/mag_seld.svg | 31 - .../doxydoc.NET/html/search/namespaces_0.js | 7 - doxygen/doxydoc.NET/html/search/pages_0.js | 4 - doxygen/doxydoc.NET/html/search/pages_1.js | 4 - doxygen/doxydoc.NET/html/search/pages_2.js | 4 - doxygen/doxydoc.NET/html/search/pages_3.js | 4 - doxygen/doxydoc.NET/html/search/pages_4.js | 4 - doxygen/doxydoc.NET/html/search/pages_5.js | 4 - .../doxydoc.NET/html/search/properties_0.js | 8 - .../doxydoc.NET/html/search/properties_1.js | 15 - .../doxydoc.NET/html/search/properties_10.js | 22 - .../doxydoc.NET/html/search/properties_11.js | 15 - .../doxydoc.NET/html/search/properties_12.js | 5 - .../doxydoc.NET/html/search/properties_13.js | 4 - .../doxydoc.NET/html/search/properties_14.js | 4 - .../doxydoc.NET/html/search/properties_15.js | 4 - .../doxydoc.NET/html/search/properties_2.js | 6 - .../doxydoc.NET/html/search/properties_3.js | 4 - .../doxydoc.NET/html/search/properties_4.js | 5 - .../doxydoc.NET/html/search/properties_5.js | 5 - .../doxydoc.NET/html/search/properties_6.js | 4 - .../doxydoc.NET/html/search/properties_7.js | 10 - .../doxydoc.NET/html/search/properties_8.js | 4 - .../doxydoc.NET/html/search/properties_9.js | 8 - .../doxydoc.NET/html/search/properties_a.js | 9 - .../doxydoc.NET/html/search/properties_b.js | 5 - .../doxydoc.NET/html/search/properties_c.js | 5 - .../doxydoc.NET/html/search/properties_d.js | 4 - .../doxydoc.NET/html/search/properties_e.js | 6 - .../doxydoc.NET/html/search/properties_f.js | 9 - doxygen/doxydoc.NET/html/search/search.css | 291 --- doxygen/doxydoc.NET/html/search/search.js | 694 ----- doxygen/doxydoc.NET/html/search/searchdata.js | 39 - .../doxydoc.NET/html/search/variables_0.js | 6 - doxygen/doxydoc.NET/html/splitbar.png | Bin 314 -> 0 bytes doxygen/doxydoc.NET/html/splitbard.png | Bin 282 -> 0 bytes doxygen/doxydoc.NET/html/sync_off.png | Bin 853 -> 0 bytes doxygen/doxydoc.NET/html/sync_on.png | Bin 845 -> 0 bytes doxygen/doxydoc.NET/html/tab_a.png | Bin 142 -> 0 bytes doxygen/doxydoc.NET/html/tab_ad.png | Bin 135 -> 0 bytes doxygen/doxydoc.NET/html/tab_b.png | Bin 169 -> 0 bytes doxygen/doxydoc.NET/html/tab_bd.png | Bin 173 -> 0 bytes doxygen/doxydoc.NET/html/tab_h.png | Bin 177 -> 0 bytes doxygen/doxydoc.NET/html/tab_hd.png | Bin 180 -> 0 bytes doxygen/doxydoc.NET/html/tab_s.png | Bin 184 -> 0 bytes doxygen/doxydoc.NET/html/tab_sd.png | Bin 188 -> 0 bytes doxygen/doxydoc.NET/html/tabs.css | 1 - 690 files changed, 63741 deletions(-) delete mode 100644 doxygen/doxydoc.NET/html/annotated.html delete mode 100644 doxygen/doxydoc.NET/html/annotated_dup.js delete mode 100644 doxygen/doxydoc.NET/html/bc_s.png delete mode 100644 doxygen/doxydoc.NET/html/bc_sd.png delete mode 100644 doxygen/doxydoc.NET/html/classes.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_queue-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_queue.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_p16_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_p16_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_p24_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_p24_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_p24_time2a.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_p32_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_p32_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_p32_time2a.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_p56_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_p56_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_p56_time2a.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_application_layer_parameters-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_application_layer_parameters.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_binary_counter_reading-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_binary_counter_reading.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_binary_counter_reading.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_files_available-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_files_available.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_files_available.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_output_circuit_info-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_output_circuit_info.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_output_circuit_info.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_private_information_object_types-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_private_information_object_types.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_qualifier_of_interrogation-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_qualifier_of_interrogation.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor_p-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor_p.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_scaled_value-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_scaled_value.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_qualifier-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_qualifier.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_event-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_event.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_start_event-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_start_event.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_start_event.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_status_and_status_change_detection-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_status_and_status_change_detection.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection_statistics-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection_statistics.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection_statistics.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_tls_security_information-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_tls_security_information.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_tls_security_information.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_frame-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_frame.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_frame__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_library_common-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_library_common.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_single_command_qualifier-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1_single_command_qualifier.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_parameters-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_parameters.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_parameters.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port-members.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.html delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.js delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port__coll__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/clipboard.js delete mode 100644 doxygen/doxydoc.NET/html/closed.png delete mode 100644 doxygen/doxydoc.NET/html/cookie.js delete mode 100644 doxygen/doxydoc.NET/html/dir_1426ccace41ffc2cc2eca9b41b45b309.html delete mode 100644 doxygen/doxydoc.NET/html/dir_1426ccace41ffc2cc2eca9b41b45b309_dep.dot delete mode 100644 doxygen/doxydoc.NET/html/dir_3a7e63ee7cf2b5c4d7f4a7d7af5f0b48.html delete mode 100644 doxygen/doxydoc.NET/html/dir_3a7e63ee7cf2b5c4d7f4a7d7af5f0b48_dep.dot delete mode 100644 doxygen/doxydoc.NET/html/dir_78da73360675c066effe4a54d369d8c9.html delete mode 100644 doxygen/doxydoc.NET/html/dir_78da73360675c066effe4a54d369d8c9_dep.dot delete mode 100644 doxygen/doxydoc.NET/html/dir_81ad2ef2a5969c1913fa2b2ec7ae6d60.html delete mode 100644 doxygen/doxydoc.NET/html/dir_81ad2ef2a5969c1913fa2b2ec7ae6d60_dep.dot delete mode 100644 doxygen/doxydoc.NET/html/dir_8ef50c26ad56f3b20d037a50a7a693a6.html delete mode 100644 doxygen/doxydoc.NET/html/dir_8ef50c26ad56f3b20d037a50a7a693a6_dep.dot delete mode 100644 doxygen/doxydoc.NET/html/dir_93f3e8569115651ede3b56a0e65cbd1f.html delete mode 100644 doxygen/doxydoc.NET/html/dir_93f3e8569115651ede3b56a0e65cbd1f_dep.dot delete mode 100644 doxygen/doxydoc.NET/html/dir_b0a5ae503da9b14c7a6f4a2af13537d9.html delete mode 100644 doxygen/doxydoc.NET/html/dir_b0a5ae503da9b14c7a6f4a2af13537d9_dep.dot delete mode 100644 doxygen/doxydoc.NET/html/dir_b850c7c61d39a008cf3688cd306216ed.html delete mode 100644 doxygen/doxydoc.NET/html/dir_b850c7c61d39a008cf3688cd306216ed_dep.dot delete mode 100644 doxygen/doxydoc.NET/html/dir_d8978c4994c85815b95534f7a21d38a3.html delete mode 100644 doxygen/doxydoc.NET/html/dir_e363fa5d362eba4388eff3f3f5e37912.html delete mode 100644 doxygen/doxydoc.NET/html/dir_e363fa5d362eba4388eff3f3f5e37912_dep.dot delete mode 100644 doxygen/doxydoc.NET/html/doc.svg delete mode 100644 doxygen/doxydoc.NET/html/docd.svg delete mode 100644 doxygen/doxydoc.NET/html/doxygen.css delete mode 100644 doxygen/doxydoc.NET/html/doxygen.svg delete mode 100644 doxygen/doxydoc.NET/html/doxygen_crawl.html delete mode 100644 doxygen/doxydoc.NET/html/dynsections.js delete mode 100644 doxygen/doxydoc.NET/html/folderclosed.svg delete mode 100644 doxygen/doxydoc.NET/html/folderclosedd.svg delete mode 100644 doxygen/doxydoc.NET/html/folderopen.svg delete mode 100644 doxygen/doxydoc.NET/html/folderopend.svg delete mode 100644 doxygen/doxydoc.NET/html/functions.html delete mode 100644 doxygen/doxydoc.NET/html/functions_c.html delete mode 100644 doxygen/doxydoc.NET/html/functions_d.html delete mode 100644 doxygen/doxydoc.NET/html/functions_dup.js delete mode 100644 doxygen/doxydoc.NET/html/functions_e.html delete mode 100644 doxygen/doxydoc.NET/html/functions_f.html delete mode 100644 doxygen/doxydoc.NET/html/functions_func.html delete mode 100644 doxygen/doxydoc.NET/html/functions_g.html delete mode 100644 doxygen/doxydoc.NET/html/functions_h.html delete mode 100644 doxygen/doxydoc.NET/html/functions_i.html delete mode 100644 doxygen/doxydoc.NET/html/functions_k.html delete mode 100644 doxygen/doxydoc.NET/html/functions_l.html delete mode 100644 doxygen/doxydoc.NET/html/functions_m.html delete mode 100644 doxygen/doxydoc.NET/html/functions_n.html delete mode 100644 doxygen/doxydoc.NET/html/functions_o.html delete mode 100644 doxygen/doxydoc.NET/html/functions_p.html delete mode 100644 doxygen/doxydoc.NET/html/functions_prop.html delete mode 100644 doxygen/doxydoc.NET/html/functions_q.html delete mode 100644 doxygen/doxydoc.NET/html/functions_r.html delete mode 100644 doxygen/doxydoc.NET/html/functions_s.html delete mode 100644 doxygen/doxydoc.NET/html/functions_t.html delete mode 100644 doxygen/doxydoc.NET/html/functions_u.html delete mode 100644 doxygen/doxydoc.NET/html/functions_v.html delete mode 100644 doxygen/doxydoc.NET/html/functions_vars.html delete mode 100644 doxygen/doxydoc.NET/html/functions_w.html delete mode 100644 doxygen/doxydoc.NET/html/functions_y.html delete mode 100644 doxygen/doxydoc.NET/html/graph_legend.dot delete mode 100644 doxygen/doxydoc.NET/html/graph_legend.html delete mode 100644 doxygen/doxydoc.NET/html/hierarchy.html delete mode 100644 doxygen/doxydoc.NET/html/hierarchy.js delete mode 100644 doxygen/doxydoc.NET/html/index.html delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_0.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_1.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_10.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_11.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_12.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_13.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_14.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_15.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_16.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_17.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_18.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_19.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_2.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_20.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_21.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_22.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_23.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_24.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_25.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_26.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_27.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_28.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_29.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_3.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_30.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_31.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_32.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_33.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_34.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_4.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_5.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_6.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_7.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_8.dot delete mode 100644 doxygen/doxydoc.NET/html/inherit_graph_9.dot delete mode 100644 doxygen/doxydoc.NET/html/inherits.html delete mode 100644 doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider-members.html delete mode 100644 doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider.html delete mode 100644 doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider.js delete mode 100644 doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_receiver-members.html delete mode 100644 doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_receiver.html delete mode 100644 doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_master_connection-members.html delete mode 100644 doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_master_connection.html delete mode 100644 doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_master_connection__inherit__graph.dot delete mode 100644 doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory-members.html delete mode 100644 doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html delete mode 100644 doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.js delete mode 100644 doxygen/doxydoc.NET/html/jquery.js delete mode 100644 doxygen/doxydoc.NET/html/md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html delete mode 100644 doxygen/doxydoc.NET/html/menu.js delete mode 100644 doxygen/doxydoc.NET/html/menudata.js delete mode 100644 doxygen/doxydoc.NET/html/minus.svg delete mode 100644 doxygen/doxydoc.NET/html/minusd.svg delete mode 100644 doxygen/doxydoc.NET/html/mz_logo.ico delete mode 100644 doxygen/doxydoc.NET/html/namespacelib60870.html delete mode 100644 doxygen/doxydoc.NET/html/namespacelib60870.js delete mode 100644 doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s101.html delete mode 100644 doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s101.js delete mode 100644 doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s104.html delete mode 100644 doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s104.js delete mode 100644 doxygen/doxydoc.NET/html/namespacelib60870_1_1linklayer.html delete mode 100644 doxygen/doxydoc.NET/html/namespacelib60870_1_1linklayer.js delete mode 100644 doxygen/doxydoc.NET/html/namespacemembers.html delete mode 100644 doxygen/doxydoc.NET/html/namespacemembers_enum.html delete mode 100644 doxygen/doxydoc.NET/html/namespacemembers_func.html delete mode 100644 doxygen/doxydoc.NET/html/namespaces.html delete mode 100644 doxygen/doxydoc.NET/html/namespaces_dup.js delete mode 100644 doxygen/doxydoc.NET/html/nav_f.png delete mode 100644 doxygen/doxydoc.NET/html/nav_fd.png delete mode 100644 doxygen/doxydoc.NET/html/nav_g.png delete mode 100644 doxygen/doxydoc.NET/html/nav_h.png delete mode 100644 doxygen/doxydoc.NET/html/nav_hd.png delete mode 100644 doxygen/doxydoc.NET/html/navtree.css delete mode 100644 doxygen/doxydoc.NET/html/navtree.js delete mode 100644 doxygen/doxydoc.NET/html/navtreedata.js delete mode 100644 doxygen/doxydoc.NET/html/navtreeindex0.js delete mode 100644 doxygen/doxydoc.NET/html/navtreeindex1.js delete mode 100644 doxygen/doxydoc.NET/html/navtreeindex2.js delete mode 100644 doxygen/doxydoc.NET/html/navtreeindex3.js delete mode 100644 doxygen/doxydoc.NET/html/open.png delete mode 100644 doxygen/doxydoc.NET/html/pages.html delete mode 100644 doxygen/doxydoc.NET/html/plus.svg delete mode 100644 doxygen/doxydoc.NET/html/plusd.svg delete mode 100644 doxygen/doxydoc.NET/html/resize.js delete mode 100644 doxygen/doxydoc.NET/html/search/all_0.js delete mode 100644 doxygen/doxydoc.NET/html/search/all_1.js delete mode 100644 doxygen/doxydoc.NET/html/search/all_10.js delete mode 100644 doxygen/doxydoc.NET/html/search/all_11.js delete mode 100644 doxygen/doxydoc.NET/html/search/all_12.js delete mode 100644 doxygen/doxydoc.NET/html/search/all_13.js delete mode 100644 doxygen/doxydoc.NET/html/search/all_14.js delete mode 100644 doxygen/doxydoc.NET/html/search/all_15.js delete mode 100644 doxygen/doxydoc.NET/html/search/all_16.js delete mode 100644 doxygen/doxydoc.NET/html/search/all_17.js delete mode 100644 doxygen/doxydoc.NET/html/search/all_18.js delete mode 100644 doxygen/doxydoc.NET/html/search/all_2.js delete mode 100644 doxygen/doxydoc.NET/html/search/all_3.js delete mode 100644 doxygen/doxydoc.NET/html/search/all_4.js delete mode 100644 doxygen/doxydoc.NET/html/search/all_5.js delete mode 100644 doxygen/doxydoc.NET/html/search/all_6.js delete mode 100644 doxygen/doxydoc.NET/html/search/all_7.js delete mode 100644 doxygen/doxydoc.NET/html/search/all_8.js delete mode 100644 doxygen/doxydoc.NET/html/search/all_9.js delete mode 100644 doxygen/doxydoc.NET/html/search/all_a.js delete mode 100644 doxygen/doxydoc.NET/html/search/all_b.js delete mode 100644 doxygen/doxydoc.NET/html/search/all_c.js delete mode 100644 doxygen/doxydoc.NET/html/search/all_d.js delete mode 100644 doxygen/doxydoc.NET/html/search/all_e.js delete mode 100644 doxygen/doxydoc.NET/html/search/all_f.js delete mode 100644 doxygen/doxydoc.NET/html/search/classes_0.js delete mode 100644 doxygen/doxydoc.NET/html/search/classes_1.js delete mode 100644 doxygen/doxydoc.NET/html/search/classes_2.js delete mode 100644 doxygen/doxydoc.NET/html/search/classes_3.js delete mode 100644 doxygen/doxydoc.NET/html/search/classes_4.js delete mode 100644 doxygen/doxydoc.NET/html/search/classes_5.js delete mode 100644 doxygen/doxydoc.NET/html/search/classes_6.js delete mode 100644 doxygen/doxydoc.NET/html/search/classes_7.js delete mode 100644 doxygen/doxydoc.NET/html/search/classes_8.js delete mode 100644 doxygen/doxydoc.NET/html/search/classes_9.js delete mode 100644 doxygen/doxydoc.NET/html/search/classes_a.js delete mode 100644 doxygen/doxydoc.NET/html/search/classes_b.js delete mode 100644 doxygen/doxydoc.NET/html/search/classes_c.js delete mode 100644 doxygen/doxydoc.NET/html/search/classes_d.js delete mode 100644 doxygen/doxydoc.NET/html/search/classes_e.js delete mode 100644 doxygen/doxydoc.NET/html/search/close.svg delete mode 100644 doxygen/doxydoc.NET/html/search/enums_0.js delete mode 100644 doxygen/doxydoc.NET/html/search/enums_1.js delete mode 100644 doxygen/doxydoc.NET/html/search/enums_2.js delete mode 100644 doxygen/doxydoc.NET/html/search/enums_3.js delete mode 100644 doxygen/doxydoc.NET/html/search/enums_4.js delete mode 100644 doxygen/doxydoc.NET/html/search/enums_5.js delete mode 100644 doxygen/doxydoc.NET/html/search/enums_6.js delete mode 100644 doxygen/doxydoc.NET/html/search/enums_7.js delete mode 100644 doxygen/doxydoc.NET/html/search/enums_8.js delete mode 100644 doxygen/doxydoc.NET/html/search/enumvalues_0.js delete mode 100644 doxygen/doxydoc.NET/html/search/enumvalues_1.js delete mode 100644 doxygen/doxydoc.NET/html/search/enumvalues_2.js delete mode 100644 doxygen/doxydoc.NET/html/search/enumvalues_3.js delete mode 100644 doxygen/doxydoc.NET/html/search/enumvalues_4.js delete mode 100644 doxygen/doxydoc.NET/html/search/enumvalues_5.js delete mode 100644 doxygen/doxydoc.NET/html/search/enumvalues_6.js delete mode 100644 doxygen/doxydoc.NET/html/search/enumvalues_7.js delete mode 100644 doxygen/doxydoc.NET/html/search/functions_0.js delete mode 100644 doxygen/doxydoc.NET/html/search/functions_1.js delete mode 100644 doxygen/doxydoc.NET/html/search/functions_2.js delete mode 100644 doxygen/doxydoc.NET/html/search/functions_3.js delete mode 100644 doxygen/doxydoc.NET/html/search/functions_4.js delete mode 100644 doxygen/doxydoc.NET/html/search/functions_5.js delete mode 100644 doxygen/doxydoc.NET/html/search/functions_6.js delete mode 100644 doxygen/doxydoc.NET/html/search/functions_7.js delete mode 100644 doxygen/doxydoc.NET/html/search/functions_8.js delete mode 100644 doxygen/doxydoc.NET/html/search/functions_9.js delete mode 100644 doxygen/doxydoc.NET/html/search/functions_a.js delete mode 100644 doxygen/doxydoc.NET/html/search/functions_b.js delete mode 100644 doxygen/doxydoc.NET/html/search/functions_c.js delete mode 100644 doxygen/doxydoc.NET/html/search/mag.svg delete mode 100644 doxygen/doxydoc.NET/html/search/mag_d.svg delete mode 100644 doxygen/doxydoc.NET/html/search/mag_sel.svg delete mode 100644 doxygen/doxydoc.NET/html/search/mag_seld.svg delete mode 100644 doxygen/doxydoc.NET/html/search/namespaces_0.js delete mode 100644 doxygen/doxydoc.NET/html/search/pages_0.js delete mode 100644 doxygen/doxydoc.NET/html/search/pages_1.js delete mode 100644 doxygen/doxydoc.NET/html/search/pages_2.js delete mode 100644 doxygen/doxydoc.NET/html/search/pages_3.js delete mode 100644 doxygen/doxydoc.NET/html/search/pages_4.js delete mode 100644 doxygen/doxydoc.NET/html/search/pages_5.js delete mode 100644 doxygen/doxydoc.NET/html/search/properties_0.js delete mode 100644 doxygen/doxydoc.NET/html/search/properties_1.js delete mode 100644 doxygen/doxydoc.NET/html/search/properties_10.js delete mode 100644 doxygen/doxydoc.NET/html/search/properties_11.js delete mode 100644 doxygen/doxydoc.NET/html/search/properties_12.js delete mode 100644 doxygen/doxydoc.NET/html/search/properties_13.js delete mode 100644 doxygen/doxydoc.NET/html/search/properties_14.js delete mode 100644 doxygen/doxydoc.NET/html/search/properties_15.js delete mode 100644 doxygen/doxydoc.NET/html/search/properties_2.js delete mode 100644 doxygen/doxydoc.NET/html/search/properties_3.js delete mode 100644 doxygen/doxydoc.NET/html/search/properties_4.js delete mode 100644 doxygen/doxydoc.NET/html/search/properties_5.js delete mode 100644 doxygen/doxydoc.NET/html/search/properties_6.js delete mode 100644 doxygen/doxydoc.NET/html/search/properties_7.js delete mode 100644 doxygen/doxydoc.NET/html/search/properties_8.js delete mode 100644 doxygen/doxydoc.NET/html/search/properties_9.js delete mode 100644 doxygen/doxydoc.NET/html/search/properties_a.js delete mode 100644 doxygen/doxydoc.NET/html/search/properties_b.js delete mode 100644 doxygen/doxydoc.NET/html/search/properties_c.js delete mode 100644 doxygen/doxydoc.NET/html/search/properties_d.js delete mode 100644 doxygen/doxydoc.NET/html/search/properties_e.js delete mode 100644 doxygen/doxydoc.NET/html/search/properties_f.js delete mode 100644 doxygen/doxydoc.NET/html/search/search.css delete mode 100644 doxygen/doxydoc.NET/html/search/search.js delete mode 100644 doxygen/doxydoc.NET/html/search/searchdata.js delete mode 100644 doxygen/doxydoc.NET/html/search/variables_0.js delete mode 100644 doxygen/doxydoc.NET/html/splitbar.png delete mode 100644 doxygen/doxydoc.NET/html/splitbard.png delete mode 100644 doxygen/doxydoc.NET/html/sync_off.png delete mode 100644 doxygen/doxydoc.NET/html/sync_on.png delete mode 100644 doxygen/doxydoc.NET/html/tab_a.png delete mode 100644 doxygen/doxydoc.NET/html/tab_ad.png delete mode 100644 doxygen/doxydoc.NET/html/tab_b.png delete mode 100644 doxygen/doxydoc.NET/html/tab_bd.png delete mode 100644 doxygen/doxydoc.NET/html/tab_h.png delete mode 100644 doxygen/doxydoc.NET/html/tab_hd.png delete mode 100644 doxygen/doxydoc.NET/html/tab_s.png delete mode 100644 doxygen/doxydoc.NET/html/tab_sd.png delete mode 100644 doxygen/doxydoc.NET/html/tabs.css diff --git a/doxygen/doxydoc.NET/html/annotated.html b/doxygen/doxydoc.NET/html/annotated.html deleted file mode 100644 index d2fe42f..0000000 --- a/doxygen/doxydoc.NET/html/annotated.html +++ /dev/null @@ -1,233 +0,0 @@ - - - - - - - -lib60870.NET: Class List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Class List
    -
    -
    -
    Here are the classes, structs, unions and interfaces with brief descriptions:
    -
    [detail level 123]
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     Nlib60870
     NCS101
     NCS104
     Nlinklayer
     CASDUParsingException
     CASDUQueue
     CConnectionException
     CCP16Time2a
     CCP24Time2a
     CCP32Time2a
     CCP56Time2a
     CFrameAbstract class to encode an application layer frame
     CLibraryCommonCommon information functions about the library
     CSingleCommandQualifier
    -
    -
    -
    - -
    - - diff --git a/doxygen/doxydoc.NET/html/annotated_dup.js b/doxygen/doxydoc.NET/html/annotated_dup.js deleted file mode 100644 index be6034f..0000000 --- a/doxygen/doxydoc.NET/html/annotated_dup.js +++ /dev/null @@ -1,123 +0,0 @@ -var annotated_dup = -[ - [ "lib60870", "namespacelib60870.html", [ - [ "CS101", "namespacelib60870_1_1_c_s101.html", [ - [ "ApplicationLayerParameters", "classlib60870_1_1_c_s101_1_1_application_layer_parameters.html", null ], - [ "ASDU", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html", "classlib60870_1_1_c_s101_1_1_a_s_d_u" ], - [ "ASDUQueueException", "classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception.html", null ], - [ "BinaryCounterReading", "classlib60870_1_1_c_s101_1_1_binary_counter_reading.html", "classlib60870_1_1_c_s101_1_1_binary_counter_reading" ], - [ "Bitstring32", "classlib60870_1_1_c_s101_1_1_bitstring32.html", null ], - [ "Bitstring32Command", "classlib60870_1_1_c_s101_1_1_bitstring32_command.html", null ], - [ "Bitstring32CommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a.html", null ], - [ "Bitstring32WithCP24Time2a", "classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a.html", null ], - [ "Bitstring32WithCP56Time2a", "classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a.html", null ], - [ "ClockSynchronizationCommand", "classlib60870_1_1_c_s101_1_1_clock_synchronization_command.html", null ], - [ "CounterInterrogationCommand", "classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html", "classlib60870_1_1_c_s101_1_1_counter_interrogation_command" ], - [ "CS101Master", "classlib60870_1_1_c_s101_1_1_c_s101_master.html", "classlib60870_1_1_c_s101_1_1_c_s101_master" ], - [ "CS101Slave", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html", "classlib60870_1_1_c_s101_1_1_c_s101_slave" ], - [ "DelayAcquisitionCommand", "classlib60870_1_1_c_s101_1_1_delay_acquisition_command.html", null ], - [ "DoubleCommand", "classlib60870_1_1_c_s101_1_1_double_command.html", null ], - [ "DoubleCommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a.html", null ], - [ "DoublePointInformation", "classlib60870_1_1_c_s101_1_1_double_point_information.html", null ], - [ "DoublePointWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a.html", null ], - [ "DoublePointWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a.html", null ], - [ "EndOfInitialization", "classlib60870_1_1_c_s101_1_1_end_of_initialization.html", "classlib60870_1_1_c_s101_1_1_end_of_initialization" ], - [ "EventOfProtectionEquipment", "classlib60870_1_1_c_s101_1_1_event_of_protection_equipment.html", null ], - [ "EventOfProtectionEquipmentWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a.html", null ], - [ "FileACK", "classlib60870_1_1_c_s101_1_1_file_a_c_k.html", "classlib60870_1_1_c_s101_1_1_file_a_c_k" ], - [ "FileCallOrSelect", "classlib60870_1_1_c_s101_1_1_file_call_or_select.html", "classlib60870_1_1_c_s101_1_1_file_call_or_select" ], - [ "FileDirectory", "classlib60870_1_1_c_s101_1_1_file_directory.html", "classlib60870_1_1_c_s101_1_1_file_directory" ], - [ "FileLastSegmentOrSection", "classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html", "classlib60870_1_1_c_s101_1_1_file_last_segment_or_section" ], - [ "FileReady", "classlib60870_1_1_c_s101_1_1_file_ready.html", "classlib60870_1_1_c_s101_1_1_file_ready" ], - [ "FilesAvailable", "classlib60870_1_1_c_s101_1_1_files_available.html", "classlib60870_1_1_c_s101_1_1_files_available" ], - [ "FileSegment", "classlib60870_1_1_c_s101_1_1_file_segment.html", null ], - [ "IFileProvider", "interfacelib60870_1_1_c_s101_1_1_i_file_provider.html", "interfacelib60870_1_1_c_s101_1_1_i_file_provider" ], - [ "IFileReceiver", "interfacelib60870_1_1_c_s101_1_1_i_file_receiver.html", null ], - [ "IMasterConnection", "interfacelib60870_1_1_c_s101_1_1_i_master_connection.html", null ], - [ "InformationObject", "classlib60870_1_1_c_s101_1_1_information_object.html", "classlib60870_1_1_c_s101_1_1_information_object" ], - [ "IntegratedTotals", "classlib60870_1_1_c_s101_1_1_integrated_totals.html", null ], - [ "IntegratedTotalsWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a.html", null ], - [ "IntegratedTotalsWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a.html", null ], - [ "InterrogationCommand", "classlib60870_1_1_c_s101_1_1_interrogation_command.html", null ], - [ "IPrivateIOFactory", "interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html", "interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory" ], - [ "Master", "classlib60870_1_1_c_s101_1_1_master.html", "classlib60870_1_1_c_s101_1_1_master" ], - [ "MeasuredValueNormalized", "classlib60870_1_1_c_s101_1_1_measured_value_normalized.html", null ], - [ "MeasuredValueNormalizedWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a.html", null ], - [ "MeasuredValueNormalizedWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a.html", null ], - [ "MeasuredValueNormalizedWithoutQuality", "classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html", null ], - [ "MeasuredValueScaled", "classlib60870_1_1_c_s101_1_1_measured_value_scaled.html", "classlib60870_1_1_c_s101_1_1_measured_value_scaled" ], - [ "MeasuredValueScaledWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a.html", null ], - [ "MeasuredValueScaledWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a.html", null ], - [ "MeasuredValueShort", "classlib60870_1_1_c_s101_1_1_measured_value_short.html", null ], - [ "MeasuredValueShortWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a.html", null ], - [ "MeasuredValueShortWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a.html", null ], - [ "OutputCircuitInfo", "classlib60870_1_1_c_s101_1_1_output_circuit_info.html", "classlib60870_1_1_c_s101_1_1_output_circuit_info" ], - [ "PackedOutputCircuitInfo", "classlib60870_1_1_c_s101_1_1_packed_output_circuit_info.html", null ], - [ "PackedOutputCircuitInfoWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a.html", null ], - [ "PackedSinglePointWithSCD", "classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d.html", null ], - [ "PackedStartEventsOfProtectionEquipment", "classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment.html", null ], - [ "PackedStartEventsOfProtectionEquipmentWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a.html", null ], - [ "ParameterActivation", "classlib60870_1_1_c_s101_1_1_parameter_activation.html", "classlib60870_1_1_c_s101_1_1_parameter_activation" ], - [ "ParameterFloatValue", "classlib60870_1_1_c_s101_1_1_parameter_float_value.html", null ], - [ "ParameterNormalizedValue", "classlib60870_1_1_c_s101_1_1_parameter_normalized_value.html", null ], - [ "ParameterScaledValue", "classlib60870_1_1_c_s101_1_1_parameter_scaled_value.html", null ], - [ "PrivateInformationObjectTypes", "classlib60870_1_1_c_s101_1_1_private_information_object_types.html", null ], - [ "QualifierOfInterrogation", "classlib60870_1_1_c_s101_1_1_qualifier_of_interrogation.html", null ], - [ "QualityDescriptor", "classlib60870_1_1_c_s101_1_1_quality_descriptor.html", null ], - [ "QualityDescriptorP", "classlib60870_1_1_c_s101_1_1_quality_descriptor_p.html", null ], - [ "ReadCommand", "classlib60870_1_1_c_s101_1_1_read_command.html", null ], - [ "ResetProcessCommand", "classlib60870_1_1_c_s101_1_1_reset_process_command.html", "classlib60870_1_1_c_s101_1_1_reset_process_command" ], - [ "ScaledValue", "classlib60870_1_1_c_s101_1_1_scaled_value.html", null ], - [ "SectionReady", "classlib60870_1_1_c_s101_1_1_section_ready.html", "classlib60870_1_1_c_s101_1_1_section_ready" ], - [ "SetpointCommandNormalized", "classlib60870_1_1_c_s101_1_1_setpoint_command_normalized.html", null ], - [ "SetpointCommandNormalizedWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a.html", null ], - [ "SetpointCommandQualifier", "classlib60870_1_1_c_s101_1_1_setpoint_command_qualifier.html", null ], - [ "SetpointCommandScaled", "classlib60870_1_1_c_s101_1_1_setpoint_command_scaled.html", null ], - [ "SetpointCommandScaledWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a.html", null ], - [ "SetpointCommandShort", "classlib60870_1_1_c_s101_1_1_setpoint_command_short.html", null ], - [ "SetpointCommandShortWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a.html", null ], - [ "SingleCommand", "classlib60870_1_1_c_s101_1_1_single_command.html", "classlib60870_1_1_c_s101_1_1_single_command" ], - [ "SingleCommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a.html", null ], - [ "SingleEvent", "classlib60870_1_1_c_s101_1_1_single_event.html", null ], - [ "SinglePointInformation", "classlib60870_1_1_c_s101_1_1_single_point_information.html", null ], - [ "SinglePointWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a.html", null ], - [ "SinglePointWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a.html", null ], - [ "Slave", "classlib60870_1_1_c_s101_1_1_slave.html", "classlib60870_1_1_c_s101_1_1_slave" ], - [ "StartEvent", "classlib60870_1_1_c_s101_1_1_start_event.html", "classlib60870_1_1_c_s101_1_1_start_event" ], - [ "StatusAndStatusChangeDetection", "classlib60870_1_1_c_s101_1_1_status_and_status_change_detection.html", null ], - [ "StepCommand", "classlib60870_1_1_c_s101_1_1_step_command.html", null ], - [ "StepCommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a.html", null ], - [ "StepPositionInformation", "classlib60870_1_1_c_s101_1_1_step_position_information.html", "classlib60870_1_1_c_s101_1_1_step_position_information" ], - [ "StepPositionWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a.html", null ], - [ "StepPositionWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a.html", null ], - [ "TestCommand", "classlib60870_1_1_c_s101_1_1_test_command.html", null ], - [ "TestCommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html", "classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a" ], - [ "TransparentFile", "classlib60870_1_1_c_s101_1_1_transparent_file.html", "classlib60870_1_1_c_s101_1_1_transparent_file" ] - ] ], - [ "CS104", "namespacelib60870_1_1_c_s104.html", [ - [ "APCIParameters", "classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html", "classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters" ], - [ "ClientConnection", "classlib60870_1_1_c_s104_1_1_client_connection.html", "classlib60870_1_1_c_s104_1_1_client_connection" ], - [ "Connection", "classlib60870_1_1_c_s104_1_1_connection.html", "classlib60870_1_1_c_s104_1_1_connection" ], - [ "ConnectionStatistics", "classlib60870_1_1_c_s104_1_1_connection_statistics.html", "classlib60870_1_1_c_s104_1_1_connection_statistics" ], - [ "RedundancyGroup", "classlib60870_1_1_c_s104_1_1_redundancy_group.html", "classlib60870_1_1_c_s104_1_1_redundancy_group" ], - [ "Server", "classlib60870_1_1_c_s104_1_1_server.html", "classlib60870_1_1_c_s104_1_1_server" ], - [ "TlsSecurityInformation", "classlib60870_1_1_c_s104_1_1_tls_security_information.html", "classlib60870_1_1_c_s104_1_1_tls_security_information" ] - ] ], - [ "linklayer", "namespacelib60870_1_1linklayer.html", [ - [ "LinkLayerBusyException", "classlib60870_1_1linklayer_1_1_link_layer_busy_exception.html", null ], - [ "LinkLayerParameters", "classlib60870_1_1linklayer_1_1_link_layer_parameters.html", "classlib60870_1_1linklayer_1_1_link_layer_parameters" ], - [ "TcpClientVirtualSerialPort", "classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html", "classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port" ], - [ "TcpServerVirtualSerialPort", "classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.html", "classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port" ] - ] ], - [ "ASDUParsingException", "classlib60870_1_1_a_s_d_u_parsing_exception.html", null ], - [ "ASDUQueue", "classlib60870_1_1_a_s_d_u_queue.html", null ], - [ "ConnectionException", "classlib60870_1_1_connection_exception.html", null ], - [ "CP16Time2a", "classlib60870_1_1_c_p16_time2a.html", null ], - [ "CP24Time2a", "classlib60870_1_1_c_p24_time2a.html", "classlib60870_1_1_c_p24_time2a" ], - [ "CP32Time2a", "classlib60870_1_1_c_p32_time2a.html", "classlib60870_1_1_c_p32_time2a" ], - [ "CP56Time2a", "classlib60870_1_1_c_p56_time2a.html", "classlib60870_1_1_c_p56_time2a" ], - [ "Frame", "classlib60870_1_1_frame.html", null ], - [ "LibraryCommon", "classlib60870_1_1_library_common.html", null ], - [ "SingleCommandQualifier", "classlib60870_1_1_single_command_qualifier.html", null ] - ] ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/bc_s.png b/doxygen/doxydoc.NET/html/bc_s.png deleted file mode 100644 index 224b29aa9847d5a4b3902efd602b7ddf7d33e6c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT diff --git a/doxygen/doxydoc.NET/html/bc_sd.png b/doxygen/doxydoc.NET/html/bc_sd.png deleted file mode 100644 index 31ca888dc71049713b35c351933a8d0f36180bf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 635 zcmV->0)+jEP)Jwi0r1~gdSq#w{Bu1q z`craw(p2!hu$4C_$Oc3X(sI6e=9QSTwPt{G) z=htT&^~&c~L2~e{r5_5SYe7#Is-$ln>~Kd%$F#tC65?{LvQ}8O`A~RBB0N~`2M+waajO;5>3B&-viHGJeEK2TQOiPRa zfDKyqwMc4wfaEh4jt>H`nW_Zidwk@Bowp`}(VUaj-pSI(-1L>FJVsX}Yl9~JsqgsZ zUD9(rMwf23Gez6KPa|wwInZodP-2}9@fK0Ga_9{8SOjU&4l`pH4@qlQp83>>HT$xW zER^U>)MyV%t(Lu=`d=Y?{k1@}&r7ZGkFQ%z%N+sE9BtYjovzxyxCPxN6&@wLK{soQ zSmkj$aLI}miuE^p@~4}mg9OjDfGEkgY4~^XzLRUBB*O{+&vq<3v(E%+k_i%=`~j%{ Vj14gnt9}3g002ovPDHLkV1n!oC4m3{ diff --git a/doxygen/doxydoc.NET/html/classes.html b/doxygen/doxydoc.NET/html/classes.html deleted file mode 100644 index 7f7fd2a..0000000 --- a/doxygen/doxydoc.NET/html/classes.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - -lib60870.NET: Class Index - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Class Index
    -
    -
    -
    A | B | C | D | E | F | I | L | M | O | P | Q | R | S | T
    -
    -
    -
    A
    -
    APCIParameters (lib60870.CS104)
    ApplicationLayerParameters (lib60870.CS101)
    ASDU (lib60870.CS101)
    ASDUParsingException (lib60870)
    ASDUQueue (lib60870)
    ASDUQueueException (lib60870.CS101)
    -
    -
    B
    -
    BinaryCounterReading (lib60870.CS101)
    Bitstring32 (lib60870.CS101)
    Bitstring32Command (lib60870.CS101)
    Bitstring32CommandWithCP56Time2a (lib60870.CS101)
    Bitstring32WithCP24Time2a (lib60870.CS101)
    Bitstring32WithCP56Time2a (lib60870.CS101)
    -
    -
    C
    -
    ClientConnection (lib60870.CS104)
    ClockSynchronizationCommand (lib60870.CS101)
    Connection (lib60870.CS104)
    ConnectionException (lib60870)
    ConnectionStatistics (lib60870.CS104)
    CounterInterrogationCommand (lib60870.CS101)
    CP16Time2a (lib60870)
    CP24Time2a (lib60870)
    CP32Time2a (lib60870)
    CP56Time2a (lib60870)
    CS101Master (lib60870.CS101)
    CS101Slave (lib60870.CS101)
    -
    -
    D
    -
    DelayAcquisitionCommand (lib60870.CS101)
    DoubleCommand (lib60870.CS101)
    DoubleCommandWithCP56Time2a (lib60870.CS101)
    DoublePointInformation (lib60870.CS101)
    DoublePointWithCP24Time2a (lib60870.CS101)
    DoublePointWithCP56Time2a (lib60870.CS101)
    -
    -
    E
    -
    EndOfInitialization (lib60870.CS101)
    EventOfProtectionEquipment (lib60870.CS101)
    EventOfProtectionEquipmentWithCP56Time2a (lib60870.CS101)
    -
    -
    F
    -
    FileACK (lib60870.CS101)
    FileCallOrSelect (lib60870.CS101)
    FileDirectory (lib60870.CS101)
    FileLastSegmentOrSection (lib60870.CS101)
    FileReady (lib60870.CS101)
    FilesAvailable (lib60870.CS101)
    FileSegment (lib60870.CS101)
    Frame (lib60870)
    -
    -
    I
    -
    IFileProvider (lib60870.CS101)
    IFileReceiver (lib60870.CS101)
    IMasterConnection (lib60870.CS101)
    InformationObject (lib60870.CS101)
    IntegratedTotals (lib60870.CS101)
    IntegratedTotalsWithCP24Time2a (lib60870.CS101)
    IntegratedTotalsWithCP56Time2a (lib60870.CS101)
    InterrogationCommand (lib60870.CS101)
    IPrivateIOFactory (lib60870.CS101)
    -
    -
    L
    -
    LibraryCommon (lib60870)
    LinkLayerBusyException (lib60870.linklayer)
    LinkLayerParameters (lib60870.linklayer)
    -
    -
    M
    -
    Master (lib60870.CS101)
    MeasuredValueNormalized (lib60870.CS101)
    MeasuredValueNormalizedWithCP24Time2a (lib60870.CS101)
    MeasuredValueNormalizedWithCP56Time2a (lib60870.CS101)
    MeasuredValueNormalizedWithoutQuality (lib60870.CS101)
    MeasuredValueScaled (lib60870.CS101)
    MeasuredValueScaledWithCP24Time2a (lib60870.CS101)
    MeasuredValueScaledWithCP56Time2a (lib60870.CS101)
    MeasuredValueShort (lib60870.CS101)
    MeasuredValueShortWithCP24Time2a (lib60870.CS101)
    MeasuredValueShortWithCP56Time2a (lib60870.CS101)
    -
    -
    O
    -
    OutputCircuitInfo (lib60870.CS101)
    -
    -
    P
    -
    PackedOutputCircuitInfo (lib60870.CS101)
    PackedOutputCircuitInfoWithCP56Time2a (lib60870.CS101)
    PackedSinglePointWithSCD (lib60870.CS101)
    PackedStartEventsOfProtectionEquipment (lib60870.CS101)
    PackedStartEventsOfProtectionEquipmentWithCP56Time2a (lib60870.CS101)
    ParameterActivation (lib60870.CS101)
    ParameterFloatValue (lib60870.CS101)
    ParameterNormalizedValue (lib60870.CS101)
    ParameterScaledValue (lib60870.CS101)
    PrivateInformationObjectTypes (lib60870.CS101)
    -
    -
    Q
    -
    QualifierOfInterrogation (lib60870.CS101)
    QualityDescriptor (lib60870.CS101)
    QualityDescriptorP (lib60870.CS101)
    -
    -
    R
    -
    ReadCommand (lib60870.CS101)
    RedundancyGroup (lib60870.CS104)
    ResetProcessCommand (lib60870.CS101)
    -
    -
    S
    -
    ScaledValue (lib60870.CS101)
    SectionReady (lib60870.CS101)
    Server (lib60870.CS104)
    SetpointCommandNormalized (lib60870.CS101)
    SetpointCommandNormalizedWithCP56Time2a (lib60870.CS101)
    SetpointCommandQualifier (lib60870.CS101)
    SetpointCommandScaled (lib60870.CS101)
    SetpointCommandScaledWithCP56Time2a (lib60870.CS101)
    SetpointCommandShort (lib60870.CS101)
    SetpointCommandShortWithCP56Time2a (lib60870.CS101)
    SingleCommand (lib60870.CS101)
    SingleCommandQualifier (lib60870)
    SingleCommandWithCP56Time2a (lib60870.CS101)
    SingleEvent (lib60870.CS101)
    SinglePointInformation (lib60870.CS101)
    SinglePointWithCP24Time2a (lib60870.CS101)
    SinglePointWithCP56Time2a (lib60870.CS101)
    Slave (lib60870.CS101)
    StartEvent (lib60870.CS101)
    StatusAndStatusChangeDetection (lib60870.CS101)
    StepCommand (lib60870.CS101)
    StepCommandWithCP56Time2a (lib60870.CS101)
    StepPositionInformation (lib60870.CS101)
    StepPositionWithCP24Time2a (lib60870.CS101)
    StepPositionWithCP56Time2a (lib60870.CS101)
    -
    -
    T
    -
    TcpClientVirtualSerialPort (lib60870.linklayer)
    TcpServerVirtualSerialPort (lib60870.linklayer)
    TestCommand (lib60870.CS101)
    TestCommandWithCP56Time2a (lib60870.CS101)
    TlsSecurityInformation (lib60870.CS104)
    TransparentFile (lib60870.CS101)
    -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception-members.html deleted file mode 100644 index 455fe45..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception-members.html +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.ASDUParsingException Member List
    -
    -
    - -

    This is the complete list of members for lib60870.ASDUParsingException, including all inherited members.

    - - -
    ASDUParsingException(string message) (defined in lib60870.ASDUParsingException)lib60870.ASDUParsingException
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception.html deleted file mode 100644 index 28f896d..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.ASDUParsingException Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.ASDUParsingException Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.ASDUParsingException:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.ASDUParsingException:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - -

    -Public Member Functions

    ASDUParsingException (string message)
     
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/ASDUParsingException.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception__coll__graph.dot deleted file mode 100644 index 8d95f3d..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.ASDUParsingException" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.ASDUParsingException",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="Exception",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception__inherit__graph.dot deleted file mode 100644 index 8d95f3d..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_parsing_exception__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.ASDUParsingException" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.ASDUParsingException",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="Exception",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_queue-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_queue-members.html deleted file mode 100644 index d31ebfd..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_queue-members.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.ASDUQueue Member List
    -
    -
    - -

    This is the complete list of members for lib60870.ASDUQueue, including all inherited members.

    - - - - - - - - - - -
    ASDUQueue(int maxQueueSize, EnqueueMode enqueueMode, ApplicationLayerParameters parameters, Action< string > DebugLog) (defined in lib60870.ASDUQueue)lib60870.ASDUQueue
    EnqueueAsdu(ASDU asdu) (defined in lib60870.ASDUQueue)lib60870.ASDUQueue
    LockASDUQueue() (defined in lib60870.ASDUQueue)lib60870.ASDUQueue
    MarkASDUAsConfirmed(int index, long timestamp) (defined in lib60870.ASDUQueue)lib60870.ASDUQueue
    MessageQueue_hasUnconfirmedIMessages() (defined in lib60870.ASDUQueue)lib60870.ASDUQueue
    NumberOfAsduInQueue (defined in lib60870.ASDUQueue)lib60870.ASDUQueue
    queueLock (defined in lib60870.ASDUQueue)lib60870.ASDUQueue
    UnlockASDUQueue() (defined in lib60870.ASDUQueue)lib60870.ASDUQueue
    UnmarkAllASDUs() (defined in lib60870.ASDUQueue)lib60870.ASDUQueue
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_queue.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_queue.html deleted file mode 100644 index e7c63fa..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_a_s_d_u_queue.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.ASDUQueue Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.ASDUQueue Class Reference
    -
    -
    - - - - - - - - - - - - - - - - -

    -Public Member Functions

    ASDUQueue (int maxQueueSize, EnqueueMode enqueueMode, ApplicationLayerParameters parameters, Action< string > DebugLog)
     
    -void EnqueueAsdu (ASDU asdu)
     
    -void LockASDUQueue ()
     
    -void UnlockASDUQueue ()
     
    -bool MessageQueue_hasUnconfirmedIMessages ()
     
    -void UnmarkAllASDUs ()
     
    -void MarkASDUAsConfirmed (int index, long timestamp)
     
    - - - -

    -Public Attributes

    -SemaphoreSlim queueLock = new SemaphoreSlim(1, 1)
     
    - - - -

    -Properties

    -int NumberOfAsduInQueue [get, set]
     
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/ASDUQueue.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p16_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p16_time2a-members.html deleted file mode 100644 index 65216e0..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p16_time2a-members.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CP16Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CP16Time2a, including all inherited members.

    - - - - - - - - - - -
    CP16Time2a(byte[] msg, int startIndex) (defined in lib60870.CP16Time2a)lib60870.CP16Time2a
    CP16Time2a(int elapsedTimeInMs) (defined in lib60870.CP16Time2a)lib60870.CP16Time2a
    CP16Time2a() (defined in lib60870.CP16Time2a)lib60870.CP16Time2a
    CP16Time2a(CP16Time2a original) (defined in lib60870.CP16Time2a)lib60870.CP16Time2a
    ElapsedTimeInMs (defined in lib60870.CP16Time2a)lib60870.CP16Time2a
    Equals(object obj) (defined in lib60870.CP16Time2a)lib60870.CP16Time2a
    GetEncodedValue() (defined in lib60870.CP16Time2a)lib60870.CP16Time2a
    GetHashCode() (defined in lib60870.CP16Time2a)lib60870.CP16Time2a
    ToString() (defined in lib60870.CP16Time2a)lib60870.CP16Time2a
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p16_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p16_time2a.html deleted file mode 100644 index aa339cc..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p16_time2a.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CP16Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CP16Time2a Class Reference
    -
    -
    - - - - - - - - - - - - - - - - -

    -Public Member Functions

    CP16Time2a (byte[] msg, int startIndex)
     
    CP16Time2a (int elapsedTimeInMs)
     
    CP16Time2a (CP16Time2a original)
     
    -override bool Equals (object obj)
     
    -override int GetHashCode ()
     
    -byte[] GetEncodedValue ()
     
    -override string ToString ()
     
    - - - -

    -Properties

    -int ElapsedTimeInMs [get, set]
     
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CP16Time2a.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p24_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p24_time2a-members.html deleted file mode 100644 index 88a985d..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p24_time2a-members.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CP24Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CP24Time2a, including all inherited members.

    - - - - - - - - - - - - - - - -
    CP24Time2a(byte[] msg, int startIndex) (defined in lib60870.CP24Time2a)lib60870.CP24Time2a
    CP24Time2a(int minute, int second, int millisecond) (defined in lib60870.CP24Time2a)lib60870.CP24Time2a
    CP24Time2a() (defined in lib60870.CP24Time2a)lib60870.CP24Time2a
    CP24Time2a(CP24Time2a original) (defined in lib60870.CP24Time2a)lib60870.CP24Time2a
    Equals(object obj) (defined in lib60870.CP24Time2a)lib60870.CP24Time2a
    GetEncodedValue() (defined in lib60870.CP24Time2a)lib60870.CP24Time2a
    GetHashCode() (defined in lib60870.CP24Time2a)lib60870.CP24Time2a
    GetMilliseconds()lib60870.CP24Time2a
    Invalidlib60870.CP24Time2a
    Millisecondlib60870.CP24Time2a
    Minutelib60870.CP24Time2a
    Secondlib60870.CP24Time2a
    Substituedlib60870.CP24Time2a
    ToString() (defined in lib60870.CP24Time2a)lib60870.CP24Time2a
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p24_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p24_time2a.html deleted file mode 100644 index 9e39622..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p24_time2a.html +++ /dev/null @@ -1,314 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CP24Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CP24Time2a Class Reference
    -
    -
    - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    CP24Time2a (byte[] msg, int startIndex)
     
    CP24Time2a (int minute, int second, int millisecond)
     
    CP24Time2a (CP24Time2a original)
     
    -override bool Equals (object obj)
     
    -override int GetHashCode ()
     
    int GetMilliseconds ()
     Gets the total milliseconds of the elapsed time.
     
    -byte[] GetEncodedValue ()
     
    -override string ToString ()
     
    - - - - - - - - - - - - - - - - -

    -Properties

    int Millisecond [get, set]
     Gets or sets the millisecond part of the time value.
     
    int Second [get, set]
     Gets or sets the second (range 0 to 59)
     
    int Minute [get, set]
     Gets or sets the minute (range 0 to 59)
     
    bool Invalid [get, set]
     Gets a value indicating whether this lib60870.CP24Time2a is invalid.
     
    bool Substitued [get, set]
     Gets a value indicating whether this lib60870.CP24Time2a was substitued by an intermediate station.
     
    -

    Member Function Documentation

    - -

    ◆ GetMilliseconds()

    - -
    -
    - - - - - - - -
    int lib60870.CP24Time2a.GetMilliseconds ()
    -
    - -

    Gets the total milliseconds of the elapsed time.

    -
    Returns
    The milliseconds.
    - -
    -
    -

    Property Documentation

    - -

    ◆ Invalid

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CP24Time2a.Invalid
    -
    -getset
    -
    - -

    Gets a value indicating whether this lib60870.CP24Time2a is invalid.

    -

    true if invalid; otherwise, false.

    - -
    -
    - -

    ◆ Millisecond

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CP24Time2a.Millisecond
    -
    -getset
    -
    - -

    Gets or sets the millisecond part of the time value.

    -

    The millisecond.

    - -
    -
    - -

    ◆ Minute

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CP24Time2a.Minute
    -
    -getset
    -
    - -

    Gets or sets the minute (range 0 to 59)

    -

    The minute.

    - -
    -
    - -

    ◆ Second

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CP24Time2a.Second
    -
    -getset
    -
    - -

    Gets or sets the second (range 0 to 59)

    -

    The second.

    - -
    -
    - -

    ◆ Substitued

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CP24Time2a.Substitued
    -
    -getset
    -
    - -

    Gets a value indicating whether this lib60870.CP24Time2a was substitued by an intermediate station.

    -

    true if substitued; otherwise, false.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CP24Time2a.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p24_time2a.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p24_time2a.js deleted file mode 100644 index c26e724..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p24_time2a.js +++ /dev/null @@ -1,9 +0,0 @@ -var classlib60870_1_1_c_p24_time2a = -[ - [ "GetMilliseconds", "classlib60870_1_1_c_p24_time2a.html#afa47b9c056d5787d0368779f462fd2ff", null ], - [ "Invalid", "classlib60870_1_1_c_p24_time2a.html#acb0606324a0b221df177d242cd97f7c7", null ], - [ "Millisecond", "classlib60870_1_1_c_p24_time2a.html#a54e60600dccb34252b428488223f419e", null ], - [ "Minute", "classlib60870_1_1_c_p24_time2a.html#a1bdb66a13e77ea4ca5938c7609a38225", null ], - [ "Second", "classlib60870_1_1_c_p24_time2a.html#a44e08d428c8cbb76a84836b2ed19ae60", null ], - [ "Substitued", "classlib60870_1_1_c_p24_time2a.html#a4400a44009413f637412cb34d7d73820", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p32_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p32_time2a-members.html deleted file mode 100644 index 3f4211b..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p32_time2a-members.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CP32Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CP32Time2a, including all inherited members.

    - - - - - - - - - - - - - - - - - - -
    CP32Time2a(int hours, int minutes, int seconds, int milliseconds, bool invalid, bool summertime) (defined in lib60870.CP32Time2a)lib60870.CP32Time2a
    CP32Time2a(DateTime time) (defined in lib60870.CP32Time2a)lib60870.CP32Time2a
    CP32Time2a() (defined in lib60870.CP32Time2a)lib60870.CP32Time2a
    CP32Time2a(CP32Time2a original) (defined in lib60870.CP32Time2a)lib60870.CP32Time2a
    Equals(object obj) (defined in lib60870.CP32Time2a)lib60870.CP32Time2a
    GetDateTime(DateTime refTime)lib60870.CP32Time2a
    GetDateTime() (defined in lib60870.CP32Time2a)lib60870.CP32Time2a
    GetEncodedValue() (defined in lib60870.CP32Time2a)lib60870.CP32Time2a
    GetHashCode() (defined in lib60870.CP32Time2a)lib60870.CP32Time2a
    Hourlib60870.CP32Time2a
    Invalidlib60870.CP32Time2a
    Millisecondlib60870.CP32Time2a
    Minutelib60870.CP32Time2a
    Secondlib60870.CP32Time2a
    Substitutedlib60870.CP32Time2a
    SummerTime (defined in lib60870.CP32Time2a)lib60870.CP32Time2a
    ToString() (defined in lib60870.CP32Time2a)lib60870.CP32Time2a
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p32_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p32_time2a.html deleted file mode 100644 index c203a73..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p32_time2a.html +++ /dev/null @@ -1,354 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CP32Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CP32Time2a Class Reference
    -
    -
    - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    CP32Time2a (int hours, int minutes, int seconds, int milliseconds, bool invalid, bool summertime)
     
    CP32Time2a (DateTime time)
     
    CP32Time2a (CP32Time2a original)
     
    -override bool Equals (object obj)
     
    -override int GetHashCode ()
     
    DateTime GetDateTime (DateTime refTime)
     Gets the date time added to the reference day.
     
    -DateTime GetDateTime ()
     
    -byte[] GetEncodedValue ()
     
    -override string ToString ()
     
    - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    int Millisecond [get, set]
     Gets or sets the millisecond part of the time value (range 0 to 999)
     
    int Second [get, set]
     Gets or sets the second (range 0 to 59)
     
    int Minute [get, set]
     Gets or sets the minute (range 0 to 59)
     
    int Hour [get, set]
     Gets or sets the hour (range 0 to 23)
     
    -bool SummerTime [get, set]
     
    bool Invalid [get, set]
     Gets a value indicating whether this lib60870.CP56Time2a is invalid.
     
    bool Substituted [get, set]
     Gets a value indicating whether this lib60870.CP26Time2a was substitued by an intermediate station.
     
    -

    Member Function Documentation

    - -

    ◆ GetDateTime()

    - -
    -
    - - - - - - - -
    DateTime lib60870.CP32Time2a.GetDateTime (DateTime refTime)
    -
    - -

    Gets the date time added to the reference day.

    -
    Returns
    The date time.
    -
    Parameters
    - - -
    refTimeDatetime representing the reference day
    -
    -
    - -
    -
    -

    Property Documentation

    - -

    ◆ Hour

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CP32Time2a.Hour
    -
    -getset
    -
    - -

    Gets or sets the hour (range 0 to 23)

    -

    The hour.

    - -
    -
    - -

    ◆ Invalid

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CP32Time2a.Invalid
    -
    -getset
    -
    - -

    Gets a value indicating whether this lib60870.CP56Time2a is invalid.

    -

    true if invalid; otherwise, false.

    - -
    -
    - -

    ◆ Millisecond

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CP32Time2a.Millisecond
    -
    -getset
    -
    - -

    Gets or sets the millisecond part of the time value (range 0 to 999)

    -

    The millisecond.

    - -
    -
    - -

    ◆ Minute

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CP32Time2a.Minute
    -
    -getset
    -
    - -

    Gets or sets the minute (range 0 to 59)

    -

    The minute.

    - -
    -
    - -

    ◆ Second

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CP32Time2a.Second
    -
    -getset
    -
    - -

    Gets or sets the second (range 0 to 59)

    -

    The second.

    - -
    -
    - -

    ◆ Substituted

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CP32Time2a.Substituted
    -
    -getset
    -
    - -

    Gets a value indicating whether this lib60870.CP26Time2a was substitued by an intermediate station.

    -

    true if substitued; otherwise, false.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CP32Time2a.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p32_time2a.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p32_time2a.js deleted file mode 100644 index 11c9141..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p32_time2a.js +++ /dev/null @@ -1,10 +0,0 @@ -var classlib60870_1_1_c_p32_time2a = -[ - [ "GetDateTime", "classlib60870_1_1_c_p32_time2a.html#a57711ec4af4479936d10b2bf6df355a4", null ], - [ "Hour", "classlib60870_1_1_c_p32_time2a.html#a4cfa66063d1b214990d69515af388552", null ], - [ "Invalid", "classlib60870_1_1_c_p32_time2a.html#a9bc00071f0d79994977adcc9ea1564b4", null ], - [ "Millisecond", "classlib60870_1_1_c_p32_time2a.html#a144afbb4092fbe1a3196f30cba13fc37", null ], - [ "Minute", "classlib60870_1_1_c_p32_time2a.html#a723b8ffeb4915b7347aa97c65b2f4365", null ], - [ "Second", "classlib60870_1_1_c_p32_time2a.html#ae0c845c0ce9555c5ea2dd8514b6222dd", null ], - [ "Substituted", "classlib60870_1_1_c_p32_time2a.html#ae4e8f2da41474e5fbeb67412cb1a1523", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p56_time2a-members.html deleted file mode 100644 index efc2683..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p56_time2a-members.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CP56Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CP56Time2a, including all inherited members.

    - - - - - - - - - - - - - - - - - - - - - - -
    CP56Time2a(byte[] msg, int startIndex) (defined in lib60870.CP56Time2a)lib60870.CP56Time2a
    CP56Time2a(DateTime time) (defined in lib60870.CP56Time2a)lib60870.CP56Time2a
    CP56Time2a() (defined in lib60870.CP56Time2a)lib60870.CP56Time2a
    CP56Time2a(CP56Time2a original) (defined in lib60870.CP56Time2a)lib60870.CP56Time2a
    DayOfMonthlib60870.CP56Time2a
    DayOfWeeklib60870.CP56Time2a
    Equals(object obj) (defined in lib60870.CP56Time2a)lib60870.CP56Time2a
    GetDateTime(int startYear)lib60870.CP56Time2a
    GetDateTime() (defined in lib60870.CP56Time2a)lib60870.CP56Time2a
    GetEncodedValue() (defined in lib60870.CP56Time2a)lib60870.CP56Time2a
    GetHashCode() (defined in lib60870.CP56Time2a)lib60870.CP56Time2a
    Hourlib60870.CP56Time2a
    Invalidlib60870.CP56Time2a
    Millisecondlib60870.CP56Time2a
    Minutelib60870.CP56Time2a
    Monthlib60870.CP56Time2a
    Secondlib60870.CP56Time2a
    Substitutedlib60870.CP56Time2a
    SummerTime (defined in lib60870.CP56Time2a)lib60870.CP56Time2a
    ToString() (defined in lib60870.CP56Time2a)lib60870.CP56Time2a
    Yearlib60870.CP56Time2a
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p56_time2a.html deleted file mode 100644 index 703ba1f..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p56_time2a.html +++ /dev/null @@ -1,466 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CP56Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CP56Time2a Class Reference
    -
    -
    - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    CP56Time2a (byte[] msg, int startIndex)
     
    CP56Time2a (DateTime time)
     
    CP56Time2a (CP56Time2a original)
     
    -override bool Equals (object obj)
     
    -override int GetHashCode ()
     
    DateTime GetDateTime (int startYear)
     Gets the date time.
     
    -DateTime GetDateTime ()
     
    -byte[] GetEncodedValue ()
     
    -override string ToString ()
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    int Millisecond [get, set]
     Gets or sets the millisecond part of the time value.
     
    int Second [get, set]
     Gets or sets the second (range 0 to 59)
     
    int Minute [get, set]
     Gets or sets the minute (range 0 to 59)
     
    int Hour [get, set]
     Gets or sets the hour (range 0 to 23)
     
    int DayOfWeek [get, set]
     Gets or sets the day of week in range from 1 (Monday) until 7 (Sunday)
     
    int DayOfMonth [get, set]
     Gets or sets the day of month in range 1 to 31.
     
    int Month [get, set]
     Gets the month in range from 1 (January) to 12 (December)
     
    int Year [get, set]
     Gets the year in the range 0 to 99.
     
    -bool SummerTime [get, set]
     
    bool Invalid [get, set]
     Gets a value indicating whether this lib60870.CP56Time2a is invalid.
     
    bool Substituted [get, set]
     Gets a value indicating whether this lib60870.CP26Time2a was substitued by an intermediate station.
     
    -

    Member Function Documentation

    - -

    ◆ GetDateTime()

    - -
    -
    - - - - - - - -
    DateTime lib60870.CP56Time2a.GetDateTime (int startYear)
    -
    - -

    Gets the date time.

    -
    Returns
    The date time.
    -
    Parameters
    - - -
    startYearStart year.
    -
    -
    - -
    -
    -

    Property Documentation

    - -

    ◆ DayOfMonth

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CP56Time2a.DayOfMonth
    -
    -getset
    -
    - -

    Gets or sets the day of month in range 1 to 31.

    -

    The day of month.

    - -
    -
    - -

    ◆ DayOfWeek

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CP56Time2a.DayOfWeek
    -
    -getset
    -
    - -

    Gets or sets the day of week in range from 1 (Monday) until 7 (Sunday)

    -

    The day of week.

    - -
    -
    - -

    ◆ Hour

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CP56Time2a.Hour
    -
    -getset
    -
    - -

    Gets or sets the hour (range 0 to 23)

    -

    The hour.

    - -
    -
    - -

    ◆ Invalid

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CP56Time2a.Invalid
    -
    -getset
    -
    - -

    Gets a value indicating whether this lib60870.CP56Time2a is invalid.

    -

    true if invalid; otherwise, false.

    - -
    -
    - -

    ◆ Millisecond

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CP56Time2a.Millisecond
    -
    -getset
    -
    - -

    Gets or sets the millisecond part of the time value.

    -

    The millisecond.

    - -
    -
    - -

    ◆ Minute

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CP56Time2a.Minute
    -
    -getset
    -
    - -

    Gets or sets the minute (range 0 to 59)

    -

    The minute.

    - -
    -
    - -

    ◆ Month

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CP56Time2a.Month
    -
    -getset
    -
    - -

    Gets the month in range from 1 (January) to 12 (December)

    -

    The month.

    - -
    -
    - -

    ◆ Second

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CP56Time2a.Second
    -
    -getset
    -
    - -

    Gets or sets the second (range 0 to 59)

    -

    The second.

    - -
    -
    - -

    ◆ Substituted

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CP56Time2a.Substituted
    -
    -getset
    -
    - -

    Gets a value indicating whether this lib60870.CP26Time2a was substitued by an intermediate station.

    -

    true if substitued; otherwise, false.

    - -
    -
    - -

    ◆ Year

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CP56Time2a.Year
    -
    -getset
    -
    - -

    Gets the year in the range 0 to 99.

    -

    The year.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CP56Time2a.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p56_time2a.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p56_time2a.js deleted file mode 100644 index 5526d18..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_p56_time2a.js +++ /dev/null @@ -1,14 +0,0 @@ -var classlib60870_1_1_c_p56_time2a = -[ - [ "GetDateTime", "classlib60870_1_1_c_p56_time2a.html#a83f9707e94051e90f0ab9b2f5dc1b3df", null ], - [ "DayOfMonth", "classlib60870_1_1_c_p56_time2a.html#a533808a9bd35fd250ff3197ce8b4e8fa", null ], - [ "DayOfWeek", "classlib60870_1_1_c_p56_time2a.html#afddcdbd7c4557c88032eb519a57b4019", null ], - [ "Hour", "classlib60870_1_1_c_p56_time2a.html#a34891c411294a0cb5bf2f1d4adb3286a", null ], - [ "Invalid", "classlib60870_1_1_c_p56_time2a.html#a7c00ef3b8b3f7fb1bb9a6cad0440f6dd", null ], - [ "Millisecond", "classlib60870_1_1_c_p56_time2a.html#a2e0c82ecba6b07880f9416101f004ecc", null ], - [ "Minute", "classlib60870_1_1_c_p56_time2a.html#af5a5ead5f041e47e0f4e201acb707d13", null ], - [ "Month", "classlib60870_1_1_c_p56_time2a.html#aeda1719c2e81de05a616f166036ef1f7", null ], - [ "Second", "classlib60870_1_1_c_p56_time2a.html#a02627aa0a76a5e3bfd4007a07f042a2c", null ], - [ "Substituted", "classlib60870_1_1_c_p56_time2a.html#a3b8f17e2e0ea8e6482dfae2fbea87173", null ], - [ "Year", "classlib60870_1_1_c_p56_time2a.html#acd2210101a5b5235b4779e3ecf00527e", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u-members.html deleted file mode 100644 index 50d6590..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u-members.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.ASDU Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.ASDU, including all inherited members.

    - - - - - - - - - - - - - - - - - -
    AddInformationObject(InformationObject io)lib60870.CS101.ASDU
    AsByteArray() (defined in lib60870.CS101.ASDU)lib60870.CS101.ASDU
    ASDU(ApplicationLayerParameters parameters, CauseOfTransmission cot, bool isTest, bool isNegative, byte oa, int ca, bool isSequence)lib60870.CS101.ASDU
    ASDU(ApplicationLayerParameters parameters, byte[] msg, int bufPos, int msgLength) (defined in lib60870.CS101.ASDU)lib60870.CS101.ASDU
    Calib60870.CS101.ASDU
    Cotlib60870.CS101.ASDU
    GetElement(int index, PrivateInformationObjectTypes privateObjectTypes)lib60870.CS101.ASDU
    GetElement(int index, IPrivateIOFactory ioFactory)lib60870.CS101.ASDU
    GetElement(int index)lib60870.CS101.ASDU
    IsNegativelib60870.CS101.ASDU
    IsSequencelib60870.CS101.ASDU
    IsTestlib60870.CS101.ASDU
    NumberOfElementslib60870.CS101.ASDU
    Oalib60870.CS101.ASDU
    ToString() (defined in lib60870.CS101.ASDU)lib60870.CS101.ASDU
    TypeIdlib60870.CS101.ASDU
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u.html deleted file mode 100644 index d01a653..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u.html +++ /dev/null @@ -1,577 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.ASDU Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.ASDU Class Reference
    -
    -
    - -

    This class represents an application layer message. It contains some generic message information and one or more InformationObject instances of the same type. It is used to send and receive messages. - More...

    - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

     ASDU (ApplicationLayerParameters parameters, CauseOfTransmission cot, bool isTest, bool isNegative, byte oa, int ca, bool isSequence)
     Initializes a new instance of the lib60870.CS101.ASDU class.
     
    bool AddInformationObject (InformationObject io)
     Adds an information object to the ASDU.
     
    ASDU (ApplicationLayerParameters parameters, byte[] msg, int bufPos, int msgLength)
     
    -byte[] AsByteArray ()
     
    InformationObject GetElement (int index, PrivateInformationObjectTypes privateObjectTypes)
     Gets the element (information object) with the specified index. This function supports private information object types.
     
    InformationObject GetElement (int index, IPrivateIOFactory ioFactory)
     Gets the element (information object) with the specified index. This function supports private information object types by using IPrivateIOFactory.
     
    InformationObject GetElement (int index)
     Gets the element (information object) with the specified index.
     
    -override string ToString ()
     
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    TypeID TypeId [get]
     Gets the type identifier (TI).
     
    CauseOfTransmission Cot [get, set]
     Gets or sets the cause of transmission (COT)
     
    byte Oa [get]
     Gets the originator address (OA)
     
    bool IsTest [get]
     Gets a value indicating whether this instance is a test message.
     
    bool IsNegative [get, set]
     Gets or sets a value indicating whether this instance is a negative confirmation.
     
    int Ca [get]
     Gets the common address of the ASDU (CA)
     
    bool IsSequence [get]
     Gets a value indicating whether this instance is a sequence of information objects.
     
    int NumberOfElements [get]
     Gets the number of elements (information objects) of the ASDU.
     
    -

    Detailed Description

    -

    This class represents an application layer message. It contains some generic message information and one or more InformationObject instances of the same type. It is used to send and receive messages.

    -

    Constructor & Destructor Documentation

    - -

    ◆ ASDU()

    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    lib60870.CS101.ASDU.ASDU (ApplicationLayerParameters parameters,
    CauseOfTransmission cot,
    bool isTest,
    bool isNegative,
    byte oa,
    int ca,
    bool isSequence )
    -
    - -

    Initializes a new instance of the lib60870.CS101.ASDU class.

    -
    Parameters
    - - - - - - - - -
    parametersapplication layer parameters to be used for encoding/decoding
    cotCause of transmission (COT)
    isTestIf set to true ASDU is a test ASDU.
    isNegativeIf set to true is negative confirmation.
    oaoriginator address (OA)
    cacommon address of the ASDU (CA)
    isSequenceIf set to true is a sequence of information objects.
    -
    -
    - -
    -
    -

    Member Function Documentation

    - -

    ◆ AddInformationObject()

    - -
    -
    - - - - - - - -
    bool lib60870.CS101.ASDU.AddInformationObject (InformationObject io)
    -
    - -

    Adds an information object to the ASDU.

    -

    This function add an information object (InformationObject) to the ASDU. NOTE: that all information objects have to be of the same type. Otherwise an ArgumentException will be thrown. The function returns true when the information object has been added to the ASDU. The function returns false if there is no space left in the ASDU to add the information object, or when object cannot be added to a sequence because the IOA does not match.

    Returns
    true, if information object was added, false otherwise.
    -
    Parameters
    - - -
    ioThe information object to add
    -
    -
    - -
    -
    - -

    ◆ GetElement() [1/3]

    - -
    -
    - - - - - - - -
    InformationObject lib60870.CS101.ASDU.GetElement (int index)
    -
    - -

    Gets the element (information object) with the specified index.

    -
    Returns
    the information object at index
    -
    Parameters
    - - -
    indexindex of the element (starting with 0)
    -
    -
    -
    Exceptions
    - - -
    lib60870.ASDUParsingExceptionThrown when there is a problem parsing the ASDU
    -
    -
    - -
    -
    - -

    ◆ GetElement() [2/3]

    - -
    -
    - - - - - - - - - - - -
    InformationObject lib60870.CS101.ASDU.GetElement (int index,
    IPrivateIOFactory ioFactory )
    -
    - -

    Gets the element (information object) with the specified index. This function supports private information object types by using IPrivateIOFactory.

    -
    Returns
    the information object at index
    -
    Parameters
    - - - -
    indexindex of the element (starting with 0)
    ioFactoryuser defined information object parser
    -
    -
    -
    Exceptions
    - - -
    lib60870.ASDUParsingExceptionThrown when there is a problem parsing the ASDU
    -
    -
    - -
    -
    - -

    ◆ GetElement() [3/3]

    - -
    -
    - - - - - - - - - - - -
    InformationObject lib60870.CS101.ASDU.GetElement (int index,
    PrivateInformationObjectTypes privateObjectTypes )
    -
    - -

    Gets the element (information object) with the specified index. This function supports private information object types.

    -
    Returns
    the information object at index
    -
    Parameters
    - - - -
    indexindex of the element (starting with 0)
    privateObjectTypesknown private information object types
    -
    -
    -
    Exceptions
    - - -
    lib60870.ASDUParsingExceptionThrown when there is a problem parsing the ASDU
    -
    -
    - -
    -
    -

    Property Documentation

    - -

    ◆ Ca

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CS101.ASDU.Ca
    -
    -get
    -
    - -

    Gets the common address of the ASDU (CA)

    -

    The CA value

    - -
    -
    - -

    ◆ Cot

    - -
    -
    - - - - - -
    - - - - -
    CauseOfTransmission lib60870.CS101.ASDU.Cot
    -
    -getset
    -
    - -

    Gets or sets the cause of transmission (COT)

    -

    The COT value

    - -
    -
    - -

    ◆ IsNegative

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS101.ASDU.IsNegative
    -
    -getset
    -
    - -

    Gets or sets a value indicating whether this instance is a negative confirmation.

    -

    true if this instance is a negative confirmation; otherwise, false.

    - -
    -
    - -

    ◆ IsSequence

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS101.ASDU.IsSequence
    -
    -get
    -
    - -

    Gets a value indicating whether this instance is a sequence of information objects.

    -

    A sequence of information objects contains multiple information objects with successive information object addresses (IOA).

    -

    true if this instance is a sequence; otherwise, false.

    - -
    -
    - -

    ◆ IsTest

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS101.ASDU.IsTest
    -
    -get
    -
    - -

    Gets a value indicating whether this instance is a test message.

    -

    true if this instance is a test message; otherwise, false.

    - -
    -
    - -

    ◆ NumberOfElements

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CS101.ASDU.NumberOfElements
    -
    -get
    -
    - -

    Gets the number of elements (information objects) of the ASDU.

    -

    The number of information objects.

    - -
    -
    - -

    ◆ Oa

    - -
    -
    - - - - - -
    - - - - -
    byte lib60870.CS101.ASDU.Oa
    -
    -get
    -
    - -

    Gets the originator address (OA)

    -

    The OA

    - -
    -
    - -

    ◆ TypeId

    - -
    -
    - - - - - -
    - - - - -
    TypeID lib60870.CS101.ASDU.TypeId
    -
    -get
    -
    - -

    Gets the type identifier (TI).

    -

    The type identifier.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/ASDU.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u.js deleted file mode 100644 index a1c5935..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u.js +++ /dev/null @@ -1,16 +0,0 @@ -var classlib60870_1_1_c_s101_1_1_a_s_d_u = -[ - [ "ASDU", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a921d30b69cb8515973939210c0fd23b6", null ], - [ "AddInformationObject", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a2cc4f6257884b76e9e9f6b40cd3037c2", null ], - [ "GetElement", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a163ff2a748b560ecd08692a00ce83d57", null ], - [ "GetElement", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a752cdac37f9f37c859eb4de5bf01c746", null ], - [ "GetElement", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a3d57c6dab7100c5933373231c459d31f", null ], - [ "Ca", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a5d217b9cc0ecf22e127aa25c89e8a2f1", null ], - [ "Cot", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a68dd2e6df66c5c4298a357ac5da8fed1", null ], - [ "IsNegative", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a808a4ea51526b2ecbe0d9e23df1a018b", null ], - [ "IsSequence", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a874af72bec9618876b47a8da155de96f", null ], - [ "IsTest", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html#ae315fe2504e41a213cd76330cb56cc24", null ], - [ "NumberOfElements", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a8ab49764dd886c58be639d229e664af5", null ], - [ "Oa", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a73566a1f53fc1c1492804c4bcf068438", null ], - [ "TypeId", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html#ab0c3a8cae06afc0eea93c454815feb23", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception-members.html deleted file mode 100644 index 3bac976..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception-members.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.ASDUQueueException Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.ASDUQueueException, including all inherited members.

    - - - - -
    ASDUQueueException() (defined in lib60870.CS101.ASDUQueueException)lib60870.CS101.ASDUQueueException
    ASDUQueueException(string message) (defined in lib60870.CS101.ASDUQueueException)lib60870.CS101.ASDUQueueException
    ASDUQueueException(string message, Exception innerException) (defined in lib60870.CS101.ASDUQueueException)lib60870.CS101.ASDUQueueException
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception.html deleted file mode 100644 index 5b21c80..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.ASDUQueueException Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.ASDUQueueException Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.ASDUQueueException:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.ASDUQueueException:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - -

    -Public Member Functions

    ASDUQueueException (string message)
     
    ASDUQueueException (string message, Exception innerException)
     
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/Slave.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception__coll__graph.dot deleted file mode 100644 index 83a362f..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.ASDUQueueException" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.ASDUQueue\lException",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="Exception",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception__inherit__graph.dot deleted file mode 100644 index 83a362f..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.ASDUQueueException" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.ASDUQueue\lException",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="Exception",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_application_layer_parameters-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_application_layer_parameters-members.html deleted file mode 100644 index a1eac79..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_application_layer_parameters-members.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - - - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_application_layer_parameters.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_application_layer_parameters.html deleted file mode 100644 index 6a5281d..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_application_layer_parameters.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.ApplicationLayerParameters Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.ApplicationLayerParameters Class Reference
    -
    -
    - - - - -

    -Public Member Functions

    -ApplicationLayerParameters Clone ()
     
    - - - -

    -Static Public Attributes

    -static int IEC60870_5_104_MAX_ASDU_LENGTH = 249
     
    - - - - - - - - - - - - - - - -

    -Properties

    -int SizeOfCOT [get, set]
     
    -int OA [get, set]
     
    -int SizeOfCA [get, set]
     
    -int SizeOfIOA [get, set]
     
    -int SizeOfTypeId [get]
     
    -int SizeOfVSQ [get]
     
    -int MaxAsduLength [get, set]
     
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/ApplicationLayerParameters.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_binary_counter_reading-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_binary_counter_reading-members.html deleted file mode 100644 index 8e988bf..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_binary_counter_reading-members.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.BinaryCounterReading Member List
    -
    - -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_binary_counter_reading.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_binary_counter_reading.html deleted file mode 100644 index a2bb067..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_binary_counter_reading.html +++ /dev/null @@ -1,283 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.BinaryCounterReading Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.BinaryCounterReading Class Reference
    -
    -
    - -

    Binary counter reading. Used for tranmission of integrated totals. - More...

    - - - - - - - - -

    -Public Member Functions

    -byte[] GetEncodedValue ()
     
    BinaryCounterReading (byte[] msg, int startIndex)
     
    BinaryCounterReading (BinaryCounterReading original)
     
    - - - - - - - - - - - - - - - - -

    -Properties

    Int32 Value [get, set]
     Gets or sets the counter value.
     
    int SequenceNumber [get, set]
     Gets or sets the sequence number.
     
    bool Carry [get, set]
     Gets or sets the carry flag.
     
    bool Adjusted [get, set]
     Gets or sets the adjusted flag.
     
    bool Invalid [get, set]
     Gets or sets the invalid flag.
     
    -

    Detailed Description

    -

    Binary counter reading. Used for tranmission of integrated totals.

    -

    Property Documentation

    - -

    ◆ Adjusted

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS101.BinaryCounterReading.Adjusted
    -
    -getset
    -
    - -

    Gets or sets the adjusted flag.

    -

    true if adjusted flag is set; otherwise, false.

    - -
    -
    - -

    ◆ Carry

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS101.BinaryCounterReading.Carry
    -
    -getset
    -
    - -

    Gets or sets the carry flag.

    -

    true if carry flag set; otherwise, false.

    - -
    -
    - -

    ◆ Invalid

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS101.BinaryCounterReading.Invalid
    -
    -getset
    -
    - -

    Gets or sets the invalid flag.

    -

    true if invalid flag is set; otherwise, false.

    - -
    -
    - -

    ◆ SequenceNumber

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CS101.BinaryCounterReading.SequenceNumber
    -
    -getset
    -
    - -

    Gets or sets the sequence number.

    -

    The sequence number.

    - -
    -
    - -

    ◆ Value

    - -
    -
    - - - - - -
    - - - - -
    Int32 lib60870.CS101.BinaryCounterReading.Value
    -
    -getset
    -
    - -

    Gets or sets the counter value.

    -

    The value.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/BinaryCounterReading.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_binary_counter_reading.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_binary_counter_reading.js deleted file mode 100644 index f42b4ea..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_binary_counter_reading.js +++ /dev/null @@ -1,8 +0,0 @@ -var classlib60870_1_1_c_s101_1_1_binary_counter_reading = -[ - [ "Adjusted", "classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#aacf2720e880dbb0f70ea212c59c8e31f", null ], - [ "Carry", "classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#a8d73e781be2f98f00d09f91e0c3d774a", null ], - [ "Invalid", "classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#a9c84bd5840b810546affba3f452b11e0", null ], - [ "SequenceNumber", "classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#ae04563ca55ecc0df58e80263d50db184", null ], - [ "Value", "classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#a548b83c567fc345f85573f31d3a71f03", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32-members.html deleted file mode 100644 index 5591e45..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32-members.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.Bitstring32 Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.Bitstring32, including all inherited members.

    - - - - - - - - - - - - - -
    Bitstring32(int ioa, UInt32 value, QualityDescriptor quality) (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
    Bitstring32(Bitstring32 original) (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32virtual
    GetEncodedSize() (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Quality (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
    SupportsSequence (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
    Value (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32.html deleted file mode 100644 index f289200..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32.html +++ /dev/null @@ -1,225 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.Bitstring32 Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.Bitstring32 Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.Bitstring32:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.Bitstring32:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    Bitstring32 (int ioa, UInt32 value, QualityDescriptor quality)
     
    Bitstring32 (Bitstring32 original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -UInt32 Value [get]
     
    -QualityDescriptor Quality [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.Bitstring32.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/Bitstring32.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32__coll__graph.dot deleted file mode 100644 index 9af87cf..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.Bitstring32" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Bitstring32",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32__inherit__graph.dot deleted file mode 100644 index ebe9d39..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32__inherit__graph.dot +++ /dev/null @@ -1,14 +0,0 @@ -digraph "lib60870.CS101.Bitstring32" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Bitstring32",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; - Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="lib60870.CS101.Bitstring32\lWithCP24Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a.html",tooltip=" "]; - Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node4 [id="Node000004",label="lib60870.CS101.Bitstring32\lWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command-members.html deleted file mode 100644 index f98b262..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command-members.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.Bitstring32Command Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.Bitstring32Command, including all inherited members.

    - - - - - - - - - - - -
    Bitstring32Command(int objectAddress, UInt32 bitstring) (defined in lib60870.CS101.Bitstring32Command)lib60870.CS101.Bitstring32Command
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.Bitstring32Command)lib60870.CS101.Bitstring32Commandvirtual
    GetEncodedSize() (defined in lib60870.CS101.Bitstring32Command)lib60870.CS101.Bitstring32Command
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    SupportsSequence (defined in lib60870.CS101.Bitstring32Command)lib60870.CS101.Bitstring32Command
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.Bitstring32Command)lib60870.CS101.Bitstring32Command
    Value (defined in lib60870.CS101.Bitstring32Command)lib60870.CS101.Bitstring32Command
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command.html deleted file mode 100644 index 99563e8..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command.html +++ /dev/null @@ -1,219 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.Bitstring32Command Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.Bitstring32Command Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.Bitstring32Command:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.Bitstring32Command:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    Bitstring32Command (int objectAddress, UInt32 bitstring)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -UInt32 Value [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.Bitstring32Command.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SetpointCommands.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command__coll__graph.dot deleted file mode 100644 index 93e73cb..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.Bitstring32Command" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Bitstring32\lCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command__inherit__graph.dot deleted file mode 100644 index bfc95eb..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.Bitstring32Command" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Bitstring32\lCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; - Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="lib60870.CS101.Bitstring32\lCommandWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a-members.html deleted file mode 100644 index be48ebc..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a-members.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.Bitstring32CommandWithCP56Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.Bitstring32CommandWithCP56Time2a, including all inherited members.

    - - - - - - - - - - - - - -
    Bitstring32Command(int objectAddress, UInt32 bitstring) (defined in lib60870.CS101.Bitstring32Command)lib60870.CS101.Bitstring32Command
    Bitstring32CommandWithCP56Time2a(int objectAddress, UInt32 bitstring, CP56Time2a timestamp) (defined in lib60870.CS101.Bitstring32CommandWithCP56Time2a)lib60870.CS101.Bitstring32CommandWithCP56Time2a
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.Bitstring32CommandWithCP56Time2a)lib60870.CS101.Bitstring32CommandWithCP56Time2avirtual
    GetEncodedSize() (defined in lib60870.CS101.Bitstring32CommandWithCP56Time2a)lib60870.CS101.Bitstring32CommandWithCP56Time2a
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    SupportsSequence (defined in lib60870.CS101.Bitstring32CommandWithCP56Time2a)lib60870.CS101.Bitstring32CommandWithCP56Time2a
    Timestamp (defined in lib60870.CS101.Bitstring32CommandWithCP56Time2a)lib60870.CS101.Bitstring32CommandWithCP56Time2a
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.Bitstring32CommandWithCP56Time2a)lib60870.CS101.Bitstring32CommandWithCP56Time2a
    Value (defined in lib60870.CS101.Bitstring32Command)lib60870.CS101.Bitstring32Command
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a.html deleted file mode 100644 index a78e4b2..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a.html +++ /dev/null @@ -1,236 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.Bitstring32CommandWithCP56Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.Bitstring32CommandWithCP56Time2a Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.Bitstring32CommandWithCP56Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.Bitstring32CommandWithCP56Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    Bitstring32CommandWithCP56Time2a (int objectAddress, UInt32 bitstring, CP56Time2a timestamp)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.Bitstring32Command
    -override int GetEncodedSize ()
     
    Bitstring32Command (int objectAddress, UInt32 bitstring)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -CP56Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.Bitstring32Command
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -UInt32 Value [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.Bitstring32CommandWithCP56Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.Bitstring32Command.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SetpointCommands.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a__coll__graph.dot deleted file mode 100644 index 92e3621..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a__coll__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.Bitstring32CommandWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Bitstring32\lCommandWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="Bitstring32Command",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32_command.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a__inherit__graph.dot deleted file mode 100644 index 92e3621..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.Bitstring32CommandWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Bitstring32\lCommandWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="Bitstring32Command",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32_command.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a-members.html deleted file mode 100644 index 31235f9..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a-members.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.Bitstring32WithCP24Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.Bitstring32WithCP24Time2a, including all inherited members.

    - - - - - - - - - - - - - - - - -
    Bitstring32(int ioa, UInt32 value, QualityDescriptor quality) (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
    Bitstring32(Bitstring32 original) (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
    Bitstring32WithCP24Time2a(int ioa, UInt32 value, QualityDescriptor quality, CP24Time2a timestamp) (defined in lib60870.CS101.Bitstring32WithCP24Time2a)lib60870.CS101.Bitstring32WithCP24Time2a
    Bitstring32WithCP24Time2a(Bitstring32WithCP24Time2a original) (defined in lib60870.CS101.Bitstring32WithCP24Time2a)lib60870.CS101.Bitstring32WithCP24Time2a
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.Bitstring32WithCP24Time2a)lib60870.CS101.Bitstring32WithCP24Time2avirtual
    GetEncodedSize() (defined in lib60870.CS101.Bitstring32WithCP24Time2a)lib60870.CS101.Bitstring32WithCP24Time2a
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Quality (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
    SupportsSequence (defined in lib60870.CS101.Bitstring32WithCP24Time2a)lib60870.CS101.Bitstring32WithCP24Time2a
    Timestamp (defined in lib60870.CS101.Bitstring32WithCP24Time2a)lib60870.CS101.Bitstring32WithCP24Time2a
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.Bitstring32WithCP24Time2a)lib60870.CS101.Bitstring32WithCP24Time2a
    Value (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a.html deleted file mode 100644 index 862475d..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.Bitstring32WithCP24Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.Bitstring32WithCP24Time2a Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.Bitstring32WithCP24Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.Bitstring32WithCP24Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    Bitstring32WithCP24Time2a (int ioa, UInt32 value, QualityDescriptor quality, CP24Time2a timestamp)
     
    Bitstring32WithCP24Time2a (Bitstring32WithCP24Time2a original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.Bitstring32
    -override int GetEncodedSize ()
     
    Bitstring32 (int ioa, UInt32 value, QualityDescriptor quality)
     
    Bitstring32 (Bitstring32 original)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -CP24Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.Bitstring32
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -UInt32 Value [get]
     
    -QualityDescriptor Quality [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.Bitstring32WithCP24Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.Bitstring32.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/Bitstring32.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a__coll__graph.dot deleted file mode 100644 index 9502210..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a__coll__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.Bitstring32WithCP24Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Bitstring32\lWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="Bitstring32",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a__inherit__graph.dot deleted file mode 100644 index 9502210..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.Bitstring32WithCP24Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Bitstring32\lWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="Bitstring32",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a-members.html deleted file mode 100644 index afaf961..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a-members.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.Bitstring32WithCP56Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.Bitstring32WithCP56Time2a, including all inherited members.

    - - - - - - - - - - - - - - - - -
    Bitstring32(int ioa, UInt32 value, QualityDescriptor quality) (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
    Bitstring32(Bitstring32 original) (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
    Bitstring32WithCP56Time2a(int ioa, UInt32 value, QualityDescriptor quality, CP56Time2a timestamp) (defined in lib60870.CS101.Bitstring32WithCP56Time2a)lib60870.CS101.Bitstring32WithCP56Time2a
    Bitstring32WithCP56Time2a(Bitstring32WithCP56Time2a original) (defined in lib60870.CS101.Bitstring32WithCP56Time2a)lib60870.CS101.Bitstring32WithCP56Time2a
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.Bitstring32WithCP56Time2a)lib60870.CS101.Bitstring32WithCP56Time2avirtual
    GetEncodedSize() (defined in lib60870.CS101.Bitstring32WithCP56Time2a)lib60870.CS101.Bitstring32WithCP56Time2a
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Quality (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
    SupportsSequence (defined in lib60870.CS101.Bitstring32WithCP56Time2a)lib60870.CS101.Bitstring32WithCP56Time2a
    Timestamp (defined in lib60870.CS101.Bitstring32WithCP56Time2a)lib60870.CS101.Bitstring32WithCP56Time2a
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.Bitstring32WithCP56Time2a)lib60870.CS101.Bitstring32WithCP56Time2a
    Value (defined in lib60870.CS101.Bitstring32)lib60870.CS101.Bitstring32
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a.html deleted file mode 100644 index c25f29b..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.Bitstring32WithCP56Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.Bitstring32WithCP56Time2a Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.Bitstring32WithCP56Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.Bitstring32WithCP56Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    Bitstring32WithCP56Time2a (int ioa, UInt32 value, QualityDescriptor quality, CP56Time2a timestamp)
     
    Bitstring32WithCP56Time2a (Bitstring32WithCP56Time2a original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.Bitstring32
    -override int GetEncodedSize ()
     
    Bitstring32 (int ioa, UInt32 value, QualityDescriptor quality)
     
    Bitstring32 (Bitstring32 original)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -CP56Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.Bitstring32
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -UInt32 Value [get]
     
    -QualityDescriptor Quality [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.Bitstring32WithCP56Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.Bitstring32.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/Bitstring32.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a__coll__graph.dot deleted file mode 100644 index 5956dd6..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a__coll__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.Bitstring32WithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Bitstring32\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="Bitstring32",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a__inherit__graph.dot deleted file mode 100644 index 5956dd6..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.Bitstring32WithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Bitstring32\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="Bitstring32",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master-members.html deleted file mode 100644 index ad186c9..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master-members.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.CS101Master Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.CS101Master, including all inherited members.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    AddPortDeniedHandler(EventHandler eventHandler) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    AddSlave(int slaveAddress) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    CS101Master(SerialPort port, LinkLayerMode mode, LinkLayerParameters llParams=null, ApplicationLayerParameters alParams=null) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    CS101Master(Stream serialStream, LinkLayerMode mode, LinkLayerParameters llParams=null, ApplicationLayerParameters alParams=null) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    DebugOutput (defined in lib60870.CS101.Master)lib60870.CS101.Master
    debugOutput (defined in lib60870.CS101.Master)lib60870.CS101.Masterprotected
    DIRlib60870.CS101.CS101Master
    GetApplicationLayerParameters() (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    GetFile(int ca, int ioa, NameOfFile nof, IFileReceiver receiver) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    GetLinkLayerState() (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    GetLinkLayerState(int slaveAddress) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    OwnAddress (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    PollSingleSlave(int address) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    port (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Masterprotected
    RequestClass1Data(int address) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    Run()lib60870.CS101.CS101Master
    running (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Masterprotected
    SendASDU(ASDU asdu) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    SendClockSyncCommand(int ca, CP56Time2a time) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    SendControlCommand(CauseOfTransmission cot, int ca, InformationObject sc) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    SendCounterInterrogationCommand(CauseOfTransmission cot, int ca, byte qcc) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    SendDelayAcquisitionCommand(CauseOfTransmission cot, int ca, CP16Time2a delay) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    SendFile(int ca, int ioa, NameOfFile nof, IFileProvider fileProvider) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    SendInterrogationCommand(CauseOfTransmission cot, int ca, byte qoi) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    SendLinkLayerTestFunction() (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    SendReadCommand(int ca, int ioa) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    SendResetProcessCommand(CauseOfTransmission cot, int ca, byte qrp) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    SendTestCommand(int ca) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    SendTestCommandWithCP56Time2a(int ca, ushort tsc, CP56Time2a time) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    SetASDUReceivedHandler(ASDUReceivedHandler handler, object parameter) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    SetLinkLayerStateChangedHandler(LinkLayerStateChanged handler, object parameter) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    SetReceivedRawMessageHandler(RawMessageHandler handler, object parameter) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    SetSentRawMessageHandler(RawMessageHandler handler, object parameter) (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Master
    SetTimeouts(int messageTimeout, int characterTimeout)lib60870.CS101.CS101Master
    SlaveAddresslib60870.CS101.CS101Master
    Start()lib60870.CS101.CS101Master
    Stop()lib60870.CS101.CS101Master
    UseSlaveAddress(int slaveAddress)lib60870.CS101.CS101Master
    workerThread (defined in lib60870.CS101.CS101Master)lib60870.CS101.CS101Masterprotected
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master.html deleted file mode 100644 index 798bea9..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master.html +++ /dev/null @@ -1,393 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.CS101Master Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.CS101Master Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.CS101Master:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.CS101Master:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -void Run ()
     Run the protocol state machines a single time. Alternative to Start/Stop when no background thread should be used Has to be called frequently.
     
    -void AddPortDeniedHandler (EventHandler eventHandler)
     
    -void Start ()
     Start a background thread running the master.
     
    -void Stop ()
     Stop the background thread.
     
    -LinkLayerState GetLinkLayerState ()
     
    -override void SetReceivedRawMessageHandler (RawMessageHandler handler, object parameter)
     
    -override void SetSentRawMessageHandler (RawMessageHandler handler, object parameter)
     
    CS101Master (SerialPort port, LinkLayerMode mode, LinkLayerParameters llParams=null, ApplicationLayerParameters alParams=null)
     
    CS101Master (Stream serialStream, LinkLayerMode mode, LinkLayerParameters llParams=null, ApplicationLayerParameters alParams=null)
     
    void SetTimeouts (int messageTimeout, int characterTimeout)
     Sets the timeouts for receiving messages (in milliseconds)
     
    -void SetASDUReceivedHandler (ASDUReceivedHandler handler, object parameter)
     
    -void AddSlave (int slaveAddress)
     
    -LinkLayerState GetLinkLayerState (int slaveAddress)
     
    -void SetLinkLayerStateChangedHandler (LinkLayerStateChanged handler, object parameter)
     
    void UseSlaveAddress (int slaveAddress)
     Sets the slave link layer address to be used.
     
    -void PollSingleSlave (int address)
     
    -void RequestClass1Data (int address)
     
    -void SendLinkLayerTestFunction ()
     
    -override void SendInterrogationCommand (CauseOfTransmission cot, int ca, byte qoi)
     
    -override void SendCounterInterrogationCommand (CauseOfTransmission cot, int ca, byte qcc)
     
    -override void SendReadCommand (int ca, int ioa)
     
    -override void SendClockSyncCommand (int ca, CP56Time2a time)
     
    -override void SendTestCommand (int ca)
     
    -override void SendTestCommandWithCP56Time2a (int ca, ushort tsc, CP56Time2a time)
     
    -override void SendResetProcessCommand (CauseOfTransmission cot, int ca, byte qrp)
     
    -override void SendDelayAcquisitionCommand (CauseOfTransmission cot, int ca, CP16Time2a delay)
     
    -override void SendControlCommand (CauseOfTransmission cot, int ca, InformationObject sc)
     
    -override void SendASDU (ASDU asdu)
     
    -override ApplicationLayerParameters GetApplicationLayerParameters ()
     
    -override void GetFile (int ca, int ioa, NameOfFile nof, IFileReceiver receiver)
     
    -override void SendFile (int ca, int ioa, NameOfFile nof, IFileProvider fileProvider)
     
    - Public Member Functions inherited from lib60870.CS101.Master
    void SendInterrogationCommand (CauseOfTransmission cot, int ca, byte qoi)
     Sends the interrogation command.
     
    void SendCounterInterrogationCommand (CauseOfTransmission cot, int ca, byte qcc)
     Sends the counter interrogation command (C_CI_NA_1 typeID: 101)
     
    void SendReadCommand (int ca, int ioa)
     Sends a read command (C_RD_NA_1 typeID: 102).
     
    void SendClockSyncCommand (int ca, CP56Time2a time)
     Sends a clock synchronization command (C_CS_NA_1 typeID: 103).
     
    void SendTestCommand (int ca)
     Sends a test command (C_TS_NA_1 typeID: 104).
     
    void SendTestCommandWithCP56Time2a (int ca, ushort tsc, CP56Time2a time)
     Sends a test command with CP56Time2a time (C_TS_TA_1 typeID: 107).
     
    void SendResetProcessCommand (CauseOfTransmission cot, int ca, byte qrp)
     Sends a reset process command (C_RP_NA_1 typeID: 105).
     
    void SendDelayAcquisitionCommand (CauseOfTransmission cot, int ca, CP16Time2a delay)
     Sends a delay acquisition command (C_CD_NA_1 typeID: 106).
     
    void SendControlCommand (CauseOfTransmission cot, int ca, InformationObject sc)
     Sends the control command.
     
    void SendASDU (ASDU asdu)
     Sends an arbitrary ASDU to the connected slave.
     
    void GetFile (int ca, int ioa, NameOfFile nof, IFileReceiver receiver)
     Read the file from slave (upload file)
     
    void SendFile (int ca, int ioa, NameOfFile nof, IFileProvider fileProvider)
     Sends the file to slave (download file)
     
    ApplicationLayerParameters GetApplicationLayerParameters ()
     Get the application layer parameters used by this master instance.
     
    void SetReceivedRawMessageHandler (RawMessageHandler handler, object parameter)
     Sets the raw message handler for received messages.
     
    void SetSentRawMessageHandler (RawMessageHandler handler, object parameter)
     Sets the sent message handler for sent messages.
     
    - - - - - - - - - - -

    -Protected Attributes

    -Thread workerThread = null
     
    -SerialPort port = null
     
    -bool running = false
     
    - Protected Attributes inherited from lib60870.CS101.Master
    -bool debugOutput
     
    - - - - - - - - - - - - -

    -Properties

    -bool DIR [get, set]
     Value of DIR bit when sending messages.
     
    -int OwnAddress [get, set]
     
    int SlaveAddress [get, set]
     Gets or sets the link layer slave address.
     
    - Properties inherited from lib60870.CS101.Master
    -bool DebugOutput [get, set]
     
    -

    Member Function Documentation

    - -

    ◆ SetTimeouts()

    - -
    -
    - - - - - - - - - - - -
    void lib60870.CS101.CS101Master.SetTimeouts (int messageTimeout,
    int characterTimeout )
    -
    - -

    Sets the timeouts for receiving messages (in milliseconds)

    -
    Parameters
    - - - -
    messageTimeoutTimeout to wait for the first character of a message
    characterTimeoutTimeout to wait for next characters in a message
    -
    -
    - -
    -
    - -

    ◆ UseSlaveAddress()

    - -
    -
    - - - - - - - -
    void lib60870.CS101.CS101Master.UseSlaveAddress (int slaveAddress)
    -
    - -

    Sets the slave link layer address to be used.

    -
    Parameters
    - - -
    slaveAddressSlave link layer address.
    -
    -
    - -
    -
    -

    Property Documentation

    - -

    ◆ SlaveAddress

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CS101.CS101Master.SlaveAddress
    -
    -getset
    -
    - -

    Gets or sets the link layer slave address.

    -

    Slave link layer address.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/CS101Master.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master.js deleted file mode 100644 index 4611a99..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master.js +++ /dev/null @@ -1,10 +0,0 @@ -var classlib60870_1_1_c_s101_1_1_c_s101_master = -[ - [ "Run", "classlib60870_1_1_c_s101_1_1_c_s101_master.html#a4f258e8494717432a01be4ee1fcb5063", null ], - [ "SetTimeouts", "classlib60870_1_1_c_s101_1_1_c_s101_master.html#a1a60eeb2565d2111ecea43db4e4b1909", null ], - [ "Start", "classlib60870_1_1_c_s101_1_1_c_s101_master.html#a5bcaaddeb16ce3472d5567d430cf304d", null ], - [ "Stop", "classlib60870_1_1_c_s101_1_1_c_s101_master.html#a4b4ca2b56ec115d9b5f1eba13ff5c22a", null ], - [ "UseSlaveAddress", "classlib60870_1_1_c_s101_1_1_c_s101_master.html#a9923e8174758fdfa15198fcbde7502de", null ], - [ "DIR", "classlib60870_1_1_c_s101_1_1_c_s101_master.html#aceff4f3985519a296c989418c7ad71b0", null ], - [ "SlaveAddress", "classlib60870_1_1_c_s101_1_1_c_s101_master.html#aa7d93ac85baacaeaa6c70abce6856f58", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master__coll__graph.dot deleted file mode 100644 index 5de77e2..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master__coll__graph.dot +++ /dev/null @@ -1,21 +0,0 @@ -digraph "lib60870.CS101.CS101Master" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node1 [id="Node000001",label="lib60870.CS101.CS101Master",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="Master",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_master.html",tooltip="Common interface for CS104 and CS101 balanced and unbalanced master."]; - Node3 -> Node1 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="IPrimaryLinkLayerCallbacks",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node4 -> Node1 [id="edge3_Node000001_Node000004",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=" linkLayer",fontcolor="grey" ]; - Node4 [id="Node000004",label="lib60870.linklayer.LinkLayer",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node5 -> Node4 [id="edge4_Node000004_Node000005",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=" linkLayerParameters",fontcolor="grey" ]; - Node5 [id="Node000005",label="lib60870.linklayer.LinkLayer\lParameters",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1linklayer_1_1_link_layer_parameters.html",tooltip="Link layer specific parameters."]; - Node6 -> Node4 [id="edge5_Node000004_Node000006",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=" transceiver",fontcolor="grey" ]; - Node6 [id="Node000006",label="lib60870.linklayer.Serial\lTransceiverFT12",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",tooltip=" "]; - Node7 -> Node1 [id="edge6_Node000001_Node000007",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=" fileClient",fontcolor="grey" ]; - Node7 [id="Node000007",label="lib60870.CS101.FileClient",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master__inherit__graph.dot deleted file mode 100644 index 85f5ad0..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_master__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.CS101Master" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.CS101Master",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="Master",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_master.html",tooltip="Common interface for CS104 and CS101 balanced and unbalanced master."]; - Node3 -> Node1 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="IPrimaryLinkLayerCallbacks",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave-members.html deleted file mode 100644 index 5b3bd3a..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave-members.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.CS101Slave Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.CS101Slave, including all inherited members.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    asduHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    asduHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    clockSynchronizationHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    clockSynchronizationHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    counterInterrogationHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    counterInterrogationHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    CS101Slave(SerialPort port, LinkLayerParameters parameters=null)lib60870.CS101.CS101Slave
    CS101Slave(Stream serialStream, LinkLayerParameters parameters=null)lib60870.CS101.CS101Slave
    DebugOutput (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    debugOutput (defined in lib60870.CS101.Slave)lib60870.CS101.Slaveprotected
    delayAcquisitionHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    delayAcquisitionHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    DIRlib60870.CS101.CS101Slave
    EnqueueUserDataClass1(ASDU asdu)lib60870.CS101.CS101Slave
    EnqueueUserDataClass2(ASDU asdu)lib60870.CS101.CS101Slave
    filesAvailable (defined in lib60870.CS101.Slave)lib60870.CS101.Slaveprotected
    FileTimeout (defined in lib60870.CS101.CS101Slave)lib60870.CS101.CS101Slave
    GetAvailableFiles()lib60870.CS101.Slave
    interrogationHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    InterrogationHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    IsUserDataClass1QueueFull()lib60870.CS101.CS101Slave
    IsUserDataClass2QueueFull()lib60870.CS101.CS101Slave
    LinkLayerAddresslib60870.CS101.CS101Slave
    LinkLayerAddressOtherStationlib60870.CS101.CS101Slave
    LinkLayerModelib60870.CS101.CS101Slave
    Parameterslib60870.CS101.CS101Slave
    readHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    readHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    ReceiveMessageLoop()lib60870.CS101.CS101Slave
    resetProcessHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    resetProcessHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    Run()lib60870.CS101.CS101Slave
    SendLinkLayerTestFunction()lib60870.CS101.CS101Slave
    SetASDUHandler(ASDUHandler handler, object parameter)lib60870.CS101.Slave
    SetClockSynchronizationHandler(ClockSynchronizationHandler handler, object parameter)lib60870.CS101.Slave
    SetCounterInterrogationHandler(CounterInterrogationHandler handler, object parameter)lib60870.CS101.Slave
    SetDelayAcquisitionHandler(DelayAcquisitionHandler handler, object parameter) (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    SetFileReadyHandler(FileReadyHandler handler, object parameter)lib60870.CS101.Slave
    SetInterrogationHandler(InterrogationHandler handler, object parameter)lib60870.CS101.Slave
    SetReadHandler(ReadHandler handler, object parameter)lib60870.CS101.Slave
    SetReceivedRawMessageHandler(RawMessageHandler handler, object parameter)lib60870.CS101.CS101Slave
    SetResetProcessHandler(ResetProcessHandler handler, object parameter) (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    SetSentRawMessageHandler(RawMessageHandler handler, object parameter)lib60870.CS101.CS101Slave
    SetUserDataQueueSizes(int class1QueueSize, int class2QueueSize)lib60870.CS101.CS101Slave
    Stop()lib60870.CS101.CS101Slave
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave.html deleted file mode 100644 index 252d1ce..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave.html +++ /dev/null @@ -1,680 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.CS101Slave Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.CS101Slave Class Reference
    -
    -
    - -

    CS 101 slave implementation (implements Slave interface) - More...

    -
    -Inheritance diagram for lib60870.CS101.CS101Slave:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.CS101Slave:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -void Stop ()
     Stops the receive message loop.
     
    void SetUserDataQueueSizes (int class1QueueSize, int class2QueueSize)
     Sets the user data queue sizes. When the maximum size is reached the oldest value will be deleted when a new ASDU is added.
     
    bool IsUserDataClass1QueueFull ()
     Determines whether the user data class 1 queue is full.
     
    void EnqueueUserDataClass1 (ASDU asdu)
     Enqueues an ASDU into the class 1 queue (for events, command responses, and other high-priority messages).
     
    bool IsUserDataClass2QueueFull ()
     Determines whether the user data class 2 queue is full.
     
    void EnqueueUserDataClass2 (ASDU asdu)
     Enqueues an ASDU into the class 2 queue (for periodic measurments, background scan, and other low-priority data).
     
     CS101Slave (SerialPort port, LinkLayerParameters parameters=null)
     Initializes a new instance of the lib60870.CS101.CS101Slave class.
     
     CS101Slave (Stream serialStream, LinkLayerParameters parameters=null)
     Initializes a new instance of the lib60870.CS101.CS101Slave class.
     
    -void SendLinkLayerTestFunction ()
     Sends a link layer test function.
     
    -void Run ()
     Run a the message receiver and state machines once. Can be used if no threads should be used.
     
    void ReceiveMessageLoop ()
     Starts a loop that handles incoming messages.
     
    void SetReceivedRawMessageHandler (RawMessageHandler handler, object parameter)
     Sets the raw message handler for received messages.
     
    void SetSentRawMessageHandler (RawMessageHandler handler, object parameter)
     Sets the sent message handler for sent messages.
     
    - Public Member Functions inherited from lib60870.CS101.Slave
    void SetInterrogationHandler (InterrogationHandler handler, object parameter)
     Sets a callback for interrogaton requests.
     
    void SetCounterInterrogationHandler (CounterInterrogationHandler handler, object parameter)
     Sets a callback for counter interrogaton requests.
     
    void SetReadHandler (ReadHandler handler, object parameter)
     Sets a callback for read requests.
     
    void SetClockSynchronizationHandler (ClockSynchronizationHandler handler, object parameter)
     Sets a callback for the clock synchronization request.
     
    -void SetResetProcessHandler (ResetProcessHandler handler, object parameter)
     
    -void SetDelayAcquisitionHandler (DelayAcquisitionHandler handler, object parameter)
     
    void SetASDUHandler (ASDUHandler handler, object parameter)
     Sets a callback to handle ASDUs (commands, requests) form clients. This callback can be used when no other callback handles the message from the client/master.
     
    void SetFileReadyHandler (FileReadyHandler handler, object parameter)
     Sets a callback handler that is called when a file ready message is received from a master.
     
    FilesAvailable GetAvailableFiles ()
     Gets the available files that are registered with the file server.
     
    - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    ApplicationLayerParameters Parameters [get, set]
     Gets or sets the application layer parameters-.
     
    bool DIR [get, set]
     Gets or sets the direction bit value used for balanced mode (default is false)
     
    LinkLayerMode LinkLayerMode [get, set]
     Gets or sets the link layer mode (balanced or unbalanced).
     
    int LinkLayerAddress [get, set]
     Gets or sets the own link layer address.
     
    int LinkLayerAddressOtherStation [get, set]
     Gets or sets the link layer address of the other station (for balanced mode).
     
    -override int FileTimeout [get, set]
     
    - Properties inherited from lib60870.CS101.Slave
    -bool DebugOutput [get, set]
     
    virtual int FileTimeout [get, set]
     Gets or sets the file service timeout.
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Additional Inherited Members

    - Public Attributes inherited from lib60870.CS101.Slave
    -InterrogationHandler interrogationHandler = null
     
    -object InterrogationHandlerParameter = null
     
    -CounterInterrogationHandler counterInterrogationHandler = null
     
    -object counterInterrogationHandlerParameter = null
     
    -ReadHandler readHandler = null
     
    -object readHandlerParameter = null
     
    -ClockSynchronizationHandler clockSynchronizationHandler = null
     
    -object clockSynchronizationHandlerParameter = null
     
    -ResetProcessHandler resetProcessHandler = null
     
    -object resetProcessHandlerParameter = null
     
    -DelayAcquisitionHandler delayAcquisitionHandler = null
     
    -object delayAcquisitionHandlerParameter = null
     
    -ASDUHandler asduHandler = null
     
    -object asduHandlerParameter = null
     
    - Protected Attributes inherited from lib60870.CS101.Slave
    -bool debugOutput
     
    -FilesAvailable filesAvailable = new FilesAvailable()
     
    -

    Detailed Description

    -

    CS 101 slave implementation (implements Slave interface)

    -

    Constructor & Destructor Documentation

    - -

    ◆ CS101Slave() [1/2]

    - -
    -
    - - - - - - - - - - - -
    lib60870.CS101.CS101Slave.CS101Slave (SerialPort port,
    LinkLayerParameters parameters = null )
    -
    - -

    Initializes a new instance of the lib60870.CS101.CS101Slave class.

    -
    Parameters
    - - - -
    portserial port instance
    parameterslink layer parameters
    -
    -
    - -
    -
    - -

    ◆ CS101Slave() [2/2]

    - -
    -
    - - - - - - - - - - - -
    lib60870.CS101.CS101Slave.CS101Slave (Stream serialStream,
    LinkLayerParameters parameters = null )
    -
    - -

    Initializes a new instance of the lib60870.CS101.CS101Slave class.

    -
    Parameters
    - - - -
    serialStreamA stream instance (e.g. TcpClientVirtualSerialPort or TcpServerVirtualSerialPort.
    parameterslink layer parameters
    -
    -
    - -
    -
    -

    Member Function Documentation

    - -

    ◆ EnqueueUserDataClass1()

    - -
    -
    - - - - - - - -
    void lib60870.CS101.CS101Slave.EnqueueUserDataClass1 (ASDU asdu)
    -
    - -

    Enqueues an ASDU into the class 1 queue (for events, command responses, and other high-priority messages).

    -
    Parameters
    - - -
    asduASDU to enqueue
    -
    -
    - -
    -
    - -

    ◆ EnqueueUserDataClass2()

    - -
    -
    - - - - - - - -
    void lib60870.CS101.CS101Slave.EnqueueUserDataClass2 (ASDU asdu)
    -
    - -

    Enqueues an ASDU into the class 2 queue (for periodic measurments, background scan, and other low-priority data).

    -
    Parameters
    - - -
    asduASDU to enqueue
    -
    -
    - -
    -
    - -

    ◆ IsUserDataClass1QueueFull()

    - -
    -
    - - - - - - - -
    bool lib60870.CS101.CS101Slave.IsUserDataClass1QueueFull ()
    -
    - -

    Determines whether the user data class 1 queue is full.

    -
    Returns
    true if the queue is full; otherwise, false.
    - -
    -
    - -

    ◆ IsUserDataClass2QueueFull()

    - -
    -
    - - - - - - - -
    bool lib60870.CS101.CS101Slave.IsUserDataClass2QueueFull ()
    -
    - -

    Determines whether the user data class 2 queue is full.

    -
    Returns
    true if the queue is full; otherwise, false.
    - -
    -
    - -

    ◆ ReceiveMessageLoop()

    - -
    -
    - - - - - - - -
    void lib60870.CS101.CS101Slave.ReceiveMessageLoop ()
    -
    - -

    Starts a loop that handles incoming messages.

    -

    It is best to be started in a separate thread. The loop can be stopped with the Stop method.

    - -
    -
    - -

    ◆ SetReceivedRawMessageHandler()

    - -
    -
    - - - - - - - - - - - -
    void lib60870.CS101.CS101Slave.SetReceivedRawMessageHandler (RawMessageHandler handler,
    object parameter )
    -
    - -

    Sets the raw message handler for received messages.

    -
    Parameters
    - - - -
    handlerHandler/delegate that will be invoked when a message is received
    parameterwill be passed to the delegate
    -
    -
    - -
    -
    - -

    ◆ SetSentRawMessageHandler()

    - -
    -
    - - - - - - - - - - - -
    void lib60870.CS101.CS101Slave.SetSentRawMessageHandler (RawMessageHandler handler,
    object parameter )
    -
    - -

    Sets the sent message handler for sent messages.

    -
    Parameters
    - - - -
    handlerHandler/delegate that will be invoked when a message is sent<
    parameterwill be passed to the delegate
    -
    -
    - -
    -
    - -

    ◆ SetUserDataQueueSizes()

    - -
    -
    - - - - - - - - - - - -
    void lib60870.CS101.CS101Slave.SetUserDataQueueSizes (int class1QueueSize,
    int class2QueueSize )
    -
    - -

    Sets the user data queue sizes. When the maximum size is reached the oldest value will be deleted when a new ASDU is added.

    -
    Parameters
    - - - -
    class1QueueSizeClass 1 queue size.
    class2QueueSizeClass 2 queue size.
    -
    -
    - -
    -
    -

    Property Documentation

    - -

    ◆ DIR

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS101.CS101Slave.DIR
    -
    -getset
    -
    - -

    Gets or sets the direction bit value used for balanced mode (default is false)

    -

    true if DIR is set otherwise, false.

    - -
    -
    - -

    ◆ LinkLayerAddress

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CS101.CS101Slave.LinkLayerAddress
    -
    -getset
    -
    - -

    Gets or sets the own link layer address.

    -

    own link layer address.

    - -
    -
    - -

    ◆ LinkLayerAddressOtherStation

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CS101.CS101Slave.LinkLayerAddressOtherStation
    -
    -getset
    -
    - -

    Gets or sets the link layer address of the other station (for balanced mode).

    -

    link layer address of other station.

    - -
    -
    - -

    ◆ LinkLayerMode

    - -
    -
    - - - - - -
    - - - - -
    LinkLayerMode lib60870.CS101.CS101Slave.LinkLayerMode
    -
    -getset
    -
    - -

    Gets or sets the link layer mode (balanced or unbalanced).

    -

    The link layer mode.

    - -
    -
    - -

    ◆ Parameters

    - -
    -
    - - - - - -
    - - - - -
    ApplicationLayerParameters lib60870.CS101.CS101Slave.Parameters
    -
    -getset
    -
    - -

    Gets or sets the application layer parameters-.

    -

    Should be set before starting the communication

    -

    application layer parameters.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/CS101Slave.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave.js deleted file mode 100644 index c28ffb4..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave.js +++ /dev/null @@ -1,21 +0,0 @@ -var classlib60870_1_1_c_s101_1_1_c_s101_slave = -[ - [ "CS101Slave", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a2e94b7ad7d65489e0dbe94fb76d79420", null ], - [ "CS101Slave", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a7d63775d354c7e0b9a3b50927ed74134", null ], - [ "EnqueueUserDataClass1", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a5a8573dbafd2ce027d9d7603b3347211", null ], - [ "EnqueueUserDataClass2", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a605411588ecb89ab825520cac38d547e", null ], - [ "IsUserDataClass1QueueFull", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a9903e812bc9779389eb09e855ae3dd74", null ], - [ "IsUserDataClass2QueueFull", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a24cdca7a10754390b15ce735f848cdb3", null ], - [ "ReceiveMessageLoop", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a19871be23f60399362713e78b8c07404", null ], - [ "Run", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#adeb6feabfe4b01f17bc863ea0281d79c", null ], - [ "SendLinkLayerTestFunction", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a1ee5095020096c7958e2230dbd273100", null ], - [ "SetReceivedRawMessageHandler", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a01bd8b909386de3b9426d5c953a716e3", null ], - [ "SetSentRawMessageHandler", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a0fa4e121ca94fc5a017587c1382d7f42", null ], - [ "SetUserDataQueueSizes", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a6c28db4c5b92dbc3b67e25d86c5a19df", null ], - [ "Stop", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a6502368270e7b7efa3a59778d58bda3a", null ], - [ "DIR", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#ae1d00e6ee950d56d5487384070651148", null ], - [ "LinkLayerAddress", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#aeb21ec9a8522c48ad37c263762d300a4", null ], - [ "LinkLayerAddressOtherStation", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#aa3c5ac017a1ea8fdbbb686c52076cc75", null ], - [ "LinkLayerMode", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#ad9d9bad745efb1fd3ce5bcbe894f6d97", null ], - [ "Parameters", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html#ab063f08cb01b7c3ca5bdc86cbafec7d2", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave__coll__graph.dot deleted file mode 100644 index f67288e..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave__coll__graph.dot +++ /dev/null @@ -1,16 +0,0 @@ -digraph "lib60870.CS101.CS101Slave" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.CS101Slave",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="CS 101 slave implementation (implements Slave interface)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="Slave",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_slave.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=" filesAvailable",fontcolor="grey" ]; - Node3 [id="Node000003",label="lib60870.CS101.FilesAvailable",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_files_available.html",tooltip="Represents the available files in a file client or file server."]; - Node4 -> Node1 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node4 [id="Node000004",label="ISecondaryApplicationLayer",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node5 -> Node1 [id="edge4_Node000001_Node000005",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node5 [id="Node000005",label="IMasterConnection",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$interfacelib60870_1_1_c_s101_1_1_i_master_connection.html",tooltip="Provides functions to be used in Slave callbacks to send data back to the master."]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave__inherit__graph.dot deleted file mode 100644 index 94127b6..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_c_s101_slave__inherit__graph.dot +++ /dev/null @@ -1,14 +0,0 @@ -digraph "lib60870.CS101.CS101Slave" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.CS101Slave",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="CS 101 slave implementation (implements Slave interface)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="Slave",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_slave.html",tooltip=" "]; - Node3 -> Node1 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="ISecondaryApplicationLayer",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node4 -> Node1 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node4 [id="Node000004",label="IMasterConnection",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$interfacelib60870_1_1_c_s101_1_1_i_master_connection.html",tooltip="Provides functions to be used in Slave callbacks to send data back to the master."]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command-members.html deleted file mode 100644 index d1b2165..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command-members.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.ClockSynchronizationCommand Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.ClockSynchronizationCommand, including all inherited members.

    - - - - - - - - - - - -
    ClockSynchronizationCommand(int ioa, CP56Time2a newTime) (defined in lib60870.CS101.ClockSynchronizationCommand)lib60870.CS101.ClockSynchronizationCommand
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.ClockSynchronizationCommand)lib60870.CS101.ClockSynchronizationCommandvirtual
    GetEncodedSize() (defined in lib60870.CS101.ClockSynchronizationCommand)lib60870.CS101.ClockSynchronizationCommand
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    NewTime (defined in lib60870.CS101.ClockSynchronizationCommand)lib60870.CS101.ClockSynchronizationCommand
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    SupportsSequence (defined in lib60870.CS101.ClockSynchronizationCommand)lib60870.CS101.ClockSynchronizationCommand
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.ClockSynchronizationCommand)lib60870.CS101.ClockSynchronizationCommand
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command.html deleted file mode 100644 index 1bc42ea..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command.html +++ /dev/null @@ -1,219 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.ClockSynchronizationCommand Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.ClockSynchronizationCommand Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.ClockSynchronizationCommand:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.ClockSynchronizationCommand:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    ClockSynchronizationCommand (int ioa, CP56Time2a newTime)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -CP56Time2a NewTime [get, set]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.ClockSynchronizationCommand.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SystemInformationCommands.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command__coll__graph.dot deleted file mode 100644 index a2a7e16..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.ClockSynchronizationCommand" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.ClockSynchronization\lCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command__inherit__graph.dot deleted file mode 100644 index a2a7e16..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_clock_synchronization_command__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.ClockSynchronizationCommand" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.ClockSynchronization\lCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command-members.html deleted file mode 100644 index 6d6f2b9..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command-members.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.CounterInterrogationCommand Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.CounterInterrogationCommand, including all inherited members.

    - - - - - - - - - - - -
    CounterInterrogationCommand(int ioa, byte qoi) (defined in lib60870.CS101.CounterInterrogationCommand)lib60870.CS101.CounterInterrogationCommand
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.CounterInterrogationCommand)lib60870.CS101.CounterInterrogationCommandvirtual
    GetEncodedSize() (defined in lib60870.CS101.CounterInterrogationCommand)lib60870.CS101.CounterInterrogationCommand
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    QCClib60870.CS101.CounterInterrogationCommand
    SupportsSequence (defined in lib60870.CS101.CounterInterrogationCommand)lib60870.CS101.CounterInterrogationCommand
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.CounterInterrogationCommand)lib60870.CS101.CounterInterrogationCommand
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html deleted file mode 100644 index 3465940..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.CounterInterrogationCommand Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.CounterInterrogationCommand Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.CounterInterrogationCommand:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.CounterInterrogationCommand:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    CounterInterrogationCommand (int ioa, byte qoi)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    byte QCC [get, set]
     Gets or sets the QCC (Qualifier of counter interrogation).
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.CounterInterrogationCommand.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -

    Property Documentation

    - -

    ◆ QCC

    - -
    -
    - - - - - -
    - - - - -
    byte lib60870.CS101.CounterInterrogationCommand.QCC
    -
    -getset
    -
    - -

    Gets or sets the QCC (Qualifier of counter interrogation).

    -

    The QCC

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SystemInformationCommands.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command.js deleted file mode 100644 index fbdfde9..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command.js +++ /dev/null @@ -1,4 +0,0 @@ -var classlib60870_1_1_c_s101_1_1_counter_interrogation_command = -[ - [ "QCC", "classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html#a839093d6c7666896a4bcf2c9b079564e", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command__coll__graph.dot deleted file mode 100644 index 909e500..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.CounterInterrogationCommand" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.CounterInterrogation\lCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command__inherit__graph.dot deleted file mode 100644 index 909e500..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_counter_interrogation_command__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.CounterInterrogationCommand" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.CounterInterrogation\lCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command-members.html deleted file mode 100644 index fb897bc..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command-members.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.DelayAcquisitionCommand Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.DelayAcquisitionCommand, including all inherited members.

    - - - - - - - - - - - -
    Delay (defined in lib60870.CS101.DelayAcquisitionCommand)lib60870.CS101.DelayAcquisitionCommand
    DelayAcquisitionCommand(int ioa, CP16Time2a delay) (defined in lib60870.CS101.DelayAcquisitionCommand)lib60870.CS101.DelayAcquisitionCommand
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.DelayAcquisitionCommand)lib60870.CS101.DelayAcquisitionCommandvirtual
    GetEncodedSize() (defined in lib60870.CS101.DelayAcquisitionCommand)lib60870.CS101.DelayAcquisitionCommand
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    SupportsSequence (defined in lib60870.CS101.DelayAcquisitionCommand)lib60870.CS101.DelayAcquisitionCommand
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.DelayAcquisitionCommand)lib60870.CS101.DelayAcquisitionCommand
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command.html deleted file mode 100644 index 79b8689..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command.html +++ /dev/null @@ -1,219 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.DelayAcquisitionCommand Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.DelayAcquisitionCommand Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.DelayAcquisitionCommand:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.DelayAcquisitionCommand:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    DelayAcquisitionCommand (int ioa, CP16Time2a delay)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -CP16Time2a Delay [get, set]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.DelayAcquisitionCommand.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SystemInformationCommands.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command__coll__graph.dot deleted file mode 100644 index 5b8bccc..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.DelayAcquisitionCommand" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.DelayAcquisition\lCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command__inherit__graph.dot deleted file mode 100644 index 5b8bccc..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_delay_acquisition_command__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.DelayAcquisitionCommand" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.DelayAcquisition\lCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command-members.html deleted file mode 100644 index 2513917..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command-members.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.DoubleCommand Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.DoubleCommand, including all inherited members.

    - - - - - - - - - - - - - - - - -
    DoubleCommand(int ioa, int command, bool select, int quality) (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
    DoubleCommand(DoubleCommand original) (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommandvirtual
    GetEncodedSize() (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    OFF (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommandstatic
    ON (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommandstatic
    QU (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
    Select (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
    State (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
    SupportsSequence (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command.html deleted file mode 100644 index 01e9f58..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command.html +++ /dev/null @@ -1,238 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.DoubleCommand Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.DoubleCommand Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.DoubleCommand:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.DoubleCommand:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    DoubleCommand (int ioa, int command, bool select, int quality)
     
    DoubleCommand (DoubleCommand original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - -

    -Static Public Attributes

    -static int OFF = 1
     
    -static int ON = 2
     
    - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -int QU [get]
     
    -int State [get]
     
    -bool Select [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.DoubleCommand.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SingleCommand.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command__coll__graph.dot deleted file mode 100644 index 2f7d8b8..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.DoubleCommand" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.DoubleCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command__inherit__graph.dot deleted file mode 100644 index dd2dcf2..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command__inherit__graph.dot +++ /dev/null @@ -1,16 +0,0 @@ -digraph "lib60870.CS101.DoubleCommand" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.DoubleCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; - Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="lib60870.CS101.DoubleCommand\lWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a.html",tooltip=" "]; - Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node4 [id="Node000004",label="lib60870.CS101.StepCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_command.html",tooltip=" "]; - Node4 -> Node5 [id="edge4_Node000004_Node000005",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node5 [id="Node000005",label="lib60870.CS101.StepCommand\lWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a-members.html deleted file mode 100644 index e5eb7fa..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a-members.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.DoubleCommandWithCP56Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.DoubleCommandWithCP56Time2a, including all inherited members.

    - - - - - - - - - - - - - - - - - - - -
    DoubleCommand(int ioa, int command, bool select, int quality) (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
    DoubleCommand(DoubleCommand original) (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
    DoubleCommandWithCP56Time2a(int ioa, int command, bool select, int quality, CP56Time2a timestamp) (defined in lib60870.CS101.DoubleCommandWithCP56Time2a)lib60870.CS101.DoubleCommandWithCP56Time2a
    DoubleCommandWithCP56Time2a(DoubleCommandWithCP56Time2a original) (defined in lib60870.CS101.DoubleCommandWithCP56Time2a)lib60870.CS101.DoubleCommandWithCP56Time2a
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.DoubleCommandWithCP56Time2a)lib60870.CS101.DoubleCommandWithCP56Time2avirtual
    GetEncodedSize() (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    OFF (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommandstatic
    ON (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommandstatic
    QU (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
    Select (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
    State (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
    SupportsSequence (defined in lib60870.CS101.DoubleCommandWithCP56Time2a)lib60870.CS101.DoubleCommandWithCP56Time2a
    Timestamp (defined in lib60870.CS101.DoubleCommandWithCP56Time2a)lib60870.CS101.DoubleCommandWithCP56Time2a
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.DoubleCommandWithCP56Time2a)lib60870.CS101.DoubleCommandWithCP56Time2a
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a.html deleted file mode 100644 index 6edd8cc..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a.html +++ /dev/null @@ -1,252 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.DoubleCommandWithCP56Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.DoubleCommandWithCP56Time2a Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.DoubleCommandWithCP56Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.DoubleCommandWithCP56Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    DoubleCommandWithCP56Time2a (int ioa, int command, bool select, int quality, CP56Time2a timestamp)
     
    DoubleCommandWithCP56Time2a (DoubleCommandWithCP56Time2a original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.DoubleCommand
    -override int GetEncodedSize ()
     
    DoubleCommand (int ioa, int command, bool select, int quality)
     
    DoubleCommand (DoubleCommand original)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -CP56Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.DoubleCommand
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -int QU [get]
     
    -int State [get]
     
    -bool Select [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - - - - - - -

    -Additional Inherited Members

    - Static Public Attributes inherited from lib60870.CS101.DoubleCommand
    -static int OFF = 1
     
    -static int ON = 2
     
    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.DoubleCommandWithCP56Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.DoubleCommand.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SingleCommand.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a__coll__graph.dot deleted file mode 100644 index 169cacd..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a__coll__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.DoubleCommandWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.DoubleCommand\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="DoubleCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_command.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a__inherit__graph.dot deleted file mode 100644 index 169cacd..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.DoubleCommandWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.DoubleCommand\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="DoubleCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_command.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information-members.html deleted file mode 100644 index 2698ff7..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information-members.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.DoublePointInformation Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.DoublePointInformation, including all inherited members.

    - - - - - - - - - - - - - -
    DoublePointInformation(int ioa, DoublePointValue value, QualityDescriptor quality) (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
    DoublePointInformation(DoublePointInformation original) (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformationvirtual
    GetEncodedSize() (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Quality (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
    SupportsSequence (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
    Value (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information.html deleted file mode 100644 index 8e6fdfd..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information.html +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.DoublePointInformation Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.DoublePointInformation Class Reference
    -
    -
    - -

    Double point information object (M_DP_NA_1) - More...

    -
    -Inheritance diagram for lib60870.CS101.DoublePointInformation:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.DoublePointInformation:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    DoublePointInformation (int ioa, DoublePointValue value, QualityDescriptor quality)
     
    DoublePointInformation (DoublePointInformation original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -DoublePointValue Value [get]
     
    -QualityDescriptor Quality [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Detailed Description

    -

    Double point information object (M_DP_NA_1)

    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.DoublePointInformation.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/DoublePointInformation.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information__coll__graph.dot deleted file mode 100644 index aa37919..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.DoublePointInformation" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.DoublePoint\lInformation",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Double point information object (M_DP_NA_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information__inherit__graph.dot deleted file mode 100644 index fe5e102..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_information__inherit__graph.dot +++ /dev/null @@ -1,14 +0,0 @@ -digraph "lib60870.CS101.DoublePointInformation" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.DoublePoint\lInformation",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Double point information object (M_DP_NA_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; - Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="lib60870.CS101.DoublePoint\lWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a.html",tooltip="Double point information object with CP24Time2a time tag (M_DP_TA_1)"]; - Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node4 [id="Node000004",label="lib60870.CS101.DoublePoint\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a.html",tooltip="Double point information object with CP56Time2a time tag (M_DP_TB_1)"]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a-members.html deleted file mode 100644 index 9f5be9c..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a-members.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.DoublePointWithCP24Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.DoublePointWithCP24Time2a, including all inherited members.

    - - - - - - - - - - - - - - - - -
    DoublePointInformation(int ioa, DoublePointValue value, QualityDescriptor quality) (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
    DoublePointInformation(DoublePointInformation original) (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
    DoublePointWithCP24Time2a(int ioa, DoublePointValue value, QualityDescriptor quality, CP24Time2a timestamp) (defined in lib60870.CS101.DoublePointWithCP24Time2a)lib60870.CS101.DoublePointWithCP24Time2a
    DoublePointWithCP24Time2a(DoublePointWithCP24Time2a original) (defined in lib60870.CS101.DoublePointWithCP24Time2a)lib60870.CS101.DoublePointWithCP24Time2a
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.DoublePointWithCP24Time2a)lib60870.CS101.DoublePointWithCP24Time2avirtual
    GetEncodedSize() (defined in lib60870.CS101.DoublePointWithCP24Time2a)lib60870.CS101.DoublePointWithCP24Time2a
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Quality (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
    SupportsSequence (defined in lib60870.CS101.DoublePointWithCP24Time2a)lib60870.CS101.DoublePointWithCP24Time2a
    Timestamp (defined in lib60870.CS101.DoublePointWithCP24Time2a)lib60870.CS101.DoublePointWithCP24Time2a
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.DoublePointWithCP24Time2a)lib60870.CS101.DoublePointWithCP24Time2a
    Value (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a.html deleted file mode 100644 index 76b3690..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a.html +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.DoublePointWithCP24Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.DoublePointWithCP24Time2a Class Reference
    -
    -
    - -

    Double point information object with CP24Time2a time tag (M_DP_TA_1) - More...

    -
    -Inheritance diagram for lib60870.CS101.DoublePointWithCP24Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.DoublePointWithCP24Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    DoublePointWithCP24Time2a (int ioa, DoublePointValue value, QualityDescriptor quality, CP24Time2a timestamp)
     
    DoublePointWithCP24Time2a (DoublePointWithCP24Time2a original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.DoublePointInformation
    -override int GetEncodedSize ()
     
    DoublePointInformation (int ioa, DoublePointValue value, QualityDescriptor quality)
     
    DoublePointInformation (DoublePointInformation original)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -CP24Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.DoublePointInformation
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -DoublePointValue Value [get]
     
    -QualityDescriptor Quality [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Detailed Description

    -

    Double point information object with CP24Time2a time tag (M_DP_TA_1)

    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.DoublePointWithCP24Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.DoublePointInformation.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/DoublePointInformation.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a__coll__graph.dot deleted file mode 100644 index 86f78ad..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a__coll__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.DoublePointWithCP24Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.DoublePoint\lWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Double point information object with CP24Time2a time tag (M_DP_TA_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="DoublePointInformation",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_point_information.html",tooltip="Double point information object (M_DP_NA_1)"]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a__inherit__graph.dot deleted file mode 100644 index 86f78ad..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.DoublePointWithCP24Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.DoublePoint\lWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Double point information object with CP24Time2a time tag (M_DP_TA_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="DoublePointInformation",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_point_information.html",tooltip="Double point information object (M_DP_NA_1)"]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a-members.html deleted file mode 100644 index cb153d3..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a-members.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.DoublePointWithCP56Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.DoublePointWithCP56Time2a, including all inherited members.

    - - - - - - - - - - - - - - - - -
    DoublePointInformation(int ioa, DoublePointValue value, QualityDescriptor quality) (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
    DoublePointInformation(DoublePointInformation original) (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
    DoublePointWithCP56Time2a(int ioa, DoublePointValue value, QualityDescriptor quality, CP56Time2a timestamp) (defined in lib60870.CS101.DoublePointWithCP56Time2a)lib60870.CS101.DoublePointWithCP56Time2a
    DoublePointWithCP56Time2a(DoublePointWithCP56Time2a original) (defined in lib60870.CS101.DoublePointWithCP56Time2a)lib60870.CS101.DoublePointWithCP56Time2a
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.DoublePointWithCP56Time2a)lib60870.CS101.DoublePointWithCP56Time2avirtual
    GetEncodedSize() (defined in lib60870.CS101.DoublePointWithCP56Time2a)lib60870.CS101.DoublePointWithCP56Time2a
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Quality (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
    SupportsSequence (defined in lib60870.CS101.DoublePointWithCP56Time2a)lib60870.CS101.DoublePointWithCP56Time2a
    Timestamp (defined in lib60870.CS101.DoublePointWithCP56Time2a)lib60870.CS101.DoublePointWithCP56Time2a
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.DoublePointWithCP56Time2a)lib60870.CS101.DoublePointWithCP56Time2a
    Value (defined in lib60870.CS101.DoublePointInformation)lib60870.CS101.DoublePointInformation
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a.html deleted file mode 100644 index 7c1d301..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a.html +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.DoublePointWithCP56Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.DoublePointWithCP56Time2a Class Reference
    -
    -
    - -

    Double point information object with CP56Time2a time tag (M_DP_TB_1) - More...

    -
    -Inheritance diagram for lib60870.CS101.DoublePointWithCP56Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.DoublePointWithCP56Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    DoublePointWithCP56Time2a (int ioa, DoublePointValue value, QualityDescriptor quality, CP56Time2a timestamp)
     
    DoublePointWithCP56Time2a (DoublePointWithCP56Time2a original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.DoublePointInformation
    -override int GetEncodedSize ()
     
    DoublePointInformation (int ioa, DoublePointValue value, QualityDescriptor quality)
     
    DoublePointInformation (DoublePointInformation original)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -CP56Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.DoublePointInformation
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -DoublePointValue Value [get]
     
    -QualityDescriptor Quality [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Detailed Description

    -

    Double point information object with CP56Time2a time tag (M_DP_TB_1)

    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.DoublePointWithCP56Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.DoublePointInformation.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/DoublePointInformation.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a__coll__graph.dot deleted file mode 100644 index a4aa735..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a__coll__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.DoublePointWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.DoublePoint\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Double point information object with CP56Time2a time tag (M_DP_TB_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="DoublePointInformation",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_point_information.html",tooltip="Double point information object (M_DP_NA_1)"]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a__inherit__graph.dot deleted file mode 100644 index a4aa735..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.DoublePointWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.DoublePoint\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Double point information object with CP56Time2a time tag (M_DP_TB_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="DoublePointInformation",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_point_information.html",tooltip="Double point information object (M_DP_NA_1)"]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization-members.html deleted file mode 100644 index 58c40fa..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization-members.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.EndOfInitialization Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.EndOfInitialization, including all inherited members.

    - - - - - - - - - - - - -
    COIlib60870.CS101.EndOfInitialization
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.EndOfInitialization)lib60870.CS101.EndOfInitializationvirtual
    EndOfInitialization(byte coi) (defined in lib60870.CS101.EndOfInitialization)lib60870.CS101.EndOfInitialization
    EndOfInitialization(EndOfInitialization original) (defined in lib60870.CS101.EndOfInitialization)lib60870.CS101.EndOfInitialization
    GetEncodedSize() (defined in lib60870.CS101.EndOfInitialization)lib60870.CS101.EndOfInitialization
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    SupportsSequence (defined in lib60870.CS101.EndOfInitialization)lib60870.CS101.EndOfInitialization
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.EndOfInitialization)lib60870.CS101.EndOfInitialization
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization.html deleted file mode 100644 index a9dc77b..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization.html +++ /dev/null @@ -1,228 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.EndOfInitialization Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.EndOfInitialization Class Reference
    -
    -
    - -

    End of initialization information object (M_EI_NA_1) - More...

    -
    -Inheritance diagram for lib60870.CS101.EndOfInitialization:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.EndOfInitialization:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    EndOfInitialization (byte coi)
     
    EndOfInitialization (EndOfInitialization original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - -

    -Properties

    -byte COI [get, set]
     Cause of Initialization (COI)
     
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Detailed Description

    -

    End of initialization information object (M_EI_NA_1)

    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.EndOfInitialization.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/EndOfInitialization.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization.js deleted file mode 100644 index b620194..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization.js +++ /dev/null @@ -1,4 +0,0 @@ -var classlib60870_1_1_c_s101_1_1_end_of_initialization = -[ - [ "COI", "classlib60870_1_1_c_s101_1_1_end_of_initialization.html#ad48e8ec133c8bf5ed7f389063492d67b", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization__coll__graph.dot deleted file mode 100644 index 48af3df..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.EndOfInitialization" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.EndOfInitialization",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="End of initialization information object (M_EI_NA_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization__inherit__graph.dot deleted file mode 100644 index 48af3df..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_end_of_initialization__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.EndOfInitialization" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.EndOfInitialization",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="End of initialization information object (M_EI_NA_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment-members.html deleted file mode 100644 index 2565818..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment-members.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.EventOfProtectionEquipment Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.EventOfProtectionEquipment, including all inherited members.

    - - - - - - - - - - - - - - -
    ElapsedTime (defined in lib60870.CS101.EventOfProtectionEquipment)lib60870.CS101.EventOfProtectionEquipment
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.EventOfProtectionEquipment)lib60870.CS101.EventOfProtectionEquipmentvirtual
    Event (defined in lib60870.CS101.EventOfProtectionEquipment)lib60870.CS101.EventOfProtectionEquipment
    EventOfProtectionEquipment(int ioa, SingleEvent singleEvent, CP16Time2a elapsedTime, CP24Time2a timestamp) (defined in lib60870.CS101.EventOfProtectionEquipment)lib60870.CS101.EventOfProtectionEquipment
    EventOfProtectionEquipment(EventOfProtectionEquipment original) (defined in lib60870.CS101.EventOfProtectionEquipment)lib60870.CS101.EventOfProtectionEquipment
    GetEncodedSize() (defined in lib60870.CS101.EventOfProtectionEquipment)lib60870.CS101.EventOfProtectionEquipment
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    SupportsSequence (defined in lib60870.CS101.EventOfProtectionEquipment)lib60870.CS101.EventOfProtectionEquipment
    Timestamp (defined in lib60870.CS101.EventOfProtectionEquipment)lib60870.CS101.EventOfProtectionEquipment
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.EventOfProtectionEquipment)lib60870.CS101.EventOfProtectionEquipment
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment.html deleted file mode 100644 index b8a2334..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment.html +++ /dev/null @@ -1,233 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.EventOfProtectionEquipment Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.EventOfProtectionEquipment Class Reference
    -
    -
    - -

    Event of protection equipment information object (M_EP_TA_1) - More...

    -
    -Inheritance diagram for lib60870.CS101.EventOfProtectionEquipment:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.EventOfProtectionEquipment:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    EventOfProtectionEquipment (int ioa, SingleEvent singleEvent, CP16Time2a elapsedTime, CP24Time2a timestamp)
     
    EventOfProtectionEquipment (EventOfProtectionEquipment original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -SingleEvent Event [get]
     
    -CP16Time2a ElapsedTime [get]
     
    -CP24Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Detailed Description

    -

    Event of protection equipment information object (M_EP_TA_1)

    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.EventOfProtectionEquipment.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/EventOfProtectionEquipment.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment__coll__graph.dot deleted file mode 100644 index 4cc91dc..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.EventOfProtectionEquipment" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.EventOfProtection\lEquipment",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Event of protection equipment information object (M_EP_TA_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment__inherit__graph.dot deleted file mode 100644 index 4cc91dc..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.EventOfProtectionEquipment" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.EventOfProtection\lEquipment",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Event of protection equipment information object (M_EP_TA_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a-members.html deleted file mode 100644 index 406fa1b..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a-members.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a, including all inherited members.

    - - - - - - - - - - - - - - -
    ElapsedTime (defined in lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2avirtual
    Event (defined in lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a
    EventOfProtectionEquipmentWithCP56Time2a(int ioa, SingleEvent singleEvent, CP16Time2a elapsedTime, CP56Time2a timestamp) (defined in lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a
    EventOfProtectionEquipmentWithCP56Time2a(EventOfProtectionEquipmentWithCP56Time2a original) (defined in lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a
    GetEncodedSize() (defined in lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    SupportsSequence (defined in lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a
    Timestamp (defined in lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a.html deleted file mode 100644 index d0f0f68..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a.html +++ /dev/null @@ -1,233 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a Class Reference
    -
    -
    - -

    Event of protection equipment information object with CP56Time2a time tag (M_EP_TD_1) - More...

    -
    -Inheritance diagram for lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    EventOfProtectionEquipmentWithCP56Time2a (int ioa, SingleEvent singleEvent, CP16Time2a elapsedTime, CP56Time2a timestamp)
     
    EventOfProtectionEquipmentWithCP56Time2a (EventOfProtectionEquipmentWithCP56Time2a original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -SingleEvent Event [get]
     
    -CP16Time2a ElapsedTime [get]
     
    -CP56Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Detailed Description

    -

    Event of protection equipment information object with CP56Time2a time tag (M_EP_TD_1)

    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/EventOfProtectionEquipment.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a__coll__graph.dot deleted file mode 100644 index 5a92505..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.EventOfProtection\lEquipmentWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Event of protection equipment information object with CP56Time2a time tag (M_EP_TD_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a__inherit__graph.dot deleted file mode 100644 index 5a92505..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.EventOfProtection\lEquipmentWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Event of protection equipment information object with CP56Time2a time tag (M_EP_TD_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k-members.html deleted file mode 100644 index 6f09e08..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k-members.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.FileACK Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.FileACK, including all inherited members.

    - - - - - - - - - - - - - - - -
    AckQualifierlib60870.CS101.FileACK
    AFQ (defined in lib60870.CS101.FileACK)lib60870.CS101.FileACK
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.FileACK)lib60870.CS101.FileACKvirtual
    ErrorCode (defined in lib60870.CS101.FileACK)lib60870.CS101.FileACK
    FileACK(int objectAddress, NameOfFile nof, byte nameOfSection, AcknowledgeQualifier qualifier, FileError errorCode) (defined in lib60870.CS101.FileACK)lib60870.CS101.FileACK
    GetEncodedSize() (defined in lib60870.CS101.FileACK)lib60870.CS101.FileACK
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    NameOfSection (defined in lib60870.CS101.FileACK)lib60870.CS101.FileACK
    NOF (defined in lib60870.CS101.FileACK)lib60870.CS101.FileACK
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    SupportsSequence (defined in lib60870.CS101.FileACK)lib60870.CS101.FileACK
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.FileACK)lib60870.CS101.FileACK
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k.html deleted file mode 100644 index 644d3c1..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k.html +++ /dev/null @@ -1,262 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.FileACK Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.FileACK Class Reference
    -
    -
    - -

    ACK file/section - F_AF_NA_1 (124) - More...

    -
    -Inheritance diagram for lib60870.CS101.FileACK:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.FileACK:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    FileACK (int objectAddress, NameOfFile nof, byte nameOfSection, AcknowledgeQualifier qualifier, FileError errorCode)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -NameOfFile NOF [get, set]
     
    -byte NameOfSection [get, set]
     
    AcknowledgeQualifier AckQualifier [get, set]
     Gets or sets the AFQ (acknowledge file or section qualifier)
     
    -FileError ErrorCode [get, set]
     
    -byte AFQ [get, set]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Detailed Description

    -

    ACK file/section - F_AF_NA_1 (124)

    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.FileACK.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -

    Property Documentation

    - -

    ◆ AckQualifier

    - -
    -
    - - - - - -
    - - - - -
    AcknowledgeQualifier lib60870.CS101.FileACK.AckQualifier
    -
    -getset
    -
    - -

    Gets or sets the AFQ (acknowledge file or section qualifier)

    -

    The AFQ

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/FileObjects.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k.js deleted file mode 100644 index b02eb5f..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k.js +++ /dev/null @@ -1,4 +0,0 @@ -var classlib60870_1_1_c_s101_1_1_file_a_c_k = -[ - [ "AckQualifier", "classlib60870_1_1_c_s101_1_1_file_a_c_k.html#a9f6b95cc90ebe3515dff6af81c294d81", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k__coll__graph.dot deleted file mode 100644 index 0d08976..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.FileACK" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.FileACK",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="ACK file/section - F_AF_NA_1 (124)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k__inherit__graph.dot deleted file mode 100644 index 0d08976..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_a_c_k__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.FileACK" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.FileACK",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="ACK file/section - F_AF_NA_1 (124)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select-members.html deleted file mode 100644 index 151485b..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select-members.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.FileCallOrSelect Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.FileCallOrSelect, including all inherited members.

    - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.FileCallOrSelect)lib60870.CS101.FileCallOrSelectvirtual
    FileCallOrSelect(int objectAddress, NameOfFile nof, byte nameOfSection, SelectAndCallQualifier scq) (defined in lib60870.CS101.FileCallOrSelect)lib60870.CS101.FileCallOrSelect
    GetEncodedSize() (defined in lib60870.CS101.FileCallOrSelect)lib60870.CS101.FileCallOrSelect
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    NameOfSection (defined in lib60870.CS101.FileCallOrSelect)lib60870.CS101.FileCallOrSelect
    NOF (defined in lib60870.CS101.FileCallOrSelect)lib60870.CS101.FileCallOrSelect
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    SCQlib60870.CS101.FileCallOrSelect
    SupportsSequence (defined in lib60870.CS101.FileCallOrSelect)lib60870.CS101.FileCallOrSelect
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.FileCallOrSelect)lib60870.CS101.FileCallOrSelect
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select.html deleted file mode 100644 index 9580d22..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.FileCallOrSelect Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.FileCallOrSelect Class Reference
    -
    -
    - -

    Call/Select directory/file/section - F_SC_NA_1 (122) - More...

    -
    -Inheritance diagram for lib60870.CS101.FileCallOrSelect:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.FileCallOrSelect:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    FileCallOrSelect (int objectAddress, NameOfFile nof, byte nameOfSection, SelectAndCallQualifier scq)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -NameOfFile NOF [get, set]
     
    -byte NameOfSection [get, set]
     
    SelectAndCallQualifier SCQ [get, set]
     Gets or sets the SCQ (select and call qualifier)
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Detailed Description

    -

    Call/Select directory/file/section - F_SC_NA_1 (122)

    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.FileCallOrSelect.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -

    Property Documentation

    - -

    ◆ SCQ

    - -
    -
    - - - - - -
    - - - - -
    SelectAndCallQualifier lib60870.CS101.FileCallOrSelect.SCQ
    -
    -getset
    -
    - -

    Gets or sets the SCQ (select and call qualifier)

    -

    The SCQ

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/FileObjects.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select.js deleted file mode 100644 index d328c7b..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select.js +++ /dev/null @@ -1,4 +0,0 @@ -var classlib60870_1_1_c_s101_1_1_file_call_or_select = -[ - [ "SCQ", "classlib60870_1_1_c_s101_1_1_file_call_or_select.html#a6acae49243536a7db32643ffccdc17c8", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select__coll__graph.dot deleted file mode 100644 index d23fe72..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.FileCallOrSelect" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.FileCallOr\lSelect",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Call/Select directory/file/section - F_SC_NA_1 (122)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select__inherit__graph.dot deleted file mode 100644 index d23fe72..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_call_or_select__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.FileCallOrSelect" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.FileCallOr\lSelect",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Call/Select directory/file/section - F_SC_NA_1 (122)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory-members.html deleted file mode 100644 index e0ba812..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory-members.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.FileDirectory Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.FileDirectory, including all inherited members.

    - - - - - - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.FileDirectory)lib60870.CS101.FileDirectoryvirtual
    FA (defined in lib60870.CS101.FileDirectory)lib60870.CS101.FileDirectory
    FileDirectory(int objectAddress, NameOfFile nof, int lengthOfFile, byte sof, CP56Time2a creationTime) (defined in lib60870.CS101.FileDirectory)lib60870.CS101.FileDirectory
    FileDirectory(int objectAddress, NameOfFile nof, int lengthOfFile, int status, bool LFD, bool FOR, bool FA, CP56Time2a creationTime) (defined in lib60870.CS101.FileDirectory)lib60870.CS101.FileDirectory
    FOR (defined in lib60870.CS101.FileDirectory)lib60870.CS101.FileDirectory
    GetEncodedSize() (defined in lib60870.CS101.FileDirectory)lib60870.CS101.FileDirectory
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    LengthOfFile (defined in lib60870.CS101.FileDirectory)lib60870.CS101.FileDirectory
    LFD (defined in lib60870.CS101.FileDirectory)lib60870.CS101.FileDirectory
    NOF (defined in lib60870.CS101.FileDirectory)lib60870.CS101.FileDirectory
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    SOFlib60870.CS101.FileDirectory
    STATUS (defined in lib60870.CS101.FileDirectory)lib60870.CS101.FileDirectory
    SupportsSequence (defined in lib60870.CS101.FileDirectory)lib60870.CS101.FileDirectory
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.FileDirectory)lib60870.CS101.FileDirectory
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory.html deleted file mode 100644 index c42b544..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory.html +++ /dev/null @@ -1,271 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.FileDirectory Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.FileDirectory Class Reference
    -
    -
    - -

    File directory - F_DR_TA_1 (126) - More...

    -
    -Inheritance diagram for lib60870.CS101.FileDirectory:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.FileDirectory:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    FileDirectory (int objectAddress, NameOfFile nof, int lengthOfFile, byte sof, CP56Time2a creationTime)
     
    FileDirectory (int objectAddress, NameOfFile nof, int lengthOfFile, int status, bool LFD, bool FOR, bool FA, CP56Time2a creationTime)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -NameOfFile NOF [get, set]
     
    -int LengthOfFile [get, set]
     
    byte SOF [get, set]
     Gets or sets the SOF (Status of file - 7.2.6.38 in IEC 60870-5-101:2003)
     
    -int STATUS [get]
     
    -bool LFD [get]
     
    -bool FOR [get]
     
    -bool FA [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Detailed Description

    -

    File directory - F_DR_TA_1 (126)

    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.FileDirectory.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -

    Property Documentation

    - -

    ◆ SOF

    - -
    -
    - - - - - -
    - - - - -
    byte lib60870.CS101.FileDirectory.SOF
    -
    -getset
    -
    - -

    Gets or sets the SOF (Status of file - 7.2.6.38 in IEC 60870-5-101:2003)

    -

    SOF value

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/FileObjects.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory.js deleted file mode 100644 index 07a81a4..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory.js +++ /dev/null @@ -1,4 +0,0 @@ -var classlib60870_1_1_c_s101_1_1_file_directory = -[ - [ "SOF", "classlib60870_1_1_c_s101_1_1_file_directory.html#af1f8d171f735aae0eed368015a3be40d", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory__coll__graph.dot deleted file mode 100644 index 369ba1d..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.FileDirectory" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.FileDirectory",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="File directory - F_DR_TA_1 (126)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory__inherit__graph.dot deleted file mode 100644 index 369ba1d..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_directory__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.FileDirectory" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.FileDirectory",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="File directory - F_DR_TA_1 (126)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section-members.html deleted file mode 100644 index af08c25..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section-members.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.FileLastSegmentOrSection Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.FileLastSegmentOrSection, including all inherited members.

    - - - - - - - - - - - - - - -
    CHSlib60870.CS101.FileLastSegmentOrSection
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.FileLastSegmentOrSection)lib60870.CS101.FileLastSegmentOrSectionvirtual
    FileLastSegmentOrSection(int objectAddress, NameOfFile nof, byte nameOfSection, LastSectionOrSegmentQualifier lsq, byte checksum) (defined in lib60870.CS101.FileLastSegmentOrSection)lib60870.CS101.FileLastSegmentOrSection
    GetEncodedSize() (defined in lib60870.CS101.FileLastSegmentOrSection)lib60870.CS101.FileLastSegmentOrSection
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    LSQ (defined in lib60870.CS101.FileLastSegmentOrSection)lib60870.CS101.FileLastSegmentOrSection
    NameOfSection (defined in lib60870.CS101.FileLastSegmentOrSection)lib60870.CS101.FileLastSegmentOrSection
    NOF (defined in lib60870.CS101.FileLastSegmentOrSection)lib60870.CS101.FileLastSegmentOrSection
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    SupportsSequence (defined in lib60870.CS101.FileLastSegmentOrSection)lib60870.CS101.FileLastSegmentOrSection
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.FileLastSegmentOrSection)lib60870.CS101.FileLastSegmentOrSection
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html deleted file mode 100644 index 2a7a0ff..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html +++ /dev/null @@ -1,259 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.FileLastSegmentOrSection Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.FileLastSegmentOrSection Class Reference
    -
    -
    - -

    Last segment/section - F_LS_NA_1 (123) - More...

    -
    -Inheritance diagram for lib60870.CS101.FileLastSegmentOrSection:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.FileLastSegmentOrSection:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    FileLastSegmentOrSection (int objectAddress, NameOfFile nof, byte nameOfSection, LastSectionOrSegmentQualifier lsq, byte checksum)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -NameOfFile NOF [get, set]
     
    -byte NameOfSection [get, set]
     
    -LastSectionOrSegmentQualifier LSQ [get, set]
     
    byte CHS [get, set]
     Gets or sets the checksum.
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Detailed Description

    -

    Last segment/section - F_LS_NA_1 (123)

    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.FileLastSegmentOrSection.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -

    Property Documentation

    - -

    ◆ CHS

    - -
    -
    - - - - - -
    - - - - -
    byte lib60870.CS101.FileLastSegmentOrSection.CHS
    -
    -getset
    -
    - -

    Gets or sets the checksum.

    -

    The checksum value

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/FileObjects.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.js deleted file mode 100644 index 0a24b3f..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.js +++ /dev/null @@ -1,4 +0,0 @@ -var classlib60870_1_1_c_s101_1_1_file_last_segment_or_section = -[ - [ "CHS", "classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html#af2302361352eb1447b4bfb6541772c50", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section__coll__graph.dot deleted file mode 100644 index 7e25fc7..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.FileLastSegmentOrSection" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.FileLastSegment\lOrSection",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Last segment/section - F_LS_NA_1 (123)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section__inherit__graph.dot deleted file mode 100644 index 7e25fc7..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_last_segment_or_section__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.FileLastSegmentOrSection" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.FileLastSegment\lOrSection",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Last segment/section - F_LS_NA_1 (123)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready-members.html deleted file mode 100644 index 07e696d..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready-members.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.FileReady Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.FileReady, including all inherited members.

    - - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.FileReady)lib60870.CS101.FileReadyvirtual
    FileReady(int objectAddress, NameOfFile nof, int lengthOfFile, bool positive)lib60870.CS101.FileReady
    FRQlib60870.CS101.FileReady
    GetEncodedSize() (defined in lib60870.CS101.FileReady)lib60870.CS101.FileReady
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    LengthOfFile (defined in lib60870.CS101.FileReady)lib60870.CS101.FileReady
    NOF (defined in lib60870.CS101.FileReady)lib60870.CS101.FileReady
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Positive (defined in lib60870.CS101.FileReady)lib60870.CS101.FileReady
    SupportsSequence (defined in lib60870.CS101.FileReady)lib60870.CS101.FileReady
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.FileReady)lib60870.CS101.FileReady
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready.html deleted file mode 100644 index e40b2be..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready.html +++ /dev/null @@ -1,277 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.FileReady Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.FileReady Class Reference
    -
    -
    - -

    File ready - F_FR_NA_1 (120) - More...

    -
    -Inheritance diagram for lib60870.CS101.FileReady:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.FileReady:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
     FileReady (int objectAddress, NameOfFile nof, int lengthOfFile, bool positive)
     Initializes a new instance of the lib60870.CS101.FileReady class.
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -NameOfFile NOF [get, set]
     
    -int LengthOfFile [get, set]
     
    -byte FRQ [get, set]
     Gets or sets the FRQ (File ready qualifier)
     
    -bool Positive [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Detailed Description

    -

    File ready - F_FR_NA_1 (120)

    -

    Constructor & Destructor Documentation

    - -

    ◆ FileReady()

    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    lib60870.CS101.FileReady.FileReady (int objectAddress,
    NameOfFile nof,
    int lengthOfFile,
    bool positive )
    -
    - -

    Initializes a new instance of the lib60870.CS101.FileReady class.

    -
    Parameters
    - - - - - -
    objectAddressinformation object address (IOA)
    nofNOF (file type)
    lengthOfFileLength of file.
    positiveIf set to true positive ACK.
    -
    -
    - -
    -
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.FileReady.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/FileObjects.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready.js deleted file mode 100644 index 9e43719..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready.js +++ /dev/null @@ -1,5 +0,0 @@ -var classlib60870_1_1_c_s101_1_1_file_ready = -[ - [ "FileReady", "classlib60870_1_1_c_s101_1_1_file_ready.html#a109625172b98152e626a426c260295e6", null ], - [ "FRQ", "classlib60870_1_1_c_s101_1_1_file_ready.html#a68e7d332f311fb83d9bb617b6e54ec0a", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready__coll__graph.dot deleted file mode 100644 index b67a656..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.FileReady" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.FileReady",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="File ready - F_FR_NA_1 (120)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready__inherit__graph.dot deleted file mode 100644 index b67a656..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_ready__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.FileReady" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.FileReady",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="File ready - F_FR_NA_1 (120)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment-members.html deleted file mode 100644 index 183785e..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment-members.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.FileSegment Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.FileSegment, including all inherited members.

    - - - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.FileSegment)lib60870.CS101.FileSegmentvirtual
    FileSegment(int objectAddress, NameOfFile nof, byte nameOfSection, byte[] data) (defined in lib60870.CS101.FileSegment)lib60870.CS101.FileSegment
    GetEncodedSize() (defined in lib60870.CS101.FileSegment)lib60870.CS101.FileSegment
    GetMaxDataSize(ApplicationLayerParameters parameters) (defined in lib60870.CS101.FileSegment)lib60870.CS101.FileSegmentstatic
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    LengthOfSegment (defined in lib60870.CS101.FileSegment)lib60870.CS101.FileSegment
    NameOfSection (defined in lib60870.CS101.FileSegment)lib60870.CS101.FileSegment
    NOF (defined in lib60870.CS101.FileSegment)lib60870.CS101.FileSegment
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    SegmentData (defined in lib60870.CS101.FileSegment)lib60870.CS101.FileSegment
    SupportsSequence (defined in lib60870.CS101.FileSegment)lib60870.CS101.FileSegment
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.FileSegment)lib60870.CS101.FileSegment
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment.html deleted file mode 100644 index ed682e2..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment.html +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.FileSegment Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.FileSegment Class Reference
    -
    -
    - -

    File segment - F_SG_NA_1 (125) - More...

    -
    -Inheritance diagram for lib60870.CS101.FileSegment:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.FileSegment:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    FileSegment (int objectAddress, NameOfFile nof, byte nameOfSection, byte[] data)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - -

    -Static Public Member Functions

    -static int GetMaxDataSize (ApplicationLayerParameters parameters)
     
    - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -NameOfFile NOF [get, set]
     
    -byte NameOfSection [get, set]
     
    -byte LengthOfSegment [get, set]
     
    -byte[] SegmentData [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Detailed Description

    -

    File segment - F_SG_NA_1 (125)

    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.FileSegment.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/FileObjects.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment__coll__graph.dot deleted file mode 100644 index 5c4e580..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.FileSegment" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.FileSegment",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="File segment - F_SG_NA_1 (125)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment__inherit__graph.dot deleted file mode 100644 index 5c4e580..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_file_segment__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.FileSegment" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.FileSegment",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="File segment - F_SG_NA_1 (125)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_files_available-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_files_available-members.html deleted file mode 100644 index 6c3c403..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_files_available-members.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.FilesAvailable Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.FilesAvailable, including all inherited members.

    - - - - -
    AddFile(IFileProvider file)lib60870.CS101.FilesAvailable
    GetFiles()lib60870.CS101.FilesAvailable
    RemoveFile(IFileProvider file)lib60870.CS101.FilesAvailable
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_files_available.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_files_available.html deleted file mode 100644 index 3288fe7..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_files_available.html +++ /dev/null @@ -1,209 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.FilesAvailable Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.FilesAvailable Class Reference
    -
    -
    - -

    Represents the available files in a file client or file server. - More...

    - - - - - - - - - - - -

    -Public Member Functions

    void AddFile (IFileProvider file)
     Adds a file to the list of available files.
     
    void RemoveFile (IFileProvider file)
     Removes a file from the list of available files.
     
    List< IFileProviderGetFiles ()
     Gets the list of available files.
     
    -

    Detailed Description

    -

    Represents the available files in a file client or file server.

    -

    Member Function Documentation

    - -

    ◆ AddFile()

    - -
    -
    - - - - - - - -
    void lib60870.CS101.FilesAvailable.AddFile (IFileProvider file)
    -
    - -

    Adds a file to the list of available files.

    -
    Parameters
    - - -
    filefile to add
    -
    -
    - -
    -
    - -

    ◆ GetFiles()

    - -
    -
    - - - - - - - -
    List< IFileProvider > lib60870.CS101.FilesAvailable.GetFiles ()
    -
    - -

    Gets the list of available files.

    -
    Returns
    the list of available files
    - -
    -
    - -

    ◆ RemoveFile()

    - -
    -
    - - - - - - - -
    void lib60870.CS101.FilesAvailable.RemoveFile (IFileProvider file)
    -
    - -

    Removes a file from the list of available files.

    -
    Parameters
    - - -
    filefile to remove
    -
    -
    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/FileServices.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_files_available.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_files_available.js deleted file mode 100644 index c0ae408..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_files_available.js +++ /dev/null @@ -1,6 +0,0 @@ -var classlib60870_1_1_c_s101_1_1_files_available = -[ - [ "AddFile", "classlib60870_1_1_c_s101_1_1_files_available.html#a72840ada81d664c1d63531ce022e57e5", null ], - [ "GetFiles", "classlib60870_1_1_c_s101_1_1_files_available.html#ad07db9fbd1ca2f1643991d7b446bf7c4", null ], - [ "RemoveFile", "classlib60870_1_1_c_s101_1_1_files_available.html#a894040bf5b71a47feaa4eab80cf7a0d9", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object-members.html deleted file mode 100644 index c690d3a..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object-members.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.InformationObject Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.InformationObject, including all inherited members.

    - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectvirtual
    GetEncodedSize()lib60870.CS101.InformationObject
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    SupportsSequencelib60870.CS101.InformationObject
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Typelib60870.CS101.InformationObject
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object.html deleted file mode 100644 index 7c61bd1..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object.html +++ /dev/null @@ -1,241 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.InformationObject Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.InformationObject Class Referenceabstract
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.InformationObject:
    -
    -
    Inheritance graph
    -
    [legend]
    - - - - - - - - - - - -

    -Public Member Functions

    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    -virtual void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - - - -

    -Protected Member Functions

    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    - - - - - - - - - -

    -Properties

    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    -

    Member Function Documentation

    - -

    ◆ GetEncodedSize()

    - -
    -
    - - - - - -
    - - - - - - - -
    int lib60870.CS101.InformationObject.GetEncodedSize ()
    -
    -abstract
    -
    - -

    Gets the encoded payload size of the object (information object size without the IOA)

    -
    Returns
    The encoded size in bytes
    - -
    -
    -

    Property Documentation

    - -

    ◆ SupportsSequence

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS101.InformationObject.SupportsSequence
    -
    -getabstract
    -
    - -

    Indicates if this information object type supports sequence of information objects encoding.

    -

    true if supports sequence encoding; otherwise, false.

    - -
    -
    - -

    ◆ Type

    - -
    -
    - - - - - -
    - - - - -
    TypeID lib60870.CS101.InformationObject.Type
    -
    -getabstract
    -
    - -

    The type ID (message type) of the information object type.

    -

    The type.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/InformationObject.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object.js deleted file mode 100644 index 3b0143c..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object.js +++ /dev/null @@ -1,6 +0,0 @@ -var classlib60870_1_1_c_s101_1_1_information_object = -[ - [ "GetEncodedSize", "classlib60870_1_1_c_s101_1_1_information_object.html#a2e5cb4ff206963db465c10d06c6e1954", null ], - [ "SupportsSequence", "classlib60870_1_1_c_s101_1_1_information_object.html#a8e277f6a5d421d25ae9c9eb9b169887e", null ], - [ "Type", "classlib60870_1_1_c_s101_1_1_information_object.html#af2eba7ad5825d5d34258ce9747a615be", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object__inherit__graph.dot deleted file mode 100644 index 4eeb796..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_information_object__inherit__graph.dot +++ /dev/null @@ -1,105 +0,0 @@ -digraph "lib60870.CS101.InformationObject" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node1 [id="Node000001",label="lib60870.CS101.Information\lObject",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="lib60870.CS101.Bitstring32",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32.html",tooltip=" "]; - Node2 -> Node3 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="lib60870.CS101.Bitstring32\lWithCP24Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a.html",tooltip=" "]; - Node2 -> Node4 [id="edge3_Node000002_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node4 [id="Node000004",label="lib60870.CS101.Bitstring32\lWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a.html",tooltip=" "]; - Node1 -> Node5 [id="edge4_Node000001_Node000005",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node5 [id="Node000005",label="lib60870.CS101.Bitstring32\lCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32_command.html",tooltip=" "]; - Node5 -> Node6 [id="edge5_Node000005_Node000006",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node6 [id="Node000006",label="lib60870.CS101.Bitstring32\lCommandWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a.html",tooltip=" "]; - Node1 -> Node7 [id="edge6_Node000001_Node000007",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node7 [id="Node000007",label="lib60870.CS101.ClockSynchronization\lCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_clock_synchronization_command.html",tooltip=" "]; - Node1 -> Node8 [id="edge7_Node000001_Node000008",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node8 [id="Node000008",label="lib60870.CS101.CounterInterrogation\lCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html",tooltip=" "]; - Node1 -> Node9 [id="edge8_Node000001_Node000009",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node9 [id="Node000009",label="lib60870.CS101.DelayAcquisition\lCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_delay_acquisition_command.html",tooltip=" "]; - Node1 -> Node10 [id="edge9_Node000001_Node000010",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node10 [id="Node000010",label="lib60870.CS101.DoubleCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_command.html",tooltip=" "]; - Node10 -> Node11 [id="edge10_Node000010_Node000011",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node11 [id="Node000011",label="lib60870.CS101.DoubleCommand\lWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a.html",tooltip=" "]; - Node10 -> Node12 [id="edge11_Node000010_Node000012",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node12 [id="Node000012",label="lib60870.CS101.StepCommand",height=0.2,width=0.4,color="orangered", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_command.html",tooltip=" "]; - Node1 -> Node14 [id="edge12_Node000001_Node000014",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node14 [id="Node000014",label="lib60870.CS101.DoublePoint\lInformation",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_point_information.html",tooltip="Double point information object (M_DP_NA_1)"]; - Node14 -> Node15 [id="edge13_Node000014_Node000015",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node15 [id="Node000015",label="lib60870.CS101.DoublePoint\lWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a.html",tooltip="Double point information object with CP24Time2a time tag (M_DP_TA_1)"]; - Node14 -> Node16 [id="edge14_Node000014_Node000016",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node16 [id="Node000016",label="lib60870.CS101.DoublePoint\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a.html",tooltip="Double point information object with CP56Time2a time tag (M_DP_TB_1)"]; - Node1 -> Node17 [id="edge15_Node000001_Node000017",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node17 [id="Node000017",label="lib60870.CS101.EndOfInitialization",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_end_of_initialization.html",tooltip="End of initialization information object (M_EI_NA_1)"]; - Node1 -> Node18 [id="edge16_Node000001_Node000018",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node18 [id="Node000018",label="lib60870.CS101.EventOfProtection\lEquipment",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_event_of_protection_equipment.html",tooltip="Event of protection equipment information object (M_EP_TA_1)"]; - Node1 -> Node19 [id="edge17_Node000001_Node000019",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node19 [id="Node000019",label="lib60870.CS101.EventOfProtection\lEquipmentWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a.html",tooltip="Event of protection equipment information object with CP56Time2a time tag (M_EP_TD_1)"]; - Node1 -> Node20 [id="edge18_Node000001_Node000020",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node20 [id="Node000020",label="lib60870.CS101.FileACK",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_file_a_c_k.html",tooltip="ACK file/section - F_AF_NA_1 (124)"]; - Node1 -> Node21 [id="edge19_Node000001_Node000021",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node21 [id="Node000021",label="lib60870.CS101.FileCallOr\lSelect",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_file_call_or_select.html",tooltip="Call/Select directory/file/section - F_SC_NA_1 (122)"]; - Node1 -> Node22 [id="edge20_Node000001_Node000022",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node22 [id="Node000022",label="lib60870.CS101.FileDirectory",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_file_directory.html",tooltip="File directory - F_DR_TA_1 (126)"]; - Node1 -> Node23 [id="edge21_Node000001_Node000023",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node23 [id="Node000023",label="lib60870.CS101.FileLastSegment\lOrSection",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html",tooltip="Last segment/section - F_LS_NA_1 (123)"]; - Node1 -> Node24 [id="edge22_Node000001_Node000024",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node24 [id="Node000024",label="lib60870.CS101.FileReady",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_file_ready.html",tooltip="File ready - F_FR_NA_1 (120)"]; - Node1 -> Node25 [id="edge23_Node000001_Node000025",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node25 [id="Node000025",label="lib60870.CS101.FileSegment",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_file_segment.html",tooltip="File segment - F_SG_NA_1 (125)"]; - Node1 -> Node26 [id="edge24_Node000001_Node000026",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node26 [id="Node000026",label="lib60870.CS101.Integrated\lTotals",height=0.2,width=0.4,color="red", fillcolor="#FFF0F0", style="filled",URL="$classlib60870_1_1_c_s101_1_1_integrated_totals.html",tooltip="Integrated totals information object (M_IT_NA_1)"]; - Node1 -> Node29 [id="edge25_Node000001_Node000029",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node29 [id="Node000029",label="lib60870.CS101.Interrogation\lCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_interrogation_command.html",tooltip=" "]; - Node1 -> Node30 [id="edge26_Node000001_Node000030",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node30 [id="Node000030",label="lib60870.CS101.MeasuredValue\lNormalizedWithoutQuality",height=0.2,width=0.4,color="red", fillcolor="#FFF0F0", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html",tooltip="Measured value normalized without quality information object (M_ME_ND_1)"]; - Node1 -> Node34 [id="edge27_Node000001_Node000034",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node34 [id="Node000034",label="lib60870.CS101.MeasuredValue\lScaled",height=0.2,width=0.4,color="orangered", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_scaled.html",tooltip=" "]; - Node1 -> Node37 [id="edge28_Node000001_Node000037",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node37 [id="Node000037",label="lib60870.CS101.MeasuredValue\lShort",height=0.2,width=0.4,color="orangered", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_short.html",tooltip=" "]; - Node1 -> Node40 [id="edge29_Node000001_Node000040",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node40 [id="Node000040",label="lib60870.CS101.PackedOutput\lCircuitInfo",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_packed_output_circuit_info.html",tooltip=" "]; - Node1 -> Node41 [id="edge30_Node000001_Node000041",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node41 [id="Node000041",label="lib60870.CS101.PackedOutput\lCircuitInfoWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a.html",tooltip=" "]; - Node1 -> Node42 [id="edge31_Node000001_Node000042",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node42 [id="Node000042",label="lib60870.CS101.PackedSingle\lPointWithSCD",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d.html",tooltip=" "]; - Node1 -> Node43 [id="edge32_Node000001_Node000043",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node43 [id="Node000043",label="lib60870.CS101.PackedStart\lEventsOfProtectionEquipment",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment.html",tooltip=" "]; - Node1 -> Node44 [id="edge33_Node000001_Node000044",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node44 [id="Node000044",label="lib60870.CS101.PackedStart\lEventsOfProtectionEquipmentWith\lCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a.html",tooltip=" "]; - Node1 -> Node45 [id="edge34_Node000001_Node000045",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node45 [id="Node000045",label="lib60870.CS101.Parameter\lActivation",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_parameter_activation.html",tooltip=" "]; - Node1 -> Node46 [id="edge35_Node000001_Node000046",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node46 [id="Node000046",label="lib60870.CS101.Parameter\lFloatValue",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_parameter_float_value.html",tooltip=" "]; - Node1 -> Node47 [id="edge36_Node000001_Node000047",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node47 [id="Node000047",label="lib60870.CS101.Parameter\lNormalizedValue",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_parameter_normalized_value.html",tooltip=" "]; - Node1 -> Node48 [id="edge37_Node000001_Node000048",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node48 [id="Node000048",label="lib60870.CS101.Parameter\lScaledValue",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_parameter_scaled_value.html",tooltip=" "]; - Node1 -> Node49 [id="edge38_Node000001_Node000049",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node49 [id="Node000049",label="lib60870.CS101.ReadCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_read_command.html",tooltip=" "]; - Node1 -> Node50 [id="edge39_Node000001_Node000050",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node50 [id="Node000050",label="lib60870.CS101.ResetProcess\lCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_reset_process_command.html",tooltip=" "]; - Node1 -> Node51 [id="edge40_Node000001_Node000051",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node51 [id="Node000051",label="lib60870.CS101.SectionReady",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_section_ready.html",tooltip="Section ready - F_SR_NA_1 (121)"]; - Node1 -> Node52 [id="edge41_Node000001_Node000052",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node52 [id="Node000052",label="lib60870.CS101.SetpointCommand\lNormalized",height=0.2,width=0.4,color="orangered", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_normalized.html",tooltip=" "]; - Node1 -> Node54 [id="edge42_Node000001_Node000054",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node54 [id="Node000054",label="lib60870.CS101.SetpointCommand\lScaled",height=0.2,width=0.4,color="orangered", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_scaled.html",tooltip=" "]; - Node1 -> Node56 [id="edge43_Node000001_Node000056",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node56 [id="Node000056",label="lib60870.CS101.SetpointCommand\lShort",height=0.2,width=0.4,color="orangered", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_short.html",tooltip=" "]; - Node1 -> Node58 [id="edge44_Node000001_Node000058",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node58 [id="Node000058",label="lib60870.CS101.SingleCommand",height=0.2,width=0.4,color="orangered", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_command.html",tooltip=" "]; - Node1 -> Node60 [id="edge45_Node000001_Node000060",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node60 [id="Node000060",label="lib60870.CS101.SinglePoint\lInformation",height=0.2,width=0.4,color="orangered", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_point_information.html",tooltip=" "]; - Node1 -> Node63 [id="edge46_Node000001_Node000063",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node63 [id="Node000063",label="lib60870.CS101.StepPosition\lInformation",height=0.2,width=0.4,color="red", fillcolor="#FFF0F0", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_position_information.html",tooltip="Step position information object (M_ST_NA_1)"]; - Node1 -> Node66 [id="edge47_Node000001_Node000066",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node66 [id="Node000066",label="lib60870.CS101.TestCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_test_command.html",tooltip=" "]; - Node1 -> Node67 [id="edge48_Node000001_Node000067",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node67 [id="Node000067",label="lib60870.CS101.TestCommand\lWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals-members.html deleted file mode 100644 index 6da80fd..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals-members.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.IntegratedTotals Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.IntegratedTotals, including all inherited members.

    - - - - - - - - - - - - -
    BCR (defined in lib60870.CS101.IntegratedTotals)lib60870.CS101.IntegratedTotals
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.IntegratedTotals)lib60870.CS101.IntegratedTotalsvirtual
    GetEncodedSize() (defined in lib60870.CS101.IntegratedTotals)lib60870.CS101.IntegratedTotals
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    IntegratedTotals(int ioa, BinaryCounterReading bcr) (defined in lib60870.CS101.IntegratedTotals)lib60870.CS101.IntegratedTotals
    IntegratedTotals(IntegratedTotals original) (defined in lib60870.CS101.IntegratedTotals)lib60870.CS101.IntegratedTotals
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    SupportsSequence (defined in lib60870.CS101.IntegratedTotals)lib60870.CS101.IntegratedTotals
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.IntegratedTotals)lib60870.CS101.IntegratedTotals
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals.html deleted file mode 100644 index a26d836..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.IntegratedTotals Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.IntegratedTotals Class Reference
    -
    -
    - -

    Integrated totals information object (M_IT_NA_1) - More...

    -
    -Inheritance diagram for lib60870.CS101.IntegratedTotals:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.IntegratedTotals:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    IntegratedTotals (int ioa, BinaryCounterReading bcr)
     
    IntegratedTotals (IntegratedTotals original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -BinaryCounterReading BCR [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Detailed Description

    -

    Integrated totals information object (M_IT_NA_1)

    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.IntegratedTotals.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/IntegratedTotals.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals__coll__graph.dot deleted file mode 100644 index 1ea67cf..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.IntegratedTotals" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Integrated\lTotals",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Integrated totals information object (M_IT_NA_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals__inherit__graph.dot deleted file mode 100644 index bde40d6..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals__inherit__graph.dot +++ /dev/null @@ -1,15 +0,0 @@ -digraph "lib60870.CS101.IntegratedTotals" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node1 [id="Node000001",label="lib60870.CS101.Integrated\lTotals",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Integrated totals information object (M_IT_NA_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; - Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="lib60870.CS101.Integrated\lTotalsWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a.html",tooltip="Integrated totals information object with CP24Time2a time tag (M_IT_TA_1)"]; - Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node4 [id="Node000004",label="lib60870.CS101.Integrated\lTotalsWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a.html",tooltip="Integrated totals information object with CP56Time2a time tag (M_IT_TB_1)"]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a-members.html deleted file mode 100644 index f5454a8..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a-members.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.IntegratedTotalsWithCP24Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.IntegratedTotalsWithCP24Time2a, including all inherited members.

    - - - - - - - - - - - - - - - - -
    BCR (defined in lib60870.CS101.IntegratedTotals)lib60870.CS101.IntegratedTotals
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.IntegratedTotalsWithCP24Time2a)lib60870.CS101.IntegratedTotalsWithCP24Time2avirtual
    GetEncodedSize() (defined in lib60870.CS101.IntegratedTotalsWithCP24Time2a)lib60870.CS101.IntegratedTotalsWithCP24Time2a
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    IntegratedTotals(int ioa, BinaryCounterReading bcr) (defined in lib60870.CS101.IntegratedTotals)lib60870.CS101.IntegratedTotals
    IntegratedTotals(IntegratedTotals original) (defined in lib60870.CS101.IntegratedTotals)lib60870.CS101.IntegratedTotals
    IntegratedTotalsWithCP24Time2a(int ioa, BinaryCounterReading bcr, CP24Time2a timestamp) (defined in lib60870.CS101.IntegratedTotalsWithCP24Time2a)lib60870.CS101.IntegratedTotalsWithCP24Time2a
    IntegratedTotalsWithCP24Time2a(IntegratedTotalsWithCP24Time2a original) (defined in lib60870.CS101.IntegratedTotalsWithCP24Time2a)lib60870.CS101.IntegratedTotalsWithCP24Time2a
    IntegratedTotalsWithCP24Time2a(IntegratedTotals original) (defined in lib60870.CS101.IntegratedTotalsWithCP24Time2a)lib60870.CS101.IntegratedTotalsWithCP24Time2a
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    SupportsSequence (defined in lib60870.CS101.IntegratedTotalsWithCP24Time2a)lib60870.CS101.IntegratedTotalsWithCP24Time2a
    Timestamp (defined in lib60870.CS101.IntegratedTotalsWithCP24Time2a)lib60870.CS101.IntegratedTotalsWithCP24Time2a
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.IntegratedTotalsWithCP24Time2a)lib60870.CS101.IntegratedTotalsWithCP24Time2a
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a.html deleted file mode 100644 index c05dd23..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a.html +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.IntegratedTotalsWithCP24Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.IntegratedTotalsWithCP24Time2a Class Reference
    -
    -
    - -

    Integrated totals information object with CP24Time2a time tag (M_IT_TA_1) - More...

    -
    -Inheritance diagram for lib60870.CS101.IntegratedTotalsWithCP24Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.IntegratedTotalsWithCP24Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    IntegratedTotalsWithCP24Time2a (int ioa, BinaryCounterReading bcr, CP24Time2a timestamp)
     
    IntegratedTotalsWithCP24Time2a (IntegratedTotalsWithCP24Time2a original)
     
    IntegratedTotalsWithCP24Time2a (IntegratedTotals original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.IntegratedTotals
    -override int GetEncodedSize ()
     
    IntegratedTotals (int ioa, BinaryCounterReading bcr)
     
    IntegratedTotals (IntegratedTotals original)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -CP24Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.IntegratedTotals
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -BinaryCounterReading BCR [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Detailed Description

    -

    Integrated totals information object with CP24Time2a time tag (M_IT_TA_1)

    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.IntegratedTotalsWithCP24Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.IntegratedTotals.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/IntegratedTotals.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a__coll__graph.dot deleted file mode 100644 index 644e505..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a__coll__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.IntegratedTotalsWithCP24Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Integrated\lTotalsWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Integrated totals information object with CP24Time2a time tag (M_IT_TA_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="IntegratedTotals",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_integrated_totals.html",tooltip="Integrated totals information object (M_IT_NA_1)"]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a__inherit__graph.dot deleted file mode 100644 index 644e505..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.IntegratedTotalsWithCP24Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Integrated\lTotalsWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Integrated totals information object with CP24Time2a time tag (M_IT_TA_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="IntegratedTotals",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_integrated_totals.html",tooltip="Integrated totals information object (M_IT_NA_1)"]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a-members.html deleted file mode 100644 index cdc4463..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a-members.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.IntegratedTotalsWithCP56Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.IntegratedTotalsWithCP56Time2a, including all inherited members.

    - - - - - - - - - - - - - - - - - -
    BCR (defined in lib60870.CS101.IntegratedTotals)lib60870.CS101.IntegratedTotals
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.IntegratedTotalsWithCP56Time2a)lib60870.CS101.IntegratedTotalsWithCP56Time2avirtual
    GetEncodedSize() (defined in lib60870.CS101.IntegratedTotalsWithCP56Time2a)lib60870.CS101.IntegratedTotalsWithCP56Time2a
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    IntegratedTotals(int ioa, BinaryCounterReading bcr) (defined in lib60870.CS101.IntegratedTotals)lib60870.CS101.IntegratedTotals
    IntegratedTotals(IntegratedTotals original) (defined in lib60870.CS101.IntegratedTotals)lib60870.CS101.IntegratedTotals
    IntegratedTotalsWithCP56Time2a(int ioa, BinaryCounterReading bcr, CP56Time2a timestamp) (defined in lib60870.CS101.IntegratedTotalsWithCP56Time2a)lib60870.CS101.IntegratedTotalsWithCP56Time2a
    IntegratedTotalsWithCP56Time2a(IntegratedTotalsWithCP56Time2a original) (defined in lib60870.CS101.IntegratedTotalsWithCP56Time2a)lib60870.CS101.IntegratedTotalsWithCP56Time2a
    IntegratedTotalsWithCP56Time2a(IntegratedTotals original) (defined in lib60870.CS101.IntegratedTotalsWithCP56Time2a)lib60870.CS101.IntegratedTotalsWithCP56Time2a
    IntegratedTotalsWithCP56Time2a(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.IntegratedTotalsWithCP56Time2a)lib60870.CS101.IntegratedTotalsWithCP56Time2a
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    SupportsSequence (defined in lib60870.CS101.IntegratedTotalsWithCP56Time2a)lib60870.CS101.IntegratedTotalsWithCP56Time2a
    Timestamp (defined in lib60870.CS101.IntegratedTotalsWithCP56Time2a)lib60870.CS101.IntegratedTotalsWithCP56Time2a
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.IntegratedTotalsWithCP56Time2a)lib60870.CS101.IntegratedTotalsWithCP56Time2a
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a.html deleted file mode 100644 index 55ed4bd..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a.html +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.IntegratedTotalsWithCP56Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.IntegratedTotalsWithCP56Time2a Class Reference
    -
    -
    - -

    Integrated totals information object with CP56Time2a time tag (M_IT_TB_1) - More...

    -
    -Inheritance diagram for lib60870.CS101.IntegratedTotalsWithCP56Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.IntegratedTotalsWithCP56Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    IntegratedTotalsWithCP56Time2a (int ioa, BinaryCounterReading bcr, CP56Time2a timestamp)
     
    IntegratedTotalsWithCP56Time2a (IntegratedTotalsWithCP56Time2a original)
     
    IntegratedTotalsWithCP56Time2a (IntegratedTotals original)
     
    IntegratedTotalsWithCP56Time2a (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.IntegratedTotals
    -override int GetEncodedSize ()
     
    IntegratedTotals (int ioa, BinaryCounterReading bcr)
     
    IntegratedTotals (IntegratedTotals original)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -CP56Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.IntegratedTotals
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -BinaryCounterReading BCR [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Detailed Description

    -

    Integrated totals information object with CP56Time2a time tag (M_IT_TB_1)

    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.IntegratedTotalsWithCP56Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.IntegratedTotals.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/IntegratedTotals.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a__coll__graph.dot deleted file mode 100644 index 4268fce..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a__coll__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.IntegratedTotalsWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Integrated\lTotalsWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Integrated totals information object with CP56Time2a time tag (M_IT_TB_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="IntegratedTotals",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_integrated_totals.html",tooltip="Integrated totals information object (M_IT_NA_1)"]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a__inherit__graph.dot deleted file mode 100644 index 4268fce..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.IntegratedTotalsWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Integrated\lTotalsWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Integrated totals information object with CP56Time2a time tag (M_IT_TB_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="IntegratedTotals",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_integrated_totals.html",tooltip="Integrated totals information object (M_IT_NA_1)"]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command-members.html deleted file mode 100644 index 7600933..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command-members.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.InterrogationCommand Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.InterrogationCommand, including all inherited members.

    - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.InterrogationCommand)lib60870.CS101.InterrogationCommandvirtual
    GetEncodedSize() (defined in lib60870.CS101.InterrogationCommand)lib60870.CS101.InterrogationCommand
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    InterrogationCommand(int ioa, byte qoi) (defined in lib60870.CS101.InterrogationCommand)lib60870.CS101.InterrogationCommand
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    QOI (defined in lib60870.CS101.InterrogationCommand)lib60870.CS101.InterrogationCommand
    SupportsSequence (defined in lib60870.CS101.InterrogationCommand)lib60870.CS101.InterrogationCommand
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.InterrogationCommand)lib60870.CS101.InterrogationCommand
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command.html deleted file mode 100644 index 24d1545..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command.html +++ /dev/null @@ -1,219 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.InterrogationCommand Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.InterrogationCommand Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.InterrogationCommand:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.InterrogationCommand:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    InterrogationCommand (int ioa, byte qoi)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -byte QOI [get, set]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.InterrogationCommand.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SystemInformationCommands.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command__coll__graph.dot deleted file mode 100644 index 6ac062e..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.InterrogationCommand" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Interrogation\lCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command__inherit__graph.dot deleted file mode 100644 index 6ac062e..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_interrogation_command__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.InterrogationCommand" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Interrogation\lCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master-members.html deleted file mode 100644 index 5306334..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master-members.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.Master Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.Master, including all inherited members.

    - - - - - - - - - - - - - - - - - - -
    DebugOutput (defined in lib60870.CS101.Master)lib60870.CS101.Master
    debugOutput (defined in lib60870.CS101.Master)lib60870.CS101.Masterprotected
    GetApplicationLayerParameters()lib60870.CS101.Master
    GetFile(int ca, int ioa, NameOfFile nof, IFileReceiver receiver)lib60870.CS101.Master
    SendASDU(ASDU asdu)lib60870.CS101.Master
    SendClockSyncCommand(int ca, CP56Time2a time)lib60870.CS101.Master
    SendControlCommand(CauseOfTransmission cot, int ca, InformationObject sc)lib60870.CS101.Master
    SendCounterInterrogationCommand(CauseOfTransmission cot, int ca, byte qcc)lib60870.CS101.Master
    SendDelayAcquisitionCommand(CauseOfTransmission cot, int ca, CP16Time2a delay)lib60870.CS101.Master
    SendFile(int ca, int ioa, NameOfFile nof, IFileProvider fileProvider)lib60870.CS101.Master
    SendInterrogationCommand(CauseOfTransmission cot, int ca, byte qoi)lib60870.CS101.Master
    SendReadCommand(int ca, int ioa)lib60870.CS101.Master
    SendResetProcessCommand(CauseOfTransmission cot, int ca, byte qrp)lib60870.CS101.Master
    SendTestCommand(int ca)lib60870.CS101.Master
    SendTestCommandWithCP56Time2a(int ca, ushort tsc, CP56Time2a time)lib60870.CS101.Master
    SetReceivedRawMessageHandler(RawMessageHandler handler, object parameter)lib60870.CS101.Master
    SetSentRawMessageHandler(RawMessageHandler handler, object parameter)lib60870.CS101.Master
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master.html deleted file mode 100644 index d8497d7..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master.html +++ /dev/null @@ -1,862 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.Master Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.Master Class Referenceabstract
    -
    -
    - -

    Common interface for CS104 and CS101 balanced and unbalanced master. - More...

    -
    -Inheritance diagram for lib60870.CS101.Master:
    -
    -
    Inheritance graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    void SendInterrogationCommand (CauseOfTransmission cot, int ca, byte qoi)
     Sends the interrogation command.
     
    void SendCounterInterrogationCommand (CauseOfTransmission cot, int ca, byte qcc)
     Sends the counter interrogation command (C_CI_NA_1 typeID: 101)
     
    void SendReadCommand (int ca, int ioa)
     Sends a read command (C_RD_NA_1 typeID: 102).
     
    void SendClockSyncCommand (int ca, CP56Time2a time)
     Sends a clock synchronization command (C_CS_NA_1 typeID: 103).
     
    void SendTestCommand (int ca)
     Sends a test command (C_TS_NA_1 typeID: 104).
     
    void SendTestCommandWithCP56Time2a (int ca, ushort tsc, CP56Time2a time)
     Sends a test command with CP56Time2a time (C_TS_TA_1 typeID: 107).
     
    void SendResetProcessCommand (CauseOfTransmission cot, int ca, byte qrp)
     Sends a reset process command (C_RP_NA_1 typeID: 105).
     
    void SendDelayAcquisitionCommand (CauseOfTransmission cot, int ca, CP16Time2a delay)
     Sends a delay acquisition command (C_CD_NA_1 typeID: 106).
     
    void SendControlCommand (CauseOfTransmission cot, int ca, InformationObject sc)
     Sends the control command.
     
    void SendASDU (ASDU asdu)
     Sends an arbitrary ASDU to the connected slave.
     
    void GetFile (int ca, int ioa, NameOfFile nof, IFileReceiver receiver)
     Read the file from slave (upload file)
     
    void SendFile (int ca, int ioa, NameOfFile nof, IFileProvider fileProvider)
     Sends the file to slave (download file)
     
    ApplicationLayerParameters GetApplicationLayerParameters ()
     Get the application layer parameters used by this master instance.
     
    void SetReceivedRawMessageHandler (RawMessageHandler handler, object parameter)
     Sets the raw message handler for received messages.
     
    void SetSentRawMessageHandler (RawMessageHandler handler, object parameter)
     Sets the sent message handler for sent messages.
     
    - - - -

    -Protected Attributes

    -bool debugOutput
     
    - - - -

    -Properties

    -bool DebugOutput [get, set]
     
    -

    Detailed Description

    -

    Common interface for CS104 and CS101 balanced and unbalanced master.

    -

    Member Function Documentation

    - -

    ◆ GetApplicationLayerParameters()

    - -
    -
    - - - - - -
    - - - - - - - -
    ApplicationLayerParameters lib60870.CS101.Master.GetApplicationLayerParameters ()
    -
    -abstract
    -
    - -

    Get the application layer parameters used by this master instance.

    -
    Returns
    used application layer parameters
    - -
    -
    - -

    ◆ GetFile()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - -
    void lib60870.CS101.Master.GetFile (int ca,
    int ioa,
    NameOfFile nof,
    IFileReceiver receiver )
    -
    -abstract
    -
    - -

    Read the file from slave (upload file)

    -
    Parameters
    - - - - - -
    caCA
    ioaIOA
    nofName of file (file type)
    receiverfile receiver instance
    -
    -
    - -
    -
    - -

    ◆ SendASDU()

    - -
    -
    - - - - - -
    - - - - - - - -
    void lib60870.CS101.Master.SendASDU (ASDU asdu)
    -
    -abstract
    -
    - -

    Sends an arbitrary ASDU to the connected slave.

    -
    Parameters
    - - -
    asduThe ASDU to send
    -
    -
    - -
    -
    - -

    ◆ SendClockSyncCommand()

    - -
    -
    - - - - - -
    - - - - - - - - - - - -
    void lib60870.CS101.Master.SendClockSyncCommand (int ca,
    CP56Time2a time )
    -
    -abstract
    -
    - -

    Sends a clock synchronization command (C_CS_NA_1 typeID: 103).

    -
    Parameters
    - - - -
    caCommon address
    timethe new time to set
    -
    -
    -
    Exceptions
    - - -
    ConnectionExceptiondescription
    -
    -
    - -
    -
    - -

    ◆ SendControlCommand()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    void lib60870.CS101.Master.SendControlCommand (CauseOfTransmission cot,
    int ca,
    InformationObject sc )
    -
    -abstract
    -
    - -

    Sends the control command.

    -

    The type ID has to match the type of the InformationObject!

    -

    C_SC_NA_1 -> SingleCommand C_DC_NA_1 -> DoubleCommand C_RC_NA_1 -> StepCommand C_SC_TA_1 -> SingleCommandWithCP56Time2a C_SE_NA_1 -> SetpointCommandNormalized C_SE_NB_1 -> SetpointCommandScaled C_SE_NC_1 -> SetpointCommandShort C_BO_NA_1 -> Bitstring32Command

    -
    Parameters
    - - - - -
    cotCause of transmission (use ACTIVATION to start a control sequence)
    caCommon address
    scInformation object of the command
    -
    -
    -
    Exceptions
    - - -
    ConnectionExceptiondescription
    -
    -
    - -
    -
    - -

    ◆ SendCounterInterrogationCommand()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    void lib60870.CS101.Master.SendCounterInterrogationCommand (CauseOfTransmission cot,
    int ca,
    byte qcc )
    -
    -abstract
    -
    - -

    Sends the counter interrogation command (C_CI_NA_1 typeID: 101)

    -
    Parameters
    - - - - -
    cotCause of transmission
    caCommon address
    qccQualifier of counter interrogation command
    -
    -
    -
    Exceptions
    - - -
    ConnectionExceptiondescription
    -
    -
    - -
    -
    - -

    ◆ SendDelayAcquisitionCommand()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    void lib60870.CS101.Master.SendDelayAcquisitionCommand (CauseOfTransmission cot,
    int ca,
    CP16Time2a delay )
    -
    -abstract
    -
    - -

    Sends a delay acquisition command (C_CD_NA_1 typeID: 106).

    -
    Parameters
    - - - - -
    cotCause of transmission
    caCommon address
    delaydelay for acquisition
    -
    -
    -
    Exceptions
    - - -
    ConnectionExceptiondescription
    -
    -
    - -
    -
    - -

    ◆ SendFile()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - -
    void lib60870.CS101.Master.SendFile (int ca,
    int ioa,
    NameOfFile nof,
    IFileProvider fileProvider )
    -
    -abstract
    -
    - -

    Sends the file to slave (download file)

    -
    Parameters
    - - - - - -
    caCA
    ioaIOA
    nofName of file (file type)
    fileProviderFile provider instance
    -
    -
    - -
    -
    - -

    ◆ SendInterrogationCommand()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    void lib60870.CS101.Master.SendInterrogationCommand (CauseOfTransmission cot,
    int ca,
    byte qoi )
    -
    -abstract
    -
    - -

    Sends the interrogation command.

    -
    Parameters
    - - - - -
    cotCause of transmission
    caCommon address
    qoiQualifier of interrogation (20 = station interrogation)
    -
    -
    -
    Exceptions
    - - -
    ConnectionExceptiondescription
    -
    -
    - -
    -
    - -

    ◆ SendReadCommand()

    - -
    -
    - - - - - -
    - - - - - - - - - - - -
    void lib60870.CS101.Master.SendReadCommand (int ca,
    int ioa )
    -
    -abstract
    -
    - -

    Sends a read command (C_RD_NA_1 typeID: 102).

    -

    This will send a read command C_RC_NA_1 (102) to the slave/outstation. The COT is always REQUEST (5). It is used to implement the cyclical polling of data application function.

    -
    Parameters
    - - - -
    caCommon address
    ioaInformation object address
    -
    -
    -
    Exceptions
    - - -
    ConnectionExceptiondescription
    -
    -
    - -
    -
    - -

    ◆ SendResetProcessCommand()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    void lib60870.CS101.Master.SendResetProcessCommand (CauseOfTransmission cot,
    int ca,
    byte qrp )
    -
    -abstract
    -
    - -

    Sends a reset process command (C_RP_NA_1 typeID: 105).

    -
    Parameters
    - - - - -
    cotCause of transmission
    caCommon address
    qrpQualifier of reset process command
    -
    -
    -
    Exceptions
    - - -
    ConnectionExceptiondescription
    -
    -
    - -
    -
    - -

    ◆ SendTestCommand()

    - -
    -
    - - - - - -
    - - - - - - - -
    void lib60870.CS101.Master.SendTestCommand (int ca)
    -
    -abstract
    -
    - -

    Sends a test command (C_TS_NA_1 typeID: 104).

    -

    Not required and supported by IEC 60870-5-104.

    -
    Parameters
    - - -
    caCommon address
    -
    -
    -
    Exceptions
    - - -
    ConnectionExceptiondescription
    -
    -
    - -
    -
    - -

    ◆ SendTestCommandWithCP56Time2a()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    void lib60870.CS101.Master.SendTestCommandWithCP56Time2a (int ca,
    ushort tsc,
    CP56Time2a time )
    -
    -abstract
    -
    - -

    Sends a test command with CP56Time2a time (C_TS_TA_1 typeID: 107).

    -
    Parameters
    - - - - -
    caCommon address
    tsctest sequence number
    timetest timestamp
    -
    -
    -
    Exceptions
    - - -
    ConnectionExceptiondescription
    -
    -
    - -
    -
    - -

    ◆ SetReceivedRawMessageHandler()

    - -
    -
    - - - - - -
    - - - - - - - - - - - -
    void lib60870.CS101.Master.SetReceivedRawMessageHandler (RawMessageHandler handler,
    object parameter )
    -
    -abstract
    -
    - -

    Sets the raw message handler for received messages.

    -
    Parameters
    - - - -
    handlerHandler/delegate that will be invoked when a message is received
    parameterwill be passed to the delegate
    -
    -
    - -
    -
    - -

    ◆ SetSentRawMessageHandler()

    - -
    -
    - - - - - -
    - - - - - - - - - - - -
    void lib60870.CS101.Master.SetSentRawMessageHandler (RawMessageHandler handler,
    object parameter )
    -
    -abstract
    -
    - -

    Sets the sent message handler for sent messages.

    -
    Parameters
    - - - -
    handlerHandler/delegate that will be invoked when a message is sent<
    parameterwill be passed to the delegate
    -
    -
    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/Master.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master.js deleted file mode 100644 index 79b217e..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master.js +++ /dev/null @@ -1,18 +0,0 @@ -var classlib60870_1_1_c_s101_1_1_master = -[ - [ "GetApplicationLayerParameters", "classlib60870_1_1_c_s101_1_1_master.html#ac8f077926245f7194b3aba089a7ce520", null ], - [ "GetFile", "classlib60870_1_1_c_s101_1_1_master.html#a67284f6ec618c943766040e3877acc7b", null ], - [ "SendASDU", "classlib60870_1_1_c_s101_1_1_master.html#a6917b74951e51d7e80bd0ae352bd6147", null ], - [ "SendClockSyncCommand", "classlib60870_1_1_c_s101_1_1_master.html#a71ae908a23d89528f78f061fa466104f", null ], - [ "SendControlCommand", "classlib60870_1_1_c_s101_1_1_master.html#a83a31edf0e9e4360e4dc613735f851d5", null ], - [ "SendCounterInterrogationCommand", "classlib60870_1_1_c_s101_1_1_master.html#a6b9a6af0acad8fa03468630363eb99a8", null ], - [ "SendDelayAcquisitionCommand", "classlib60870_1_1_c_s101_1_1_master.html#afbc769788f9720e9a3d63268500b8710", null ], - [ "SendFile", "classlib60870_1_1_c_s101_1_1_master.html#ad988de86e0a0ed0d052dc599b3fc98f3", null ], - [ "SendInterrogationCommand", "classlib60870_1_1_c_s101_1_1_master.html#ab25cd6997967e5a60943f391c2b2ddc0", null ], - [ "SendReadCommand", "classlib60870_1_1_c_s101_1_1_master.html#a52bcf5912b59e4ac44061730c3702eb4", null ], - [ "SendResetProcessCommand", "classlib60870_1_1_c_s101_1_1_master.html#a6440a2d388ca610f80190dda3c11b623", null ], - [ "SendTestCommand", "classlib60870_1_1_c_s101_1_1_master.html#a77d37b1e27cdd4eec1a314f3e2a09432", null ], - [ "SendTestCommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_master.html#a97c6f3b896c0588761bb1b113ef7f7be", null ], - [ "SetReceivedRawMessageHandler", "classlib60870_1_1_c_s101_1_1_master.html#a43ddedf33710bf27df6f10265787d359", null ], - [ "SetSentRawMessageHandler", "classlib60870_1_1_c_s101_1_1_master.html#ac850d2199ac83075bfe52648eec57993", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master__inherit__graph.dot deleted file mode 100644 index e03e25b..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_master__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.Master" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Master",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Common interface for CS104 and CS101 balanced and unbalanced master."]; - Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="lib60870.CS101.CS101Master",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_c_s101_master.html",tooltip=" "]; - Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="lib60870.CS104.Connection",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s104_1_1_connection.html",tooltip="A single connection to a CS 104 (IEC 60870-5-104) server. Implements the Master interface."]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized-members.html deleted file mode 100644 index 7718322..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized-members.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.MeasuredValueNormalized Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.MeasuredValueNormalized, including all inherited members.

    - - - - - - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalizedvirtual
    GetEncodedSize() (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    MeasuredValueNormalized(int objectAddress, float value, QualityDescriptor quality) (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
    MeasuredValueNormalized(int objectAddress, short value, QualityDescriptor quality) (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
    MeasuredValueNormalized(MeasuredValueNormalized original) (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
    MeasuredValueNormalizedWithoutQuality(int objectAddress, float normalizedValue) (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    MeasuredValueNormalizedWithoutQuality(MeasuredValueNormalizedWithoutQuality original) (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    MeasuredValueNormalizedWithoutQuality(int objectAddress, short rawValue) (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    NormalizedValue (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Quality (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
    RawValue (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    SupportsSequence (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized.html deleted file mode 100644 index 11435d0..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized.html +++ /dev/null @@ -1,258 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.MeasuredValueNormalized Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.MeasuredValueNormalized Class Reference
    -
    -
    - -

    Measured value normalized information object (M_ME_NA_1) - More...

    -
    -Inheritance diagram for lib60870.CS101.MeasuredValueNormalized:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.MeasuredValueNormalized:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    MeasuredValueNormalized (int objectAddress, float value, QualityDescriptor quality)
     
    MeasuredValueNormalized (int objectAddress, short value, QualityDescriptor quality)
     
    MeasuredValueNormalized (MeasuredValueNormalized original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    -override int GetEncodedSize ()
     
    MeasuredValueNormalizedWithoutQuality (int objectAddress, float normalizedValue)
     
    MeasuredValueNormalizedWithoutQuality (MeasuredValueNormalizedWithoutQuality original)
     
    MeasuredValueNormalizedWithoutQuality (int objectAddress, short rawValue)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -QualityDescriptor Quality [get]
     
    - Properties inherited from lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -short RawValue [get, set]
     
    -float NormalizedValue [get, set]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Detailed Description

    -

    Measured value normalized information object (M_ME_NA_1)

    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.MeasuredValueNormalized.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/MeasuredValueNormalized.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized__coll__graph.dot deleted file mode 100644 index db0c04a..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized__coll__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.MeasuredValueNormalized" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lNormalized",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Measured value normalized information object (M_ME_NA_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="MeasuredValueNormalizedWithout\lQuality",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html",tooltip="Measured value normalized without quality information object (M_ME_ND_1)"]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized__inherit__graph.dot deleted file mode 100644 index dea5ed6..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized__inherit__graph.dot +++ /dev/null @@ -1,17 +0,0 @@ -digraph "lib60870.CS101.MeasuredValueNormalized" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lNormalized",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Measured value normalized information object (M_ME_NA_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="MeasuredValueNormalizedWithout\lQuality",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html",tooltip="Measured value normalized without quality information object (M_ME_ND_1)"]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; - Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node4 [id="Node000004",label="lib60870.CS101.MeasuredValue\lNormalizedWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a.html",tooltip="Measured value normalized with CP24Time2a time tag (M_ME_TA_1)"]; - Node1 -> Node5 [id="edge4_Node000001_Node000005",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node5 [id="Node000005",label="lib60870.CS101.MeasuredValue\lNormalizedWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a.html",tooltip="Measured value normalized with CP56Time2a time tag (M_ME_TD_1)"]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a-members.html deleted file mode 100644 index f989639..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a-members.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a, including all inherited members.

    - - - - - - - - - - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP24Time2avirtual
    GetEncodedSize() (defined in lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    MeasuredValueNormalized(int objectAddress, float value, QualityDescriptor quality) (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
    MeasuredValueNormalized(int objectAddress, short value, QualityDescriptor quality) (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
    MeasuredValueNormalized(MeasuredValueNormalized original) (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
    MeasuredValueNormalizedWithCP24Time2a(int objectAddress, float value, QualityDescriptor quality, CP24Time2a timestamp) (defined in lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a
    MeasuredValueNormalizedWithCP24Time2a(int objectAddress, short value, QualityDescriptor quality, CP24Time2a timestamp) (defined in lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a
    MeasuredValueNormalizedWithCP24Time2a(MeasuredValueNormalizedWithCP24Time2a original) (defined in lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a
    MeasuredValueNormalizedWithoutQuality(int objectAddress, float normalizedValue) (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    MeasuredValueNormalizedWithoutQuality(MeasuredValueNormalizedWithoutQuality original) (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    MeasuredValueNormalizedWithoutQuality(int objectAddress, short rawValue) (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    NormalizedValue (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Quality (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
    RawValue (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    SupportsSequence (defined in lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a
    Timestamp (defined in lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a.html deleted file mode 100644 index 8166c79..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a.html +++ /dev/null @@ -1,281 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a Class Reference
    -
    -
    - -

    Measured value normalized with CP24Time2a time tag (M_ME_TA_1) - More...

    -
    -Inheritance diagram for lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    MeasuredValueNormalizedWithCP24Time2a (int objectAddress, float value, QualityDescriptor quality, CP24Time2a timestamp)
     
    MeasuredValueNormalizedWithCP24Time2a (int objectAddress, short value, QualityDescriptor quality, CP24Time2a timestamp)
     
    MeasuredValueNormalizedWithCP24Time2a (MeasuredValueNormalizedWithCP24Time2a original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.MeasuredValueNormalized
    -override int GetEncodedSize ()
     
    MeasuredValueNormalized (int objectAddress, float value, QualityDescriptor quality)
     
    MeasuredValueNormalized (int objectAddress, short value, QualityDescriptor quality)
     
    MeasuredValueNormalized (MeasuredValueNormalized original)
     
    - Public Member Functions inherited from lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    -override int GetEncodedSize ()
     
    MeasuredValueNormalizedWithoutQuality (int objectAddress, float normalizedValue)
     
    MeasuredValueNormalizedWithoutQuality (MeasuredValueNormalizedWithoutQuality original)
     
    MeasuredValueNormalizedWithoutQuality (int objectAddress, short rawValue)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -CP24Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.MeasuredValueNormalized
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -QualityDescriptor Quality [get]
     
    - Properties inherited from lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -short RawValue [get, set]
     
    -float NormalizedValue [get, set]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Detailed Description

    -

    Measured value normalized with CP24Time2a time tag (M_ME_TA_1)

    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.MeasuredValueNormalized.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/MeasuredValueNormalized.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a__coll__graph.dot deleted file mode 100644 index 6a8a10f..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a__coll__graph.dot +++ /dev/null @@ -1,14 +0,0 @@ -digraph "lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lNormalizedWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Measured value normalized with CP24Time2a time tag (M_ME_TA_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="MeasuredValueNormalized",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized.html",tooltip="Measured value normalized information object (M_ME_NA_1)"]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="MeasuredValueNormalizedWithout\lQuality",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html",tooltip="Measured value normalized without quality information object (M_ME_ND_1)"]; - Node4 -> Node3 [id="edge3_Node000003_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node4 [id="Node000004",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a__inherit__graph.dot deleted file mode 100644 index 6a8a10f..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a__inherit__graph.dot +++ /dev/null @@ -1,14 +0,0 @@ -digraph "lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lNormalizedWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Measured value normalized with CP24Time2a time tag (M_ME_TA_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="MeasuredValueNormalized",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized.html",tooltip="Measured value normalized information object (M_ME_NA_1)"]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="MeasuredValueNormalizedWithout\lQuality",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html",tooltip="Measured value normalized without quality information object (M_ME_ND_1)"]; - Node4 -> Node3 [id="edge3_Node000003_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node4 [id="Node000004",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a-members.html deleted file mode 100644 index 4a1557f..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a-members.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a, including all inherited members.

    - - - - - - - - - - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP56Time2avirtual
    GetEncodedSize() (defined in lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    MeasuredValueNormalized(int objectAddress, float value, QualityDescriptor quality) (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
    MeasuredValueNormalized(int objectAddress, short value, QualityDescriptor quality) (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
    MeasuredValueNormalized(MeasuredValueNormalized original) (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
    MeasuredValueNormalizedWithCP56Time2a(int objectAddress, float value, QualityDescriptor quality, CP56Time2a timestamp) (defined in lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a
    MeasuredValueNormalizedWithCP56Time2a(int objectAddress, short value, QualityDescriptor quality, CP56Time2a timestamp) (defined in lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a
    MeasuredValueNormalizedWithCP56Time2a(MeasuredValueNormalizedWithCP56Time2a original) (defined in lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a
    MeasuredValueNormalizedWithoutQuality(int objectAddress, float normalizedValue) (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    MeasuredValueNormalizedWithoutQuality(MeasuredValueNormalizedWithoutQuality original) (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    MeasuredValueNormalizedWithoutQuality(int objectAddress, short rawValue) (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    NormalizedValue (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Quality (defined in lib60870.CS101.MeasuredValueNormalized)lib60870.CS101.MeasuredValueNormalized
    RawValue (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    SupportsSequence (defined in lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a
    Timestamp (defined in lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a)lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a.html deleted file mode 100644 index dad64a2..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a.html +++ /dev/null @@ -1,281 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a Class Reference
    -
    -
    - -

    Measured value normalized with CP56Time2a time tag (M_ME_TD_1) - More...

    -
    -Inheritance diagram for lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    MeasuredValueNormalizedWithCP56Time2a (int objectAddress, float value, QualityDescriptor quality, CP56Time2a timestamp)
     
    MeasuredValueNormalizedWithCP56Time2a (int objectAddress, short value, QualityDescriptor quality, CP56Time2a timestamp)
     
    MeasuredValueNormalizedWithCP56Time2a (MeasuredValueNormalizedWithCP56Time2a original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.MeasuredValueNormalized
    -override int GetEncodedSize ()
     
    MeasuredValueNormalized (int objectAddress, float value, QualityDescriptor quality)
     
    MeasuredValueNormalized (int objectAddress, short value, QualityDescriptor quality)
     
    MeasuredValueNormalized (MeasuredValueNormalized original)
     
    - Public Member Functions inherited from lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    -override int GetEncodedSize ()
     
    MeasuredValueNormalizedWithoutQuality (int objectAddress, float normalizedValue)
     
    MeasuredValueNormalizedWithoutQuality (MeasuredValueNormalizedWithoutQuality original)
     
    MeasuredValueNormalizedWithoutQuality (int objectAddress, short rawValue)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -CP56Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.MeasuredValueNormalized
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -QualityDescriptor Quality [get]
     
    - Properties inherited from lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -short RawValue [get, set]
     
    -float NormalizedValue [get, set]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Detailed Description

    -

    Measured value normalized with CP56Time2a time tag (M_ME_TD_1)

    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.MeasuredValueNormalized.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/MeasuredValueNormalized.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a__coll__graph.dot deleted file mode 100644 index 9616b38..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a__coll__graph.dot +++ /dev/null @@ -1,14 +0,0 @@ -digraph "lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lNormalizedWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Measured value normalized with CP56Time2a time tag (M_ME_TD_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="MeasuredValueNormalized",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized.html",tooltip="Measured value normalized information object (M_ME_NA_1)"]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="MeasuredValueNormalizedWithout\lQuality",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html",tooltip="Measured value normalized without quality information object (M_ME_ND_1)"]; - Node4 -> Node3 [id="edge3_Node000003_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node4 [id="Node000004",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a__inherit__graph.dot deleted file mode 100644 index 9616b38..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a__inherit__graph.dot +++ /dev/null @@ -1,14 +0,0 @@ -digraph "lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lNormalizedWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Measured value normalized with CP56Time2a time tag (M_ME_TD_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="MeasuredValueNormalized",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized.html",tooltip="Measured value normalized information object (M_ME_NA_1)"]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="MeasuredValueNormalizedWithout\lQuality",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html",tooltip="Measured value normalized without quality information object (M_ME_ND_1)"]; - Node4 -> Node3 [id="edge3_Node000003_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node4 [id="Node000004",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality-members.html deleted file mode 100644 index 91e2169..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality-members.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.MeasuredValueNormalizedWithoutQuality Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.MeasuredValueNormalizedWithoutQuality, including all inherited members.

    - - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQualityvirtual
    GetEncodedSize() (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    MeasuredValueNormalizedWithoutQuality(int objectAddress, float normalizedValue) (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    MeasuredValueNormalizedWithoutQuality(MeasuredValueNormalizedWithoutQuality original) (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    MeasuredValueNormalizedWithoutQuality(int objectAddress, short rawValue) (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    NormalizedValue (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    RawValue (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    SupportsSequence (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.MeasuredValueNormalizedWithoutQuality)lib60870.CS101.MeasuredValueNormalizedWithoutQuality
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html deleted file mode 100644 index f3ce85e..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html +++ /dev/null @@ -1,233 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.MeasuredValueNormalizedWithoutQuality Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.MeasuredValueNormalizedWithoutQuality Class Reference
    -
    -
    - -

    Measured value normalized without quality information object (M_ME_ND_1) - More...

    -
    -Inheritance diagram for lib60870.CS101.MeasuredValueNormalizedWithoutQuality:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.MeasuredValueNormalizedWithoutQuality:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    MeasuredValueNormalizedWithoutQuality (int objectAddress, float normalizedValue)
     
    MeasuredValueNormalizedWithoutQuality (MeasuredValueNormalizedWithoutQuality original)
     
    MeasuredValueNormalizedWithoutQuality (int objectAddress, short rawValue)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -short RawValue [get, set]
     
    -float NormalizedValue [get, set]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Detailed Description

    -

    Measured value normalized without quality information object (M_ME_ND_1)

    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.MeasuredValueNormalizedWithoutQuality.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/MeasuredValueNormalized.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality__coll__graph.dot deleted file mode 100644 index 4805a68..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.MeasuredValueNormalizedWithoutQuality" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lNormalizedWithoutQuality",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Measured value normalized without quality information object (M_ME_ND_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality__inherit__graph.dot deleted file mode 100644 index 42dea41..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality__inherit__graph.dot +++ /dev/null @@ -1,17 +0,0 @@ -digraph "lib60870.CS101.MeasuredValueNormalizedWithoutQuality" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lNormalizedWithoutQuality",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Measured value normalized without quality information object (M_ME_ND_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; - Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="lib60870.CS101.MeasuredValue\lNormalized",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized.html",tooltip="Measured value normalized information object (M_ME_NA_1)"]; - Node3 -> Node4 [id="edge3_Node000003_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node4 [id="Node000004",label="lib60870.CS101.MeasuredValue\lNormalizedWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a.html",tooltip="Measured value normalized with CP24Time2a time tag (M_ME_TA_1)"]; - Node3 -> Node5 [id="edge4_Node000003_Node000005",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node5 [id="Node000005",label="lib60870.CS101.MeasuredValue\lNormalizedWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a.html",tooltip="Measured value normalized with CP56Time2a time tag (M_ME_TD_1)"]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled-members.html deleted file mode 100644 index 6bdcdcb..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled-members.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.MeasuredValueScaled Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.MeasuredValueScaled, including all inherited members.

    - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.MeasuredValueScaled)lib60870.CS101.MeasuredValueScaledvirtual
    GetEncodedSize() (defined in lib60870.CS101.MeasuredValueScaled)lib60870.CS101.MeasuredValueScaled
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    MeasuredValueScaled(int objectAddress, int value, QualityDescriptor quality)lib60870.CS101.MeasuredValueScaled
    MeasuredValueScaled(MeasuredValueScaled original) (defined in lib60870.CS101.MeasuredValueScaled)lib60870.CS101.MeasuredValueScaled
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Quality (defined in lib60870.CS101.MeasuredValueScaled)lib60870.CS101.MeasuredValueScaled
    ScaledValue (defined in lib60870.CS101.MeasuredValueScaled)lib60870.CS101.MeasuredValueScaled
    SupportsSequence (defined in lib60870.CS101.MeasuredValueScaled)lib60870.CS101.MeasuredValueScaled
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.MeasuredValueScaled)lib60870.CS101.MeasuredValueScaled
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled.html deleted file mode 100644 index 4fb0f8b..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled.html +++ /dev/null @@ -1,262 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.MeasuredValueScaled Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.MeasuredValueScaled Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.MeasuredValueScaled:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.MeasuredValueScaled:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
     MeasuredValueScaled (int objectAddress, int value, QualityDescriptor quality)
     Initializes a new instance of the lib60870.MeasuredValueScaled class.
     
    MeasuredValueScaled (MeasuredValueScaled original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -ScaledValue ScaledValue [get]
     
    -QualityDescriptor Quality [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Constructor & Destructor Documentation

    - -

    ◆ MeasuredValueScaled()

    - -
    -
    - - - - - - - - - - - - - - - - -
    lib60870.CS101.MeasuredValueScaled.MeasuredValueScaled (int objectAddress,
    int value,
    QualityDescriptor quality )
    -
    - -

    Initializes a new instance of the lib60870.MeasuredValueScaled class.

    -
    Parameters
    - - - - -
    objectAddressInformation object address
    valuescaled value (range -32768 - 32767)
    qualityquality descriptor (according to IEC 60870-5-101:2003 7.2.6.3)
    -
    -
    - -
    -
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.MeasuredValueScaled.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/MeasuredValueScaled.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled.js deleted file mode 100644 index 3b63d35..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled.js +++ /dev/null @@ -1,4 +0,0 @@ -var classlib60870_1_1_c_s101_1_1_measured_value_scaled = -[ - [ "MeasuredValueScaled", "classlib60870_1_1_c_s101_1_1_measured_value_scaled.html#a05819e48801faf682acea7f5c53d93e7", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled__coll__graph.dot deleted file mode 100644 index 650bc2e..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.MeasuredValueScaled" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lScaled",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled__inherit__graph.dot deleted file mode 100644 index a2cfa1a..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled__inherit__graph.dot +++ /dev/null @@ -1,15 +0,0 @@ -digraph "lib60870.CS101.MeasuredValueScaled" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lScaled",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; - Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="lib60870.CS101.MeasuredValue\lScaledWithCP24Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a.html",tooltip=" "]; - Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node4 [id="Node000004",label="lib60870.CS101.MeasuredValue\lScaledWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a-members.html deleted file mode 100644 index 773517e..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a-members.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.MeasuredValueScaledWithCP24Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.MeasuredValueScaledWithCP24Time2a, including all inherited members.

    - - - - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.MeasuredValueScaledWithCP24Time2a)lib60870.CS101.MeasuredValueScaledWithCP24Time2avirtual
    GetEncodedSize() (defined in lib60870.CS101.MeasuredValueScaledWithCP24Time2a)lib60870.CS101.MeasuredValueScaledWithCP24Time2a
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    MeasuredValueScaled(int objectAddress, int value, QualityDescriptor quality)lib60870.CS101.MeasuredValueScaled
    MeasuredValueScaled(MeasuredValueScaled original) (defined in lib60870.CS101.MeasuredValueScaled)lib60870.CS101.MeasuredValueScaled
    MeasuredValueScaledWithCP24Time2a(int objectAddress, int value, QualityDescriptor quality, CP24Time2a timestamp) (defined in lib60870.CS101.MeasuredValueScaledWithCP24Time2a)lib60870.CS101.MeasuredValueScaledWithCP24Time2a
    MeasuredValueScaledWithCP24Time2a(MeasuredValueScaledWithCP24Time2a original) (defined in lib60870.CS101.MeasuredValueScaledWithCP24Time2a)lib60870.CS101.MeasuredValueScaledWithCP24Time2a
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Quality (defined in lib60870.CS101.MeasuredValueScaled)lib60870.CS101.MeasuredValueScaled
    ScaledValue (defined in lib60870.CS101.MeasuredValueScaled)lib60870.CS101.MeasuredValueScaled
    SupportsSequence (defined in lib60870.CS101.MeasuredValueScaledWithCP24Time2a)lib60870.CS101.MeasuredValueScaledWithCP24Time2a
    Timestamp (defined in lib60870.CS101.MeasuredValueScaledWithCP24Time2a)lib60870.CS101.MeasuredValueScaledWithCP24Time2a
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.MeasuredValueScaledWithCP24Time2a)lib60870.CS101.MeasuredValueScaledWithCP24Time2a
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a.html deleted file mode 100644 index 9a763ed..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.MeasuredValueScaledWithCP24Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.MeasuredValueScaledWithCP24Time2a Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.MeasuredValueScaledWithCP24Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.MeasuredValueScaledWithCP24Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    MeasuredValueScaledWithCP24Time2a (int objectAddress, int value, QualityDescriptor quality, CP24Time2a timestamp)
     
    MeasuredValueScaledWithCP24Time2a (MeasuredValueScaledWithCP24Time2a original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.MeasuredValueScaled
    -override int GetEncodedSize ()
     
     MeasuredValueScaled (int objectAddress, int value, QualityDescriptor quality)
     Initializes a new instance of the lib60870.MeasuredValueScaled class.
     
    MeasuredValueScaled (MeasuredValueScaled original)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -CP24Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.MeasuredValueScaled
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -ScaledValue ScaledValue [get]
     
    -QualityDescriptor Quality [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.MeasuredValueScaledWithCP24Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.MeasuredValueScaled.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/MeasuredValueScaled.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a__coll__graph.dot deleted file mode 100644 index 854cfef..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a__coll__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.MeasuredValueScaledWithCP24Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lScaledWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="MeasuredValueScaled",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_scaled.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a__inherit__graph.dot deleted file mode 100644 index 854cfef..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.MeasuredValueScaledWithCP24Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lScaledWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="MeasuredValueScaled",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_scaled.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a-members.html deleted file mode 100644 index 4957579..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a-members.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.MeasuredValueScaledWithCP56Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.MeasuredValueScaledWithCP56Time2a, including all inherited members.

    - - - - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.MeasuredValueScaledWithCP56Time2a)lib60870.CS101.MeasuredValueScaledWithCP56Time2avirtual
    GetEncodedSize() (defined in lib60870.CS101.MeasuredValueScaledWithCP56Time2a)lib60870.CS101.MeasuredValueScaledWithCP56Time2a
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    MeasuredValueScaled(int objectAddress, int value, QualityDescriptor quality)lib60870.CS101.MeasuredValueScaled
    MeasuredValueScaled(MeasuredValueScaled original) (defined in lib60870.CS101.MeasuredValueScaled)lib60870.CS101.MeasuredValueScaled
    MeasuredValueScaledWithCP56Time2a(int objectAddress, int value, QualityDescriptor quality, CP56Time2a timestamp) (defined in lib60870.CS101.MeasuredValueScaledWithCP56Time2a)lib60870.CS101.MeasuredValueScaledWithCP56Time2a
    MeasuredValueScaledWithCP56Time2a(MeasuredValueScaledWithCP56Time2a original) (defined in lib60870.CS101.MeasuredValueScaledWithCP56Time2a)lib60870.CS101.MeasuredValueScaledWithCP56Time2a
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Quality (defined in lib60870.CS101.MeasuredValueScaled)lib60870.CS101.MeasuredValueScaled
    ScaledValue (defined in lib60870.CS101.MeasuredValueScaled)lib60870.CS101.MeasuredValueScaled
    SupportsSequence (defined in lib60870.CS101.MeasuredValueScaledWithCP56Time2a)lib60870.CS101.MeasuredValueScaledWithCP56Time2a
    Timestamp (defined in lib60870.CS101.MeasuredValueScaledWithCP56Time2a)lib60870.CS101.MeasuredValueScaledWithCP56Time2a
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.MeasuredValueScaledWithCP56Time2a)lib60870.CS101.MeasuredValueScaledWithCP56Time2a
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a.html deleted file mode 100644 index 8d57709..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.MeasuredValueScaledWithCP56Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.MeasuredValueScaledWithCP56Time2a Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.MeasuredValueScaledWithCP56Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.MeasuredValueScaledWithCP56Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    MeasuredValueScaledWithCP56Time2a (int objectAddress, int value, QualityDescriptor quality, CP56Time2a timestamp)
     
    MeasuredValueScaledWithCP56Time2a (MeasuredValueScaledWithCP56Time2a original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.MeasuredValueScaled
    -override int GetEncodedSize ()
     
     MeasuredValueScaled (int objectAddress, int value, QualityDescriptor quality)
     Initializes a new instance of the lib60870.MeasuredValueScaled class.
     
    MeasuredValueScaled (MeasuredValueScaled original)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -CP56Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.MeasuredValueScaled
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -ScaledValue ScaledValue [get]
     
    -QualityDescriptor Quality [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.MeasuredValueScaledWithCP56Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.MeasuredValueScaled.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/MeasuredValueScaled.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a__coll__graph.dot deleted file mode 100644 index e78e55c..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a__coll__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.MeasuredValueScaledWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lScaledWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="MeasuredValueScaled",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_scaled.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a__inherit__graph.dot deleted file mode 100644 index e78e55c..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.MeasuredValueScaledWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lScaledWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="MeasuredValueScaled",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_scaled.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short-members.html deleted file mode 100644 index 410b5f3..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short-members.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.MeasuredValueShort Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.MeasuredValueShort, including all inherited members.

    - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShortvirtual
    GetEncodedSize() (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    MeasuredValueShort(int objectAddress, float value, QualityDescriptor quality) (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
    MeasuredValueShort(MeasuredValueShort original) (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Quality (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
    SupportsSequence (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
    Value (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short.html deleted file mode 100644 index 2d1832c..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short.html +++ /dev/null @@ -1,225 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.MeasuredValueShort Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.MeasuredValueShort Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.MeasuredValueShort:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.MeasuredValueShort:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    MeasuredValueShort (int objectAddress, float value, QualityDescriptor quality)
     
    MeasuredValueShort (MeasuredValueShort original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -float Value [get, set]
     
    -QualityDescriptor Quality [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.MeasuredValueShort.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/MeasuredValueShort.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short__coll__graph.dot deleted file mode 100644 index 70f8cbd..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.MeasuredValueShort" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lShort",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short__inherit__graph.dot deleted file mode 100644 index b3e9bb5..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short__inherit__graph.dot +++ /dev/null @@ -1,15 +0,0 @@ -digraph "lib60870.CS101.MeasuredValueShort" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lShort",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; - Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="lib60870.CS101.MeasuredValue\lShortWithCP24Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a.html",tooltip=" "]; - Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node4 [id="Node000004",label="lib60870.CS101.MeasuredValue\lShortWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a-members.html deleted file mode 100644 index 364fa33..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a-members.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.MeasuredValueShortWithCP24Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.MeasuredValueShortWithCP24Time2a, including all inherited members.

    - - - - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.MeasuredValueShortWithCP24Time2a)lib60870.CS101.MeasuredValueShortWithCP24Time2avirtual
    GetEncodedSize() (defined in lib60870.CS101.MeasuredValueShortWithCP24Time2a)lib60870.CS101.MeasuredValueShortWithCP24Time2a
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    MeasuredValueShort(int objectAddress, float value, QualityDescriptor quality) (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
    MeasuredValueShort(MeasuredValueShort original) (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
    MeasuredValueShortWithCP24Time2a(int objectAddress, float value, QualityDescriptor quality, CP24Time2a timestamp) (defined in lib60870.CS101.MeasuredValueShortWithCP24Time2a)lib60870.CS101.MeasuredValueShortWithCP24Time2a
    MeasuredValueShortWithCP24Time2a(MeasuredValueShortWithCP24Time2a original) (defined in lib60870.CS101.MeasuredValueShortWithCP24Time2a)lib60870.CS101.MeasuredValueShortWithCP24Time2a
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Quality (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
    SupportsSequence (defined in lib60870.CS101.MeasuredValueShortWithCP24Time2a)lib60870.CS101.MeasuredValueShortWithCP24Time2a
    Timestamp (defined in lib60870.CS101.MeasuredValueShortWithCP24Time2a)lib60870.CS101.MeasuredValueShortWithCP24Time2a
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.MeasuredValueShortWithCP24Time2a)lib60870.CS101.MeasuredValueShortWithCP24Time2a
    Value (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a.html deleted file mode 100644 index 8ae4b05..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.MeasuredValueShortWithCP24Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.MeasuredValueShortWithCP24Time2a Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.MeasuredValueShortWithCP24Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.MeasuredValueShortWithCP24Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    MeasuredValueShortWithCP24Time2a (int objectAddress, float value, QualityDescriptor quality, CP24Time2a timestamp)
     
    MeasuredValueShortWithCP24Time2a (MeasuredValueShortWithCP24Time2a original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.MeasuredValueShort
    -override int GetEncodedSize ()
     
    MeasuredValueShort (int objectAddress, float value, QualityDescriptor quality)
     
    MeasuredValueShort (MeasuredValueShort original)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -CP24Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.MeasuredValueShort
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -float Value [get, set]
     
    -QualityDescriptor Quality [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.MeasuredValueShortWithCP24Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.MeasuredValueShort.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/MeasuredValueShort.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a__coll__graph.dot deleted file mode 100644 index ab3fdf2..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a__coll__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.MeasuredValueShortWithCP24Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lShortWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="MeasuredValueShort",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_short.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a__inherit__graph.dot deleted file mode 100644 index ab3fdf2..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.MeasuredValueShortWithCP24Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lShortWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="MeasuredValueShort",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_short.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a-members.html deleted file mode 100644 index 162d57c..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a-members.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.MeasuredValueShortWithCP56Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.MeasuredValueShortWithCP56Time2a, including all inherited members.

    - - - - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.MeasuredValueShortWithCP56Time2a)lib60870.CS101.MeasuredValueShortWithCP56Time2avirtual
    GetEncodedSize() (defined in lib60870.CS101.MeasuredValueShortWithCP56Time2a)lib60870.CS101.MeasuredValueShortWithCP56Time2a
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    MeasuredValueShort(int objectAddress, float value, QualityDescriptor quality) (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
    MeasuredValueShort(MeasuredValueShort original) (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
    MeasuredValueShortWithCP56Time2a(int objectAddress, float value, QualityDescriptor quality, CP56Time2a timestamp) (defined in lib60870.CS101.MeasuredValueShortWithCP56Time2a)lib60870.CS101.MeasuredValueShortWithCP56Time2a
    MeasuredValueShortWithCP56Time2a(MeasuredValueShortWithCP56Time2a original) (defined in lib60870.CS101.MeasuredValueShortWithCP56Time2a)lib60870.CS101.MeasuredValueShortWithCP56Time2a
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Quality (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
    SupportsSequence (defined in lib60870.CS101.MeasuredValueShortWithCP56Time2a)lib60870.CS101.MeasuredValueShortWithCP56Time2a
    Timestamp (defined in lib60870.CS101.MeasuredValueShortWithCP56Time2a)lib60870.CS101.MeasuredValueShortWithCP56Time2a
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.MeasuredValueShortWithCP56Time2a)lib60870.CS101.MeasuredValueShortWithCP56Time2a
    Value (defined in lib60870.CS101.MeasuredValueShort)lib60870.CS101.MeasuredValueShort
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a.html deleted file mode 100644 index 2be8f65..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.MeasuredValueShortWithCP56Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.MeasuredValueShortWithCP56Time2a Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.MeasuredValueShortWithCP56Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.MeasuredValueShortWithCP56Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    MeasuredValueShortWithCP56Time2a (int objectAddress, float value, QualityDescriptor quality, CP56Time2a timestamp)
     
    MeasuredValueShortWithCP56Time2a (MeasuredValueShortWithCP56Time2a original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.MeasuredValueShort
    -override int GetEncodedSize ()
     
    MeasuredValueShort (int objectAddress, float value, QualityDescriptor quality)
     
    MeasuredValueShort (MeasuredValueShort original)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -CP56Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.MeasuredValueShort
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -float Value [get, set]
     
    -QualityDescriptor Quality [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.MeasuredValueShortWithCP56Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.MeasuredValueShort.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/MeasuredValueShort.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a__coll__graph.dot deleted file mode 100644 index dd02f34..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a__coll__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.MeasuredValueShortWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lShortWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="MeasuredValueShort",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_short.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a__inherit__graph.dot deleted file mode 100644 index dd02f34..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.MeasuredValueShortWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.MeasuredValue\lShortWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="MeasuredValueShort",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_short.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_output_circuit_info-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_output_circuit_info-members.html deleted file mode 100644 index f2c7462..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_output_circuit_info-members.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.OutputCircuitInfo Member List
    -
    - -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_output_circuit_info.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_output_circuit_info.html deleted file mode 100644 index f54df48..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_output_circuit_info.html +++ /dev/null @@ -1,267 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.OutputCircuitInfo Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.OutputCircuitInfo Class Reference
    -
    -
    - -

    Output circuit information of protection equipment According to IEC 60870-5-101:2003 7.2.6.12. - More...

    - - - - - - - - - - - - - - -

    -Public Member Functions

    OutputCircuitInfo (OutputCircuitInfo original)
     
    -override bool Equals (object obj)
     
    -override int GetHashCode ()
     
    OutputCircuitInfo (byte encodedValue)
     
    OutputCircuitInfo (bool gc, bool cl1, bool cl2, bool cl3)
     
    -override string ToString ()
     
    - - - - - - - - - - - - - - - -

    -Properties

    -byte EncodedValue [get, set]
     
    bool GC [get, set]
     General command to output circuit.
     
    bool CL1 [get, set]
     Command to output circuit phase L1.
     
    bool CL2 [get, set]
     Command to output circuit phase L2.
     
    bool CL3 [get, set]
     Command to output circuit phase L3.
     
    -

    Detailed Description

    -

    Output circuit information of protection equipment According to IEC 60870-5-101:2003 7.2.6.12.

    -

    Property Documentation

    - -

    ◆ CL1

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS101.OutputCircuitInfo.CL1
    -
    -getset
    -
    - -

    Command to output circuit phase L1.

    -

    true if set, otherwise, false.

    - -
    -
    - -

    ◆ CL2

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS101.OutputCircuitInfo.CL2
    -
    -getset
    -
    - -

    Command to output circuit phase L2.

    -

    true if set, otherwise, false.

    - -
    -
    - -

    ◆ CL3

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS101.OutputCircuitInfo.CL3
    -
    -getset
    -
    - -

    Command to output circuit phase L3.

    -

    true if set, otherwise, false.

    - -
    -
    - -

    ◆ GC

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS101.OutputCircuitInfo.GC
    -
    -getset
    -
    - -

    General command to output circuit.

    -

    true if set, otherwise, false.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/OutputCircuitInfo.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_output_circuit_info.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_output_circuit_info.js deleted file mode 100644 index 43c0d47..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_output_circuit_info.js +++ /dev/null @@ -1,7 +0,0 @@ -var classlib60870_1_1_c_s101_1_1_output_circuit_info = -[ - [ "CL1", "classlib60870_1_1_c_s101_1_1_output_circuit_info.html#ac474a5e41cac7e82a2225cb27792fcf7", null ], - [ "CL2", "classlib60870_1_1_c_s101_1_1_output_circuit_info.html#a6507ca6be64921d3931911033d496661", null ], - [ "CL3", "classlib60870_1_1_c_s101_1_1_output_circuit_info.html#ad9d84ee2a4315546c531867e4d9a5e28", null ], - [ "GC", "classlib60870_1_1_c_s101_1_1_output_circuit_info.html#a1eeab57adef2da4f97af4fc96b07ad6c", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info-members.html deleted file mode 100644 index f26fd81..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info-members.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.PackedOutputCircuitInfo Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.PackedOutputCircuitInfo, including all inherited members.

    - - - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.PackedOutputCircuitInfo)lib60870.CS101.PackedOutputCircuitInfovirtual
    GetEncodedSize() (defined in lib60870.CS101.PackedOutputCircuitInfo)lib60870.CS101.PackedOutputCircuitInfo
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    OCI (defined in lib60870.CS101.PackedOutputCircuitInfo)lib60870.CS101.PackedOutputCircuitInfo
    OperatingTime (defined in lib60870.CS101.PackedOutputCircuitInfo)lib60870.CS101.PackedOutputCircuitInfo
    PackedOutputCircuitInfo(int objectAddress, OutputCircuitInfo oci, QualityDescriptorP qdp, CP16Time2a operatingTime, CP24Time2a timestamp) (defined in lib60870.CS101.PackedOutputCircuitInfo)lib60870.CS101.PackedOutputCircuitInfo
    PackedOutputCircuitInfo(PackedOutputCircuitInfo original) (defined in lib60870.CS101.PackedOutputCircuitInfo)lib60870.CS101.PackedOutputCircuitInfo
    QDP (defined in lib60870.CS101.PackedOutputCircuitInfo)lib60870.CS101.PackedOutputCircuitInfo
    SupportsSequence (defined in lib60870.CS101.PackedOutputCircuitInfo)lib60870.CS101.PackedOutputCircuitInfo
    Timestamp (defined in lib60870.CS101.PackedOutputCircuitInfo)lib60870.CS101.PackedOutputCircuitInfo
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.PackedOutputCircuitInfo)lib60870.CS101.PackedOutputCircuitInfo
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info.html deleted file mode 100644 index 4ecbd48..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info.html +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.PackedOutputCircuitInfo Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.PackedOutputCircuitInfo Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.PackedOutputCircuitInfo:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.PackedOutputCircuitInfo:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    PackedOutputCircuitInfo (int objectAddress, OutputCircuitInfo oci, QualityDescriptorP qdp, CP16Time2a operatingTime, CP24Time2a timestamp)
     
    PackedOutputCircuitInfo (PackedOutputCircuitInfo original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -OutputCircuitInfo OCI [get]
     
    -QualityDescriptorP QDP [get]
     
    -CP16Time2a OperatingTime [get]
     
    -CP24Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.PackedOutputCircuitInfo.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/PackedOutputCircuitInfo.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info__coll__graph.dot deleted file mode 100644 index 5405fe2..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.PackedOutputCircuitInfo" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.PackedOutput\lCircuitInfo",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info__inherit__graph.dot deleted file mode 100644 index 5405fe2..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.PackedOutputCircuitInfo" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.PackedOutput\lCircuitInfo",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a-members.html deleted file mode 100644 index 66ba675..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a-members.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a, including all inherited members.

    - - - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a)lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2avirtual
    GetEncodedSize() (defined in lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a)lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    OCI (defined in lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a)lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a
    OperatingTime (defined in lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a)lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a
    PackedOutputCircuitInfoWithCP56Time2a(int objectAddress, OutputCircuitInfo oci, QualityDescriptorP qdp, CP16Time2a operatingTime, CP56Time2a timestamp) (defined in lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a)lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a
    PackedOutputCircuitInfoWithCP56Time2a(PackedOutputCircuitInfoWithCP56Time2a original) (defined in lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a)lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a
    QDP (defined in lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a)lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a
    SupportsSequence (defined in lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a)lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a
    Timestamp (defined in lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a)lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a)lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a.html deleted file mode 100644 index 8d9d85d..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a.html +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    PackedOutputCircuitInfoWithCP56Time2a (int objectAddress, OutputCircuitInfo oci, QualityDescriptorP qdp, CP16Time2a operatingTime, CP56Time2a timestamp)
     
    PackedOutputCircuitInfoWithCP56Time2a (PackedOutputCircuitInfoWithCP56Time2a original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -OutputCircuitInfo OCI [get]
     
    -QualityDescriptorP QDP [get]
     
    -CP16Time2a OperatingTime [get]
     
    -CP56Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/PackedOutputCircuitInfo.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a__coll__graph.dot deleted file mode 100644 index 653c76e..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.PackedOutput\lCircuitInfoWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a__inherit__graph.dot deleted file mode 100644 index 653c76e..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.PackedOutput\lCircuitInfoWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d-members.html deleted file mode 100644 index a5c4f18..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d-members.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.PackedSinglePointWithSCD Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.PackedSinglePointWithSCD, including all inherited members.

    - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.PackedSinglePointWithSCD)lib60870.CS101.PackedSinglePointWithSCDvirtual
    GetEncodedSize() (defined in lib60870.CS101.PackedSinglePointWithSCD)lib60870.CS101.PackedSinglePointWithSCD
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    PackedSinglePointWithSCD(int objectAddress, StatusAndStatusChangeDetection scd, QualityDescriptor quality) (defined in lib60870.CS101.PackedSinglePointWithSCD)lib60870.CS101.PackedSinglePointWithSCD
    PackedSinglePointWithSCD(PackedSinglePointWithSCD original) (defined in lib60870.CS101.PackedSinglePointWithSCD)lib60870.CS101.PackedSinglePointWithSCD
    QDS (defined in lib60870.CS101.PackedSinglePointWithSCD)lib60870.CS101.PackedSinglePointWithSCD
    SCD (defined in lib60870.CS101.PackedSinglePointWithSCD)lib60870.CS101.PackedSinglePointWithSCD
    SupportsSequence (defined in lib60870.CS101.PackedSinglePointWithSCD)lib60870.CS101.PackedSinglePointWithSCD
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.PackedSinglePointWithSCD)lib60870.CS101.PackedSinglePointWithSCD
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d.html deleted file mode 100644 index d8cac1d..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d.html +++ /dev/null @@ -1,225 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.PackedSinglePointWithSCD Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.PackedSinglePointWithSCD Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.PackedSinglePointWithSCD:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.PackedSinglePointWithSCD:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    PackedSinglePointWithSCD (int objectAddress, StatusAndStatusChangeDetection scd, QualityDescriptor quality)
     
    PackedSinglePointWithSCD (PackedSinglePointWithSCD original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -StatusAndStatusChangeDetection SCD [get, set]
     
    -QualityDescriptor QDS [get, set]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.PackedSinglePointWithSCD.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SinglePointInformation.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d__coll__graph.dot deleted file mode 100644 index b02ddc0..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.PackedSinglePointWithSCD" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.PackedSingle\lPointWithSCD",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d__inherit__graph.dot deleted file mode 100644 index b02ddc0..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.PackedSinglePointWithSCD" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.PackedSingle\lPointWithSCD",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment-members.html deleted file mode 100644 index 5ff37ae..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment-members.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.PackedStartEventsOfProtectionEquipment Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.PackedStartEventsOfProtectionEquipment, including all inherited members.

    - - - - - - - - - - - - - - - -
    ElapsedTime (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipment)lib60870.CS101.PackedStartEventsOfProtectionEquipment
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipment)lib60870.CS101.PackedStartEventsOfProtectionEquipmentvirtual
    GetEncodedSize() (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipment)lib60870.CS101.PackedStartEventsOfProtectionEquipment
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    PackedStartEventsOfProtectionEquipment(int objectAddress, StartEvent spe, QualityDescriptorP qdp, CP16Time2a elapsedTime, CP24Time2a timestamp) (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipment)lib60870.CS101.PackedStartEventsOfProtectionEquipment
    PackedStartEventsOfProtectionEquipment(PackedStartEventsOfProtectionEquipment original) (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipment)lib60870.CS101.PackedStartEventsOfProtectionEquipment
    QDP (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipment)lib60870.CS101.PackedStartEventsOfProtectionEquipment
    SPE (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipment)lib60870.CS101.PackedStartEventsOfProtectionEquipment
    SupportsSequence (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipment)lib60870.CS101.PackedStartEventsOfProtectionEquipment
    Timestamp (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipment)lib60870.CS101.PackedStartEventsOfProtectionEquipment
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipment)lib60870.CS101.PackedStartEventsOfProtectionEquipment
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment.html deleted file mode 100644 index 5aa40f0..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment.html +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.PackedStartEventsOfProtectionEquipment Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.PackedStartEventsOfProtectionEquipment Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.PackedStartEventsOfProtectionEquipment:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.PackedStartEventsOfProtectionEquipment:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    PackedStartEventsOfProtectionEquipment (int objectAddress, StartEvent spe, QualityDescriptorP qdp, CP16Time2a elapsedTime, CP24Time2a timestamp)
     
    PackedStartEventsOfProtectionEquipment (PackedStartEventsOfProtectionEquipment original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -StartEvent SPE [get]
     
    -QualityDescriptorP QDP [get]
     
    -CP16Time2a ElapsedTime [get]
     
    -CP24Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.PackedStartEventsOfProtectionEquipment.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/PackedStartEventsOfProtectionEquipment.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment__coll__graph.dot deleted file mode 100644 index 4ed6549..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.PackedStartEventsOfProtectionEquipment" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.PackedStart\lEventsOfProtectionEquipment",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment__inherit__graph.dot deleted file mode 100644 index 4ed6549..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.PackedStartEventsOfProtectionEquipment" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.PackedStart\lEventsOfProtectionEquipment",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a-members.html deleted file mode 100644 index 48a26b2..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a-members.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a, including all inherited members.

    - - - - - - - - - - - - - - - -
    ElapsedTime (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2avirtual
    GetEncodedSize() (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    PackedStartEventsOfProtectionEquipmentWithCP56Time2a(int objectAddress, StartEvent spe, QualityDescriptorP qdp, CP16Time2a elapsedTime, CP56Time2a timestamp) (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a
    PackedStartEventsOfProtectionEquipmentWithCP56Time2a(PackedStartEventsOfProtectionEquipmentWithCP56Time2a original) (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a
    QDP (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a
    SPE (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a
    SupportsSequence (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a
    Timestamp (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a)lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a.html deleted file mode 100644 index d3455ef..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a.html +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    PackedStartEventsOfProtectionEquipmentWithCP56Time2a (int objectAddress, StartEvent spe, QualityDescriptorP qdp, CP16Time2a elapsedTime, CP56Time2a timestamp)
     
    PackedStartEventsOfProtectionEquipmentWithCP56Time2a (PackedStartEventsOfProtectionEquipmentWithCP56Time2a original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -StartEvent SPE [get]
     
    -QualityDescriptorP QDP [get]
     
    -CP16Time2a ElapsedTime [get]
     
    -CP56Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/PackedStartEventsOfProtectionEquipment.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a__coll__graph.dot deleted file mode 100644 index 40ec84d..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.PackedStart\lEventsOfProtectionEquipmentWith\lCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a__inherit__graph.dot deleted file mode 100644 index 40ec84d..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.PackedStart\lEventsOfProtectionEquipmentWith\lCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation-members.html deleted file mode 100644 index d9e459a..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation-members.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.ParameterActivation Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.ParameterActivation, including all inherited members.

    - - - - - - - - - - - - - - - -
    DE_ACT_OBJECT_PARAMETER (defined in lib60870.CS101.ParameterActivation)lib60870.CS101.ParameterActivationstatic
    DE_ACT_OBJECT_TRANSMISSION (defined in lib60870.CS101.ParameterActivation)lib60870.CS101.ParameterActivationstatic
    DE_ACT_PREV_LOADED_PARAMETER (defined in lib60870.CS101.ParameterActivation)lib60870.CS101.ParameterActivationstatic
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.ParameterActivation)lib60870.CS101.ParameterActivationvirtual
    GetEncodedSize() (defined in lib60870.CS101.ParameterActivation)lib60870.CS101.ParameterActivation
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    NOT_USED (defined in lib60870.CS101.ParameterActivation)lib60870.CS101.ParameterActivationstatic
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ParameterActivation(int objectAddress, byte qpa) (defined in lib60870.CS101.ParameterActivation)lib60870.CS101.ParameterActivation
    QPAlib60870.CS101.ParameterActivation
    SupportsSequence (defined in lib60870.CS101.ParameterActivation)lib60870.CS101.ParameterActivation
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.ParameterActivation)lib60870.CS101.ParameterActivation
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation.html deleted file mode 100644 index e1a452f..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.ParameterActivation Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.ParameterActivation Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.ParameterActivation:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.ParameterActivation:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    ParameterActivation (int objectAddress, byte qpa)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - -

    -Static Public Attributes

    -static byte NOT_USED = 0
     
    -static byte DE_ACT_PREV_LOADED_PARAMETER = 1
     
    -static byte DE_ACT_OBJECT_PARAMETER = 2
     
    -static byte DE_ACT_OBJECT_TRANSMISSION = 3
     
    - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    byte QPA [get]
     Gets the Qualifier of Parameter Activation (QPA)
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.ParameterActivation.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -

    Property Documentation

    - -

    ◆ QPA

    - -
    -
    - - - - - -
    - - - - -
    byte lib60870.CS101.ParameterActivation.QPA
    -
    -get
    -
    - -

    Gets the Qualifier of Parameter Activation (QPA)

    -

    The QPA value

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/ParameterMeasuredValues.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation.js deleted file mode 100644 index 1b6a6ea..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation.js +++ /dev/null @@ -1,4 +0,0 @@ -var classlib60870_1_1_c_s101_1_1_parameter_activation = -[ - [ "QPA", "classlib60870_1_1_c_s101_1_1_parameter_activation.html#ab541aa687b71edc3411f12acd9adb618", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation__coll__graph.dot deleted file mode 100644 index 5c0de5b..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.ParameterActivation" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Parameter\lActivation",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation__inherit__graph.dot deleted file mode 100644 index 5c0de5b..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_activation__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.ParameterActivation" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Parameter\lActivation",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value-members.html deleted file mode 100644 index 20a10ae..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value-members.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.ParameterFloatValue Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.ParameterFloatValue, including all inherited members.

    - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.ParameterFloatValue)lib60870.CS101.ParameterFloatValuevirtual
    GetEncodedSize() (defined in lib60870.CS101.ParameterFloatValue)lib60870.CS101.ParameterFloatValue
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ParameterFloatValue(int objectAddress, float value, byte qpm) (defined in lib60870.CS101.ParameterFloatValue)lib60870.CS101.ParameterFloatValue
    QPM (defined in lib60870.CS101.ParameterFloatValue)lib60870.CS101.ParameterFloatValue
    SupportsSequence (defined in lib60870.CS101.ParameterFloatValue)lib60870.CS101.ParameterFloatValue
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.ParameterFloatValue)lib60870.CS101.ParameterFloatValue
    Value (defined in lib60870.CS101.ParameterFloatValue)lib60870.CS101.ParameterFloatValue
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value.html deleted file mode 100644 index 38987e0..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value.html +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.ParameterFloatValue Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.ParameterFloatValue Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.ParameterFloatValue:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.ParameterFloatValue:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    ParameterFloatValue (int objectAddress, float value, byte qpm)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -float Value [get]
     
    -byte QPM [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.ParameterFloatValue.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/ParameterMeasuredValues.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value__coll__graph.dot deleted file mode 100644 index 977d226..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.ParameterFloatValue" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Parameter\lFloatValue",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value__inherit__graph.dot deleted file mode 100644 index 977d226..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_float_value__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.ParameterFloatValue" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Parameter\lFloatValue",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value-members.html deleted file mode 100644 index 38a04f0..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value-members.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.ParameterNormalizedValue Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.ParameterNormalizedValue, including all inherited members.

    - - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.ParameterNormalizedValue)lib60870.CS101.ParameterNormalizedValuevirtual
    GetEncodedSize() (defined in lib60870.CS101.ParameterNormalizedValue)lib60870.CS101.ParameterNormalizedValue
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    NormalizedValue (defined in lib60870.CS101.ParameterNormalizedValue)lib60870.CS101.ParameterNormalizedValue
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ParameterNormalizedValue(int objectAddress, float normalizedValue, byte qpm) (defined in lib60870.CS101.ParameterNormalizedValue)lib60870.CS101.ParameterNormalizedValue
    ParameterNormalizedValue(int objectAddress, short rawValue, byte qpm) (defined in lib60870.CS101.ParameterNormalizedValue)lib60870.CS101.ParameterNormalizedValue
    QPM (defined in lib60870.CS101.ParameterNormalizedValue)lib60870.CS101.ParameterNormalizedValue
    RawValue (defined in lib60870.CS101.ParameterNormalizedValue)lib60870.CS101.ParameterNormalizedValue
    SupportsSequence (defined in lib60870.CS101.ParameterNormalizedValue)lib60870.CS101.ParameterNormalizedValue
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.ParameterNormalizedValue)lib60870.CS101.ParameterNormalizedValue
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value.html deleted file mode 100644 index 5a1e843..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value.html +++ /dev/null @@ -1,228 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.ParameterNormalizedValue Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.ParameterNormalizedValue Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.ParameterNormalizedValue:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.ParameterNormalizedValue:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    ParameterNormalizedValue (int objectAddress, float normalizedValue, byte qpm)
     
    ParameterNormalizedValue (int objectAddress, short rawValue, byte qpm)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -short RawValue [get, set]
     
    -float NormalizedValue [get, set]
     
    -byte QPM [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.ParameterNormalizedValue.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/ParameterMeasuredValues.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value__coll__graph.dot deleted file mode 100644 index 75547b6..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.ParameterNormalizedValue" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Parameter\lNormalizedValue",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value__inherit__graph.dot deleted file mode 100644 index 75547b6..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_normalized_value__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.ParameterNormalizedValue" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Parameter\lNormalizedValue",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value-members.html deleted file mode 100644 index 29d7273..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value-members.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.ParameterScaledValue Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.ParameterScaledValue, including all inherited members.

    - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.ParameterScaledValue)lib60870.CS101.ParameterScaledValuevirtual
    GetEncodedSize() (defined in lib60870.CS101.ParameterScaledValue)lib60870.CS101.ParameterScaledValue
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ParameterScaledValue(int objectAddress, ScaledValue value, byte qpm) (defined in lib60870.CS101.ParameterScaledValue)lib60870.CS101.ParameterScaledValue
    QPM (defined in lib60870.CS101.ParameterScaledValue)lib60870.CS101.ParameterScaledValue
    ScaledValue (defined in lib60870.CS101.ParameterScaledValue)lib60870.CS101.ParameterScaledValue
    SupportsSequence (defined in lib60870.CS101.ParameterScaledValue)lib60870.CS101.ParameterScaledValue
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.ParameterScaledValue)lib60870.CS101.ParameterScaledValue
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value.html deleted file mode 100644 index 12db998..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value.html +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.ParameterScaledValue Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.ParameterScaledValue Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.ParameterScaledValue:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.ParameterScaledValue:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    ParameterScaledValue (int objectAddress, ScaledValue value, byte qpm)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -ScaledValue ScaledValue [get, set]
     
    -byte QPM [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.ParameterScaledValue.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/ParameterMeasuredValues.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value__coll__graph.dot deleted file mode 100644 index ea18206..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.ParameterScaledValue" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Parameter\lScaledValue",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value__inherit__graph.dot deleted file mode 100644 index ea18206..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_parameter_scaled_value__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.ParameterScaledValue" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Parameter\lScaledValue",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_private_information_object_types-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_private_information_object_types-members.html deleted file mode 100644 index 63697b2..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_private_information_object_types-members.html +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.PrivateInformationObjectTypes Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.PrivateInformationObjectTypes, including all inherited members.

    - - -
    AddPrivateInformationObjectType(TypeID typeId, IPrivateIOFactory iot) (defined in lib60870.CS101.PrivateInformationObjectTypes)lib60870.CS101.PrivateInformationObjectTypes
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_private_information_object_types.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_private_information_object_types.html deleted file mode 100644 index 3d821b2..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_private_information_object_types.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.PrivateInformationObjectTypes Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.PrivateInformationObjectTypes Class Reference
    -
    -
    - -

    Hold a list of private information object (IO) types to be used for parsing. - More...

    - - - - -

    -Public Member Functions

    -void AddPrivateInformationObjectType (TypeID typeId, IPrivateIOFactory iot)
     
    -

    Detailed Description

    -

    Hold a list of private information object (IO) types to be used for parsing.

    -

    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/InformationObject.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_qualifier_of_interrogation-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_qualifier_of_interrogation-members.html deleted file mode 100644 index d25f331..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_qualifier_of_interrogation-members.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.QualifierOfInterrogation Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.QualifierOfInterrogation, including all inherited members.

    - - - - - - - - - - - - - - - - - - -
    GROUP_1 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
    GROUP_10 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
    GROUP_11 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
    GROUP_12 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
    GROUP_13 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
    GROUP_14 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
    GROUP_15 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
    GROUP_16 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
    GROUP_2 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
    GROUP_3 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
    GROUP_4 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
    GROUP_5 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
    GROUP_6 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
    GROUP_7 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
    GROUP_8 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
    GROUP_9 (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
    STATION (defined in lib60870.CS101.QualifierOfInterrogation)lib60870.CS101.QualifierOfInterrogationstatic
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_qualifier_of_interrogation.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_qualifier_of_interrogation.html deleted file mode 100644 index 7fb99e6..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_qualifier_of_interrogation.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.QualifierOfInterrogation Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.QualifierOfInterrogation Class Reference
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Static Public Attributes

    -static byte STATION = 20
     
    -static byte GROUP_1 = 21
     
    -static byte GROUP_2 = 22
     
    -static byte GROUP_3 = 23
     
    -static byte GROUP_4 = 24
     
    -static byte GROUP_5 = 25
     
    -static byte GROUP_6 = 26
     
    -static byte GROUP_7 = 27
     
    -static byte GROUP_8 = 28
     
    -static byte GROUP_9 = 29
     
    -static byte GROUP_10 = 30
     
    -static byte GROUP_11 = 31
     
    -static byte GROUP_12 = 32
     
    -static byte GROUP_13 = 33
     
    -static byte GROUP_14 = 34
     
    -static byte GROUP_15 = 35
     
    -static byte GROUP_16 = 36
     
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SystemInformationCommands.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor-members.html deleted file mode 100644 index 90a46dc..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor-members.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.QualityDescriptor Member List
    -
    - -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor.html deleted file mode 100644 index cbc5361..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.QualityDescriptor Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.QualityDescriptor Class Reference
    -
    -
    - - - - - - - - - - - - -

    -Public Member Functions

    QualityDescriptor (QualityDescriptor original)
     
    QualityDescriptor (byte encodedValue)
     
    -override bool Equals (object obj)
     
    -override int GetHashCode ()
     
    -override string ToString ()
     
    - - - - - -

    -Static Public Member Functions

    -static QualityDescriptor VALID ()
     
    -static QualityDescriptor INVALID ()
     
    - - - - - - - - - - - - - -

    -Properties

    -bool Overflow [get, set]
     
    -bool Blocked [get, set]
     
    -bool Substituted [get, set]
     
    -bool NonTopical [get, set]
     
    -bool Invalid [get, set]
     
    -byte EncodedValue [get, set]
     
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/QualityDescriptor.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor_p-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor_p-members.html deleted file mode 100644 index 39636cc..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor_p-members.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.QualityDescriptorP Member List
    -
    - -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor_p.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor_p.html deleted file mode 100644 index 9d1d1c8..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_quality_descriptor_p.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.QualityDescriptorP Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.QualityDescriptorP Class Reference
    -
    -
    - -

    QDP - Quality descriptor for events of protection equipment according to IEC 60870-5-101:2003 7.2.6.4. - More...

    - - - - - - - - - - -

    -Public Member Functions

    QualityDescriptorP (byte encodedValue)
     
    QualityDescriptorP (QualityDescriptorP original)
     
    -override bool Equals (object obj)
     
    -override int GetHashCode ()
     
    - - - - - - - - - - - - - - - -

    -Properties

    -bool Reserved [get, set]
     
    -bool ElapsedTimeInvalid [get, set]
     
    -bool Blocked [get, set]
     
    -bool Substituted [get, set]
     
    -bool NonTopical [get, set]
     
    -bool Invalid [get, set]
     
    -byte EncodedValue [get, set]
     
    -

    Detailed Description

    -

    QDP - Quality descriptor for events of protection equipment according to IEC 60870-5-101:2003 7.2.6.4.

    -

    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/QualityDescriptorP.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command-members.html deleted file mode 100644 index 4b09287..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command-members.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.ReadCommand Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.ReadCommand, including all inherited members.

    - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectvirtual
    GetEncodedSize() (defined in lib60870.CS101.ReadCommand)lib60870.CS101.ReadCommand
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ReadCommand(int ioa) (defined in lib60870.CS101.ReadCommand)lib60870.CS101.ReadCommand
    SupportsSequence (defined in lib60870.CS101.ReadCommand)lib60870.CS101.ReadCommand
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.ReadCommand)lib60870.CS101.ReadCommand
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command.html deleted file mode 100644 index 75234e7..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command.html +++ /dev/null @@ -1,180 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.ReadCommand Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.ReadCommand Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.ReadCommand:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.ReadCommand:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    ReadCommand (int ioa)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    -virtual void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SystemInformationCommands.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command__coll__graph.dot deleted file mode 100644 index f9cd915..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.ReadCommand" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.ReadCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command__inherit__graph.dot deleted file mode 100644 index f9cd915..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_read_command__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.ReadCommand" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.ReadCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command-members.html deleted file mode 100644 index c3f059f..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command-members.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.ResetProcessCommand Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.ResetProcessCommand, including all inherited members.

    - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.ResetProcessCommand)lib60870.CS101.ResetProcessCommandvirtual
    GetEncodedSize() (defined in lib60870.CS101.ResetProcessCommand)lib60870.CS101.ResetProcessCommand
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    QRPlib60870.CS101.ResetProcessCommand
    ResetProcessCommand(int ioa, byte qrp) (defined in lib60870.CS101.ResetProcessCommand)lib60870.CS101.ResetProcessCommand
    SupportsSequence (defined in lib60870.CS101.ResetProcessCommand)lib60870.CS101.ResetProcessCommand
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.ResetProcessCommand)lib60870.CS101.ResetProcessCommand
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command.html deleted file mode 100644 index b4d7b4a..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.ResetProcessCommand Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.ResetProcessCommand Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.ResetProcessCommand:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.ResetProcessCommand:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    ResetProcessCommand (int ioa, byte qrp)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    byte QRP [get, set]
     Gets or sets the QRP (Qualifier of reset process command).
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.ResetProcessCommand.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -

    Property Documentation

    - -

    ◆ QRP

    - -
    -
    - - - - - -
    - - - - -
    byte lib60870.CS101.ResetProcessCommand.QRP
    -
    -getset
    -
    - -

    Gets or sets the QRP (Qualifier of reset process command).

    -

    The QRP

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SystemInformationCommands.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command.js deleted file mode 100644 index de7d1fc..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command.js +++ /dev/null @@ -1,4 +0,0 @@ -var classlib60870_1_1_c_s101_1_1_reset_process_command = -[ - [ "QRP", "classlib60870_1_1_c_s101_1_1_reset_process_command.html#ab87ef8bc0fa796dd5544ef39df6db59a", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command__coll__graph.dot deleted file mode 100644 index 6e5bd4c..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.ResetProcessCommand" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.ResetProcess\lCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command__inherit__graph.dot deleted file mode 100644 index 6e5bd4c..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_reset_process_command__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.ResetProcessCommand" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.ResetProcess\lCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_scaled_value-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_scaled_value-members.html deleted file mode 100644 index de47c6e..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_scaled_value-members.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.ScaledValue Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.ScaledValue, including all inherited members.

    - - - - - - - - - - - - - -
    ConvertNormalizedValueToScaled(float value) (defined in lib60870.CS101.ScaledValue)lib60870.CS101.ScaledValue
    GetEncodedValue() (defined in lib60870.CS101.ScaledValue)lib60870.CS101.ScaledValue
    GetNormalizedValue() (defined in lib60870.CS101.ScaledValue)lib60870.CS101.ScaledValue
    ScaledValue(byte[] msg, int startIndex) (defined in lib60870.CS101.ScaledValue)lib60870.CS101.ScaledValue
    ScaledValue() (defined in lib60870.CS101.ScaledValue)lib60870.CS101.ScaledValue
    ScaledValue(int value) (defined in lib60870.CS101.ScaledValue)lib60870.CS101.ScaledValue
    ScaledValue(short value) (defined in lib60870.CS101.ScaledValue)lib60870.CS101.ScaledValue
    ScaledValue(ScaledValue original) (defined in lib60870.CS101.ScaledValue)lib60870.CS101.ScaledValue
    SetScaledFromNormalizedValue(float value) (defined in lib60870.CS101.ScaledValue)lib60870.CS101.ScaledValue
    ShortValue (defined in lib60870.CS101.ScaledValue)lib60870.CS101.ScaledValue
    ToString() (defined in lib60870.CS101.ScaledValue)lib60870.CS101.ScaledValue
    Value (defined in lib60870.CS101.ScaledValue)lib60870.CS101.ScaledValue
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_scaled_value.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_scaled_value.html deleted file mode 100644 index c90bba1..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_scaled_value.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.ScaledValue Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.ScaledValue Class Reference
    -
    -
    - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    ScaledValue (byte[] msg, int startIndex)
     
    ScaledValue (int value)
     
    ScaledValue (short value)
     
    ScaledValue (ScaledValue original)
     
    -byte[] GetEncodedValue ()
     
    -override string ToString ()
     
    -float GetNormalizedValue ()
     
    -int ConvertNormalizedValueToScaled (float value)
     
    -void SetScaledFromNormalizedValue (float value)
     
    - - - - - -

    -Properties

    -int Value [get, set]
     
    -short ShortValue [get, set]
     
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/ScaledValue.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready-members.html deleted file mode 100644 index dc42bb5..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready-members.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.SectionReady Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.SectionReady, including all inherited members.

    - - - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.SectionReady)lib60870.CS101.SectionReadyvirtual
    GetEncodedSize() (defined in lib60870.CS101.SectionReady)lib60870.CS101.SectionReady
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    LengthOfSection (defined in lib60870.CS101.SectionReady)lib60870.CS101.SectionReady
    NameOfSection (defined in lib60870.CS101.SectionReady)lib60870.CS101.SectionReady
    NOF (defined in lib60870.CS101.SectionReady)lib60870.CS101.SectionReady
    NotReady (defined in lib60870.CS101.SectionReady)lib60870.CS101.SectionReady
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    SectionReady(int objectAddress, NameOfFile nof, byte nameOfSection, int lengthOfSection, bool notReady) (defined in lib60870.CS101.SectionReady)lib60870.CS101.SectionReady
    SRQlib60870.CS101.SectionReady
    SupportsSequence (defined in lib60870.CS101.SectionReady)lib60870.CS101.SectionReady
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.SectionReady)lib60870.CS101.SectionReady
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready.html deleted file mode 100644 index 5d2a398..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready.html +++ /dev/null @@ -1,262 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.SectionReady Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.SectionReady Class Reference
    -
    -
    - -

    Section ready - F_SR_NA_1 (121) - More...

    -
    -Inheritance diagram for lib60870.CS101.SectionReady:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.SectionReady:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    SectionReady (int objectAddress, NameOfFile nof, byte nameOfSection, int lengthOfSection, bool notReady)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -NameOfFile NOF [get, set]
     
    -byte NameOfSection [get, set]
     
    -int LengthOfSection [get, set]
     
    byte SRQ [get, set]
     Gets or sets the SRQ (section ready qualifier)
     
    -bool NotReady [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Detailed Description

    -

    Section ready - F_SR_NA_1 (121)

    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.SectionReady.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -

    Property Documentation

    - -

    ◆ SRQ

    - -
    -
    - - - - - -
    - - - - -
    byte lib60870.CS101.SectionReady.SRQ
    -
    -getset
    -
    - -

    Gets or sets the SRQ (section ready qualifier)

    -

    The SRQ

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/FileObjects.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready.js deleted file mode 100644 index 6ae3839..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready.js +++ /dev/null @@ -1,4 +0,0 @@ -var classlib60870_1_1_c_s101_1_1_section_ready = -[ - [ "SRQ", "classlib60870_1_1_c_s101_1_1_section_ready.html#a5bbd3b419683eaa394c20ca9e3f1ba34", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready__coll__graph.dot deleted file mode 100644 index 5605a12..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.SectionReady" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.SectionReady",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Section ready - F_SR_NA_1 (121)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready__inherit__graph.dot deleted file mode 100644 index 5605a12..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_section_ready__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.SectionReady" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.SectionReady",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Section ready - F_SR_NA_1 (121)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized-members.html deleted file mode 100644 index b415cbf..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized-members.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.SetpointCommandNormalized Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.SetpointCommandNormalized, including all inherited members.

    - - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalizedvirtual
    GetEncodedSize() (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalized
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    NormalizedValue (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalized
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    QOS (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalized
    RawValue (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalized
    SetpointCommandNormalized(int objectAddress, float value, SetpointCommandQualifier qos) (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalized
    SetpointCommandNormalized(int ObjectAddress, short value, SetpointCommandQualifier qos) (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalized
    SupportsSequence (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalized
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalized
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized.html deleted file mode 100644 index 90cbc34..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized.html +++ /dev/null @@ -1,228 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.SetpointCommandNormalized Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.SetpointCommandNormalized Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.SetpointCommandNormalized:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.SetpointCommandNormalized:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    SetpointCommandNormalized (int objectAddress, float value, SetpointCommandQualifier qos)
     
    SetpointCommandNormalized (int ObjectAddress, short value, SetpointCommandQualifier qos)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -short RawValue [get, set]
     
    -float NormalizedValue [get, set]
     
    -SetpointCommandQualifier QOS [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.SetpointCommandNormalized.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SetpointCommands.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized__coll__graph.dot deleted file mode 100644 index 804b385..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.SetpointCommandNormalized" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.SetpointCommand\lNormalized",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized__inherit__graph.dot deleted file mode 100644 index 5429052..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.SetpointCommandNormalized" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.SetpointCommand\lNormalized",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; - Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="lib60870.CS101.SetpointCommand\lNormalizedWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a-members.html deleted file mode 100644 index 5b4a914..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a-members.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a, including all inherited members.

    - - - - - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a)lib60870.CS101.SetpointCommandNormalizedWithCP56Time2avirtual
    GetEncodedSize() (defined in lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a)lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    NormalizedValue (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalized
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    QOS (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalized
    RawValue (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalized
    SetpointCommandNormalized(int objectAddress, float value, SetpointCommandQualifier qos) (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalized
    SetpointCommandNormalized(int ObjectAddress, short value, SetpointCommandQualifier qos) (defined in lib60870.CS101.SetpointCommandNormalized)lib60870.CS101.SetpointCommandNormalized
    SetpointCommandNormalizedWithCP56Time2a(int objectAddress, float value, SetpointCommandQualifier qos, CP56Time2a timestamp) (defined in lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a)lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a
    SetpointCommandNormalizedWithCP56Time2a(int objectAddress, short value, SetpointCommandQualifier qos, CP56Time2a timestamp) (defined in lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a)lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a
    SupportsSequence (defined in lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a)lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a
    Timestamp (defined in lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a)lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a)lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a.html deleted file mode 100644 index ccc8544..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    SetpointCommandNormalizedWithCP56Time2a (int objectAddress, float value, SetpointCommandQualifier qos, CP56Time2a timestamp)
     
    SetpointCommandNormalizedWithCP56Time2a (int objectAddress, short value, SetpointCommandQualifier qos, CP56Time2a timestamp)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.SetpointCommandNormalized
    -override int GetEncodedSize ()
     
    SetpointCommandNormalized (int objectAddress, float value, SetpointCommandQualifier qos)
     
    SetpointCommandNormalized (int ObjectAddress, short value, SetpointCommandQualifier qos)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -CP56Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.SetpointCommandNormalized
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -short RawValue [get, set]
     
    -float NormalizedValue [get, set]
     
    -SetpointCommandQualifier QOS [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.SetpointCommandNormalized.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SetpointCommands.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a__coll__graph.dot deleted file mode 100644 index 6e457bf..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a__coll__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.SetpointCommand\lNormalizedWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="SetpointCommandNormalized",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_normalized.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a__inherit__graph.dot deleted file mode 100644 index 6e457bf..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.SetpointCommand\lNormalizedWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="SetpointCommandNormalized",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_normalized.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_qualifier-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_qualifier-members.html deleted file mode 100644 index 2580b8e..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_qualifier-members.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.SetpointCommandQualifier Member List
    -
    - -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_qualifier.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_qualifier.html deleted file mode 100644 index f5806c2..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_qualifier.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.SetpointCommandQualifier Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.SetpointCommandQualifier Class Reference
    -
    -
    - - - - - - - - -

    -Public Member Functions

    SetpointCommandQualifier (byte encodedValue)
     
    SetpointCommandQualifier (bool select, int ql)
     
    -byte GetEncodedValue ()
     
    - - - - - -

    -Properties

    -int QL [get]
     
    -bool Select [get]
     
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SetpointCommandQualifier.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled-members.html deleted file mode 100644 index 8740a57..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled-members.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.SetpointCommandScaled Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.SetpointCommandScaled, including all inherited members.

    - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.SetpointCommandScaled)lib60870.CS101.SetpointCommandScaledvirtual
    GetEncodedSize() (defined in lib60870.CS101.SetpointCommandScaled)lib60870.CS101.SetpointCommandScaled
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    QOS (defined in lib60870.CS101.SetpointCommandScaled)lib60870.CS101.SetpointCommandScaled
    ScaledValue (defined in lib60870.CS101.SetpointCommandScaled)lib60870.CS101.SetpointCommandScaled
    SetpointCommandScaled(int objectAddress, ScaledValue value, SetpointCommandQualifier qos) (defined in lib60870.CS101.SetpointCommandScaled)lib60870.CS101.SetpointCommandScaled
    SupportsSequence (defined in lib60870.CS101.SetpointCommandScaled)lib60870.CS101.SetpointCommandScaled
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.SetpointCommandScaled)lib60870.CS101.SetpointCommandScaled
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled.html deleted file mode 100644 index fd34384..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled.html +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.SetpointCommandScaled Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.SetpointCommandScaled Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.SetpointCommandScaled:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.SetpointCommandScaled:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    SetpointCommandScaled (int objectAddress, ScaledValue value, SetpointCommandQualifier qos)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -ScaledValue ScaledValue [get]
     
    -SetpointCommandQualifier QOS [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.SetpointCommandScaled.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SetpointCommands.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled__coll__graph.dot deleted file mode 100644 index 5cb2945..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.SetpointCommandScaled" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.SetpointCommand\lScaled",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled__inherit__graph.dot deleted file mode 100644 index 0fb99ff..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.SetpointCommandScaled" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.SetpointCommand\lScaled",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; - Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="lib60870.CS101.SetpointCommand\lScaledWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a-members.html deleted file mode 100644 index 45afcd1..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a-members.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.SetpointCommandScaledWithCP56Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.SetpointCommandScaledWithCP56Time2a, including all inherited members.

    - - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.SetpointCommandScaledWithCP56Time2a)lib60870.CS101.SetpointCommandScaledWithCP56Time2avirtual
    GetEncodedSize() (defined in lib60870.CS101.SetpointCommandScaledWithCP56Time2a)lib60870.CS101.SetpointCommandScaledWithCP56Time2a
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    QOS (defined in lib60870.CS101.SetpointCommandScaled)lib60870.CS101.SetpointCommandScaled
    ScaledValue (defined in lib60870.CS101.SetpointCommandScaled)lib60870.CS101.SetpointCommandScaled
    SetpointCommandScaled(int objectAddress, ScaledValue value, SetpointCommandQualifier qos) (defined in lib60870.CS101.SetpointCommandScaled)lib60870.CS101.SetpointCommandScaled
    SetpointCommandScaledWithCP56Time2a(int objectAddress, ScaledValue value, SetpointCommandQualifier qos, CP56Time2a timestamp) (defined in lib60870.CS101.SetpointCommandScaledWithCP56Time2a)lib60870.CS101.SetpointCommandScaledWithCP56Time2a
    SupportsSequence (defined in lib60870.CS101.SetpointCommandScaledWithCP56Time2a)lib60870.CS101.SetpointCommandScaledWithCP56Time2a
    Timestamp (defined in lib60870.CS101.SetpointCommandScaledWithCP56Time2a)lib60870.CS101.SetpointCommandScaledWithCP56Time2a
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.SetpointCommandScaledWithCP56Time2a)lib60870.CS101.SetpointCommandScaledWithCP56Time2a
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a.html deleted file mode 100644 index 11e8b7e..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a.html +++ /dev/null @@ -1,239 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.SetpointCommandScaledWithCP56Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.SetpointCommandScaledWithCP56Time2a Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.SetpointCommandScaledWithCP56Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.SetpointCommandScaledWithCP56Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    SetpointCommandScaledWithCP56Time2a (int objectAddress, ScaledValue value, SetpointCommandQualifier qos, CP56Time2a timestamp)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.SetpointCommandScaled
    -override int GetEncodedSize ()
     
    SetpointCommandScaled (int objectAddress, ScaledValue value, SetpointCommandQualifier qos)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -CP56Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.SetpointCommandScaled
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -ScaledValue ScaledValue [get]
     
    -SetpointCommandQualifier QOS [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.SetpointCommandScaledWithCP56Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.SetpointCommandScaled.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SetpointCommands.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a__coll__graph.dot deleted file mode 100644 index 3d1af3b..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a__coll__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.SetpointCommandScaledWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.SetpointCommand\lScaledWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="SetpointCommandScaled",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_scaled.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a__inherit__graph.dot deleted file mode 100644 index 3d1af3b..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.SetpointCommandScaledWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.SetpointCommand\lScaledWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="SetpointCommandScaled",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_scaled.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short-members.html deleted file mode 100644 index 1de0311..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short-members.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.SetpointCommandShort Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.SetpointCommandShort, including all inherited members.

    - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.SetpointCommandShort)lib60870.CS101.SetpointCommandShortvirtual
    GetEncodedSize() (defined in lib60870.CS101.SetpointCommandShort)lib60870.CS101.SetpointCommandShort
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    QOS (defined in lib60870.CS101.SetpointCommandShort)lib60870.CS101.SetpointCommandShort
    SetpointCommandShort(int objectAddress, float value, SetpointCommandQualifier qos) (defined in lib60870.CS101.SetpointCommandShort)lib60870.CS101.SetpointCommandShort
    SupportsSequence (defined in lib60870.CS101.SetpointCommandShort)lib60870.CS101.SetpointCommandShort
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.SetpointCommandShort)lib60870.CS101.SetpointCommandShort
    Value (defined in lib60870.CS101.SetpointCommandShort)lib60870.CS101.SetpointCommandShort
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short.html deleted file mode 100644 index 89f79aa..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short.html +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.SetpointCommandShort Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.SetpointCommandShort Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.SetpointCommandShort:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.SetpointCommandShort:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    SetpointCommandShort (int objectAddress, float value, SetpointCommandQualifier qos)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -float Value [get]
     
    -SetpointCommandQualifier QOS [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.SetpointCommandShort.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SetpointCommands.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short__coll__graph.dot deleted file mode 100644 index dd3f394..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.SetpointCommandShort" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.SetpointCommand\lShort",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short__inherit__graph.dot deleted file mode 100644 index 87a9674..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.SetpointCommandShort" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.SetpointCommand\lShort",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; - Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="lib60870.CS101.SetpointCommand\lShortWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a-members.html deleted file mode 100644 index dd05db6..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a-members.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.SetpointCommandShortWithCP56Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.SetpointCommandShortWithCP56Time2a, including all inherited members.

    - - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.SetpointCommandShortWithCP56Time2a)lib60870.CS101.SetpointCommandShortWithCP56Time2avirtual
    GetEncodedSize() (defined in lib60870.CS101.SetpointCommandShortWithCP56Time2a)lib60870.CS101.SetpointCommandShortWithCP56Time2a
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    QOS (defined in lib60870.CS101.SetpointCommandShort)lib60870.CS101.SetpointCommandShort
    SetpointCommandShort(int objectAddress, float value, SetpointCommandQualifier qos) (defined in lib60870.CS101.SetpointCommandShort)lib60870.CS101.SetpointCommandShort
    SetpointCommandShortWithCP56Time2a(int objectAddress, float value, SetpointCommandQualifier qos, CP56Time2a timestamp) (defined in lib60870.CS101.SetpointCommandShortWithCP56Time2a)lib60870.CS101.SetpointCommandShortWithCP56Time2a
    SupportsSequence (defined in lib60870.CS101.SetpointCommandShortWithCP56Time2a)lib60870.CS101.SetpointCommandShortWithCP56Time2a
    Timestamp (defined in lib60870.CS101.SetpointCommandShortWithCP56Time2a)lib60870.CS101.SetpointCommandShortWithCP56Time2a
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.SetpointCommandShortWithCP56Time2a)lib60870.CS101.SetpointCommandShortWithCP56Time2a
    Value (defined in lib60870.CS101.SetpointCommandShort)lib60870.CS101.SetpointCommandShort
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a.html deleted file mode 100644 index a3c44fe..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a.html +++ /dev/null @@ -1,239 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.SetpointCommandShortWithCP56Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.SetpointCommandShortWithCP56Time2a Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.SetpointCommandShortWithCP56Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.SetpointCommandShortWithCP56Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    SetpointCommandShortWithCP56Time2a (int objectAddress, float value, SetpointCommandQualifier qos, CP56Time2a timestamp)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.SetpointCommandShort
    -override int GetEncodedSize ()
     
    SetpointCommandShort (int objectAddress, float value, SetpointCommandQualifier qos)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -CP56Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.SetpointCommandShort
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -float Value [get]
     
    -SetpointCommandQualifier QOS [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.SetpointCommandShortWithCP56Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.SetpointCommandShort.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SetpointCommands.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a__coll__graph.dot deleted file mode 100644 index 831b5a3..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a__coll__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.SetpointCommandShortWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.SetpointCommand\lShortWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="SetpointCommandShort",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_short.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a__inherit__graph.dot deleted file mode 100644 index 831b5a3..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.SetpointCommandShortWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.SetpointCommand\lShortWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="SetpointCommandShort",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_short.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command-members.html deleted file mode 100644 index 7c8366e..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command-members.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.SingleCommand Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.SingleCommand, including all inherited members.

    - - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.SingleCommand)lib60870.CS101.SingleCommandvirtual
    GetEncodedSize() (defined in lib60870.CS101.SingleCommand)lib60870.CS101.SingleCommand
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    QU (defined in lib60870.CS101.SingleCommand)lib60870.CS101.SingleCommand
    Selectlib60870.CS101.SingleCommand
    SingleCommand(int ioa, bool command, bool selectCommand, int qu) (defined in lib60870.CS101.SingleCommand)lib60870.CS101.SingleCommand
    SingleCommand(SingleCommand original) (defined in lib60870.CS101.SingleCommand)lib60870.CS101.SingleCommand
    Statelib60870.CS101.SingleCommand
    SupportsSequence (defined in lib60870.CS101.SingleCommand)lib60870.CS101.SingleCommand
    ToString() (defined in lib60870.CS101.SingleCommand)lib60870.CS101.SingleCommand
    Type (defined in lib60870.CS101.SingleCommand)lib60870.CS101.SingleCommand
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command.html deleted file mode 100644 index 5b15926..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command.html +++ /dev/null @@ -1,282 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.SingleCommand Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.SingleCommand Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.SingleCommand:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.SingleCommand:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    SingleCommand (int ioa, bool command, bool selectCommand, int qu)
     
    SingleCommand (SingleCommand original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    -override string ToString ()
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -int QU [get, set]
     
    bool State [get, set]
     Gets the state (off - false / on - true) of this command.
     
    bool Select [get, set]
     Indicates if the command is a select or an execute command.
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.SingleCommand.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -

    Property Documentation

    - -

    ◆ Select

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS101.SingleCommand.Select
    -
    -getset
    -
    - -

    Indicates if the command is a select or an execute command.

    -

    true if select; execute, false.

    - -
    -
    - -

    ◆ State

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS101.SingleCommand.State
    -
    -getset
    -
    - -

    Gets the state (off - false / on - true) of this command.

    -

    true if on; otherwise, false.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SingleCommand.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command.js deleted file mode 100644 index 590c332..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command.js +++ /dev/null @@ -1,5 +0,0 @@ -var classlib60870_1_1_c_s101_1_1_single_command = -[ - [ "Select", "classlib60870_1_1_c_s101_1_1_single_command.html#a1829a95a868ed80cae41cc66f8d23867", null ], - [ "State", "classlib60870_1_1_c_s101_1_1_single_command.html#ae642167ac8c59c6a2f5552919c3606a4", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command__coll__graph.dot deleted file mode 100644 index c3074f1..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.SingleCommand" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.SingleCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command__inherit__graph.dot deleted file mode 100644 index 5d7aed5..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.SingleCommand" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.SingleCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; - Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="lib60870.CS101.SingleCommand\lWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a-members.html deleted file mode 100644 index 7d6311a..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a-members.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.SingleCommandWithCP56Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.SingleCommandWithCP56Time2a, including all inherited members.

    - - - - - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.SingleCommandWithCP56Time2a)lib60870.CS101.SingleCommandWithCP56Time2avirtual
    GetEncodedSize() (defined in lib60870.CS101.SingleCommand)lib60870.CS101.SingleCommand
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    QU (defined in lib60870.CS101.SingleCommand)lib60870.CS101.SingleCommand
    Selectlib60870.CS101.SingleCommand
    SingleCommand(int ioa, bool command, bool selectCommand, int qu) (defined in lib60870.CS101.SingleCommand)lib60870.CS101.SingleCommand
    SingleCommand(SingleCommand original) (defined in lib60870.CS101.SingleCommand)lib60870.CS101.SingleCommand
    SingleCommandWithCP56Time2a(int ioa, bool command, bool selectCommand, int qu, CP56Time2a timestamp) (defined in lib60870.CS101.SingleCommandWithCP56Time2a)lib60870.CS101.SingleCommandWithCP56Time2a
    SingleCommandWithCP56Time2a(SingleCommandWithCP56Time2a original) (defined in lib60870.CS101.SingleCommandWithCP56Time2a)lib60870.CS101.SingleCommandWithCP56Time2a
    Statelib60870.CS101.SingleCommand
    SupportsSequence (defined in lib60870.CS101.SingleCommandWithCP56Time2a)lib60870.CS101.SingleCommandWithCP56Time2a
    Timestamp (defined in lib60870.CS101.SingleCommandWithCP56Time2a)lib60870.CS101.SingleCommandWithCP56Time2a
    ToString() (defined in lib60870.CS101.SingleCommand)lib60870.CS101.SingleCommand
    Type (defined in lib60870.CS101.SingleCommandWithCP56Time2a)lib60870.CS101.SingleCommandWithCP56Time2a
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a.html deleted file mode 100644 index 69ed34d..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.SingleCommandWithCP56Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.SingleCommandWithCP56Time2a Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.SingleCommandWithCP56Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.SingleCommandWithCP56Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    SingleCommandWithCP56Time2a (int ioa, bool command, bool selectCommand, int qu, CP56Time2a timestamp)
     
    SingleCommandWithCP56Time2a (SingleCommandWithCP56Time2a original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.SingleCommand
    -override int GetEncodedSize ()
     
    SingleCommand (int ioa, bool command, bool selectCommand, int qu)
     
    SingleCommand (SingleCommand original)
     
    -override string ToString ()
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -CP56Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.SingleCommand
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -int QU [get, set]
     
    bool State [get, set]
     Gets the state (off - false / on - true) of this command.
     
    bool Select [get, set]
     Indicates if the command is a select or an execute command.
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.SingleCommandWithCP56Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.SingleCommand.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SingleCommand.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a__coll__graph.dot deleted file mode 100644 index 8db0435..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a__coll__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.SingleCommandWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.SingleCommand\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="SingleCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_command.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a__inherit__graph.dot deleted file mode 100644 index 8db0435..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.SingleCommandWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.SingleCommand\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="SingleCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_command.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_event-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_event-members.html deleted file mode 100644 index 8df6483..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_event-members.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.SingleEvent Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.SingleEvent, including all inherited members.

    - - - - - - - - - -
    EncodedValue (defined in lib60870.CS101.SingleEvent)lib60870.CS101.SingleEvent
    Equals(object obj) (defined in lib60870.CS101.SingleEvent)lib60870.CS101.SingleEvent
    GetHashCode() (defined in lib60870.CS101.SingleEvent)lib60870.CS101.SingleEvent
    QDP (defined in lib60870.CS101.SingleEvent)lib60870.CS101.SingleEvent
    SingleEvent() (defined in lib60870.CS101.SingleEvent)lib60870.CS101.SingleEvent
    SingleEvent(SingleEvent orignal) (defined in lib60870.CS101.SingleEvent)lib60870.CS101.SingleEvent
    SingleEvent(byte encodedValue) (defined in lib60870.CS101.SingleEvent)lib60870.CS101.SingleEvent
    State (defined in lib60870.CS101.SingleEvent)lib60870.CS101.SingleEvent
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_event.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_event.html deleted file mode 100644 index 8621f6d..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_event.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.SingleEvent Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.SingleEvent Class Reference
    -
    -
    - - - - - - - - - - -

    -Public Member Functions

    SingleEvent (SingleEvent orignal)
     
    -override bool Equals (object obj)
     
    -override int GetHashCode ()
     
    SingleEvent (byte encodedValue)
     
    - - - - - - - -

    -Properties

    -EventState State [get, set]
     
    -QualityDescriptorP QDP [get, set]
     
    -byte EncodedValue [get]
     
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SingleEvent.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information-members.html deleted file mode 100644 index 68a7d20..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information-members.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.SinglePointInformation Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.SinglePointInformation, including all inherited members.

    - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformationvirtual
    GetEncodedSize() (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Quality (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
    SinglePointInformation(int objectAddress, bool value, QualityDescriptor quality) (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
    SinglePointInformation(SinglePointInformation original) (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
    SupportsSequence (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
    Value (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information.html deleted file mode 100644 index 1af769f..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information.html +++ /dev/null @@ -1,225 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.SinglePointInformation Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.SinglePointInformation Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.SinglePointInformation:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.SinglePointInformation:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    SinglePointInformation (int objectAddress, bool value, QualityDescriptor quality)
     
    SinglePointInformation (SinglePointInformation original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -bool Value [get, set]
     
    -QualityDescriptor Quality [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.SinglePointInformation.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SinglePointInformation.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information__coll__graph.dot deleted file mode 100644 index 5b8117f..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.SinglePointInformation" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.SinglePoint\lInformation",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information__inherit__graph.dot deleted file mode 100644 index a80b236..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_information__inherit__graph.dot +++ /dev/null @@ -1,14 +0,0 @@ -digraph "lib60870.CS101.SinglePointInformation" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.SinglePoint\lInformation",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; - Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="lib60870.CS101.SinglePoint\lWithCP24Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a.html",tooltip=" "]; - Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node4 [id="Node000004",label="lib60870.CS101.SinglePoint\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a.html",tooltip="Single point with CP56Time2a timestamp (M_SP_TB_1)"]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a-members.html deleted file mode 100644 index 08a1255..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a-members.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.SinglePointWithCP24Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.SinglePointWithCP24Time2a, including all inherited members.

    - - - - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.SinglePointWithCP24Time2a)lib60870.CS101.SinglePointWithCP24Time2avirtual
    GetEncodedSize() (defined in lib60870.CS101.SinglePointWithCP24Time2a)lib60870.CS101.SinglePointWithCP24Time2a
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Quality (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
    SinglePointInformation(int objectAddress, bool value, QualityDescriptor quality) (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
    SinglePointInformation(SinglePointInformation original) (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
    SinglePointWithCP24Time2a(int objectAddress, bool value, QualityDescriptor quality, CP24Time2a timestamp) (defined in lib60870.CS101.SinglePointWithCP24Time2a)lib60870.CS101.SinglePointWithCP24Time2a
    SinglePointWithCP24Time2a(SinglePointWithCP24Time2a original) (defined in lib60870.CS101.SinglePointWithCP24Time2a)lib60870.CS101.SinglePointWithCP24Time2a
    SupportsSequence (defined in lib60870.CS101.SinglePointWithCP24Time2a)lib60870.CS101.SinglePointWithCP24Time2a
    Timestamp (defined in lib60870.CS101.SinglePointWithCP24Time2a)lib60870.CS101.SinglePointWithCP24Time2a
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.SinglePointWithCP24Time2a)lib60870.CS101.SinglePointWithCP24Time2a
    Value (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a.html deleted file mode 100644 index de89bd3..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.SinglePointWithCP24Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.SinglePointWithCP24Time2a Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.SinglePointWithCP24Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.SinglePointWithCP24Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    SinglePointWithCP24Time2a (int objectAddress, bool value, QualityDescriptor quality, CP24Time2a timestamp)
     
    SinglePointWithCP24Time2a (SinglePointWithCP24Time2a original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.SinglePointInformation
    -override int GetEncodedSize ()
     
    SinglePointInformation (int objectAddress, bool value, QualityDescriptor quality)
     
    SinglePointInformation (SinglePointInformation original)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -CP24Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.SinglePointInformation
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -bool Value [get, set]
     
    -QualityDescriptor Quality [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.SinglePointWithCP24Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.SinglePointInformation.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SinglePointInformation.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a__coll__graph.dot deleted file mode 100644 index a4b5899..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a__coll__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.SinglePointWithCP24Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.SinglePoint\lWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="SinglePointInformation",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_point_information.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a__inherit__graph.dot deleted file mode 100644 index a4b5899..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.SinglePointWithCP24Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.SinglePoint\lWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="SinglePointInformation",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_point_information.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a-members.html deleted file mode 100644 index 50175f2..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a-members.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.SinglePointWithCP56Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.SinglePointWithCP56Time2a, including all inherited members.

    - - - - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.SinglePointWithCP56Time2a)lib60870.CS101.SinglePointWithCP56Time2avirtual
    GetEncodedSize() (defined in lib60870.CS101.SinglePointWithCP56Time2a)lib60870.CS101.SinglePointWithCP56Time2a
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Quality (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
    SinglePointInformation(int objectAddress, bool value, QualityDescriptor quality) (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
    SinglePointInformation(SinglePointInformation original) (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
    SinglePointWithCP56Time2a(int objectAddress, bool value, QualityDescriptor quality, CP56Time2a timestamp) (defined in lib60870.CS101.SinglePointWithCP56Time2a)lib60870.CS101.SinglePointWithCP56Time2a
    SinglePointWithCP56Time2a(SinglePointWithCP56Time2a original) (defined in lib60870.CS101.SinglePointWithCP56Time2a)lib60870.CS101.SinglePointWithCP56Time2a
    SupportsSequence (defined in lib60870.CS101.SinglePointWithCP56Time2a)lib60870.CS101.SinglePointWithCP56Time2a
    Timestamp (defined in lib60870.CS101.SinglePointWithCP56Time2a)lib60870.CS101.SinglePointWithCP56Time2a
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.SinglePointWithCP56Time2a)lib60870.CS101.SinglePointWithCP56Time2a
    Value (defined in lib60870.CS101.SinglePointInformation)lib60870.CS101.SinglePointInformation
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a.html deleted file mode 100644 index c258eca..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a.html +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.SinglePointWithCP56Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.SinglePointWithCP56Time2a Class Reference
    -
    -
    - -

    Single point with CP56Time2a timestamp (M_SP_TB_1) - More...

    -
    -Inheritance diagram for lib60870.CS101.SinglePointWithCP56Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.SinglePointWithCP56Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    SinglePointWithCP56Time2a (int objectAddress, bool value, QualityDescriptor quality, CP56Time2a timestamp)
     
    SinglePointWithCP56Time2a (SinglePointWithCP56Time2a original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.SinglePointInformation
    -override int GetEncodedSize ()
     
    SinglePointInformation (int objectAddress, bool value, QualityDescriptor quality)
     
    SinglePointInformation (SinglePointInformation original)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -CP56Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.SinglePointInformation
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -bool Value [get, set]
     
    -QualityDescriptor Quality [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Detailed Description

    -

    Single point with CP56Time2a timestamp (M_SP_TB_1)

    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.SinglePointWithCP56Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.SinglePointInformation.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SinglePointInformation.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a__coll__graph.dot deleted file mode 100644 index 41195cb..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a__coll__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.SinglePointWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.SinglePoint\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Single point with CP56Time2a timestamp (M_SP_TB_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="SinglePointInformation",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_point_information.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a__inherit__graph.dot deleted file mode 100644 index 41195cb..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.SinglePointWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.SinglePoint\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Single point with CP56Time2a timestamp (M_SP_TB_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="SinglePointInformation",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_point_information.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave-members.html deleted file mode 100644 index 84e2117..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave-members.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.Slave Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.Slave, including all inherited members.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    asduHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    asduHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    clockSynchronizationHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    clockSynchronizationHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    counterInterrogationHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    counterInterrogationHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    DebugOutput (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    debugOutput (defined in lib60870.CS101.Slave)lib60870.CS101.Slaveprotected
    delayAcquisitionHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    delayAcquisitionHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    filesAvailable (defined in lib60870.CS101.Slave)lib60870.CS101.Slaveprotected
    FileTimeoutlib60870.CS101.Slave
    GetAvailableFiles()lib60870.CS101.Slave
    interrogationHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    InterrogationHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    readHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    readHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    resetProcessHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    resetProcessHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    SetASDUHandler(ASDUHandler handler, object parameter)lib60870.CS101.Slave
    SetClockSynchronizationHandler(ClockSynchronizationHandler handler, object parameter)lib60870.CS101.Slave
    SetCounterInterrogationHandler(CounterInterrogationHandler handler, object parameter)lib60870.CS101.Slave
    SetDelayAcquisitionHandler(DelayAcquisitionHandler handler, object parameter) (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    SetFileReadyHandler(FileReadyHandler handler, object parameter)lib60870.CS101.Slave
    SetInterrogationHandler(InterrogationHandler handler, object parameter)lib60870.CS101.Slave
    SetReadHandler(ReadHandler handler, object parameter)lib60870.CS101.Slave
    SetResetProcessHandler(ResetProcessHandler handler, object parameter) (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave.html deleted file mode 100644 index 209ab59..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave.html +++ /dev/null @@ -1,454 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.Slave Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.Slave Class Referenceabstract
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.Slave:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.Slave:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    void SetInterrogationHandler (InterrogationHandler handler, object parameter)
     Sets a callback for interrogaton requests.
     
    void SetCounterInterrogationHandler (CounterInterrogationHandler handler, object parameter)
     Sets a callback for counter interrogaton requests.
     
    void SetReadHandler (ReadHandler handler, object parameter)
     Sets a callback for read requests.
     
    void SetClockSynchronizationHandler (ClockSynchronizationHandler handler, object parameter)
     Sets a callback for the clock synchronization request.
     
    -void SetResetProcessHandler (ResetProcessHandler handler, object parameter)
     
    -void SetDelayAcquisitionHandler (DelayAcquisitionHandler handler, object parameter)
     
    void SetASDUHandler (ASDUHandler handler, object parameter)
     Sets a callback to handle ASDUs (commands, requests) form clients. This callback can be used when no other callback handles the message from the client/master.
     
    void SetFileReadyHandler (FileReadyHandler handler, object parameter)
     Sets a callback handler that is called when a file ready message is received from a master.
     
    FilesAvailable GetAvailableFiles ()
     Gets the available files that are registered with the file server.
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Attributes

    -InterrogationHandler interrogationHandler = null
     
    -object InterrogationHandlerParameter = null
     
    -CounterInterrogationHandler counterInterrogationHandler = null
     
    -object counterInterrogationHandlerParameter = null
     
    -ReadHandler readHandler = null
     
    -object readHandlerParameter = null
     
    -ClockSynchronizationHandler clockSynchronizationHandler = null
     
    -object clockSynchronizationHandlerParameter = null
     
    -ResetProcessHandler resetProcessHandler = null
     
    -object resetProcessHandlerParameter = null
     
    -DelayAcquisitionHandler delayAcquisitionHandler = null
     
    -object delayAcquisitionHandlerParameter = null
     
    -ASDUHandler asduHandler = null
     
    -object asduHandlerParameter = null
     
    - - - - - -

    -Protected Attributes

    -bool debugOutput
     
    -FilesAvailable filesAvailable = new FilesAvailable()
     
    - - - - - - -

    -Properties

    -bool DebugOutput [get, set]
     
    virtual int FileTimeout [get, set]
     Gets or sets the file service timeout.
     
    -

    Member Function Documentation

    - -

    ◆ GetAvailableFiles()

    - -
    -
    - - - - - - - -
    FilesAvailable lib60870.CS101.Slave.GetAvailableFiles ()
    -
    - -

    Gets the available files that are registered with the file server.

    -
    Returns
    The available files.
    - -
    -
    - -

    ◆ SetASDUHandler()

    - -
    -
    - - - - - - - - - - - -
    void lib60870.CS101.Slave.SetASDUHandler (ASDUHandler handler,
    object parameter )
    -
    - -

    Sets a callback to handle ASDUs (commands, requests) form clients. This callback can be used when no other callback handles the message from the client/master.

    -
    Parameters
    - - - -
    handlerThe ASDU callback function
    parameteruser provided parameter that is passed to the callback
    -
    -
    - -
    -
    - -

    ◆ SetClockSynchronizationHandler()

    - -
    -
    - - - - - - - - - - - -
    void lib60870.CS101.Slave.SetClockSynchronizationHandler (ClockSynchronizationHandler handler,
    object parameter )
    -
    - -

    Sets a callback for the clock synchronization request.

    -
    Parameters
    - - - -
    handlerThe clock synchronization request handler callback function
    parameteruser provided parameter that is passed to the callback
    -
    -
    - -
    -
    - -

    ◆ SetCounterInterrogationHandler()

    - -
    -
    - - - - - - - - - - - -
    void lib60870.CS101.Slave.SetCounterInterrogationHandler (CounterInterrogationHandler handler,
    object parameter )
    -
    - -

    Sets a callback for counter interrogaton requests.

    -
    Parameters
    - - - -
    handlerThe counter interrogation request handler callback function
    parameteruser provided parameter that is passed to the callback
    -
    -
    - -
    -
    - -

    ◆ SetFileReadyHandler()

    - -
    -
    - - - - - - - - - - - -
    void lib60870.CS101.Slave.SetFileReadyHandler (FileReadyHandler handler,
    object parameter )
    -
    - -

    Sets a callback handler that is called when a file ready message is received from a master.

    -
    Parameters
    - - - -
    handlercallback function to be called
    parameteruser provided parameter that is passed to the callback
    -
    -
    - -
    -
    - -

    ◆ SetInterrogationHandler()

    - -
    -
    - - - - - - - - - - - -
    void lib60870.CS101.Slave.SetInterrogationHandler (InterrogationHandler handler,
    object parameter )
    -
    - -

    Sets a callback for interrogaton requests.

    -
    Parameters
    - - - -
    handlerThe interrogation request handler callback function
    parameteruser provided parameter that is passed to the callback
    -
    -
    - -
    -
    - -

    ◆ SetReadHandler()

    - -
    -
    - - - - - - - - - - - -
    void lib60870.CS101.Slave.SetReadHandler (ReadHandler handler,
    object parameter )
    -
    - -

    Sets a callback for read requests.

    -
    Parameters
    - - - -
    handlerThe read request handler callback function
    parameteruser provided parameter that is passed to the callback
    -
    -
    - -
    -
    -

    Property Documentation

    - -

    ◆ FileTimeout

    - -
    -
    - - - - - -
    - - - - -
    virtual int lib60870.CS101.Slave.FileTimeout
    -
    -getset
    -
    - -

    Gets or sets the file service timeout.

    -

    The file service timeout in ms

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/Slave.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave.js deleted file mode 100644 index cdb28c6..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave.js +++ /dev/null @@ -1,11 +0,0 @@ -var classlib60870_1_1_c_s101_1_1_slave = -[ - [ "GetAvailableFiles", "classlib60870_1_1_c_s101_1_1_slave.html#a5e85ada660492fecd182e654a75c8b42", null ], - [ "SetASDUHandler", "classlib60870_1_1_c_s101_1_1_slave.html#a5bde494544e568d0d9c25b43449eb8ee", null ], - [ "SetClockSynchronizationHandler", "classlib60870_1_1_c_s101_1_1_slave.html#a83b600bacb0829048c432686991db8a7", null ], - [ "SetCounterInterrogationHandler", "classlib60870_1_1_c_s101_1_1_slave.html#ad6e8b2878a13fea3b23b0b41b4da2983", null ], - [ "SetFileReadyHandler", "classlib60870_1_1_c_s101_1_1_slave.html#a3d25c95061010fa26c02cca5de0ae3cd", null ], - [ "SetInterrogationHandler", "classlib60870_1_1_c_s101_1_1_slave.html#af5871de4b26756b7b6f88e7acdc96e84", null ], - [ "SetReadHandler", "classlib60870_1_1_c_s101_1_1_slave.html#a7f0490bec09dbf3a8fb1e1e8e21503c0", null ], - [ "FileTimeout", "classlib60870_1_1_c_s101_1_1_slave.html#a063b9d1a19a2960a91afc69204cc11f7", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave__coll__graph.dot deleted file mode 100644 index edb4439..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.Slave" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Slave",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=" filesAvailable",fontcolor="grey" ]; - Node2 [id="Node000002",label="lib60870.CS101.FilesAvailable",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_files_available.html",tooltip="Represents the available files in a file client or file server."]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave__inherit__graph.dot deleted file mode 100644 index c344272..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_slave__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.Slave" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.Slave",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="lib60870.CS101.CS101Slave",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_c_s101_slave.html",tooltip="CS 101 slave implementation (implements Slave interface)"]; - Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="lib60870.CS104.Server",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s104_1_1_server.html",tooltip="This class represents a single IEC 60870-5 server (slave or controlled station). It is also the main ..."]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_start_event-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_start_event-members.html deleted file mode 100644 index 90b3bed..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_start_event-members.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.StartEvent Member List
    -
    - -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_start_event.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_start_event.html deleted file mode 100644 index 803bf54..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_start_event.html +++ /dev/null @@ -1,326 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.StartEvent Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.StartEvent Class Reference
    -
    -
    - -

    SPE - Start events of protection equipment according to IEC 60870-5-101:2003 7.2.6.11. - More...

    - - - - - - - - - - - - -

    -Public Member Functions

    StartEvent (byte encodedValue)
     
    StartEvent (StartEvent orignal)
     
    -override bool Equals (object obj)
     
    -override int GetHashCode ()
     
    -override string ToString ()
     
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    bool GS [get, set]
     General start of operation.
     
    bool SL1 [get, set]
     Start of operation phase L1.
     
    bool SL2 [get, set]
     Start of operation phase L2.
     
    bool SL3 [get, set]
     Start of operation phase L3.
     
    bool SIE [get, set]
     Start of operation IE (earth current)
     
    bool SRD [get, set]
     Start of operation in reverse direction.
     
    -bool RES1 [get, set]
     
    -bool RES2 [get, set]
     
    -byte EncodedValue [get, set]
     
    -

    Detailed Description

    -

    SPE - Start events of protection equipment according to IEC 60870-5-101:2003 7.2.6.11.

    -

    Property Documentation

    - -

    ◆ GS

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS101.StartEvent.GS
    -
    -getset
    -
    - -

    General start of operation.

    -

    true if started; otherwise, false.

    - -
    -
    - -

    ◆ SIE

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS101.StartEvent.SIE
    -
    -getset
    -
    - -

    Start of operation IE (earth current)

    -

    true if started; otherwise, false.

    - -
    -
    - -

    ◆ SL1

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS101.StartEvent.SL1
    -
    -getset
    -
    - -

    Start of operation phase L1.

    -

    true if started; otherwise, false.

    - -
    -
    - -

    ◆ SL2

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS101.StartEvent.SL2
    -
    -getset
    -
    - -

    Start of operation phase L2.

    -

    true if started; otherwise, false.

    - -
    -
    - -

    ◆ SL3

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS101.StartEvent.SL3
    -
    -getset
    -
    - -

    Start of operation phase L3.

    -

    true if started; otherwise, false.

    - -
    -
    - -

    ◆ SRD

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS101.StartEvent.SRD
    -
    -getset
    -
    - -

    Start of operation in reverse direction.

    -

    true if started; otherwise, false.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/StartEvent.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_start_event.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_start_event.js deleted file mode 100644 index 98bbe63..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_start_event.js +++ /dev/null @@ -1,9 +0,0 @@ -var classlib60870_1_1_c_s101_1_1_start_event = -[ - [ "GS", "classlib60870_1_1_c_s101_1_1_start_event.html#a6cf3d354c2df01eb808748353f743b33", null ], - [ "SIE", "classlib60870_1_1_c_s101_1_1_start_event.html#a63a1bca793fe829680fc745c8b537b1d", null ], - [ "SL1", "classlib60870_1_1_c_s101_1_1_start_event.html#a53c47cb469138b00f2d266da9ee91338", null ], - [ "SL2", "classlib60870_1_1_c_s101_1_1_start_event.html#a43c8205b9e5b018a89c57658d2fc7443", null ], - [ "SL3", "classlib60870_1_1_c_s101_1_1_start_event.html#a686791b47a50ff83badd20384b00a604", null ], - [ "SRD", "classlib60870_1_1_c_s101_1_1_start_event.html#a058cea08569048ffde04da4dab3630d7", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_status_and_status_change_detection-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_status_and_status_change_detection-members.html deleted file mode 100644 index 9a53c78..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_status_and_status_change_detection-members.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.StatusAndStatusChangeDetection Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.StatusAndStatusChangeDetection, including all inherited members.

    - - - - - - - - - - - - -
    CD(int i) (defined in lib60870.CS101.StatusAndStatusChangeDetection)lib60870.CS101.StatusAndStatusChangeDetection
    CD(int i, bool value) (defined in lib60870.CS101.StatusAndStatusChangeDetection)lib60870.CS101.StatusAndStatusChangeDetection
    CDn (defined in lib60870.CS101.StatusAndStatusChangeDetection)lib60870.CS101.StatusAndStatusChangeDetection
    GetEncodedValue() (defined in lib60870.CS101.StatusAndStatusChangeDetection)lib60870.CS101.StatusAndStatusChangeDetection
    ST(int i) (defined in lib60870.CS101.StatusAndStatusChangeDetection)lib60870.CS101.StatusAndStatusChangeDetection
    ST(int i, bool value) (defined in lib60870.CS101.StatusAndStatusChangeDetection)lib60870.CS101.StatusAndStatusChangeDetection
    StatusAndStatusChangeDetection() (defined in lib60870.CS101.StatusAndStatusChangeDetection)lib60870.CS101.StatusAndStatusChangeDetection
    StatusAndStatusChangeDetection(StatusAndStatusChangeDetection original) (defined in lib60870.CS101.StatusAndStatusChangeDetection)lib60870.CS101.StatusAndStatusChangeDetection
    StatusAndStatusChangeDetection(byte[] msg, int startIndex) (defined in lib60870.CS101.StatusAndStatusChangeDetection)lib60870.CS101.StatusAndStatusChangeDetection
    STn (defined in lib60870.CS101.StatusAndStatusChangeDetection)lib60870.CS101.StatusAndStatusChangeDetection
    ToString() (defined in lib60870.CS101.StatusAndStatusChangeDetection)lib60870.CS101.StatusAndStatusChangeDetection
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_status_and_status_change_detection.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_status_and_status_change_detection.html deleted file mode 100644 index 0f7cccb..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_status_and_status_change_detection.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.StatusAndStatusChangeDetection Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.StatusAndStatusChangeDetection Class Reference
    -
    -
    - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -bool ST (int i)
     
    -void ST (int i, bool value)
     
    -bool CD (int i)
     
    -void CD (int i, bool value)
     
    StatusAndStatusChangeDetection (StatusAndStatusChangeDetection original)
     
    StatusAndStatusChangeDetection (byte[] msg, int startIndex)
     
    -byte[] GetEncodedValue ()
     
    -override string ToString ()
     
    - - - - - -

    -Properties

    -UInt16 STn [get, set]
     
    -UInt16 CDn [get, set]
     
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/StatusAndStatusChangeDetection.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command-members.html deleted file mode 100644 index b768edf..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command-members.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.StepCommand Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.StepCommand, including all inherited members.

    - - - - - - - - - - - - - - - - - - -
    DoubleCommand(int ioa, int command, bool select, int quality) (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
    DoubleCommand(DoubleCommand original) (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommandvirtual
    GetEncodedSize() (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    OFF (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommandstatic
    ON (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommandstatic
    QU (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
    Select (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
    State (defined in lib60870.CS101.StepCommand)lib60870.CS101.StepCommand
    StepCommand(int ioa, StepCommandValue command, bool select, int quality) (defined in lib60870.CS101.StepCommand)lib60870.CS101.StepCommand
    StepCommand(StepCommand original) (defined in lib60870.CS101.StepCommand)lib60870.CS101.StepCommand
    SupportsSequence (defined in lib60870.CS101.StepCommand)lib60870.CS101.StepCommand
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.StepCommand)lib60870.CS101.StepCommand
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command.html deleted file mode 100644 index 0fecf55..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command.html +++ /dev/null @@ -1,215 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.StepCommand Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.StepCommand Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.StepCommand:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.StepCommand:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    StepCommand (int ioa, StepCommandValue command, bool select, int quality)
     
    StepCommand (StepCommand original)
     
    - Public Member Functions inherited from lib60870.CS101.DoubleCommand
    -override int GetEncodedSize ()
     
    DoubleCommand (int ioa, int command, bool select, int quality)
     
    DoubleCommand (DoubleCommand original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -new StepCommandValue State [get]
     
    - Properties inherited from lib60870.CS101.DoubleCommand
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -int QU [get]
     
    -int State [get]
     
    -bool Select [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - - - - - - -

    -Additional Inherited Members

    - Static Public Attributes inherited from lib60870.CS101.DoubleCommand
    -static int OFF = 1
     
    -static int ON = 2
     
    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SingleCommand.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command__coll__graph.dot deleted file mode 100644 index 2359da9..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command__coll__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.StepCommand" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.StepCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="DoubleCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_command.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command__inherit__graph.dot deleted file mode 100644 index 5b1d66e..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command__inherit__graph.dot +++ /dev/null @@ -1,14 +0,0 @@ -digraph "lib60870.CS101.StepCommand" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.StepCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="DoubleCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_command.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; - Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node4 [id="Node000004",label="lib60870.CS101.StepCommand\lWithCP56Time2a",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a-members.html deleted file mode 100644 index 305b5e6..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a-members.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.StepCommandWithCP56Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.StepCommandWithCP56Time2a, including all inherited members.

    - - - - - - - - - - - - - - - - - - - - - -
    DoubleCommand(int ioa, int command, bool select, int quality) (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
    DoubleCommand(DoubleCommand original) (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.StepCommandWithCP56Time2a)lib60870.CS101.StepCommandWithCP56Time2avirtual
    GetEncodedSize() (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    OFF (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommandstatic
    ON (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommandstatic
    QU (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
    Select (defined in lib60870.CS101.DoubleCommand)lib60870.CS101.DoubleCommand
    State (defined in lib60870.CS101.StepCommand)lib60870.CS101.StepCommand
    StepCommand(int ioa, StepCommandValue command, bool select, int quality) (defined in lib60870.CS101.StepCommand)lib60870.CS101.StepCommand
    StepCommand(StepCommand original) (defined in lib60870.CS101.StepCommand)lib60870.CS101.StepCommand
    StepCommandWithCP56Time2a(int ioa, StepCommandValue command, bool select, int quality, CP56Time2a timestamp) (defined in lib60870.CS101.StepCommandWithCP56Time2a)lib60870.CS101.StepCommandWithCP56Time2a
    StepCommandWithCP56Time2a(StepCommandWithCP56Time2a original) (defined in lib60870.CS101.StepCommandWithCP56Time2a)lib60870.CS101.StepCommandWithCP56Time2a
    SupportsSequence (defined in lib60870.CS101.StepCommandWithCP56Time2a)lib60870.CS101.StepCommandWithCP56Time2a
    Timestamp (defined in lib60870.CS101.StepCommandWithCP56Time2a)lib60870.CS101.StepCommandWithCP56Time2a
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.StepCommandWithCP56Time2a)lib60870.CS101.StepCommandWithCP56Time2a
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a.html deleted file mode 100644 index 2598c63..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a.html +++ /dev/null @@ -1,269 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.StepCommandWithCP56Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.StepCommandWithCP56Time2a Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.StepCommandWithCP56Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.StepCommandWithCP56Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    StepCommandWithCP56Time2a (int ioa, StepCommandValue command, bool select, int quality, CP56Time2a timestamp)
     
    StepCommandWithCP56Time2a (StepCommandWithCP56Time2a original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.StepCommand
    StepCommand (int ioa, StepCommandValue command, bool select, int quality)
     
    StepCommand (StepCommand original)
     
    - Public Member Functions inherited from lib60870.CS101.DoubleCommand
    -override int GetEncodedSize ()
     
    DoubleCommand (int ioa, int command, bool select, int quality)
     
    DoubleCommand (DoubleCommand original)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -CP56Time2a Timestamp [get]
     
    - Properties inherited from lib60870.CS101.StepCommand
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -new StepCommandValue State [get]
     
    - Properties inherited from lib60870.CS101.DoubleCommand
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -int QU [get]
     
    -int State [get]
     
    -bool Select [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - - - - - - -

    -Additional Inherited Members

    - Static Public Attributes inherited from lib60870.CS101.DoubleCommand
    -static int OFF = 1
     
    -static int ON = 2
     
    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.StepCommandWithCP56Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.DoubleCommand.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SingleCommand.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a__coll__graph.dot deleted file mode 100644 index 6a772e5..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a__coll__graph.dot +++ /dev/null @@ -1,14 +0,0 @@ -digraph "lib60870.CS101.StepCommandWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.StepCommand\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="StepCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_command.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="DoubleCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_command.html",tooltip=" "]; - Node4 -> Node3 [id="edge3_Node000003_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node4 [id="Node000004",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a__inherit__graph.dot deleted file mode 100644 index 6a772e5..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a__inherit__graph.dot +++ /dev/null @@ -1,14 +0,0 @@ -digraph "lib60870.CS101.StepCommandWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.StepCommand\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="StepCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_command.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="DoubleCommand",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_command.html",tooltip=" "]; - Node4 -> Node3 [id="edge3_Node000003_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node4 [id="Node000004",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information-members.html deleted file mode 100644 index eb00186..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information-members.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.StepPositionInformation Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.StepPositionInformation, including all inherited members.

    - - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.StepPositionInformation)lib60870.CS101.StepPositionInformationvirtual
    GetEncodedSize() (defined in lib60870.CS101.StepPositionInformation)lib60870.CS101.StepPositionInformation
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Quality (defined in lib60870.CS101.StepPositionInformation)lib60870.CS101.StepPositionInformation
    StepPositionInformation(int ioa, int value, bool isTransient, QualityDescriptor quality) (defined in lib60870.CS101.StepPositionInformation)lib60870.CS101.StepPositionInformation
    StepPositionInformation(StepPositionInformation original) (defined in lib60870.CS101.StepPositionInformation)lib60870.CS101.StepPositionInformation
    SupportsSequence (defined in lib60870.CS101.StepPositionInformation)lib60870.CS101.StepPositionInformation
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Transientlib60870.CS101.StepPositionInformation
    Type (defined in lib60870.CS101.StepPositionInformation)lib60870.CS101.StepPositionInformation
    Valuelib60870.CS101.StepPositionInformation
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information.html deleted file mode 100644 index a542d56..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information.html +++ /dev/null @@ -1,284 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.StepPositionInformation Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.StepPositionInformation Class Reference
    -
    -
    - -

    Step position information object (M_ST_NA_1) - More...

    -
    -Inheritance diagram for lib60870.CS101.StepPositionInformation:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.StepPositionInformation:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    StepPositionInformation (int ioa, int value, bool isTransient, QualityDescriptor quality)
     
    StepPositionInformation (StepPositionInformation original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    int Value [get, set]
     Step position (range -64 ... +63)
     
    bool Transient [get, set]
     Gets a value indicating whether this lib60870.StepPositionInformation is in transient state.
     
    -QualityDescriptor Quality [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Detailed Description

    -

    Step position information object (M_ST_NA_1)

    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.StepPositionInformation.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -

    Property Documentation

    - -

    ◆ Transient

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS101.StepPositionInformation.Transient
    -
    -getset
    -
    - -

    Gets a value indicating whether this lib60870.StepPositionInformation is in transient state.

    -

    true if transient; otherwise, false.

    - -
    -
    - -

    ◆ Value

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CS101.StepPositionInformation.Value
    -
    -getset
    -
    - -

    Step position (range -64 ... +63)

    -

    The value.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/StepPositionInformation.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information.js deleted file mode 100644 index 251b984..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information.js +++ /dev/null @@ -1,5 +0,0 @@ -var classlib60870_1_1_c_s101_1_1_step_position_information = -[ - [ "Transient", "classlib60870_1_1_c_s101_1_1_step_position_information.html#aba392b47665d183b882892dc252f285f", null ], - [ "Value", "classlib60870_1_1_c_s101_1_1_step_position_information.html#a00370bb63d3ec53ded04f4d8108990cf", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information__coll__graph.dot deleted file mode 100644 index e6e57bc..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.StepPositionInformation" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.StepPosition\lInformation",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Step position information object (M_ST_NA_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information__inherit__graph.dot deleted file mode 100644 index bf9a82b..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_information__inherit__graph.dot +++ /dev/null @@ -1,15 +0,0 @@ -digraph "lib60870.CS101.StepPositionInformation" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node1 [id="Node000001",label="lib60870.CS101.StepPosition\lInformation",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Step position information object (M_ST_NA_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; - Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="lib60870.CS101.StepPosition\lWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a.html",tooltip="Step position information object with CP24Time2a time tag (M_ST_TA_1)"]; - Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node4 [id="Node000004",label="lib60870.CS101.StepPosition\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a.html",tooltip="Step position information object with CP56Time2a time tag (M_ST_TB_1)"]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a-members.html deleted file mode 100644 index c6004cf..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a-members.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.StepPositionWithCP24Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.StepPositionWithCP24Time2a, including all inherited members.

    - - - - - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.StepPositionWithCP24Time2a)lib60870.CS101.StepPositionWithCP24Time2avirtual
    GetEncodedSize() (defined in lib60870.CS101.StepPositionWithCP24Time2a)lib60870.CS101.StepPositionWithCP24Time2a
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Quality (defined in lib60870.CS101.StepPositionInformation)lib60870.CS101.StepPositionInformation
    StepPositionInformation(int ioa, int value, bool isTransient, QualityDescriptor quality) (defined in lib60870.CS101.StepPositionInformation)lib60870.CS101.StepPositionInformation
    StepPositionInformation(StepPositionInformation original) (defined in lib60870.CS101.StepPositionInformation)lib60870.CS101.StepPositionInformation
    StepPositionWithCP24Time2a(int ioa, int value, bool isTransient, QualityDescriptor quality, CP24Time2a timestamp) (defined in lib60870.CS101.StepPositionWithCP24Time2a)lib60870.CS101.StepPositionWithCP24Time2a
    StepPositionWithCP24Time2a(StepPositionWithCP24Time2a original) (defined in lib60870.CS101.StepPositionWithCP24Time2a)lib60870.CS101.StepPositionWithCP24Time2a
    SupportsSequence (defined in lib60870.CS101.StepPositionWithCP24Time2a)lib60870.CS101.StepPositionWithCP24Time2a
    Timestamp (defined in lib60870.CS101.StepPositionWithCP24Time2a)lib60870.CS101.StepPositionWithCP24Time2a
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Transientlib60870.CS101.StepPositionInformation
    Type (defined in lib60870.CS101.StepPositionWithCP24Time2a)lib60870.CS101.StepPositionWithCP24Time2a
    Valuelib60870.CS101.StepPositionInformation
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a.html deleted file mode 100644 index 283d366..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a.html +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.StepPositionWithCP24Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.StepPositionWithCP24Time2a Class Reference
    -
    -
    - -

    Step position information object with CP24Time2a time tag (M_ST_TA_1) - More...

    -
    -Inheritance diagram for lib60870.CS101.StepPositionWithCP24Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.StepPositionWithCP24Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    StepPositionWithCP24Time2a (int ioa, int value, bool isTransient, QualityDescriptor quality, CP24Time2a timestamp)
     
    StepPositionWithCP24Time2a (StepPositionWithCP24Time2a original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.StepPositionInformation
    -override int GetEncodedSize ()
     
    StepPositionInformation (int ioa, int value, bool isTransient, QualityDescriptor quality)
     
    StepPositionInformation (StepPositionInformation original)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -CP24Time2a Timestamp [get, set]
     
    - Properties inherited from lib60870.CS101.StepPositionInformation
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    int Value [get, set]
     Step position (range -64 ... +63)
     
    bool Transient [get, set]
     Gets a value indicating whether this lib60870.StepPositionInformation is in transient state.
     
    -QualityDescriptor Quality [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Detailed Description

    -

    Step position information object with CP24Time2a time tag (M_ST_TA_1)

    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.StepPositionWithCP24Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.StepPositionInformation.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/StepPositionInformation.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a__coll__graph.dot deleted file mode 100644 index 342e9e5..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a__coll__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.StepPositionWithCP24Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.StepPosition\lWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Step position information object with CP24Time2a time tag (M_ST_TA_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="StepPositionInformation",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_position_information.html",tooltip="Step position information object (M_ST_NA_1)"]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a__inherit__graph.dot deleted file mode 100644 index 342e9e5..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.StepPositionWithCP24Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.StepPosition\lWithCP24Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Step position information object with CP24Time2a time tag (M_ST_TA_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="StepPositionInformation",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_position_information.html",tooltip="Step position information object (M_ST_NA_1)"]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a-members.html deleted file mode 100644 index 7dd92b8..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a-members.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.StepPositionWithCP56Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.StepPositionWithCP56Time2a, including all inherited members.

    - - - - - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.StepPositionWithCP56Time2a)lib60870.CS101.StepPositionWithCP56Time2avirtual
    GetEncodedSize() (defined in lib60870.CS101.StepPositionWithCP56Time2a)lib60870.CS101.StepPositionWithCP56Time2a
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Quality (defined in lib60870.CS101.StepPositionInformation)lib60870.CS101.StepPositionInformation
    StepPositionInformation(int ioa, int value, bool isTransient, QualityDescriptor quality) (defined in lib60870.CS101.StepPositionInformation)lib60870.CS101.StepPositionInformation
    StepPositionInformation(StepPositionInformation original) (defined in lib60870.CS101.StepPositionInformation)lib60870.CS101.StepPositionInformation
    StepPositionWithCP56Time2a(int ioa, int value, bool isTransient, QualityDescriptor quality, CP56Time2a timestamp) (defined in lib60870.CS101.StepPositionWithCP56Time2a)lib60870.CS101.StepPositionWithCP56Time2a
    StepPositionWithCP56Time2a(StepPositionWithCP56Time2a original) (defined in lib60870.CS101.StepPositionWithCP56Time2a)lib60870.CS101.StepPositionWithCP56Time2a
    SupportsSequence (defined in lib60870.CS101.StepPositionWithCP56Time2a)lib60870.CS101.StepPositionWithCP56Time2a
    Timestamp (defined in lib60870.CS101.StepPositionWithCP56Time2a)lib60870.CS101.StepPositionWithCP56Time2a
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Transientlib60870.CS101.StepPositionInformation
    Type (defined in lib60870.CS101.StepPositionWithCP56Time2a)lib60870.CS101.StepPositionWithCP56Time2a
    Valuelib60870.CS101.StepPositionInformation
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a.html deleted file mode 100644 index f57e210..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a.html +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.StepPositionWithCP56Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.StepPositionWithCP56Time2a Class Reference
    -
    -
    - -

    Step position information object with CP56Time2a time tag (M_ST_TB_1) - More...

    -
    -Inheritance diagram for lib60870.CS101.StepPositionWithCP56Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.StepPositionWithCP56Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    StepPositionWithCP56Time2a (int ioa, int value, bool isTransient, QualityDescriptor quality, CP56Time2a timestamp)
     
    StepPositionWithCP56Time2a (StepPositionWithCP56Time2a original)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.StepPositionInformation
    -override int GetEncodedSize ()
     
    StepPositionInformation (int ioa, int value, bool isTransient, QualityDescriptor quality)
     
    StepPositionInformation (StepPositionInformation original)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    -CP56Time2a Timestamp [get, set]
     
    - Properties inherited from lib60870.CS101.StepPositionInformation
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    int Value [get, set]
     Step position (range -64 ... +63)
     
    bool Transient [get, set]
     Gets a value indicating whether this lib60870.StepPositionInformation is in transient state.
     
    -QualityDescriptor Quality [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Detailed Description

    -

    Step position information object with CP56Time2a time tag (M_ST_TB_1)

    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.StepPositionWithCP56Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.StepPositionInformation.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/StepPositionInformation.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a__coll__graph.dot deleted file mode 100644 index 766aa49..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a__coll__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.StepPositionWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.StepPosition\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Step position information object with CP56Time2a time tag (M_ST_TB_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="StepPositionInformation",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_position_information.html",tooltip="Step position information object (M_ST_NA_1)"]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a__inherit__graph.dot deleted file mode 100644 index 766aa49..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.StepPositionWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.StepPosition\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Step position information object with CP56Time2a time tag (M_ST_TB_1)"]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="StepPositionInformation",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_position_information.html",tooltip="Step position information object (M_ST_NA_1)"]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command-members.html deleted file mode 100644 index 0c386d0..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command-members.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.TestCommand Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.TestCommand, including all inherited members.

    - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.TestCommand)lib60870.CS101.TestCommandvirtual
    GetEncodedSize() (defined in lib60870.CS101.TestCommand)lib60870.CS101.TestCommand
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    SupportsSequence (defined in lib60870.CS101.TestCommand)lib60870.CS101.TestCommand
    TestCommand() (defined in lib60870.CS101.TestCommand)lib60870.CS101.TestCommand
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    Type (defined in lib60870.CS101.TestCommand)lib60870.CS101.TestCommand
    Valid (defined in lib60870.CS101.TestCommand)lib60870.CS101.TestCommand
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command.html deleted file mode 100644 index f362225..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.TestCommand Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.TestCommand Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.TestCommand:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.TestCommand:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - -

    -Properties

    -override TypeID Type [get]
     
    -bool Valid [get]
     
    -override bool SupportsSequence [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.TestCommand.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SystemInformationCommands.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command__coll__graph.dot deleted file mode 100644 index 9db1047..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.TestCommand" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.TestCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command__inherit__graph.dot deleted file mode 100644 index 9db1047..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.TestCommand" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.TestCommand",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a-members.html deleted file mode 100644 index 46fcbe6..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a-members.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.TestCommandWithCP56Time2a Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.TestCommandWithCP56Time2a, including all inherited members.

    - - - - - - - - - - - - - -
    Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) (defined in lib60870.CS101.TestCommandWithCP56Time2a)lib60870.CS101.TestCommandWithCP56Time2avirtual
    GetEncodedSize() (defined in lib60870.CS101.TestCommandWithCP56Time2a)lib60870.CS101.TestCommandWithCP56Time2a
    InformationObject(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObjectprotected
    InformationObject(int objectAddress) (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    ObjectAddress (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    SupportsSequence (defined in lib60870.CS101.TestCommandWithCP56Time2a)lib60870.CS101.TestCommandWithCP56Time2a
    TestCommandWithCP56Time2a() (defined in lib60870.CS101.TestCommandWithCP56Time2a)lib60870.CS101.TestCommandWithCP56Time2a
    TestCommandWithCP56Time2a(ushort tsc, CP56Time2a time) (defined in lib60870.CS101.TestCommandWithCP56Time2a)lib60870.CS101.TestCommandWithCP56Time2a
    Timelib60870.CS101.TestCommandWithCP56Time2a
    ToString() (defined in lib60870.CS101.InformationObject)lib60870.CS101.InformationObject
    TSClib60870.CS101.TestCommandWithCP56Time2a
    Type (defined in lib60870.CS101.TestCommandWithCP56Time2a)lib60870.CS101.TestCommandWithCP56Time2a
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html deleted file mode 100644 index 390e621..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html +++ /dev/null @@ -1,224 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.TestCommandWithCP56Time2a Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.TestCommandWithCP56Time2a Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.TestCommandWithCP56Time2a:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.TestCommandWithCP56Time2a:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -override int GetEncodedSize ()
     
    TestCommandWithCP56Time2a (ushort tsc, CP56Time2a time)
     
    override void Encode (Frame frame, ApplicationLayerParameters parameters, bool isSequence)
     
    - Public Member Functions inherited from lib60870.CS101.InformationObject
    -override string ToString ()
     
    InformationObject (int objectAddress)
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -CP56Time2a Time [get, set]
     Test time.
     
    -ushort TSC [get, set]
     Test sequence number.
     
    -override TypeID Type [get]
     
    -override bool SupportsSequence [get]
     
    - Properties inherited from lib60870.CS101.InformationObject
    -int ObjectAddress [get, set]
     
    bool SupportsSequence [get]
     Indicates if this information object type supports sequence of information objects encoding.
     
    TypeID Type [get]
     The type ID (message type) of the information object type.
     
    - - - - -

    -Additional Inherited Members

    - Protected Member Functions inherited from lib60870.CS101.InformationObject
    InformationObject (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     
    -

    Member Function Documentation

    - -

    ◆ Encode()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS101.TestCommandWithCP56Time2a.Encode (Frame frame,
    ApplicationLayerParameters parameters,
    bool isSequence )
    -
    -virtual
    -
    - -

    Reimplemented from lib60870.CS101.InformationObject.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SystemInformationCommands.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.js deleted file mode 100644 index 9b1a9eb..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.js +++ /dev/null @@ -1,5 +0,0 @@ -var classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a = -[ - [ "Time", "classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html#abcedc8616644f69702da1eb4dddb1860", null ], - [ "TSC", "classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html#ae5a610ff07bf26fbc6eb1e54efbd99df", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a__coll__graph.dot deleted file mode 100644 index f9ed1d3..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.TestCommandWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.TestCommand\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a__inherit__graph.dot deleted file mode 100644 index f9ed1d3..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.TestCommandWithCP56Time2a" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.TestCommand\lWithCP56Time2a",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="InformationObject",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file-members.html deleted file mode 100644 index 4852a10..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file-members.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.TransparentFile Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.TransparentFile, including all inherited members.

    - - - - - - - - - - - -
    AddSection(byte[] section) (defined in lib60870.CS101.TransparentFile)lib60870.CS101.TransparentFile
    GetCA()lib60870.CS101.TransparentFile
    GetFileDate() (defined in lib60870.CS101.TransparentFile)lib60870.CS101.TransparentFile
    GetFileSize()lib60870.CS101.TransparentFile
    GetIOA()lib60870.CS101.TransparentFile
    GetNameOfFile()lib60870.CS101.TransparentFile
    GetSectionSize(int sectionNumber)lib60870.CS101.TransparentFile
    GetSegmentData(int sectionNumber, int offset, int segmentSize, byte[] segmentData)lib60870.CS101.TransparentFile
    TransferComplete(bool success)lib60870.CS101.TransparentFilevirtual
    TransparentFile(int ca, int ioa, NameOfFile nof) (defined in lib60870.CS101.TransparentFile)lib60870.CS101.TransparentFile
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file.html deleted file mode 100644 index bcc3f77..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file.html +++ /dev/null @@ -1,384 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.TransparentFile Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.TransparentFile Class Reference
    -
    -
    - -

    Simple implementation of IFileProvider that can be used to provide transparent files. Derived classed should override the TransferComplete method. - More...

    -
    -Inheritance diagram for lib60870.CS101.TransparentFile:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS101.TransparentFile:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    TransparentFile (int ca, int ioa, NameOfFile nof)
     
    -void AddSection (byte[] section)
     
    int GetCA ()
     Returns the CA (Comman address) of the file.
     
    int GetIOA ()
     Returns the IOA (information object address of the file)
     
    NameOfFile GetNameOfFile ()
     Gets the type ("name") of the file.
     
    DateTime GetFileDate ()
     
    int GetFileSize ()
     Gets the size of the file in bytes.
     
    int GetSectionSize (int sectionNumber)
     Gets the size of a section in byzes.
     
    bool GetSegmentData (int sectionNumber, int offset, int segmentSize, byte[] segmentData)
     Gets the segment data.
     
    virtual void TransferComplete (bool success)
     Indicates that the transfer is complete. When success equals true the file data can be deleted.
     
    -

    Detailed Description

    -

    Simple implementation of IFileProvider that can be used to provide transparent files. Derived classed should override the TransferComplete method.

    -

    Member Function Documentation

    - -

    ◆ GetCA()

    - -
    -
    - - - - - - - -
    int lib60870.CS101.TransparentFile.GetCA ()
    -
    - -

    Returns the CA (Comman address) of the file.

    -
    Returns
    The CA
    - -

    Implements lib60870.CS101.IFileProvider.

    - -
    -
    - -

    ◆ GetFileDate()

    - -
    -
    - - - - - - - -
    DateTime lib60870.CS101.TransparentFile.GetFileDate ()
    -
    - -

    Implements lib60870.CS101.IFileProvider.

    - -
    -
    - -

    ◆ GetFileSize()

    - -
    -
    - - - - - - - -
    int lib60870.CS101.TransparentFile.GetFileSize ()
    -
    - -

    Gets the size of the file in bytes.

    -
    Returns
    The file size in bytes
    - -

    Implements lib60870.CS101.IFileProvider.

    - -
    -
    - -

    ◆ GetIOA()

    - -
    -
    - - - - - - - -
    int lib60870.CS101.TransparentFile.GetIOA ()
    -
    - -

    Returns the IOA (information object address of the file)

    -
    Returns
    The IOA
    - -

    Implements lib60870.CS101.IFileProvider.

    - -
    -
    - -

    ◆ GetNameOfFile()

    - -
    -
    - - - - - - - -
    NameOfFile lib60870.CS101.TransparentFile.GetNameOfFile ()
    -
    - -

    Gets the type ("name") of the file.

    -
    Returns
    The file type
    - -

    Implements lib60870.CS101.IFileProvider.

    - -
    -
    - -

    ◆ GetSectionSize()

    - -
    -
    - - - - - - - -
    int lib60870.CS101.TransparentFile.GetSectionSize (int sectionNumber)
    -
    - -

    Gets the size of a section in byzes.

    -
    Returns
    The section size in bytes or -1 if the section does not exist
    -
    Parameters
    - - -
    sectionNumberNumber of section (starting with 0)
    -
    -
    - -

    Implements lib60870.CS101.IFileProvider.

    - -
    -
    - -

    ◆ GetSegmentData()

    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    bool lib60870.CS101.TransparentFile.GetSegmentData (int sectionNumber,
    int offset,
    int segmentSize,
    byte[] segmentData )
    -
    - -

    Gets the segment data.

    -
    Returns
    true, if segment data was gotten, false otherwise.
    -
    Parameters
    - - - - - -
    sectionNumberSection number.
    offsetOffset.
    segmentSizeSegment size.
    segmentDataSegment data.
    -
    -
    - -

    Implements lib60870.CS101.IFileProvider.

    - -
    -
    - -

    ◆ TransferComplete()

    - -
    -
    - - - - - -
    - - - - - - - -
    virtual void lib60870.CS101.TransparentFile.TransferComplete (bool success)
    -
    -virtual
    -
    - -

    Indicates that the transfer is complete. When success equals true the file data can be deleted.

    -
    Parameters
    - - -
    successIf set to true success.
    -
    -
    - -

    Implements lib60870.CS101.IFileProvider.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/FileServices.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file.js deleted file mode 100644 index 86b0945..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file.js +++ /dev/null @@ -1,10 +0,0 @@ -var classlib60870_1_1_c_s101_1_1_transparent_file = -[ - [ "GetCA", "classlib60870_1_1_c_s101_1_1_transparent_file.html#a7f9d7004443cb8285f67ef8362544313", null ], - [ "GetFileSize", "classlib60870_1_1_c_s101_1_1_transparent_file.html#a7eaa164b404cd4f32302c7f044b774ab", null ], - [ "GetIOA", "classlib60870_1_1_c_s101_1_1_transparent_file.html#a955484a99eb32c9a8c37a76959add633", null ], - [ "GetNameOfFile", "classlib60870_1_1_c_s101_1_1_transparent_file.html#a069c64d7b35226bb030fc5e0dfcbd5bd", null ], - [ "GetSectionSize", "classlib60870_1_1_c_s101_1_1_transparent_file.html#a4a53ae94f1bc4d70ebac30d1af9ba596", null ], - [ "GetSegmentData", "classlib60870_1_1_c_s101_1_1_transparent_file.html#adefa9e2224dba9bb842481db21e94216", null ], - [ "TransferComplete", "classlib60870_1_1_c_s101_1_1_transparent_file.html#a533ea7bd0c80d98d5ea48748c14ee376", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file__coll__graph.dot deleted file mode 100644 index 65b98fc..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.TransparentFile" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.TransparentFile",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Simple implementation of IFileProvider that can be used to provide transparent files...."]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="IFileProvider",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$interfacelib60870_1_1_c_s101_1_1_i_file_provider.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file__inherit__graph.dot deleted file mode 100644 index 65b98fc..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s101_1_1_transparent_file__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.TransparentFile" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.TransparentFile",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Simple implementation of IFileProvider that can be used to provide transparent files...."]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="IFileProvider",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$interfacelib60870_1_1_c_s101_1_1_i_file_provider.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters-members.html deleted file mode 100644 index cb62ebc..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters-members.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS104.APCIParameters Member List
    -
    - -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html deleted file mode 100644 index f75d2b4..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS104.APCIParameters Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS104.APCIParameters Class Reference
    -
    -
    - -

    Parameters for the CS 104 APCI (Application Protocol Control Information) - More...

    - - - - -

    -Public Member Functions

    -APCIParameters Clone ()
     
    - - - - - - - - - - - - - - - - - - - -

    -Properties

    -int K [get, set]
     number of unconfirmed APDUs in I format (range: 1 .. 32767 (2^15 - 1) - sender will stop transmission after k unconfirmed I messages
     
    -int W [get, set]
     number of unconfirmed APDUs in I format (range: 1 .. 32767 (2^15 - 1) - receiver will confirm latest after w messages
     
    int T0 [get, set]
     Timeout for connection establishment (in s)
     
    int T1 [get, set]
     timeout for transmitted APDUs in I/U format (in s) when timeout elapsed without confirmation the connection will be closed
     
    int T2 [get, set]
     timeout to confirm messages (in s)
     
    int T3 [get, set]
     time until sending test telegrams in case of idle connection
     
    -

    Detailed Description

    -

    Parameters for the CS 104 APCI (Application Protocol Control Information)

    -

    Property Documentation

    - -

    ◆ T0

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CS104.APCIParameters.T0
    -
    -getset
    -
    - -

    Timeout for connection establishment (in s)

    -

    timeout t0

    - -
    -
    - -

    ◆ T1

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CS104.APCIParameters.T1
    -
    -getset
    -
    - -

    timeout for transmitted APDUs in I/U format (in s) when timeout elapsed without confirmation the connection will be closed

    -

    timeout t1

    - -
    -
    - -

    ◆ T2

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CS104.APCIParameters.T2
    -
    -getset
    -
    - -

    timeout to confirm messages (in s)

    -

    timeout t2

    - -
    -
    - -

    ◆ T3

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CS104.APCIParameters.T3
    -
    -getset
    -
    - -

    time until sending test telegrams in case of idle connection

    -

    timeout t3

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS104/APCIParameters.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.js deleted file mode 100644 index 619f371..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.js +++ /dev/null @@ -1,9 +0,0 @@ -var classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters = -[ - [ "K", "classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#a0e3fc557d1c66308e6e38383ec9a5287", null ], - [ "T0", "classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#adb7f9816ddbbf8925f5372308efed78f", null ], - [ "T1", "classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#a11f40dff24e0352eb76b4d456afe9e68", null ], - [ "T2", "classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#a0320d85982ccb2814e8829c51d4eb7b8", null ], - [ "T3", "classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#ad68a65bbce99a4a7533a8c1291a52e0a", null ], - [ "W", "classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#ac86b4a16c31fd7ad6af55e6c7b6f048b", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection-members.html deleted file mode 100644 index a8d3559..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection-members.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS104.ClientConnection Member List
    -
    - -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection.html deleted file mode 100644 index 89a4b65..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection.html +++ /dev/null @@ -1,405 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS104.ClientConnection Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS104.ClientConnection Class Reference
    -
    -
    - -

    Represents a client (master) connection. - More...

    -
    -Inheritance diagram for lib60870.CS104.ClientConnection:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS104.ClientConnection:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    ApplicationLayerParameters GetApplicationLayerParameters ()
     Gets the connection parameters.
     
    bool MasterConnection_hasUnconfirmedMessages ()
     Checks if there are any unconfirmed messages in the low-priority or high-priority queues.
     
    void SendASDU (ASDU asdu)
     Send a response ASDU over this connection.
     
    void SendACT_CON (ASDU asdu, bool negative)
     Sends an Activation Confirmation (ACT_CON) ASDU with the specified negative flag.
     
    void SendACT_TERM (ASDU asdu)
     Sends an Activation Termination (ACT_TERM) ASDU with a negative flag set to false.
     
    bool CertificateValidationCallback (object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors sslPolicyErrors)
     Callback method to handle certificate validation in SSL/TLS communication. It checks various conditions such as certificate chain validation, specific certificate validation, and SSL policy errors to determine whether the certificate is valid for the current connection.
     
    -void Close ()
     
    -void ASDUReadyToSend ()
     
    - - - - - - - - - -

    -Properties

    IPEndPoint RemoteEndpoint [get]
     Gets the remote endpoint (client IP address and TCP port)
     
    bool IsActive [get, set]
     Gets or sets a value indicating whether this connection is active. The active connection is the only connection that is answering application layer requests and sends cyclic, and spontaneous messages.
     
    -MasterConnectionState State [get, set]
     
    -

    Detailed Description

    -

    Represents a client (master) connection.

    -

    Member Function Documentation

    - -

    ◆ CertificateValidationCallback()

    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    bool lib60870.CS104.ClientConnection.CertificateValidationCallback (object sender,
    X509Certificate cert,
    X509Chain chain,
    SslPolicyErrors sslPolicyErrors )
    -
    - -

    Callback method to handle certificate validation in SSL/TLS communication. It checks various conditions such as certificate chain validation, specific certificate validation, and SSL policy errors to determine whether the certificate is valid for the current connection.

    -
    Parameters
    - - - - - -
    senderThe source of the event. This is typically the SSL/TLS connection.
    certThe certificate being validated.
    chainThe certificate chain associated with the certificate.
    sslPolicyErrorsThe SSL policy errors that occurred during certificate validation.
    -
    -
    -
    Returns
    Returns true if the certificate is considered valid based on the specified criteria; otherwise, returns false.
    - -
    -
    - -

    ◆ GetApplicationLayerParameters()

    - -
    -
    - - - - - - - -
    ApplicationLayerParameters lib60870.CS104.ClientConnection.GetApplicationLayerParameters ()
    -
    - -

    Gets the connection parameters.

    -
    Returns
    The connection parameters used by the server.
    - -

    Implements lib60870.CS101.IMasterConnection.

    - -
    -
    - -

    ◆ MasterConnection_hasUnconfirmedMessages()

    - -
    -
    - - - - - - - -
    bool lib60870.CS104.ClientConnection.MasterConnection_hasUnconfirmedMessages ()
    -
    - -

    Checks if there are any unconfirmed messages in the low-priority or high-priority queues.

    -
    Returns
    true if there are unconfirmed messages in either the low-priority or high-priority queues; false if no unconfirmed messages are found.
    - -
    -
    - -

    ◆ SendACT_CON()

    - -
    -
    - - - - - - - - - - - -
    void lib60870.CS104.ClientConnection.SendACT_CON (ASDU asdu,
    bool negative )
    -
    - -

    Sends an Activation Confirmation (ACT_CON) ASDU with the specified negative flag.

    -
    Parameters
    - - - -
    asduThe ASDU to be sent as an Activation Confirmation (ACT_CON).
    negativeA boolean flag indicating whether the Activation Confirmation is negative.
    -
    -
    - -

    Implements lib60870.CS101.IMasterConnection.

    - -
    -
    - -

    ◆ SendACT_TERM()

    - -
    -
    - - - - - - - -
    void lib60870.CS104.ClientConnection.SendACT_TERM (ASDU asdu)
    -
    - -

    Sends an Activation Termination (ACT_TERM) ASDU with a negative flag set to false.

    -
    Parameters
    - - -
    asduThe ASDU to be sent as an Activation Termination (ACT_TERM).
    -
    -
    - -

    Implements lib60870.CS101.IMasterConnection.

    - -
    -
    - -

    ◆ SendASDU()

    - -
    -
    - - - - - - - -
    void lib60870.CS104.ClientConnection.SendASDU (ASDU asdu)
    -
    - -

    Send a response ASDU over this connection.

    -
    Exceptions
    - - -
    ConnectionExceptionThrows an exception if the connection is no longer active (e.g. because it has been closed by the other side).
    -
    -
    -
    Parameters
    - - -
    asduThe ASDU to send
    -
    -
    - -

    Implements lib60870.CS101.IMasterConnection.

    - -
    -
    -

    Property Documentation

    - -

    ◆ IsActive

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS104.ClientConnection.IsActive
    -
    -getset
    -
    - -

    Gets or sets a value indicating whether this connection is active. The active connection is the only connection that is answering application layer requests and sends cyclic, and spontaneous messages.

    -

    true if this instance is active; otherwise, false.

    - -
    -
    - -

    ◆ RemoteEndpoint

    - -
    -
    - - - - - -
    - - - - -
    IPEndPoint lib60870.CS104.ClientConnection.RemoteEndpoint
    -
    -get
    -
    - -

    Gets the remote endpoint (client IP address and TCP port)

    -

    The remote IP endpoint

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS104/ClientConnection.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection.js deleted file mode 100644 index b710ddc..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection.js +++ /dev/null @@ -1,11 +0,0 @@ -var classlib60870_1_1_c_s104_1_1_client_connection = -[ - [ "CertificateValidationCallback", "classlib60870_1_1_c_s104_1_1_client_connection.html#aa936b912c162118b6a9834030f924491", null ], - [ "GetApplicationLayerParameters", "classlib60870_1_1_c_s104_1_1_client_connection.html#a92d801095c3038a96b26093e7d38628a", null ], - [ "MasterConnection_hasUnconfirmedMessages", "classlib60870_1_1_c_s104_1_1_client_connection.html#a16acd0a66071c7d1f4d111fafd7a2421", null ], - [ "SendACT_CON", "classlib60870_1_1_c_s104_1_1_client_connection.html#a677c04ff5484b981e8464af8d9f86540", null ], - [ "SendACT_TERM", "classlib60870_1_1_c_s104_1_1_client_connection.html#aa5d85670797c2046051a4a10071fe611", null ], - [ "SendASDU", "classlib60870_1_1_c_s104_1_1_client_connection.html#a92362655a693e3081af86a00a24955ef", null ], - [ "IsActive", "classlib60870_1_1_c_s104_1_1_client_connection.html#afa8806c545bf905a3548afa9732de38b", null ], - [ "RemoteEndpoint", "classlib60870_1_1_c_s104_1_1_client_connection.html#ad59a914894aa422d1bff8b601cc100f3", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection__coll__graph.dot deleted file mode 100644 index 4ef248a..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS104.ClientConnection" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS104.ClientConnection",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Represents a client (master) connection."]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="IMasterConnection",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$interfacelib60870_1_1_c_s101_1_1_i_master_connection.html",tooltip="Provides functions to be used in Slave callbacks to send data back to the master."]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection__inherit__graph.dot deleted file mode 100644 index 4ef248a..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_client_connection__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS104.ClientConnection" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS104.ClientConnection",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Represents a client (master) connection."]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="IMasterConnection",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$interfacelib60870_1_1_c_s101_1_1_i_master_connection.html",tooltip="Provides functions to be used in Slave callbacks to send data back to the master."]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection-members.html deleted file mode 100644 index 5bd1305..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection-members.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS104.Connection Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS104.Connection, including all inherited members.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Autostartlib60870.CS104.Connection
    Cancel() (defined in lib60870.CS104.Connection)lib60870.CS104.Connection
    CheckSequenceNumbers (defined in lib60870.CS104.Connection)lib60870.CS104.Connectionprotected
    Close() (defined in lib60870.CS104.Connection)lib60870.CS104.Connection
    Connect()lib60870.CS104.Connection
    ConnectAsync()lib60870.CS104.Connection
    Connection(string hostname, int tcpPort=2404)lib60870.CS104.Connection
    Connection(string hostname, APCIParameters apciParameters, ApplicationLayerParameters alParameters)lib60870.CS104.Connection
    Connection(string hostname, int tcpPort, APCIParameters apciParameters, ApplicationLayerParameters alParameters)lib60870.CS104.Connection
    Connection(string hostname, TlsSecurityInformation tlsInfo, int tcpPort=19998)lib60870.CS104.Connection
    Connection(string hostname, int tcpPort, APCIParameters apciParameters, ApplicationLayerParameters alParameters, TlsSecurityInformation tlsInfo)lib60870.CS104.Connection
    ConnectTimeoutlib60870.CS104.Connection
    DebugOutput (defined in lib60870.CS101.Master)lib60870.CS101.Master
    debugOutput (defined in lib60870.CS101.Master)lib60870.CS101.Masterprotected
    GetApplicationLayerParameters() (defined in lib60870.CS104.Connection)lib60870.CS104.Connection
    GetDirectory(int ca)lib60870.CS104.Connection
    GetFile(int ca, int ioa, NameOfFile nof, IFileReceiver receiver)lib60870.CS104.Connection
    GetFile(int ca, int ioa, NameOfFile nof, IFileReceiver receiver, int timeout)lib60870.CS104.Connection
    GetStatistics()lib60870.CS104.Connection
    IsRunninglib60870.CS104.Connection
    IsTransmitBufferFull()lib60870.CS104.Connection
    LocalCertificateSelectionCallback(object sender, string targetHost, X509CertificateCollection localCertificates, X509Certificate remoteCertificate, string[] acceptableIssuers)lib60870.CS104.Connection
    LocalIpAddresslib60870.CS104.Connection
    LocalTcpPortlib60870.CS104.Connection
    Parameters (defined in lib60870.CS104.Connection)lib60870.CS104.Connection
    ReceiveSequenceNumberlib60870.CS104.Connection
    ReceiveTimeoutlib60870.CS104.Connection
    SendASDU(ASDU asdu)lib60870.CS104.Connection
    SendClockSyncCommand(int ca, CP56Time2a time)lib60870.CS104.Connection
    SendControlCommand(CauseOfTransmission cot, int ca, InformationObject sc)lib60870.CS104.Connection
    SendCounterInterrogationCommand(CauseOfTransmission cot, int ca, byte qcc)lib60870.CS104.Connection
    SendDelayAcquisitionCommand(CauseOfTransmission cot, int ca, CP16Time2a delay)lib60870.CS104.Connection
    SendFile(int ca, int ioa, NameOfFile nof, IFileProvider fileProvider)lib60870.CS104.Connection
    SendInterrogationCommand(CauseOfTransmission cot, int ca, byte qoi)lib60870.CS104.Connection
    SendReadCommand(int ca, int ioa)lib60870.CS104.Connection
    SendResetProcessCommand(CauseOfTransmission cot, int ca, byte qrp)lib60870.CS104.Connection
    SendSequenceNumberlib60870.CS104.Connection
    SendStartDT()lib60870.CS104.Connection
    SendStartDT_CON()lib60870.CS104.Connectionprotected
    SendStopDT()lib60870.CS104.Connection
    SendStopDT_CON()lib60870.CS104.Connectionprotected
    SendTestCommand(int ca)lib60870.CS104.Connection
    SendTestCommandWithCP56Time2a(int ca, ushort tsc, CP56Time2a time)lib60870.CS104.Connection
    SendTestFR_ACT()lib60870.CS104.Connectionprotected
    SendTestFR_CON()lib60870.CS104.Connectionprotected
    SetASDUReceivedHandler(ASDUReceivedHandler handler, object parameter)lib60870.CS104.Connection
    SetConnectionHandler(ConnectionHandler handler, object parameter)lib60870.CS104.Connection
    SetConnectTimeout(int millies)lib60870.CS104.Connection
    SetReceivedRawMessageHandler(RawMessageHandler handler, object parameter)lib60870.CS104.Connection
    SetSentRawMessageHandler(RawMessageHandler handler, object parameter)lib60870.CS104.Connection
    SetTlsSecurity(TlsSecurityInformation securityInfo)lib60870.CS104.Connection
    tcpPort (defined in lib60870.CS104.Connection)lib60870.CS104.Connectionprotected
    UseSendMessageQueuelib60870.CS104.Connection
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection.html deleted file mode 100644 index c5a1942..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection.html +++ /dev/null @@ -1,1539 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS104.Connection Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS104.Connection Class Reference
    -
    -
    - -

    A single connection to a CS 104 (IEC 60870-5-104) server. Implements the Master interface. - More...

    -
    -Inheritance diagram for lib60870.CS104.Connection:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS104.Connection:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

     Connection (string hostname, int tcpPort=2404)
     Initializes a new instance of the lib60870.CS104.Connection class.
     
     Connection (string hostname, APCIParameters apciParameters, ApplicationLayerParameters alParameters)
     Initializes a new instance of the lib60870.CS104.Connection class.
     
     Connection (string hostname, int tcpPort, APCIParameters apciParameters, ApplicationLayerParameters alParameters)
     Initializes a new instance of the lib60870.CS104.Connection class.
     
     Connection (string hostname, TlsSecurityInformation tlsInfo, int tcpPort=19998)
     Initializes a new instance of the lib60870.CS104.Connection class using TLS.
     
     Connection (string hostname, int tcpPort, APCIParameters apciParameters, ApplicationLayerParameters alParameters, TlsSecurityInformation tlsInfo)
     Initializes a new instance of the lib60870.CS104.Connection class using TLS.
     
    void SetTlsSecurity (TlsSecurityInformation securityInfo)
     Set the security parameters for TLS.
     
    ConnectionStatistics GetStatistics ()
     Gets the conenction statistics.
     
    void SetConnectTimeout (int millies)
     Sets the connect timeout.
     
    override void SendInterrogationCommand (CauseOfTransmission cot, int ca, byte qoi)
     Sends the interrogation command.
     
    override void SendCounterInterrogationCommand (CauseOfTransmission cot, int ca, byte qcc)
     Sends the counter interrogation command (C_CI_NA_1 typeID: 101)
     
    override void SendReadCommand (int ca, int ioa)
     Sends a read command (C_RD_NA_1 typeID: 102).
     
    override void SendClockSyncCommand (int ca, CP56Time2a time)
     Sends a clock synchronization command (C_CS_NA_1 typeID: 103).
     
    override void SendTestCommand (int ca)
     Sends a test command (C_TS_NA_1 typeID: 104).
     
    override void SendTestCommandWithCP56Time2a (int ca, ushort tsc, CP56Time2a time)
     Sends a test command with CP56Time2a time (C_TS_TA_1 typeID: 107).
     
    override void SendResetProcessCommand (CauseOfTransmission cot, int ca, byte qrp)
     Sends a reset process command (C_RP_NA_1 typeID: 105).
     
    override void SendDelayAcquisitionCommand (CauseOfTransmission cot, int ca, CP16Time2a delay)
     Sends a delay acquisition command (C_CD_NA_1 typeID: 106).
     
    override void SendControlCommand (CauseOfTransmission cot, int ca, InformationObject sc)
     Sends the control command.
     
    override void SendASDU (ASDU asdu)
     Sends an arbitrary ASDU to the connected slave.
     
    -override ApplicationLayerParameters GetApplicationLayerParameters ()
     
    -void SendStartDT ()
     Start data transmission on this connection.
     
    -void SendStopDT ()
     Stop data transmission on this connection.
     
    void Connect ()
     Connect this instance.
     
    void ConnectAsync ()
     Connects to the server (outstation). This is a non-blocking call. Before using the connection you have to check if the connection is already connected and running.
     
    X509Certificate LocalCertificateSelectionCallback (object sender, string targetHost, X509CertificateCollection localCertificates, X509Certificate remoteCertificate, string[] acceptableIssuers)
     Callback function for selecting a local certificate during an SSL/TLS handshake.
     
    -void Cancel ()
     
    -void Close ()
     
    void SetASDUReceivedHandler (ASDUReceivedHandler handler, object parameter)
     Set the ASDUReceivedHandler. This handler is invoked whenever a new ASDU is received.
     
    void SetConnectionHandler (ConnectionHandler handler, object parameter)
     Sets the connection handler. The connection handler is called when the connection is established or closed.
     
    override void SetReceivedRawMessageHandler (RawMessageHandler handler, object parameter)
     Sets the raw message handler. This is a callback to intercept raw messages received.
     
    override void SetSentRawMessageHandler (RawMessageHandler handler, object parameter)
     Sets the sent message handler. This is a callback to intercept the sent raw messages.
     
    bool IsTransmitBufferFull ()
     Determines whether the transmit (send) buffer is full. If true the next send command will throw a ConnectionException.
     
    override void GetFile (int ca, int ioa, NameOfFile nof, IFileReceiver receiver)
     Initiates a request to retrieve a file from the remote system.
     
    void GetFile (int ca, int ioa, NameOfFile nof, IFileReceiver receiver, int timeout)
     Initiates a request to retrieve a file from the remote system with a specified timeout.
     
    override void SendFile (int ca, int ioa, NameOfFile nof, IFileProvider fileProvider)
     Initiates a request to send a file to the remote system.
     
    void GetDirectory (int ca)
     Requests the directory listing from the remote system.
     
    - Public Member Functions inherited from lib60870.CS101.Master
    void SendInterrogationCommand (CauseOfTransmission cot, int ca, byte qoi)
     Sends the interrogation command.
     
    void SendCounterInterrogationCommand (CauseOfTransmission cot, int ca, byte qcc)
     Sends the counter interrogation command (C_CI_NA_1 typeID: 101)
     
    void SendReadCommand (int ca, int ioa)
     Sends a read command (C_RD_NA_1 typeID: 102).
     
    void SendClockSyncCommand (int ca, CP56Time2a time)
     Sends a clock synchronization command (C_CS_NA_1 typeID: 103).
     
    void SendTestCommand (int ca)
     Sends a test command (C_TS_NA_1 typeID: 104).
     
    void SendTestCommandWithCP56Time2a (int ca, ushort tsc, CP56Time2a time)
     Sends a test command with CP56Time2a time (C_TS_TA_1 typeID: 107).
     
    void SendResetProcessCommand (CauseOfTransmission cot, int ca, byte qrp)
     Sends a reset process command (C_RP_NA_1 typeID: 105).
     
    void SendDelayAcquisitionCommand (CauseOfTransmission cot, int ca, CP16Time2a delay)
     Sends a delay acquisition command (C_CD_NA_1 typeID: 106).
     
    void SendControlCommand (CauseOfTransmission cot, int ca, InformationObject sc)
     Sends the control command.
     
    void SendASDU (ASDU asdu)
     Sends an arbitrary ASDU to the connected slave.
     
    void GetFile (int ca, int ioa, NameOfFile nof, IFileReceiver receiver)
     Read the file from slave (upload file)
     
    void SendFile (int ca, int ioa, NameOfFile nof, IFileProvider fileProvider)
     Sends the file to slave (download file)
     
    ApplicationLayerParameters GetApplicationLayerParameters ()
     Get the application layer parameters used by this master instance.
     
    void SetReceivedRawMessageHandler (RawMessageHandler handler, object parameter)
     Sets the raw message handler for received messages.
     
    void SetSentRawMessageHandler (RawMessageHandler handler, object parameter)
     Sets the sent message handler for sent messages.
     
    - - - - - - - - - - - - - -

    -Protected Member Functions

    -void SendStartDT_CON ()
     Start application layer data transmission on this connection.
     
    -void SendStopDT_CON ()
     Sends a STOPDT_CON message to the remote server if the connection is active.
     
    -void SendTestFR_ACT ()
     Sends a TESTFR_ACT message to the remote server if the connection is active.
     
    -void SendTestFR_CON ()
     Sends a TESTFR_CON message to the remote server if the connection is active.
     
    - - - - - - -

    -Protected Attributes

    -int tcpPort
     
    - Protected Attributes inherited from lib60870.CS101.Master
    -bool debugOutput
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    -string LocalIpAddress [get, set]
     Set the local IP address for the local connection endpoint.
     
    -int LocalTcpPort [get, set]
     Set the TCP (source) port for the local connection endpoint (0 to automatically select a source port)
     
    bool UseSendMessageQueue [get, set]
     Gets or sets a value indicating whether this lib60870.Connection use send message queue.
     
    int SendSequenceNumber [get, set]
     Gets or sets the send sequence number N(S). WARNING: For test purposes only! Do net set in real application!
     
    -bool CheckSequenceNumbers [get, set]
     
    int ReceiveSequenceNumber [get, set]
     Gets or sets the receive sequence number N(R). WARNING: For test purposes only! Do net set in real application!
     
    bool Autostart [get, set]
     Gets or sets a value indicating whether this lib60870.Connection is automatically sends a STARTDT_ACT message on startup.
     
    -ApplicationLayerParameters Parameters [get]
     
    -int ConnectTimeout [get, set]
     Timeout for connection establishment in milliseconds (ms)
     
    -int ReceiveTimeout [get, set]
     Maximum allowed time for receiving a single message.
     
    bool IsRunning [get]
     Gets a value indicating whether this T:lib60870.CS104.Connection is running(connected).
     
    - Properties inherited from lib60870.CS101.Master
    -bool DebugOutput [get, set]
     
    -

    Detailed Description

    -

    A single connection to a CS 104 (IEC 60870-5-104) server. Implements the Master interface.

    -

    Constructor & Destructor Documentation

    - -

    ◆ Connection() [1/5]

    - -
    -
    - - - - - - - - - - - -
    lib60870.CS104.Connection.Connection (string hostname,
    int tcpPort = 2404 )
    -
    - -

    Initializes a new instance of the lib60870.CS104.Connection class.

    -
    Parameters
    - - - -
    hostnamehostname of IP address of the CS 104 server
    tcpPortTCP port of the CS 104 server
    -
    -
    - -
    -
    - -

    ◆ Connection() [2/5]

    - -
    -
    - - - - - - - - - - - - - - - - -
    lib60870.CS104.Connection.Connection (string hostname,
    APCIParameters apciParameters,
    ApplicationLayerParameters alParameters )
    -
    - -

    Initializes a new instance of the lib60870.CS104.Connection class.

    -
    Parameters
    - - - - -
    hostnamehostname of IP address of the CS 104 server
    apciParametersAPCI parameters.
    alParametersapplication layer parameters.
    -
    -
    - -
    -
    - -

    ◆ Connection() [3/5]

    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    lib60870.CS104.Connection.Connection (string hostname,
    int tcpPort,
    APCIParameters apciParameters,
    ApplicationLayerParameters alParameters )
    -
    - -

    Initializes a new instance of the lib60870.CS104.Connection class.

    -
    Parameters
    - - - - - -
    hostnamehostname of IP address of the CS 104 server
    tcpPortTCP port of the CS 104 server
    apciParametersAPCI parameters.
    alParametersapplication layer parameters.
    -
    -
    - -
    -
    - -

    ◆ Connection() [4/5]

    - -
    -
    - - - - - - - - - - - - - - - - -
    lib60870.CS104.Connection.Connection (string hostname,
    TlsSecurityInformation tlsInfo,
    int tcpPort = 19998 )
    -
    - -

    Initializes a new instance of the lib60870.CS104.Connection class using TLS.

    -
    Parameters
    - - - - -
    hostnamehostname of IP address of the CS 104 server
    tlsInfoTLS setup
    tcpPortTCP port of the CS 104 server
    -
    -
    - -
    -
    - -

    ◆ Connection() [5/5]

    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    lib60870.CS104.Connection.Connection (string hostname,
    int tcpPort,
    APCIParameters apciParameters,
    ApplicationLayerParameters alParameters,
    TlsSecurityInformation tlsInfo )
    -
    - -

    Initializes a new instance of the lib60870.CS104.Connection class using TLS.

    -
    Parameters
    - - - - - - -
    hostnamehostname of IP address of the CS 104 server
    tcpPortTCP port of the CS 104 server
    apciParametersAPCI parameters.
    alParametersapplication layer parameters.
    tlsInfoTLS setup
    -
    -
    - -
    -
    -

    Member Function Documentation

    - -

    ◆ Connect()

    - -
    -
    - - - - - - - -
    void lib60870.CS104.Connection.Connect ()
    -
    - -

    Connect this instance.

    -

    The function will throw a SocketException if the connection attempt is rejected or timed out.

    Exceptions
    - - -
    ConnectionExceptiondescription
    -
    -
    - -
    -
    - -

    ◆ ConnectAsync()

    - -
    -
    - - - - - - - -
    void lib60870.CS104.Connection.ConnectAsync ()
    -
    - -

    Connects to the server (outstation). This is a non-blocking call. Before using the connection you have to check if the connection is already connected and running.

    -
    Exceptions
    - - -
    ConnectionExceptiondescription
    -
    -
    - -
    -
    - -

    ◆ GetDirectory()

    - -
    -
    - - - - - - - -
    void lib60870.CS104.Connection.GetDirectory (int ca)
    -
    - -

    Requests the directory listing from the remote system.

    -
    Parameters
    - - -
    caThe communication address of the remote system.
    -
    -
    - -
    -
    - -

    ◆ GetFile() [1/2]

    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    override void lib60870.CS104.Connection.GetFile (int ca,
    int ioa,
    NameOfFile nof,
    IFileReceiver receiver )
    -
    - -

    Initiates a request to retrieve a file from the remote system.

    -
    Parameters
    - - - - - -
    caThe communication address of the remote system.
    ioaThe information object address for the file.
    nofThe name of the file to be retrieved.
    receiverThe receiver implementation to handle the file data.
    -
    -
    - -
    -
    - -

    ◆ GetFile() [2/2]

    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    void lib60870.CS104.Connection.GetFile (int ca,
    int ioa,
    NameOfFile nof,
    IFileReceiver receiver,
    int timeout )
    -
    - -

    Initiates a request to retrieve a file from the remote system with a specified timeout.

    -
    Parameters
    - - - - - - -
    caThe communication address of the remote system.
    ioaThe information object address for the file.
    nofThe name of the file to be retrieved.
    receiverThe receiver implementation to handle the file data.
    timeoutThe timeout duration in milliseconds for the file request.
    -
    -
    - -
    -
    - -

    ◆ GetStatistics()

    - -
    -
    - - - - - - - -
    ConnectionStatistics lib60870.CS104.Connection.GetStatistics ()
    -
    - -

    Gets the conenction statistics.

    -
    Returns
    The connection statistics.
    - -
    -
    - -

    ◆ IsTransmitBufferFull()

    - -
    -
    - - - - - - - -
    bool lib60870.CS104.Connection.IsTransmitBufferFull ()
    -
    - -

    Determines whether the transmit (send) buffer is full. If true the next send command will throw a ConnectionException.

    -
    Returns
    true if this instance is send buffer full; otherwise, false.
    - -
    -
    - -

    ◆ LocalCertificateSelectionCallback()

    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    X509Certificate lib60870.CS104.Connection.LocalCertificateSelectionCallback (object sender,
    string targetHost,
    X509CertificateCollection localCertificates,
    X509Certificate remoteCertificate,
    string[] acceptableIssuers )
    -
    - -

    Callback function for selecting a local certificate during an SSL/TLS handshake.

    -
    Parameters
    - - - - - - -
    senderThe source of the certificate selection request (typically the client in an SSL/TLS connection).
    targetHostThe name of the server being connected to (host name or IP address).
    localCertificatesThe collection of local certificates available for selection.
    remoteCertificateThe remote server's certificate being validated (not used in this implementation).
    acceptableIssuersA list of acceptable issuers for the certificate (not used in this implementation).
    -
    -
    -
    Returns
    The local certificate to be used for the SSL/TLS connection. In this case, the first certificate in the collection.
    - -
    -
    - -

    ◆ SendASDU()

    - -
    -
    - - - - - - - -
    override void lib60870.CS104.Connection.SendASDU (ASDU asdu)
    -
    - -

    Sends an arbitrary ASDU to the connected slave.

    -
    Parameters
    - - -
    asduThe ASDU to send
    -
    -
    - -
    -
    - -

    ◆ SendClockSyncCommand()

    - -
    -
    - - - - - - - - - - - -
    override void lib60870.CS104.Connection.SendClockSyncCommand (int ca,
    CP56Time2a time )
    -
    - -

    Sends a clock synchronization command (C_CS_NA_1 typeID: 103).

    -
    Parameters
    - - - -
    caCommon address
    timethe new time to set
    -
    -
    -
    Exceptions
    - - -
    ConnectionExceptiondescription
    -
    -
    - -
    -
    - -

    ◆ SendControlCommand()

    - -
    -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS104.Connection.SendControlCommand (CauseOfTransmission cot,
    int ca,
    InformationObject sc )
    -
    - -

    Sends the control command.

    -

    The type ID has to match the type of the InformationObject!

    -

    C_SC_NA_1 -> SingleCommand C_DC_NA_1 -> DoubleCommand C_RC_NA_1 -> StepCommand C_SC_TA_1 -> SingleCommandWithCP56Time2a C_SE_NA_1 -> SetpointCommandNormalized C_SE_NB_1 -> SetpointCommandScaled C_SE_NC_1 -> SetpointCommandShort C_BO_NA_1 -> Bitstring32Command

    -
    Parameters
    - - - - -
    cotCause of transmission (use ACTIVATION to start a control sequence)
    caCommon address
    scInformation object of the command
    -
    -
    -
    Exceptions
    - - -
    ConnectionExceptiondescription
    -
    -
    - -
    -
    - -

    ◆ SendCounterInterrogationCommand()

    - -
    -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS104.Connection.SendCounterInterrogationCommand (CauseOfTransmission cot,
    int ca,
    byte qcc )
    -
    - -

    Sends the counter interrogation command (C_CI_NA_1 typeID: 101)

    -
    Parameters
    - - - - -
    cotCause of transmission
    caCommon address
    qccQualifier of counter interrogation command
    -
    -
    -
    Exceptions
    - - -
    ConnectionExceptiondescription
    -
    -
    - -
    -
    - -

    ◆ SendDelayAcquisitionCommand()

    - -
    -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS104.Connection.SendDelayAcquisitionCommand (CauseOfTransmission cot,
    int ca,
    CP16Time2a delay )
    -
    - -

    Sends a delay acquisition command (C_CD_NA_1 typeID: 106).

    -
    Parameters
    - - - - -
    cotCause of transmission
    caCommon address
    delaydelay for acquisition
    -
    -
    -
    Exceptions
    - - -
    ConnectionExceptiondescription
    -
    -
    - -
    -
    - -

    ◆ SendFile()

    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    override void lib60870.CS104.Connection.SendFile (int ca,
    int ioa,
    NameOfFile nof,
    IFileProvider fileProvider )
    -
    - -

    Initiates a request to send a file to the remote system.

    -
    Parameters
    - - - - - -
    caThe communication address of the remote system.
    ioaThe information object address for the file.
    nofThe name of the file to be sent.
    fileProviderThe file provider interface that supplies the file data to be sent.
    -
    -
    - -
    -
    - -

    ◆ SendInterrogationCommand()

    - -
    -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS104.Connection.SendInterrogationCommand (CauseOfTransmission cot,
    int ca,
    byte qoi )
    -
    - -

    Sends the interrogation command.

    -
    Parameters
    - - - - -
    cotCause of transmission
    caCommon address
    qoiQualifier of interrogation (20 = station interrogation)
    -
    -
    -
    Exceptions
    - - -
    ConnectionExceptiondescription
    -
    -
    - -
    -
    - -

    ◆ SendReadCommand()

    - -
    -
    - - - - - - - - - - - -
    override void lib60870.CS104.Connection.SendReadCommand (int ca,
    int ioa )
    -
    - -

    Sends a read command (C_RD_NA_1 typeID: 102).

    -

    This will send a read command C_RC_NA_1 (102) to the slave/outstation. The COT is always REQUEST (5). It is used to implement the cyclical polling of data application function.

    -
    Parameters
    - - - -
    caCommon address
    ioaInformation object address
    -
    -
    -
    Exceptions
    - - -
    ConnectionExceptiondescription
    -
    -
    - -
    -
    - -

    ◆ SendResetProcessCommand()

    - -
    -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS104.Connection.SendResetProcessCommand (CauseOfTransmission cot,
    int ca,
    byte qrp )
    -
    - -

    Sends a reset process command (C_RP_NA_1 typeID: 105).

    -
    Parameters
    - - - - -
    cotCause of transmission
    caCommon address
    qrpQualifier of reset process command
    -
    -
    -
    Exceptions
    - - -
    ConnectionExceptiondescription
    -
    -
    - -
    -
    - -

    ◆ SendTestCommand()

    - -
    -
    - - - - - - - -
    override void lib60870.CS104.Connection.SendTestCommand (int ca)
    -
    - -

    Sends a test command (C_TS_NA_1 typeID: 104).

    -

    Not required and supported by IEC 60870-5-104.

    -
    Parameters
    - - -
    caCommon address
    -
    -
    -
    Exceptions
    - - -
    ConnectionExceptiondescription
    -
    -
    - -
    -
    - -

    ◆ SendTestCommandWithCP56Time2a()

    - -
    -
    - - - - - - - - - - - - - - - - -
    override void lib60870.CS104.Connection.SendTestCommandWithCP56Time2a (int ca,
    ushort tsc,
    CP56Time2a time )
    -
    - -

    Sends a test command with CP56Time2a time (C_TS_TA_1 typeID: 107).

    -
    Parameters
    - - - - -
    caCommon address
    tsctest sequence number
    timetest timestamp
    -
    -
    -
    Exceptions
    - - -
    ConnectionExceptiondescription
    -
    -
    - -
    -
    - -

    ◆ SetASDUReceivedHandler()

    - -
    -
    - - - - - - - - - - - -
    void lib60870.CS104.Connection.SetASDUReceivedHandler (ASDUReceivedHandler handler,
    object parameter )
    -
    - -

    Set the ASDUReceivedHandler. This handler is invoked whenever a new ASDU is received.

    -
    Parameters
    - - - -
    handlerthe handler to be called
    parameteruser provided parameter that is passed to the handler
    -
    -
    - -
    -
    - -

    ◆ SetConnectionHandler()

    - -
    -
    - - - - - - - - - - - -
    void lib60870.CS104.Connection.SetConnectionHandler (ConnectionHandler handler,
    object parameter )
    -
    - -

    Sets the connection handler. The connection handler is called when the connection is established or closed.

    -
    Parameters
    - - - -
    handlerthe handler to be called
    parameteruser provided parameter that is passed to the handler
    -
    -
    - -
    -
    - -

    ◆ SetConnectTimeout()

    - -
    -
    - - - - - - - -
    void lib60870.CS104.Connection.SetConnectTimeout (int millies)
    -
    - -

    Sets the connect timeout.

    -
    Parameters
    - - -
    milliestimeout value in milliseconds (ms)
    -
    -
    - -
    -
    - -

    ◆ SetReceivedRawMessageHandler()

    - -
    -
    - - - - - - - - - - - -
    override void lib60870.CS104.Connection.SetReceivedRawMessageHandler (RawMessageHandler handler,
    object parameter )
    -
    - -

    Sets the raw message handler. This is a callback to intercept raw messages received.

    -
    Parameters
    - - - -
    handlerHandler/delegate that will be invoked when a message is received
    parameterwill be passed to the delegate
    -
    -
    - -
    -
    - -

    ◆ SetSentRawMessageHandler()

    - -
    -
    - - - - - - - - - - - -
    override void lib60870.CS104.Connection.SetSentRawMessageHandler (RawMessageHandler handler,
    object parameter )
    -
    - -

    Sets the sent message handler. This is a callback to intercept the sent raw messages.

    -
    Parameters
    - - - -
    handlerHandler/delegate that will be invoked when a message is sent<
    parameterwill be passed to the delegate
    -
    -
    - -
    -
    - -

    ◆ SetTlsSecurity()

    - -
    -
    - - - - - - - -
    void lib60870.CS104.Connection.SetTlsSecurity (TlsSecurityInformation securityInfo)
    -
    - -

    Set the security parameters for TLS.

    -
    Parameters
    - - -
    securityInfoSecurity info.
    -
    -
    - -
    -
    -

    Property Documentation

    - -

    ◆ Autostart

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS104.Connection.Autostart
    -
    -getset
    -
    - -

    Gets or sets a value indicating whether this lib60870.Connection is automatically sends a STARTDT_ACT message on startup.

    -

    true to send STARTDT_ACT message on startup; otherwise, false.

    - -
    -
    - -

    ◆ IsRunning

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS104.Connection.IsRunning
    -
    -get
    -
    - -

    Gets a value indicating whether this T:lib60870.CS104.Connection is running(connected).

    -

    true if is running/connected; otherwise, false.

    - -
    -
    - -

    ◆ ReceiveSequenceNumber

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CS104.Connection.ReceiveSequenceNumber
    -
    -getset
    -
    - -

    Gets or sets the receive sequence number N(R). WARNING: For test purposes only! Do net set in real application!

    -

    The receive sequence number N(R)

    - -
    -
    - -

    ◆ SendSequenceNumber

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CS104.Connection.SendSequenceNumber
    -
    -getset
    -
    - -

    Gets or sets the send sequence number N(S). WARNING: For test purposes only! Do net set in real application!

    -

    The send sequence number N(S)

    - -
    -
    - -

    ◆ UseSendMessageQueue

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS104.Connection.UseSendMessageQueue
    -
    -getset
    -
    - -

    Gets or sets a value indicating whether this lib60870.Connection use send message queue.

    -

    If true the Connection stores the ASDUs to be sent in a Queue when the connection cannot send ASDUs. This is the case when the counterpart (slave/server) is (temporarily) not able to handle new message, or the slave did not confirm the reception of the ASDUs for other reasons. If false the ASDU will be ignored and a lib60870.ConnectionException will be thrown in this case.

    -

    true if use send message queue; otherwise, false.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS104/Connection.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection.js deleted file mode 100644 index 3cd5427..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection.js +++ /dev/null @@ -1,48 +0,0 @@ -var classlib60870_1_1_c_s104_1_1_connection = -[ - [ "Connection", "classlib60870_1_1_c_s104_1_1_connection.html#a6fe992399ec28f325cb953737e4006a0", null ], - [ "Connection", "classlib60870_1_1_c_s104_1_1_connection.html#a3eae55571e202eb6736600f1e77ebe39", null ], - [ "Connection", "classlib60870_1_1_c_s104_1_1_connection.html#a02efd3de4daa87455c94621c8a225eda", null ], - [ "Connection", "classlib60870_1_1_c_s104_1_1_connection.html#ab6fa4b93d7a17e5eb0eabb97e0e8360f", null ], - [ "Connection", "classlib60870_1_1_c_s104_1_1_connection.html#a54aa828ed44ffbc63fdd71d3860bf541", null ], - [ "Connect", "classlib60870_1_1_c_s104_1_1_connection.html#a2f21059cd28bf0a85f9ed4a666c6e96f", null ], - [ "ConnectAsync", "classlib60870_1_1_c_s104_1_1_connection.html#af8aed177bd279389527cbfa8eede3ba6", null ], - [ "GetDirectory", "classlib60870_1_1_c_s104_1_1_connection.html#a131c3dd3059b67c6ec0b2351c5e1e50c", null ], - [ "GetFile", "classlib60870_1_1_c_s104_1_1_connection.html#adca074f2aa74aae897fbfc85a4bbe6d5", null ], - [ "GetFile", "classlib60870_1_1_c_s104_1_1_connection.html#a25c9f162dfde01896bb30e8f61092183", null ], - [ "GetStatistics", "classlib60870_1_1_c_s104_1_1_connection.html#a5867e9bda4cf3d6647ebf50603e1be17", null ], - [ "IsTransmitBufferFull", "classlib60870_1_1_c_s104_1_1_connection.html#a079f96f5d2be9416e9c0c4518542eb07", null ], - [ "LocalCertificateSelectionCallback", "classlib60870_1_1_c_s104_1_1_connection.html#ab773a1837cbbd532d5406f05b9d3cf3f", null ], - [ "SendASDU", "classlib60870_1_1_c_s104_1_1_connection.html#ac8604cef7b2781cb63a16de0bff9a308", null ], - [ "SendClockSyncCommand", "classlib60870_1_1_c_s104_1_1_connection.html#aa91efa113abc4e69578a487a2a934871", null ], - [ "SendControlCommand", "classlib60870_1_1_c_s104_1_1_connection.html#a5f1458066ec9a11a12ff68c7416071fa", null ], - [ "SendCounterInterrogationCommand", "classlib60870_1_1_c_s104_1_1_connection.html#ae8629df4fb0e9cf3868728e52ec995ca", null ], - [ "SendDelayAcquisitionCommand", "classlib60870_1_1_c_s104_1_1_connection.html#af178dab629740182d7c7e07eb32a4117", null ], - [ "SendFile", "classlib60870_1_1_c_s104_1_1_connection.html#a889e1aef3301cb272286a1279ae6caa3", null ], - [ "SendInterrogationCommand", "classlib60870_1_1_c_s104_1_1_connection.html#a25c57d614b315bad886edbaead69bd3d", null ], - [ "SendReadCommand", "classlib60870_1_1_c_s104_1_1_connection.html#aeaa8a8dbf8e2449d0222837b9d5ae3d8", null ], - [ "SendResetProcessCommand", "classlib60870_1_1_c_s104_1_1_connection.html#ab615b3065cf5248d9b9951c4e178fa80", null ], - [ "SendStartDT", "classlib60870_1_1_c_s104_1_1_connection.html#a57d40edfe14bfe66f832a7647e3173ae", null ], - [ "SendStartDT_CON", "classlib60870_1_1_c_s104_1_1_connection.html#a65d8586e819b9c537b2461611b0bb9ca", null ], - [ "SendStopDT", "classlib60870_1_1_c_s104_1_1_connection.html#a2510773333d6aaea354c5730f2bc139f", null ], - [ "SendStopDT_CON", "classlib60870_1_1_c_s104_1_1_connection.html#a6723565d01d05539a320810217955743", null ], - [ "SendTestCommand", "classlib60870_1_1_c_s104_1_1_connection.html#a310efefcea197178942abe509b04f463", null ], - [ "SendTestCommandWithCP56Time2a", "classlib60870_1_1_c_s104_1_1_connection.html#a3d38dafcc825eb9bba7258c2525a56ad", null ], - [ "SendTestFR_ACT", "classlib60870_1_1_c_s104_1_1_connection.html#afe81514340488a718a49706233816052", null ], - [ "SendTestFR_CON", "classlib60870_1_1_c_s104_1_1_connection.html#a876db462369040f272cddd144833ab56", null ], - [ "SetASDUReceivedHandler", "classlib60870_1_1_c_s104_1_1_connection.html#a7fd6fb3ca802d91197f1927f2e4f8712", null ], - [ "SetConnectionHandler", "classlib60870_1_1_c_s104_1_1_connection.html#afa545f647708d76bc23b3e5cbad1ac46", null ], - [ "SetConnectTimeout", "classlib60870_1_1_c_s104_1_1_connection.html#af5de8a91a2f77bfa69421b3e3da9276e", null ], - [ "SetReceivedRawMessageHandler", "classlib60870_1_1_c_s104_1_1_connection.html#a54fa6f1012457a6e0f492441cc4bfa23", null ], - [ "SetSentRawMessageHandler", "classlib60870_1_1_c_s104_1_1_connection.html#a787c8ff4943b9991328550f69807ef6e", null ], - [ "SetTlsSecurity", "classlib60870_1_1_c_s104_1_1_connection.html#a33eae01473eb5dc6545a74601b3d9a85", null ], - [ "Autostart", "classlib60870_1_1_c_s104_1_1_connection.html#aa941946c92bfe52f71c137c3fbf6d601", null ], - [ "ConnectTimeout", "classlib60870_1_1_c_s104_1_1_connection.html#a5bc80935ee36a7bcca2c4807f0abeed4", null ], - [ "IsRunning", "classlib60870_1_1_c_s104_1_1_connection.html#a83f3dfb64fa61b1d3fef93e938c692a1", null ], - [ "LocalIpAddress", "classlib60870_1_1_c_s104_1_1_connection.html#abfa6d1581b6702a9f1dbdb96a79f5bc3", null ], - [ "LocalTcpPort", "classlib60870_1_1_c_s104_1_1_connection.html#a871e51aa4130ab9185014a4a845fdd2a", null ], - [ "ReceiveSequenceNumber", "classlib60870_1_1_c_s104_1_1_connection.html#ab6a705b8f4d600160fa842031363e63e", null ], - [ "ReceiveTimeout", "classlib60870_1_1_c_s104_1_1_connection.html#a3bf1bdcc082cd5347acb0fcb29078000", null ], - [ "SendSequenceNumber", "classlib60870_1_1_c_s104_1_1_connection.html#a38bffb6d3d17033d40383529aa69c105", null ], - [ "UseSendMessageQueue", "classlib60870_1_1_c_s104_1_1_connection.html#a452b4617dc369f3e9d6f509a0634fc21", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection__coll__graph.dot deleted file mode 100644 index a74bf13..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS104.Connection" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS104.Connection",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="A single connection to a CS 104 (IEC 60870-5-104) server. Implements the Master interface."]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="Master",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_master.html",tooltip="Common interface for CS104 and CS101 balanced and unbalanced master."]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection__inherit__graph.dot deleted file mode 100644 index a74bf13..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS104.Connection" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS104.Connection",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="A single connection to a CS 104 (IEC 60870-5-104) server. Implements the Master interface."]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="Master",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_master.html",tooltip="Common interface for CS104 and CS101 balanced and unbalanced master."]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection_statistics-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection_statistics-members.html deleted file mode 100644 index db9655a..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection_statistics-members.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS104.ConnectionStatistics Member List
    -
    - -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection_statistics.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection_statistics.html deleted file mode 100644 index 31a4a3f..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection_statistics.html +++ /dev/null @@ -1,242 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS104.ConnectionStatistics Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS104.ConnectionStatistics Class Reference
    -
    -
    - -

    Provides some Connection statistics. - More...

    - - - - - - - - - - - - - - -

    -Properties

    int SentMsgCounter [get, set]
     Gets or sets the sent message counter.
     
    int RcvdMsgCounter [get, set]
     Gets or sets the received message counter.
     
    int RcvdTestFrActCounter [get, set]
     Counter for the TEST_FR_ACT messages received.
     
    int RcvdTestFrConCounter [get, set]
     Counter for the TEST_FR_CON messages received.
     
    -

    Detailed Description

    -

    Provides some Connection statistics.

    -

    Property Documentation

    - -

    ◆ RcvdMsgCounter

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CS104.ConnectionStatistics.RcvdMsgCounter
    -
    -getset
    -
    - -

    Gets or sets the received message counter.

    -

    The received message counter.

    - -
    -
    - -

    ◆ RcvdTestFrActCounter

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CS104.ConnectionStatistics.RcvdTestFrActCounter
    -
    -getset
    -
    - -

    Counter for the TEST_FR_ACT messages received.

    -

    The TEST_FR_ACT counter.

    - -
    -
    - -

    ◆ RcvdTestFrConCounter

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CS104.ConnectionStatistics.RcvdTestFrConCounter
    -
    -getset
    -
    - -

    Counter for the TEST_FR_CON messages received.

    -

    The TEST_FR_CON counter.

    - -
    -
    - -

    ◆ SentMsgCounter

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CS104.ConnectionStatistics.SentMsgCounter
    -
    -getset
    -
    - -

    Gets or sets the sent message counter.

    -

    The sent message counter.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS104/Connection.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection_statistics.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection_statistics.js deleted file mode 100644 index 0b57243..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_connection_statistics.js +++ /dev/null @@ -1,7 +0,0 @@ -var classlib60870_1_1_c_s104_1_1_connection_statistics = -[ - [ "RcvdMsgCounter", "classlib60870_1_1_c_s104_1_1_connection_statistics.html#a763d4accdb60725988746edc43675f2e", null ], - [ "RcvdTestFrActCounter", "classlib60870_1_1_c_s104_1_1_connection_statistics.html#aba25451b06261758d07cc6d0f64292bd", null ], - [ "RcvdTestFrConCounter", "classlib60870_1_1_c_s104_1_1_connection_statistics.html#a4aef0532af04bf8cc51ab76069845eb8", null ], - [ "SentMsgCounter", "classlib60870_1_1_c_s104_1_1_connection_statistics.html#ad04c56b6a2a9520d5296c56d12f2b5b0", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group-members.html deleted file mode 100644 index c7ba699..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group-members.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS104.RedundancyGroup Member List
    -
    - -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group.html deleted file mode 100644 index 881a7c6..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group.html +++ /dev/null @@ -1,309 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS104.RedundancyGroup Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS104.RedundancyGroup Class Reference
    -
    -
    - -

    Representation of a redundancy group. A redundancy group is a group of connections that share a unique event queue. Only one connection in a redundancy group can be active. - More...

    -
    -Collaboration diagram for lib60870.CS104.RedundancyGroup:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - -

    -Public Member Functions

     RedundancyGroup (string name)
     Initializes a new instance of the lib60870.CS104.RedundancyGroup class.
     
    void AddAllowedClient (IPAddress ipAddress)
     Adds a client specified by the IP address.
     
    void AddAllowedClient (string ipString)
     Adds a client specified by the IP address.
     
    void EnqueueASDU (ASDU asdu)
     Enqueues the ASDU to the redundancy group specific message queue. This function is called by lib60870.CS104.Server.EnqueueASDU. If the Server.EnqueuASDU method is used this method should not be called!
     
    - - - - - - - -

    -Properties

    string Name [get]
     Gets the name.
     
    bool IsCatchAll [get]
     Gets a value indicating whether this instance is a catch all group. All clients that are not explicitely assigned to a specific group are handled by the catch all group.
     
    -

    Detailed Description

    -

    Representation of a redundancy group. A redundancy group is a group of connections that share a unique event queue. Only one connection in a redundancy group can be active.

    -

    Constructor & Destructor Documentation

    - -

    ◆ RedundancyGroup()

    - -
    -
    - - - - - - - -
    lib60870.CS104.RedundancyGroup.RedundancyGroup (string name)
    -
    - -

    Initializes a new instance of the lib60870.CS104.RedundancyGroup class.

    -
    Parameters
    - - -
    namean optional name for debugging purposes.
    -
    -
    - -
    -
    -

    Member Function Documentation

    - -

    ◆ AddAllowedClient() [1/2]

    - -
    -
    - - - - - - - -
    void lib60870.CS104.RedundancyGroup.AddAllowedClient (IPAddress ipAddress)
    -
    - -

    Adds a client specified by the IP address.

    -
    Parameters
    - - -
    ipAddressIP address of the client.
    -
    -
    - -
    -
    - -

    ◆ AddAllowedClient() [2/2]

    - -
    -
    - - - - - - - -
    void lib60870.CS104.RedundancyGroup.AddAllowedClient (string ipString)
    -
    - -

    Adds a client specified by the IP address.

    -
    Parameters
    - - -
    ipAddressIP address of the client.
    -
    -
    - -
    -
    - -

    ◆ EnqueueASDU()

    - -
    -
    - - - - - - - -
    void lib60870.CS104.RedundancyGroup.EnqueueASDU (ASDU asdu)
    -
    - -

    Enqueues the ASDU to the redundancy group specific message queue. This function is called by lib60870.CS104.Server.EnqueueASDU. If the Server.EnqueuASDU method is used this method should not be called!

    -
    Parameters
    - - -
    asduThe ASDU to enqueue.
    -
    -
    - -
    -
    -

    Property Documentation

    - -

    ◆ IsCatchAll

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS104.RedundancyGroup.IsCatchAll
    -
    -get
    -
    - -

    Gets a value indicating whether this instance is a catch all group. All clients that are not explicitely assigned to a specific group are handled by the catch all group.

    -

    true if this instance is a catch all group; otherwise, false.

    - -
    -
    - -

    ◆ Name

    - -
    -
    - - - - - -
    - - - - -
    string lib60870.CS104.RedundancyGroup.Name
    -
    -get
    -
    - -

    Gets the name.

    -

    the name, or null if no name is set

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS104/Server.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group.js deleted file mode 100644 index dee9b60..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group.js +++ /dev/null @@ -1,9 +0,0 @@ -var classlib60870_1_1_c_s104_1_1_redundancy_group = -[ - [ "RedundancyGroup", "classlib60870_1_1_c_s104_1_1_redundancy_group.html#a3bfc0c71f3919a451288a9b2581e6560", null ], - [ "AddAllowedClient", "classlib60870_1_1_c_s104_1_1_redundancy_group.html#a971ee15ef8b50bf62d75e552dbc5a118", null ], - [ "AddAllowedClient", "classlib60870_1_1_c_s104_1_1_redundancy_group.html#a30f6faca907a9496271e7c43e12ba220", null ], - [ "EnqueueASDU", "classlib60870_1_1_c_s104_1_1_redundancy_group.html#af72be4629377a6c78f4f9733f4e251b4", null ], - [ "IsCatchAll", "classlib60870_1_1_c_s104_1_1_redundancy_group.html#aa09df33fcd23dcf486800f45f3d41d32", null ], - [ "Name", "classlib60870_1_1_c_s104_1_1_redundancy_group.html#ab5d3a9a8d2fcca1e07fbb547cd072248", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group__coll__graph.dot deleted file mode 100644 index 9e3db46..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_redundancy_group__coll__graph.dot +++ /dev/null @@ -1,16 +0,0 @@ -digraph "lib60870.CS104.RedundancyGroup" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS104.Redundancy\lGroup",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Representation of a redundancy group. A redundancy group is a group of connections that share a uniqu..."]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=" asduQueue",fontcolor="grey" ]; - Node2 [id="Node000002",label="lib60870.ASDUQueue",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_a_s_d_u_queue.html",tooltip=" "]; - Node3 -> Node1 [id="edge2_Node000001_Node000003",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=" server",fontcolor="grey" ]; - Node3 [id="Node000003",label="lib60870.CS104.Server",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s104_1_1_server.html",tooltip="This class represents a single IEC 60870-5 server (slave or controlled station). It is also the main ..."]; - Node4 -> Node3 [id="edge3_Node000003_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node4 [id="Node000004",label="CS101::Slave",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_slave.html",tooltip=" "]; - Node5 -> Node4 [id="edge4_Node000004_Node000005",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=" filesAvailable",fontcolor="grey" ]; - Node5 [id="Node000005",label="lib60870.CS101.FilesAvailable",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_files_available.html",tooltip="Represents the available files in a file client or file server."]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server-members.html deleted file mode 100644 index 7c21791..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server-members.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS104.Server Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS104.Server, including all inherited members.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    AddRedundancyGroup(RedundancyGroup redundancyGroup)lib60870.CS104.Server
    asduHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    asduHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    clockSynchronizationHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    clockSynchronizationHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    connectionRequestHandler (defined in lib60870.CS104.Server)lib60870.CS104.Server
    connectionRequestHandlerParameter (defined in lib60870.CS104.Server)lib60870.CS104.Server
    counterInterrogationHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    counterInterrogationHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    DebugOutput (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    debugOutput (defined in lib60870.CS101.Slave)lib60870.CS101.Slaveprotected
    delayAcquisitionHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    delayAcquisitionHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    EnqueueASDU(ASDU asdu)lib60870.CS104.Server
    EnqueueModelib60870.CS104.Server
    filesAvailable (defined in lib60870.CS101.Slave)lib60870.CS101.Slaveprotected
    FileTimeout (defined in lib60870.CS104.Server)lib60870.CS104.Server
    GetAPCIParameters()lib60870.CS104.Server
    GetApplicationLayerParameters()lib60870.CS104.Server
    GetAvailableFiles()lib60870.CS101.Slave
    GetNumberOfQueueEntries(RedundancyGroup redundancyGroup=null) (defined in lib60870.CS104.Server)lib60870.CS104.Server
    interrogationHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    InterrogationHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    IsRunning()lib60870.CS104.Server
    MaxHighPrioQueueSizelib60870.CS104.Server
    MaxOpenConnectionslib60870.CS104.Server
    MaxQueueSizelib60870.CS104.Server
    OpenConnectionslib60870.CS104.Server
    readHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    readHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    ReceiveTimeoutlib60870.CS104.Server
    resetProcessHandler (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    resetProcessHandlerParameter (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    Server()lib60870.CS104.Server
    Server(TlsSecurityInformation securityInfo)lib60870.CS104.Server
    Server(APCIParameters apciParameters, ApplicationLayerParameters alParameters)lib60870.CS104.Server
    Server(APCIParameters apciParameters, ApplicationLayerParameters alParameters, TlsSecurityInformation securityInfo)lib60870.CS104.Server
    ServerModelib60870.CS104.Server
    SetASDUHandler(ASDUHandler handler, object parameter)lib60870.CS101.Slave
    SetClockSynchronizationHandler(ClockSynchronizationHandler handler, object parameter)lib60870.CS101.Slave
    SetConnectionEventHandler(ConnectionEventHandler handler, object parameter)lib60870.CS104.Server
    SetConnectionRequestHandler(ConnectionRequestHandler handler, object parameter)lib60870.CS104.Server
    SetCounterInterrogationHandler(CounterInterrogationHandler handler, object parameter)lib60870.CS101.Slave
    SetDelayAcquisitionHandler(DelayAcquisitionHandler handler, object parameter) (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    SetFileReadyHandler(FileReadyHandler handler, object parameter)lib60870.CS101.Slave
    SetInterrogationHandler(InterrogationHandler handler, object parameter)lib60870.CS101.Slave
    SetLocalAddress(string localAddress)lib60870.CS104.Server
    SetLocalPort(int tcpPort)lib60870.CS104.Server
    SetReadHandler(ReadHandler handler, object parameter)lib60870.CS101.Slave
    SetResetProcessHandler(ResetProcessHandler handler, object parameter) (defined in lib60870.CS101.Slave)lib60870.CS101.Slave
    Start()lib60870.CS104.Server
    Stop()lib60870.CS104.Server
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server.html deleted file mode 100644 index 13233a1..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server.html +++ /dev/null @@ -1,786 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS104.Server Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS104.Server Class Reference
    -
    -
    - -

    This class represents a single IEC 60870-5 server (slave or controlled station). It is also the main access to the CS 104 server API. - More...

    -
    -Inheritance diagram for lib60870.CS104.Server:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.CS104.Server:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    ApplicationLayerParameters GetApplicationLayerParameters ()
     Get active application layer parameters (modify only before starting the server!)
     
    APCIParameters GetAPCIParameters ()
     Get active APCI parameters (modify only before starting the server!)
     
    Server ()
     Create a new server using default connection parameters.
     
     Server (TlsSecurityInformation securityInfo)
     Create a new server using default connection parameters and TLS configuration.
     
     Server (APCIParameters apciParameters, ApplicationLayerParameters alParameters)
     Create a new server using the provided connection parameters.
     
     Server (APCIParameters apciParameters, ApplicationLayerParameters alParameters, TlsSecurityInformation securityInfo)
     Create a new server using the provided connection parameters.
     
    void AddRedundancyGroup (RedundancyGroup redundancyGroup)
     Adds a redundancy group to the server. Each redundancy group has its own event queue.
     
    void SetConnectionRequestHandler (ConnectionRequestHandler handler, object parameter)
     Sets a callback handler for connection request. The user can allow (returning true) or deny (returning false) the connection attempt. If no handler is installed every new connection will be accepted.
     
    void SetConnectionEventHandler (ConnectionEventHandler handler, object parameter)
     Sets the connection event handler. The connection event handler will be called whenever a new connection was opened, closed, activated, or inactivated.
     
    -int GetNumberOfQueueEntries (RedundancyGroup redundancyGroup=null)
     
    void SetLocalAddress (string localAddress)
     Sets the local IP address to bind the server. Default is "0.0.0.0" for all interfaces.
     
    void SetLocalPort (int tcpPort)
     Sets the local TCP port to bind to. Default is 2404, or 19998 when using TLS.
     
    -void Start ()
     Start the server. Listen to client connections.
     
    -void Stop ()
     Stop the server. Close all open client connections.
     
    bool IsRunning ()
     Check if the server is running (listening to client connections and handling connections) or not.
     
    void EnqueueASDU (ASDU asdu)
     Enqueues the ASDU to the transmission queue.
     
    - Public Member Functions inherited from lib60870.CS101.Slave
    void SetInterrogationHandler (InterrogationHandler handler, object parameter)
     Sets a callback for interrogaton requests.
     
    void SetCounterInterrogationHandler (CounterInterrogationHandler handler, object parameter)
     Sets a callback for counter interrogaton requests.
     
    void SetReadHandler (ReadHandler handler, object parameter)
     Sets a callback for read requests.
     
    void SetClockSynchronizationHandler (ClockSynchronizationHandler handler, object parameter)
     Sets a callback for the clock synchronization request.
     
    -void SetResetProcessHandler (ResetProcessHandler handler, object parameter)
     
    -void SetDelayAcquisitionHandler (DelayAcquisitionHandler handler, object parameter)
     
    void SetASDUHandler (ASDUHandler handler, object parameter)
     Sets a callback to handle ASDUs (commands, requests) form clients. This callback can be used when no other callback handles the message from the client/master.
     
    void SetFileReadyHandler (FileReadyHandler handler, object parameter)
     Sets a callback handler that is called when a file ready message is received from a master.
     
    FilesAvailable GetAvailableFiles ()
     Gets the available files that are registered with the file server.
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Attributes

    -ConnectionRequestHandler connectionRequestHandler = null
     
    -object connectionRequestHandlerParameter = null
     
    - Public Attributes inherited from lib60870.CS101.Slave
    -InterrogationHandler interrogationHandler = null
     
    -object InterrogationHandlerParameter = null
     
    -CounterInterrogationHandler counterInterrogationHandler = null
     
    -object counterInterrogationHandlerParameter = null
     
    -ReadHandler readHandler = null
     
    -object readHandlerParameter = null
     
    -ClockSynchronizationHandler clockSynchronizationHandler = null
     
    -object clockSynchronizationHandlerParameter = null
     
    -ResetProcessHandler resetProcessHandler = null
     
    -object resetProcessHandlerParameter = null
     
    -DelayAcquisitionHandler delayAcquisitionHandler = null
     
    -object delayAcquisitionHandlerParameter = null
     
    -ASDUHandler asduHandler = null
     
    -object asduHandlerParameter = null
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    ServerMode ServerMode [get, set]
     Gets or sets the server mode (behavior regarding redundancy groups)
     
    EnqueueMode EnqueueMode [get, set]
     Gets or sets the mode of ASDU queue behaviour. Default mode is EnqueueMode.REMOVE_OLDEST.
     
    int MaxQueueSize [get, set]
     Gets or sets the maximum size of the ASDU queue. Setting this property has no effect after calling the Start method.
     
    int MaxHighPrioQueueSize [get, set]
     Gets or sets the maximum size of the ASDU high priotity queue. Setting this property has no effect after calling the Start method.
     
    int MaxOpenConnections [get, set]
     Gets or sets the maximum number of open TCP connections.
     
    int OpenConnections [get]
     Gets the number of connected master/client stations.
     
    -int ReceiveTimeout [get, set]
     Maximum allowed time for receiving a single message.
     
    -override int FileTimeout [get, set]
     
    - Properties inherited from lib60870.CS101.Slave
    -bool DebugOutput [get, set]
     
    virtual int FileTimeout [get, set]
     Gets or sets the file service timeout.
     
    - - - - - - -

    -Additional Inherited Members

    - Protected Attributes inherited from lib60870.CS101.Slave
    -bool debugOutput
     
    -FilesAvailable filesAvailable = new FilesAvailable()
     
    -

    Detailed Description

    -

    This class represents a single IEC 60870-5 server (slave or controlled station). It is also the main access to the CS 104 server API.

    -

    Constructor & Destructor Documentation

    - -

    ◆ Server() [1/3]

    - -
    -
    - - - - - - - -
    lib60870.CS104.Server.Server (TlsSecurityInformation securityInfo)
    -
    - -

    Create a new server using default connection parameters and TLS configuration.

    -
    Parameters
    - - -
    securityInfoTLS layer configuation, or null when not using TLS
    -
    -
    - -
    -
    - -

    ◆ Server() [2/3]

    - -
    -
    - - - - - - - - - - - -
    lib60870.CS104.Server.Server (APCIParameters apciParameters,
    ApplicationLayerParameters alParameters )
    -
    - -

    Create a new server using the provided connection parameters.

    -
    Parameters
    - - - -
    apciParametersAPCI parameters
    alParametersapplication layer parameters
    -
    -
    - -
    -
    - -

    ◆ Server() [3/3]

    - -
    -
    - - - - - - - - - - - - - - - - -
    lib60870.CS104.Server.Server (APCIParameters apciParameters,
    ApplicationLayerParameters alParameters,
    TlsSecurityInformation securityInfo )
    -
    - -

    Create a new server using the provided connection parameters.

    -
    Parameters
    - - - -
    apciParametersAPCI parameters
    alParametersapplication layer parameters
    -
    -
    - -
    -
    -

    Member Function Documentation

    - -

    ◆ AddRedundancyGroup()

    - -
    -
    - - - - - - - -
    void lib60870.CS104.Server.AddRedundancyGroup (RedundancyGroup redundancyGroup)
    -
    - -

    Adds a redundancy group to the server. Each redundancy group has its own event queue.

    -
    Parameters
    - - -
    redundancyGroupRedundancy group.
    -
    -
    - -
    -
    - -

    ◆ EnqueueASDU()

    - -
    -
    - - - - - - - -
    void lib60870.CS104.Server.EnqueueASDU (ASDU asdu)
    -
    - -

    Enqueues the ASDU to the transmission queue.

    -

    If an active connection exists the ASDU will be sent to the active client immediately. Otherwhise the ASDU will be added to the transmission queue for later transmission.

    Parameters
    - - -
    asduASDU to be sent
    -
    -
    -
    Exceptions
    - - -
    lib60870.CS101.ASDUQueueExceptionwhen the ASDU queue is full and mode is EnqueueMode.THROW_EXCEPTION.
    -
    -
    - -
    -
    - -

    ◆ GetAPCIParameters()

    - -
    -
    - - - - - - - -
    APCIParameters lib60870.CS104.Server.GetAPCIParameters ()
    -
    - -

    Get active APCI parameters (modify only before starting the server!)

    -
    Returns
    APCI parameters object used by the server
    - -
    -
    - -

    ◆ GetApplicationLayerParameters()

    - -
    -
    - - - - - - - -
    ApplicationLayerParameters lib60870.CS104.Server.GetApplicationLayerParameters ()
    -
    - -

    Get active application layer parameters (modify only before starting the server!)

    -
    Returns
    application layer parameters object used by the server
    - -
    -
    - -

    ◆ IsRunning()

    - -
    -
    - - - - - - - -
    bool lib60870.CS104.Server.IsRunning ()
    -
    - -

    Check if the server is running (listening to client connections and handling connections) or not.

    -
    Returns
    true when the server is running, false otherwise
    - -
    -
    - -

    ◆ SetConnectionEventHandler()

    - -
    -
    - - - - - - - - - - - -
    void lib60870.CS104.Server.SetConnectionEventHandler (ConnectionEventHandler handler,
    object parameter )
    -
    - -

    Sets the connection event handler. The connection event handler will be called whenever a new connection was opened, closed, activated, or inactivated.

    -
    Parameters
    - - - -
    handlerHandler.
    parameterParameter.
    -
    -
    - -
    -
    - -

    ◆ SetConnectionRequestHandler()

    - -
    -
    - - - - - - - - - - - -
    void lib60870.CS104.Server.SetConnectionRequestHandler (ConnectionRequestHandler handler,
    object parameter )
    -
    - -

    Sets a callback handler for connection request. The user can allow (returning true) or deny (returning false) the connection attempt. If no handler is installed every new connection will be accepted.

    -
    Parameters
    - - - -
    handlerHandler.
    parameterParameter.
    -
    -
    - -
    -
    - -

    ◆ SetLocalAddress()

    - -
    -
    - - - - - - - -
    void lib60870.CS104.Server.SetLocalAddress (string localAddress)
    -
    - -

    Sets the local IP address to bind the server. Default is "0.0.0.0" for all interfaces.

    -
    Parameters
    - - -
    localAddressLocal IP address or hostname to bind.
    -
    -
    - -
    -
    - -

    ◆ SetLocalPort()

    - -
    -
    - - - - - - - -
    void lib60870.CS104.Server.SetLocalPort (int tcpPort)
    -
    - -

    Sets the local TCP port to bind to. Default is 2404, or 19998 when using TLS.

    -
    Parameters
    - - -
    tcpPortLocal TCP port to bind.
    -
    -
    - -
    -
    -

    Property Documentation

    - -

    ◆ EnqueueMode

    - -
    -
    - - - - - -
    - - - - -
    EnqueueMode lib60870.CS104.Server.EnqueueMode
    -
    -getset
    -
    - -

    Gets or sets the mode of ASDU queue behaviour. Default mode is EnqueueMode.REMOVE_OLDEST.

    -

    the mode of ASDU queue behaviour

    - -
    -
    - -

    ◆ MaxHighPrioQueueSize

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CS104.Server.MaxHighPrioQueueSize
    -
    -getset
    -
    - -

    Gets or sets the maximum size of the ASDU high priotity queue. Setting this property has no effect after calling the Start method.

    -

    The size of the max high priotity queue.

    - -
    -
    - -

    ◆ MaxOpenConnections

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CS104.Server.MaxOpenConnections
    -
    -getset
    -
    - -

    Gets or sets the maximum number of open TCP connections.

    -

    The maximum number of open TCP connections.

    - -
    -
    - -

    ◆ MaxQueueSize

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CS104.Server.MaxQueueSize
    -
    -getset
    -
    - -

    Gets or sets the maximum size of the ASDU queue. Setting this property has no effect after calling the Start method.

    -

    The size of the max queue.

    - -
    -
    - -

    ◆ OpenConnections

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.CS104.Server.OpenConnections
    -
    -get
    -
    - -

    Gets the number of connected master/client stations.

    -

    The number of open connections.

    - -
    -
    - -

    ◆ ServerMode

    - -
    -
    - - - - - -
    - - - - -
    ServerMode lib60870.CS104.Server.ServerMode
    -
    -getset
    -
    - -

    Gets or sets the server mode (behavior regarding redundancy groups)

    -

    The server mode.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS104/Server.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server.js deleted file mode 100644 index d4c00fd..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server.js +++ /dev/null @@ -1,25 +0,0 @@ -var classlib60870_1_1_c_s104_1_1_server = -[ - [ "Server", "classlib60870_1_1_c_s104_1_1_server.html#aae44fa0f507ea4b8d343686a9345e419", null ], - [ "Server", "classlib60870_1_1_c_s104_1_1_server.html#a12b5bdf509e0b569295b8821c016770b", null ], - [ "Server", "classlib60870_1_1_c_s104_1_1_server.html#a4b25619314b9e2586d21d83f3ed9fcd0", null ], - [ "Server", "classlib60870_1_1_c_s104_1_1_server.html#a4a25393ccd928dc4abbb13c14e3579c2", null ], - [ "AddRedundancyGroup", "classlib60870_1_1_c_s104_1_1_server.html#af970d8d63a4d220d54e213250e90eada", null ], - [ "EnqueueASDU", "classlib60870_1_1_c_s104_1_1_server.html#aa6f1a77ab87c08ca663ab88dcf1b9dbe", null ], - [ "GetAPCIParameters", "classlib60870_1_1_c_s104_1_1_server.html#a859b8ac2c4b9cd87efc490173c8cd38a", null ], - [ "GetApplicationLayerParameters", "classlib60870_1_1_c_s104_1_1_server.html#a21f35d1f590dae3b557c413e2f05d01d", null ], - [ "IsRunning", "classlib60870_1_1_c_s104_1_1_server.html#a8d16b6e5d54bee55912a00c0cb3b28fc", null ], - [ "SetConnectionEventHandler", "classlib60870_1_1_c_s104_1_1_server.html#afa4ae496c2260bc6b501a60259c35282", null ], - [ "SetConnectionRequestHandler", "classlib60870_1_1_c_s104_1_1_server.html#a8c3dbeea77158bb5014d9739bb8f1116", null ], - [ "SetLocalAddress", "classlib60870_1_1_c_s104_1_1_server.html#af7db8efa36f1bfc559ac96308a907d07", null ], - [ "SetLocalPort", "classlib60870_1_1_c_s104_1_1_server.html#aa3ddaa0a4c43ca80f35f523d84347753", null ], - [ "Start", "classlib60870_1_1_c_s104_1_1_server.html#af8d37c78f23fafbb74091b7d3d0ed684", null ], - [ "Stop", "classlib60870_1_1_c_s104_1_1_server.html#a07fc33e78e4b8d156e1bbe08170c62cf", null ], - [ "EnqueueMode", "classlib60870_1_1_c_s104_1_1_server.html#a102d175703f4f357e5749265352ce71e", null ], - [ "MaxHighPrioQueueSize", "classlib60870_1_1_c_s104_1_1_server.html#a408a31dd3cf6e781d7295804bd96d767", null ], - [ "MaxOpenConnections", "classlib60870_1_1_c_s104_1_1_server.html#adcea16c6c2db799bc5b6750e82ca2235", null ], - [ "MaxQueueSize", "classlib60870_1_1_c_s104_1_1_server.html#acef2c82d580d17114847df8409f6bf4f", null ], - [ "OpenConnections", "classlib60870_1_1_c_s104_1_1_server.html#a63dda97b27c78743dee7374d66cdda53", null ], - [ "ReceiveTimeout", "classlib60870_1_1_c_s104_1_1_server.html#a5cbb4d451a08d3b381fce39b5bf4ed3e", null ], - [ "ServerMode", "classlib60870_1_1_c_s104_1_1_server.html#a9c05718964db1a69771955715585c4da", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server__coll__graph.dot deleted file mode 100644 index 8840317..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server__coll__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS104.Server" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS104.Server",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="This class represents a single IEC 60870-5 server (slave or controlled station). It is also the main ..."]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="CS101::Slave",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_slave.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=" filesAvailable",fontcolor="grey" ]; - Node3 [id="Node000003",label="lib60870.CS101.FilesAvailable",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_files_available.html",tooltip="Represents the available files in a file client or file server."]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server__inherit__graph.dot deleted file mode 100644 index b2af2fe..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_server__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS104.Server" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS104.Server",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="This class represents a single IEC 60870-5 server (slave or controlled station). It is also the main ..."]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="CS101::Slave",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_slave.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_tls_security_information-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_tls_security_information-members.html deleted file mode 100644 index ce416a4..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_tls_security_information-members.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS104.TlsSecurityInformation Member List
    -
    - -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_tls_security_information.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_tls_security_information.html deleted file mode 100644 index 2f62087..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_tls_security_information.html +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS104.TlsSecurityInformation Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS104.TlsSecurityInformation Class Reference
    -
    -
    - - - - - - - - - - -

    -Public Member Functions

    TlsSecurityInformation (string targetHostName, X509Certificate2 ownCertificate)
     
    TlsSecurityInformation (X509Certificate2 ownCertificate)
     
    -void AddAllowedCertificate (X509Certificate2 allowedCertificate)
     
    -void AddCA (X509Certificate2 caCertificate)
     
    - - - - - - - - - - - - - - - - - - - - -

    -Properties

    bool ChainValidation [get, set]
     Gets or sets a value indicating whether this lib60870.TlsSecurityInformation performs a X509 chain validation against the registered CA certificates.
     
    bool AllowOnlySpecificCertificates [get, set]
     Gets or sets a value indicating whether this lib60870.TlsSecurityInformation allow only specific certificates.
     
    -X509Certificate2 OwnCertificate [get, set]
     
    -List< X509Certificate2 > AllowedCertificates [get, set]
     
    -List< X509Certificate2 > CaCertificates [get]
     
    -string TargetHostName [get]
     
    -SslProtocols TlsVersion [get, set]
     
    RemoteCertificateValidationCallback CertificateValidationCallback [get, set]
     Gets or sets the certificate validation callback.
     
    -

    Property Documentation

    - -

    ◆ AllowOnlySpecificCertificates

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS104.TlsSecurityInformation.AllowOnlySpecificCertificates
    -
    -getset
    -
    - -

    Gets or sets a value indicating whether this lib60870.TlsSecurityInformation allow only specific certificates.

    -

    true if allow only specific certificates; otherwise, false.

    - -
    -
    - -

    ◆ CertificateValidationCallback

    - -
    -
    - - - - - -
    - - - - -
    RemoteCertificateValidationCallback lib60870.CS104.TlsSecurityInformation.CertificateValidationCallback
    -
    -getset
    -
    - -

    Gets or sets the certificate validation callback.

    -

    The certificate validation callback, or null to use the library internal certificate validation callbacks

    - -
    -
    - -

    ◆ ChainValidation

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.CS104.TlsSecurityInformation.ChainValidation
    -
    -getset
    -
    - -

    Gets or sets a value indicating whether this lib60870.TlsSecurityInformation performs a X509 chain validation against the registered CA certificates.

    -

    true if chain validation; otherwise, false.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS104/TlsSecurityInformation.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_tls_security_information.js b/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_tls_security_information.js deleted file mode 100644 index 4da1bdc..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_c_s104_1_1_tls_security_information.js +++ /dev/null @@ -1,6 +0,0 @@ -var classlib60870_1_1_c_s104_1_1_tls_security_information = -[ - [ "AllowOnlySpecificCertificates", "classlib60870_1_1_c_s104_1_1_tls_security_information.html#aecf70336635c0bfe0fe713a5e427fa3e", null ], - [ "CertificateValidationCallback", "classlib60870_1_1_c_s104_1_1_tls_security_information.html#ab90e1e052fa15e1b211109d30529b491", null ], - [ "ChainValidation", "classlib60870_1_1_c_s104_1_1_tls_security_information.html#a2b367122104e8ac1469d6240c427fe86", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception-members.html deleted file mode 100644 index ba0e82f..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception-members.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.ConnectionException Member List
    -
    -
    - -

    This is the complete list of members for lib60870.ConnectionException, including all inherited members.

    - - - -
    ConnectionException(string message) (defined in lib60870.ConnectionException)lib60870.ConnectionException
    ConnectionException(string message, Exception e) (defined in lib60870.ConnectionException)lib60870.ConnectionException
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception.html deleted file mode 100644 index 8019f1a..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.ConnectionException Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.ConnectionException Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.ConnectionException:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.ConnectionException:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - -

    -Public Member Functions

    ConnectionException (string message)
     
    ConnectionException (string message, Exception e)
     
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/ConnectionException.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception__coll__graph.dot deleted file mode 100644 index 5650f01..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.ConnectionException" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.ConnectionException",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="Exception",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception__inherit__graph.dot deleted file mode 100644 index 8a6426f..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_connection_exception__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.ConnectionException" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.ConnectionException",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="Exception",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="lib60870.linklayer.LinkLayer\lBusyException",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1linklayer_1_1_link_layer_busy_exception.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_frame-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_frame-members.html deleted file mode 100644 index 3b857f2..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_frame-members.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.Frame Member List
    -
    -
    - -

    This is the complete list of members for lib60870.Frame, including all inherited members.

    - - - - - - -
    AppendBytes(byte[] bytes) (defined in lib60870.Frame)lib60870.Frame
    GetBuffer() (defined in lib60870.Frame)lib60870.Frame
    GetMsgSize() (defined in lib60870.Frame)lib60870.Frame
    ResetFrame() (defined in lib60870.Frame)lib60870.Frame
    SetNextByte(byte value) (defined in lib60870.Frame)lib60870.Frame
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_frame.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_frame.html deleted file mode 100644 index ff79819..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_frame.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.Frame Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.Frame Class Referenceabstract
    -
    -
    - -

    Abstract class to encode an application layer frame. - More...

    -
    -Inheritance diagram for lib60870.Frame:
    -
    -
    Inheritance graph
    -
    [legend]
    - - - - - - - - - - - - -

    -Public Member Functions

    -void ResetFrame ()
     
    -void SetNextByte (byte value)
     
    -void AppendBytes (byte[] bytes)
     
    -int GetMsgSize ()
     
    -byte[] GetBuffer ()
     
    -

    Detailed Description

    -

    Abstract class to encode an application layer frame.

    -

    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/Frame.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_frame__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1_frame__inherit__graph.dot deleted file mode 100644 index 1a1184b..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_frame__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.Frame" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.Frame",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Abstract class to encode an application layer frame."]; - Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="lib60870.BufferFrame",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_library_common-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_library_common-members.html deleted file mode 100644 index e79f7b2..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_library_common-members.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.LibraryCommon Member List
    -
    -
    - -

    This is the complete list of members for lib60870.LibraryCommon, including all inherited members.

    - - - - - -
    GetLibraryVersionString()lib60870.LibraryCommonstatic
    VERSION_MAJORlib60870.LibraryCommonstatic
    VERSION_MINORlib60870.LibraryCommonstatic
    VERSION_PATCHlib60870.LibraryCommonstatic
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_library_common.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_library_common.html deleted file mode 100644 index 86822c2..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_library_common.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.LibraryCommon Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.LibraryCommon Class Reference
    -
    -
    - -

    Common information functions about the library. - More...

    - - - - - -

    -Static Public Member Functions

    static string GetLibraryVersionString ()
     Gets the library version as string {major}.{minor}.{patch}.
     
    - - - - - - - - - - -

    -Static Public Attributes

    -const int VERSION_MAJOR = 2
     Library major version number.
     
    -const int VERSION_MINOR = 3
     Library minor version number.
     
    -const int VERSION_PATCH = 0
     Library patch number.
     
    -

    Detailed Description

    -

    Common information functions about the library.

    -

    Member Function Documentation

    - -

    ◆ GetLibraryVersionString()

    - -
    -
    - - - - - -
    - - - - - - - -
    static string lib60870.LibraryCommon.GetLibraryVersionString ()
    -
    -static
    -
    - -

    Gets the library version as string {major}.{minor}.{patch}.

    -
    Returns
    The library version as string.
    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/LibraryCommon.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_single_command_qualifier-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_single_command_qualifier-members.html deleted file mode 100644 index 30a7634..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_single_command_qualifier-members.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.SingleCommandQualifier Member List
    -
    -
    - -

    This is the complete list of members for lib60870.SingleCommandQualifier, including all inherited members.

    - - - - - - - -
    GetEncodedValue() (defined in lib60870.SingleCommandQualifier)lib60870.SingleCommandQualifier
    QU (defined in lib60870.SingleCommandQualifier)lib60870.SingleCommandQualifier
    Select (defined in lib60870.SingleCommandQualifier)lib60870.SingleCommandQualifier
    SingleCommandQualifier(byte encodedValue) (defined in lib60870.SingleCommandQualifier)lib60870.SingleCommandQualifier
    SingleCommandQualifier(bool state, bool selectCommand, int qu) (defined in lib60870.SingleCommandQualifier)lib60870.SingleCommandQualifier
    State (defined in lib60870.SingleCommandQualifier)lib60870.SingleCommandQualifier
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1_single_command_qualifier.html b/doxygen/doxydoc.NET/html/classlib60870_1_1_single_command_qualifier.html deleted file mode 100644 index 7d403ee..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1_single_command_qualifier.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.SingleCommandQualifier Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.SingleCommandQualifier Class Reference
    -
    -
    - - - - - - - - -

    -Public Member Functions

    SingleCommandQualifier (byte encodedValue)
     
    SingleCommandQualifier (bool state, bool selectCommand, int qu)
     
    -byte GetEncodedValue ()
     
    - - - - - - - -

    -Properties

    -int QU [get]
     
    -bool State [get]
     
    -bool Select [get]
     
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/SingleCommandQualifier.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception-members.html deleted file mode 100644 index 7971441..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception-members.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.linklayer.LinkLayerBusyException Member List
    -
    -
    - -

    This is the complete list of members for lib60870.linklayer.LinkLayerBusyException, including all inherited members.

    - - - - - -
    ConnectionException(string message) (defined in lib60870.ConnectionException)lib60870.ConnectionException
    ConnectionException(string message, Exception e) (defined in lib60870.ConnectionException)lib60870.ConnectionException
    LinkLayerBusyException(string message) (defined in lib60870.linklayer.LinkLayerBusyException)lib60870.linklayer.LinkLayerBusyException
    LinkLayerBusyException(string message, Exception e) (defined in lib60870.linklayer.LinkLayerBusyException)lib60870.linklayer.LinkLayerBusyException
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception.html b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception.html deleted file mode 100644 index 108f62d..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.linklayer.LinkLayerBusyException Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.linklayer.LinkLayerBusyException Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.linklayer.LinkLayerBusyException:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.linklayer.LinkLayerBusyException:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - -

    -Public Member Functions

    LinkLayerBusyException (string message)
     
    LinkLayerBusyException (string message, Exception e)
     
    - Public Member Functions inherited from lib60870.ConnectionException
    ConnectionException (string message)
     
    ConnectionException (string message, Exception e)
     
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/LinkLayer/PrimaryLinkLayer.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception__coll__graph.dot deleted file mode 100644 index ec5dc38..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception__coll__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.linklayer.LinkLayerBusyException" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.linklayer.LinkLayer\lBusyException",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="lib60870::ConnectionException",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_connection_exception.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="Exception",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception__inherit__graph.dot deleted file mode 100644 index ec5dc38..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_busy_exception__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.linklayer.LinkLayerBusyException" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.linklayer.LinkLayer\lBusyException",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="lib60870::ConnectionException",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",URL="$classlib60870_1_1_connection_exception.html",tooltip=" "]; - Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="Exception",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_parameters-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_parameters-members.html deleted file mode 100644 index b517ab3..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_parameters-members.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.linklayer.LinkLayerParameters Member List
    -
    - -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_parameters.html b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_parameters.html deleted file mode 100644 index dbcbfc5..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_parameters.html +++ /dev/null @@ -1,271 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.linklayer.LinkLayerParameters Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.linklayer.LinkLayerParameters Class Reference
    -
    -
    - -

    Link layer specific parameters. - More...

    - - - - - - - - - - - - - - - - - -

    -Properties

    int AddressLength [get, set]
     Gets or sets the length of the link layer address field.
     
    int TimeoutForACK [get, set]
     Gets or sets the timeout for message ACK.
     
    long TimeoutRepeat [get, set]
     Gets or sets the timeout for message repetition in case of missing ACK messages.
     
    bool UseSingleCharACK [get, set]
     Gets or sets a value indicating whether the secondary link layer uses single character ACK instead of FC 0 or FC 9.
     
    int TimeoutLinkState [get, set]
     Gets or sets the interval to repeat request status of link (FC=9) after response timeout.
     
    -

    Detailed Description

    -

    Link layer specific parameters.

    -

    Property Documentation

    - -

    ◆ AddressLength

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.linklayer.LinkLayerParameters.AddressLength
    -
    -getset
    -
    - -

    Gets or sets the length of the link layer address field.

    -

    The value can be either 0, 1, or 2 for balanced mode or 0, or 1 for unbalanced mode

    -

    The length of the address in byte

    - -
    -
    - -

    ◆ TimeoutForACK

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.linklayer.LinkLayerParameters.TimeoutForACK
    -
    -getset
    -
    - -

    Gets or sets the timeout for message ACK.

    -

    The timeout to wait for message ACK in ms

    - -
    -
    - -

    ◆ TimeoutLinkState

    - -
    -
    - - - - - -
    - - - - -
    int lib60870.linklayer.LinkLayerParameters.TimeoutLinkState
    -
    -getset
    -
    - -

    Gets or sets the interval to repeat request status of link (FC=9) after response timeout.

    -

    the timeout value in ms

    - -
    -
    - -

    ◆ TimeoutRepeat

    - -
    -
    - - - - - -
    - - - - -
    long lib60870.linklayer.LinkLayerParameters.TimeoutRepeat
    -
    -getset
    -
    - -

    Gets or sets the timeout for message repetition in case of missing ACK messages.

    -

    The timeout for message repetition in ms

    - -
    -
    - -

    ◆ UseSingleCharACK

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.linklayer.LinkLayerParameters.UseSingleCharACK
    -
    -getset
    -
    - -

    Gets or sets a value indicating whether the secondary link layer uses single character ACK instead of FC 0 or FC 9.

    -

    true if use single char ACK; otherwise, false.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/LinkLayer/LinkLayer.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_parameters.js b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_parameters.js deleted file mode 100644 index 3b254cc..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_link_layer_parameters.js +++ /dev/null @@ -1,8 +0,0 @@ -var classlib60870_1_1linklayer_1_1_link_layer_parameters = -[ - [ "AddressLength", "classlib60870_1_1linklayer_1_1_link_layer_parameters.html#abfa30c4ae394e96224933817b768d248", null ], - [ "TimeoutForACK", "classlib60870_1_1linklayer_1_1_link_layer_parameters.html#a2f97069460fa1a3873ca1cf91331d739", null ], - [ "TimeoutLinkState", "classlib60870_1_1linklayer_1_1_link_layer_parameters.html#ac79c13d5078a838e029e78a588e261a1", null ], - [ "TimeoutRepeat", "classlib60870_1_1linklayer_1_1_link_layer_parameters.html#a8907a50f70413012cf82de440e2b5581", null ], - [ "UseSingleCharACK", "classlib60870_1_1linklayer_1_1_link_layer_parameters.html#a35b88393725992cef49bbf6f7e196c5b", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port-members.html deleted file mode 100644 index 7a6af50..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port-members.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.linklayer.TcpClientVirtualSerialPort Member List
    -
    -
    - -

    This is the complete list of members for lib60870.linklayer.TcpClientVirtualSerialPort, including all inherited members.

    - - - - - - - - - - - - - - - - - - - -
    CanRead (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
    CanSeek (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
    CanTimeout (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
    CanWrite (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
    Connectedlib60870.linklayer.TcpClientVirtualSerialPort
    DebugOutput (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
    Flush() (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
    Length (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
    Position (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
    Read(byte[] buffer, int offset, int count) (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
    ReadTimeout (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
    Seek(long offset, SeekOrigin origin) (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
    SetLength(long value) (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
    Start()lib60870.linklayer.TcpClientVirtualSerialPort
    Stop()lib60870.linklayer.TcpClientVirtualSerialPort
    TcpClientVirtualSerialPort(String hostname, int tcpPort=2404)lib60870.linklayer.TcpClientVirtualSerialPort
    Write(byte[] buffer, int offset, int count) (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
    WriteTimeout (defined in lib60870.linklayer.TcpClientVirtualSerialPort)lib60870.linklayer.TcpClientVirtualSerialPort
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html deleted file mode 100644 index 4ca36eb..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.linklayer.TcpClientVirtualSerialPort Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.linklayer.TcpClientVirtualSerialPort Class Reference
    -
    -
    - -

    TCP client virtual serial port. Can be used to tunnel CS 101 protocol over TCP/IP. - More...

    -
    -Inheritance diagram for lib60870.linklayer.TcpClientVirtualSerialPort:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.linklayer.TcpClientVirtualSerialPort:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

     TcpClientVirtualSerialPort (String hostname, int tcpPort=2404)
     Initializes a new instance of the lib60870.linklayer.TcpClientVirtualSerialPort class.
     
    -void Start ()
     Start the virtual serial port (connect to server)
     
    -void Stop ()
     Stop the virtual serial port.
     
    -override int Read (byte[] buffer, int offset, int count)
     
    -override void Write (byte[] buffer, int offset, int count)
     
    -override long Seek (long offset, SeekOrigin origin)
     
    -override void Flush ()
     
    -override void SetLength (long value)
     
    - - - - - - - - - - - - - - - - - - - - - - -

    -Properties

    bool Connected [get]
     Gets a value indicating whether this lib60870.linklayer.TcpClientVirtualSerialPort is connected to a server.
     
    -bool DebugOutput [get, set]
     
    -override bool CanRead [get]
     
    -override bool CanSeek [get]
     
    -override bool CanTimeout [get]
     
    -override bool CanWrite [get]
     
    -override long Length [get]
     
    -override long Position [get, set]
     
    -override int ReadTimeout [get, set]
     
    -override int WriteTimeout [get, set]
     
    -

    Detailed Description

    -

    TCP client virtual serial port. Can be used to tunnel CS 101 protocol over TCP/IP.

    -

    Constructor & Destructor Documentation

    - -

    ◆ TcpClientVirtualSerialPort()

    - -
    -
    - - - - - - - - - - - -
    lib60870.linklayer.TcpClientVirtualSerialPort.TcpClientVirtualSerialPort (String hostname,
    int tcpPort = 2404 )
    -
    - -

    Initializes a new instance of the lib60870.linklayer.TcpClientVirtualSerialPort class.

    -
    Parameters
    - - - -
    hostnameIP address of the server
    tcpPortTCP port of the server
    -
    -
    - -
    -
    -

    Property Documentation

    - -

    ◆ Connected

    - -
    -
    - - - - - -
    - - - - -
    bool lib60870.linklayer.TcpClientVirtualSerialPort.Connected
    -
    -get
    -
    - -

    Gets a value indicating whether this lib60870.linklayer.TcpClientVirtualSerialPort is connected to a server.

    -

    true if connected; otherwise, false.

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/LinkLayer/TcpClientVirtualSerialPort.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.js b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.js deleted file mode 100644 index 1081bff..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.js +++ /dev/null @@ -1,7 +0,0 @@ -var classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port = -[ - [ "TcpClientVirtualSerialPort", "classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html#a38baef0d15205486d0f5d07106473836", null ], - [ "Start", "classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html#a1417a91389e864dd32cff7e80def1021", null ], - [ "Stop", "classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html#aba1035cd8d8a91290dd7d19ec48bfb34", null ], - [ "Connected", "classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html#a8e6479066b29f09067340b7fc1b29cbc", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port__coll__graph.dot deleted file mode 100644 index 025be12..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.linklayer.TcpClientVirtualSerialPort" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.linklayer.TcpClient\lVirtualSerialPort",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="TCP client virtual serial port. Can be used to tunnel CS 101 protocol over TCP/IP."]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="Stream",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port__inherit__graph.dot deleted file mode 100644 index 025be12..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.linklayer.TcpClientVirtualSerialPort" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.linklayer.TcpClient\lVirtualSerialPort",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="TCP client virtual serial port. Can be used to tunnel CS 101 protocol over TCP/IP."]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="Stream",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port-members.html b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port-members.html deleted file mode 100644 index 3f598dd..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port-members.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.linklayer.TcpServerVirtualSerialPort Member List
    -
    -
    - -

    This is the complete list of members for lib60870.linklayer.TcpServerVirtualSerialPort, including all inherited members.

    - - - - - - - - - - - - - - - - - - - - - -
    CanRead (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
    CanSeek (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
    CanTimeout (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
    CanWrite (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
    DebugOutput (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
    Flush() (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
    Length (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
    Position (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
    Read(byte[] buffer, int offset, int count) (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
    ReadTimeout (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
    Seek(long offset, SeekOrigin origin) (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
    SetConnectionRequestHandler(TcpConnectionEventHandler handler, object parameter) (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
    SetLength(long value) (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
    SetLocalAddress(string localAddress)lib60870.linklayer.TcpServerVirtualSerialPort
    SetTcpPort(int tcpPort) (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
    Start() (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
    Stop() (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
    TcpServerVirtualSerialPort() (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
    Write(byte[] buffer, int offset, int count) (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
    WriteTimeout (defined in lib60870.linklayer.TcpServerVirtualSerialPort)lib60870.linklayer.TcpServerVirtualSerialPort
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.html b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.html deleted file mode 100644 index 560a2e7..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.html +++ /dev/null @@ -1,221 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.linklayer.TcpServerVirtualSerialPort Class Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.linklayer.TcpServerVirtualSerialPort Class Reference
    -
    -
    -
    -Inheritance diagram for lib60870.linklayer.TcpServerVirtualSerialPort:
    -
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for lib60870.linklayer.TcpServerVirtualSerialPort:
    -
    -
    Collaboration graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    -void SetConnectionRequestHandler (TcpConnectionEventHandler handler, object parameter)
     
    void SetLocalAddress (string localAddress)
     Sets the local address to used.
     
    -void SetTcpPort (int tcpPort)
     
    -void Start ()
     
    -void Stop ()
     
    -override int Read (byte[] buffer, int offset, int count)
     
    -override void Write (byte[] buffer, int offset, int count)
     
    -override long Seek (long offset, SeekOrigin origin)
     
    -override void Flush ()
     
    -override void SetLength (long value)
     
    - - - - - - - - - - - - - - - - - - - -

    -Properties

    -bool DebugOutput [get, set]
     
    -override bool CanRead [get]
     
    -override bool CanSeek [get]
     
    -override bool CanTimeout [get]
     
    -override bool CanWrite [get]
     
    -override long Length [get]
     
    -override long Position [get, set]
     
    -override int ReadTimeout [get, set]
     
    -override int WriteTimeout [get, set]
     
    -

    Member Function Documentation

    - -

    ◆ SetLocalAddress()

    - -
    -
    - - - - - - - -
    void lib60870.linklayer.TcpServerVirtualSerialPort.SetLocalAddress (string localAddress)
    -
    - -

    Sets the local address to used.

    -
    Parameters
    - - -
    localAddressLocal address. Use "0.0.0.0" for all interfaces(default)
    -
    -
    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/LinkLayer/TcpServerVirtualSerialPort.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.js b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.js deleted file mode 100644 index b641739..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.js +++ /dev/null @@ -1,4 +0,0 @@ -var classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port = -[ - [ "SetLocalAddress", "classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.html#a52cf94c390fdb9de1da505a259dc85a1", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port__coll__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port__coll__graph.dot deleted file mode 100644 index 2129294..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port__coll__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.linklayer.TcpServerVirtualSerialPort" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.linklayer.TcpServer\lVirtualSerialPort",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="Stream",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port__inherit__graph.dot b/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port__inherit__graph.dot deleted file mode 100644 index 2129294..0000000 --- a/doxygen/doxydoc.NET/html/classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.linklayer.TcpServerVirtualSerialPort" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.linklayer.TcpServer\lVirtualSerialPort",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="Stream",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/clipboard.js b/doxygen/doxydoc.NET/html/clipboard.js deleted file mode 100644 index 42c1fb0..0000000 --- a/doxygen/doxydoc.NET/html/clipboard.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - -The code below is based on the Doxygen Awesome project, see -https://github.com/jothepro/doxygen-awesome-css - -MIT License - -Copyright (c) 2021 - 2022 jothepro - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -*/ - -let clipboard_title = "Copy to clipboard" -let clipboard_icon = `` -let clipboard_successIcon = `` -let clipboard_successDuration = 1000 - -$(function() { - if(navigator.clipboard) { - const fragments = document.getElementsByClassName("fragment") - for(const fragment of fragments) { - const clipboard_div = document.createElement("div") - clipboard_div.classList.add("clipboard") - clipboard_div.innerHTML = clipboard_icon - clipboard_div.title = clipboard_title - $(clipboard_div).click(function() { - const content = this.parentNode.cloneNode(true) - // filter out line number and folded fragments from file listings - content.querySelectorAll(".lineno, .ttc, .foldclosed").forEach((node) => { node.remove() }) - let text = content.textContent - // remove trailing newlines and trailing spaces from empty lines - text = text.replace(/^\s*\n/gm,'\n').replace(/\n*$/,'') - navigator.clipboard.writeText(text); - this.classList.add("success") - this.innerHTML = clipboard_successIcon - window.setTimeout(() => { // switch back to normal icon after timeout - this.classList.remove("success") - this.innerHTML = clipboard_icon - }, clipboard_successDuration); - }) - fragment.insertBefore(clipboard_div, fragment.firstChild) - } - } -}) diff --git a/doxygen/doxydoc.NET/html/closed.png b/doxygen/doxydoc.NET/html/closed.png deleted file mode 100644 index 98cc2c909da37a6df914fbf67780eebd99c597f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT diff --git a/doxygen/doxydoc.NET/html/cookie.js b/doxygen/doxydoc.NET/html/cookie.js deleted file mode 100644 index 53ad21d..0000000 --- a/doxygen/doxydoc.NET/html/cookie.js +++ /dev/null @@ -1,58 +0,0 @@ -/*! - Cookie helper functions - Copyright (c) 2023 Dimitri van Heesch - Released under MIT license. -*/ -let Cookie = { - cookie_namespace: 'doxygen_', - - readSetting(cookie,defVal) { - if (window.chrome) { - const val = localStorage.getItem(this.cookie_namespace+cookie) || - sessionStorage.getItem(this.cookie_namespace+cookie); - if (val) return val; - } else { - let myCookie = this.cookie_namespace+cookie+"="; - if (document.cookie) { - const index = document.cookie.indexOf(myCookie); - if (index != -1) { - const valStart = index + myCookie.length; - let valEnd = document.cookie.indexOf(";", valStart); - if (valEnd == -1) { - valEnd = document.cookie.length; - } - return document.cookie.substring(valStart, valEnd); - } - } - } - return defVal; - }, - - writeSetting(cookie,val,days=10*365) { // default days='forever', 0=session cookie, -1=delete - if (window.chrome) { - if (days==0) { - sessionStorage.setItem(this.cookie_namespace+cookie,val); - } else { - localStorage.setItem(this.cookie_namespace+cookie,val); - } - } else { - let date = new Date(); - date.setTime(date.getTime()+(days*24*60*60*1000)); - const expiration = days!=0 ? "expires="+date.toGMTString()+";" : ""; - document.cookie = this.cookie_namespace + cookie + "=" + - val + "; SameSite=Lax;" + expiration + "path=/"; - } - }, - - eraseSetting(cookie) { - if (window.chrome) { - if (localStorage.getItem(this.cookie_namespace+cookie)) { - localStorage.removeItem(this.cookie_namespace+cookie); - } else if (sessionStorage.getItem(this.cookie_namespace+cookie)) { - sessionStorage.removeItem(this.cookie_namespace+cookie); - } - } else { - this.writeSetting(cookie,'',-1); - } - }, -} diff --git a/doxygen/doxydoc.NET/html/dir_1426ccace41ffc2cc2eca9b41b45b309.html b/doxygen/doxydoc.NET/html/dir_1426ccace41ffc2cc2eca9b41b45b309.html deleted file mode 100644 index be72f81..0000000 --- a/doxygen/doxydoc.NET/html/dir_1426ccace41ffc2cc2eca9b41b45b309.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - -lib60870.NET: C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj Directory Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    obj Directory Reference
    -
    -
    -
    -Directory dependency graph for obj:
    -
    -
    C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj
    -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/dir_1426ccace41ffc2cc2eca9b41b45b309_dep.dot b/doxygen/doxydoc.NET/html/dir_1426ccace41ffc2cc2eca9b41b45b309_dep.dot deleted file mode 100644 index daf98e0..0000000 --- a/doxygen/doxydoc.NET/html/dir_1426ccace41ffc2cc2eca9b41b45b309_dep.dot +++ /dev/null @@ -1,17 +0,0 @@ -digraph "C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - compound=true - subgraph clusterdir_d8978c4994c85815b95534f7a21d38a3 { - graph [ bgcolor="#edf0f7", pencolor="grey25", label="lib60870", fontname=Helvetica,fontsize=10 style="filled,dashed", URL="dir_d8978c4994c85815b95534f7a21d38a3.html",tooltip=""] - subgraph clusterdir_1426ccace41ffc2cc2eca9b41b45b309 { - graph [ bgcolor="#edf0f7", pencolor="grey25", label="", fontname=Helvetica,fontsize=10 style="filled,bold", URL="dir_1426ccace41ffc2cc2eca9b41b45b309.html",tooltip=""] - dir_1426ccace41ffc2cc2eca9b41b45b309 [shape=plaintext, label="obj"]; - dir_b0a5ae503da9b14c7a6f4a2af13537d9 [label="Debug", fillcolor="#a2b4d6", color="grey25", style="filled", URL="dir_b0a5ae503da9b14c7a6f4a2af13537d9.html",tooltip=""]; - dir_b850c7c61d39a008cf3688cd306216ed [label="x86", fillcolor="#a2b4d6", color="grey25", style="filled", URL="dir_b850c7c61d39a008cf3688cd306216ed.html",tooltip=""]; - } - } -} diff --git a/doxygen/doxydoc.NET/html/dir_3a7e63ee7cf2b5c4d7f4a7d7af5f0b48.html b/doxygen/doxydoc.NET/html/dir_3a7e63ee7cf2b5c4d7f4a7d7af5f0b48.html deleted file mode 100644 index 21988e9..0000000 --- a/doxygen/doxydoc.NET/html/dir_3a7e63ee7cf2b5c4d7f4a7d7af5f0b48.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - -lib60870.NET: C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/LinkLayer Directory Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    LinkLayer Directory Reference
    -
    -
    -
    -Directory dependency graph for LinkLayer:
    -
    -
    C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/LinkLayer
    -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/dir_3a7e63ee7cf2b5c4d7f4a7d7af5f0b48_dep.dot b/doxygen/doxydoc.NET/html/dir_3a7e63ee7cf2b5c4d7f4a7d7af5f0b48_dep.dot deleted file mode 100644 index b652ac8..0000000 --- a/doxygen/doxydoc.NET/html/dir_3a7e63ee7cf2b5c4d7f4a7d7af5f0b48_dep.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/LinkLayer" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - compound=true - subgraph clusterdir_d8978c4994c85815b95534f7a21d38a3 { - graph [ bgcolor="#edf0f7", pencolor="grey25", label="lib60870", fontname=Helvetica,fontsize=10 style="filled,dashed", URL="dir_d8978c4994c85815b95534f7a21d38a3.html",tooltip=""] - dir_3a7e63ee7cf2b5c4d7f4a7d7af5f0b48 [label="LinkLayer", fillcolor="#edf0f7", color="grey25", style="filled,bold", URL="dir_3a7e63ee7cf2b5c4d7f4a7d7af5f0b48.html",tooltip=""]; - } -} diff --git a/doxygen/doxydoc.NET/html/dir_78da73360675c066effe4a54d369d8c9.html b/doxygen/doxydoc.NET/html/dir_78da73360675c066effe4a54d369d8c9.html deleted file mode 100644 index 7f4387d..0000000 --- a/doxygen/doxydoc.NET/html/dir_78da73360675c066effe4a54d369d8c9.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - -lib60870.NET: C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj/Debug/netstandard2.0 Directory Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    netstandard2.0 Directory Reference
    -
    -
    -
    -Directory dependency graph for netstandard2.0:
    -
    -
    C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj/Debug/netstandard2.0
    -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/dir_78da73360675c066effe4a54d369d8c9_dep.dot b/doxygen/doxydoc.NET/html/dir_78da73360675c066effe4a54d369d8c9_dep.dot deleted file mode 100644 index f16f0b3..0000000 --- a/doxygen/doxydoc.NET/html/dir_78da73360675c066effe4a54d369d8c9_dep.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj/Debug/netstandard2.0" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - compound=true - subgraph clusterdir_b0a5ae503da9b14c7a6f4a2af13537d9 { - graph [ bgcolor="#edf0f7", pencolor="grey50", label="Debug", fontname=Helvetica,fontsize=10 style="filled,dashed", URL="dir_b0a5ae503da9b14c7a6f4a2af13537d9.html",tooltip=""] - dir_78da73360675c066effe4a54d369d8c9 [label="netstandard2.0", fillcolor="#edf0f7", color="grey25", style="filled,bold", URL="dir_78da73360675c066effe4a54d369d8c9.html",tooltip=""]; - } -} diff --git a/doxygen/doxydoc.NET/html/dir_81ad2ef2a5969c1913fa2b2ec7ae6d60.html b/doxygen/doxydoc.NET/html/dir_81ad2ef2a5969c1913fa2b2ec7ae6d60.html deleted file mode 100644 index 317768f..0000000 --- a/doxygen/doxydoc.NET/html/dir_81ad2ef2a5969c1913fa2b2ec7ae6d60.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - -lib60870.NET: C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS104 Directory Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    CS104 Directory Reference
    -
    -
    -
    -Directory dependency graph for CS104:
    -
    -
    C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS104
    -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/dir_81ad2ef2a5969c1913fa2b2ec7ae6d60_dep.dot b/doxygen/doxydoc.NET/html/dir_81ad2ef2a5969c1913fa2b2ec7ae6d60_dep.dot deleted file mode 100644 index e287100..0000000 --- a/doxygen/doxydoc.NET/html/dir_81ad2ef2a5969c1913fa2b2ec7ae6d60_dep.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS104" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - compound=true - subgraph clusterdir_d8978c4994c85815b95534f7a21d38a3 { - graph [ bgcolor="#edf0f7", pencolor="grey25", label="lib60870", fontname=Helvetica,fontsize=10 style="filled,dashed", URL="dir_d8978c4994c85815b95534f7a21d38a3.html",tooltip=""] - dir_81ad2ef2a5969c1913fa2b2ec7ae6d60 [label="CS104", fillcolor="#edf0f7", color="grey25", style="filled,bold", URL="dir_81ad2ef2a5969c1913fa2b2ec7ae6d60.html",tooltip=""]; - } -} diff --git a/doxygen/doxydoc.NET/html/dir_8ef50c26ad56f3b20d037a50a7a693a6.html b/doxygen/doxydoc.NET/html/dir_8ef50c26ad56f3b20d037a50a7a693a6.html deleted file mode 100644 index 79e2775..0000000 --- a/doxygen/doxydoc.NET/html/dir_8ef50c26ad56f3b20d037a50a7a693a6.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - -lib60870.NET: C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101 Directory Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    CS101 Directory Reference
    -
    -
    -
    -Directory dependency graph for CS101:
    -
    -
    C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101
    -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/dir_8ef50c26ad56f3b20d037a50a7a693a6_dep.dot b/doxygen/doxydoc.NET/html/dir_8ef50c26ad56f3b20d037a50a7a693a6_dep.dot deleted file mode 100644 index 56b62da..0000000 --- a/doxygen/doxydoc.NET/html/dir_8ef50c26ad56f3b20d037a50a7a693a6_dep.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - compound=true - subgraph clusterdir_d8978c4994c85815b95534f7a21d38a3 { - graph [ bgcolor="#edf0f7", pencolor="grey25", label="lib60870", fontname=Helvetica,fontsize=10 style="filled,dashed", URL="dir_d8978c4994c85815b95534f7a21d38a3.html",tooltip=""] - dir_8ef50c26ad56f3b20d037a50a7a693a6 [label="CS101", fillcolor="#edf0f7", color="grey25", style="filled,bold", URL="dir_8ef50c26ad56f3b20d037a50a7a693a6.html",tooltip=""]; - } -} diff --git a/doxygen/doxydoc.NET/html/dir_93f3e8569115651ede3b56a0e65cbd1f.html b/doxygen/doxydoc.NET/html/dir_93f3e8569115651ede3b56a0e65cbd1f.html deleted file mode 100644 index 305224d..0000000 --- a/doxygen/doxydoc.NET/html/dir_93f3e8569115651ede3b56a0e65cbd1f.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - -lib60870.NET: C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/Properties Directory Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Properties Directory Reference
    -
    -
    -
    -Directory dependency graph for Properties:
    -
    -
    C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/Properties
    -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/dir_93f3e8569115651ede3b56a0e65cbd1f_dep.dot b/doxygen/doxydoc.NET/html/dir_93f3e8569115651ede3b56a0e65cbd1f_dep.dot deleted file mode 100644 index b341a79..0000000 --- a/doxygen/doxydoc.NET/html/dir_93f3e8569115651ede3b56a0e65cbd1f_dep.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/Properties" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - compound=true - subgraph clusterdir_d8978c4994c85815b95534f7a21d38a3 { - graph [ bgcolor="#edf0f7", pencolor="grey25", label="lib60870", fontname=Helvetica,fontsize=10 style="filled,dashed", URL="dir_d8978c4994c85815b95534f7a21d38a3.html",tooltip=""] - dir_93f3e8569115651ede3b56a0e65cbd1f [label="Properties", fillcolor="#edf0f7", color="grey25", style="filled,bold", URL="dir_93f3e8569115651ede3b56a0e65cbd1f.html",tooltip=""]; - } -} diff --git a/doxygen/doxydoc.NET/html/dir_b0a5ae503da9b14c7a6f4a2af13537d9.html b/doxygen/doxydoc.NET/html/dir_b0a5ae503da9b14c7a6f4a2af13537d9.html deleted file mode 100644 index 83f4e95..0000000 --- a/doxygen/doxydoc.NET/html/dir_b0a5ae503da9b14c7a6f4a2af13537d9.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - -lib60870.NET: C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj/Debug Directory Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Debug Directory Reference
    -
    -
    -
    -Directory dependency graph for Debug:
    -
    -
    C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj/Debug
    -
    - - - - -

    -Directories

     netstandard2.0
     
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/dir_b0a5ae503da9b14c7a6f4a2af13537d9_dep.dot b/doxygen/doxydoc.NET/html/dir_b0a5ae503da9b14c7a6f4a2af13537d9_dep.dot deleted file mode 100644 index b58a4c9..0000000 --- a/doxygen/doxydoc.NET/html/dir_b0a5ae503da9b14c7a6f4a2af13537d9_dep.dot +++ /dev/null @@ -1,16 +0,0 @@ -digraph "C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj/Debug" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - compound=true - subgraph clusterdir_1426ccace41ffc2cc2eca9b41b45b309 { - graph [ bgcolor="#edf0f7", pencolor="grey50", label="obj", fontname=Helvetica,fontsize=10 style="filled,dashed", URL="dir_1426ccace41ffc2cc2eca9b41b45b309.html",tooltip=""] - subgraph clusterdir_b0a5ae503da9b14c7a6f4a2af13537d9 { - graph [ bgcolor="#edf0f7", pencolor="grey25", label="", fontname=Helvetica,fontsize=10 style="filled,bold", URL="dir_b0a5ae503da9b14c7a6f4a2af13537d9.html",tooltip=""] - dir_b0a5ae503da9b14c7a6f4a2af13537d9 [shape=plaintext, label="Debug"]; - dir_78da73360675c066effe4a54d369d8c9 [label="netstandard2.0", fillcolor="#a2b4d6", color="grey25", style="filled", URL="dir_78da73360675c066effe4a54d369d8c9.html",tooltip=""]; - } - } -} diff --git a/doxygen/doxydoc.NET/html/dir_b850c7c61d39a008cf3688cd306216ed.html b/doxygen/doxydoc.NET/html/dir_b850c7c61d39a008cf3688cd306216ed.html deleted file mode 100644 index d5fe4b4..0000000 --- a/doxygen/doxydoc.NET/html/dir_b850c7c61d39a008cf3688cd306216ed.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - -lib60870.NET: C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj/x86 Directory Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    x86 Directory Reference
    -
    -
    -
    -Directory dependency graph for x86:
    -
    -
    C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj/x86
    -
    - - - - -

    -Directories

     Debug
     
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/dir_b850c7c61d39a008cf3688cd306216ed_dep.dot b/doxygen/doxydoc.NET/html/dir_b850c7c61d39a008cf3688cd306216ed_dep.dot deleted file mode 100644 index 9d1248c..0000000 --- a/doxygen/doxydoc.NET/html/dir_b850c7c61d39a008cf3688cd306216ed_dep.dot +++ /dev/null @@ -1,16 +0,0 @@ -digraph "C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj/x86" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - compound=true - subgraph clusterdir_1426ccace41ffc2cc2eca9b41b45b309 { - graph [ bgcolor="#edf0f7", pencolor="grey50", label="obj", fontname=Helvetica,fontsize=10 style="filled,dashed", URL="dir_1426ccace41ffc2cc2eca9b41b45b309.html",tooltip=""] - subgraph clusterdir_b850c7c61d39a008cf3688cd306216ed { - graph [ bgcolor="#edf0f7", pencolor="grey25", label="", fontname=Helvetica,fontsize=10 style="filled,bold", URL="dir_b850c7c61d39a008cf3688cd306216ed.html",tooltip=""] - dir_b850c7c61d39a008cf3688cd306216ed [shape=plaintext, label="x86"]; - dir_e363fa5d362eba4388eff3f3f5e37912 [label="Debug", fillcolor="#a2b4d6", color="grey25", style="filled", URL="dir_e363fa5d362eba4388eff3f3f5e37912.html",tooltip=""]; - } - } -} diff --git a/doxygen/doxydoc.NET/html/dir_d8978c4994c85815b95534f7a21d38a3.html b/doxygen/doxydoc.NET/html/dir_d8978c4994c85815b95534f7a21d38a3.html deleted file mode 100644 index 0a815f0..0000000 --- a/doxygen/doxydoc.NET/html/dir_d8978c4994c85815b95534f7a21d38a3.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - -lib60870.NET: C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870 Directory Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870 Directory Reference
    -
    -
    - - - - - - - - - - -

    -Directories

     CS101
     
     CS104
     
     LinkLayer
     
     Properties
     
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/dir_e363fa5d362eba4388eff3f3f5e37912.html b/doxygen/doxydoc.NET/html/dir_e363fa5d362eba4388eff3f3f5e37912.html deleted file mode 100644 index 9d3cf05..0000000 --- a/doxygen/doxydoc.NET/html/dir_e363fa5d362eba4388eff3f3f5e37912.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - -lib60870.NET: C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj/x86/Debug Directory Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Debug Directory Reference
    -
    -
    -
    -Directory dependency graph for Debug:
    -
    -
    C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj/x86/Debug
    -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/dir_e363fa5d362eba4388eff3f3f5e37912_dep.dot b/doxygen/doxydoc.NET/html/dir_e363fa5d362eba4388eff3f3f5e37912_dep.dot deleted file mode 100644 index 340792a..0000000 --- a/doxygen/doxydoc.NET/html/dir_e363fa5d362eba4388eff3f3f5e37912_dep.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/obj/x86/Debug" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - compound=true - subgraph clusterdir_b850c7c61d39a008cf3688cd306216ed { - graph [ bgcolor="#edf0f7", pencolor="grey50", label="x86", fontname=Helvetica,fontsize=10 style="filled,dashed", URL="dir_b850c7c61d39a008cf3688cd306216ed.html",tooltip=""] - dir_e363fa5d362eba4388eff3f3f5e37912 [label="Debug", fillcolor="#edf0f7", color="grey25", style="filled,bold", URL="dir_e363fa5d362eba4388eff3f3f5e37912.html",tooltip=""]; - } -} diff --git a/doxygen/doxydoc.NET/html/doc.svg b/doxygen/doxydoc.NET/html/doc.svg deleted file mode 100644 index 0b928a5..0000000 --- a/doxygen/doxydoc.NET/html/doc.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - diff --git a/doxygen/doxydoc.NET/html/docd.svg b/doxygen/doxydoc.NET/html/docd.svg deleted file mode 100644 index ac18b27..0000000 --- a/doxygen/doxydoc.NET/html/docd.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - diff --git a/doxygen/doxydoc.NET/html/doxygen.css b/doxygen/doxydoc.NET/html/doxygen.css deleted file mode 100644 index 209912c..0000000 --- a/doxygen/doxydoc.NET/html/doxygen.css +++ /dev/null @@ -1,2244 +0,0 @@ -/* The standard CSS for doxygen 1.11.0*/ - -html { -/* page base colors */ ---page-background-color: white; ---page-foreground-color: black; ---page-link-color: #3D578C; ---page-visited-link-color: #4665A2; - -/* index */ ---index-odd-item-bg-color: #F8F9FC; ---index-even-item-bg-color: white; ---index-header-color: black; ---index-separator-color: #A0A0A0; - -/* header */ ---header-background-color: #F9FAFC; ---header-separator-color: #C4CFE5; ---header-gradient-image: url('nav_h.png'); ---group-header-separator-color: #879ECB; ---group-header-color: #354C7B; ---inherit-header-color: gray; - ---footer-foreground-color: #2A3D61; ---footer-logo-width: 104px; ---citation-label-color: #334975; ---glow-color: cyan; - ---title-background-color: white; ---title-separator-color: #5373B4; ---directory-separator-color: #9CAFD4; ---separator-color: #4A6AAA; - ---blockquote-background-color: #F7F8FB; ---blockquote-border-color: #9CAFD4; - ---scrollbar-thumb-color: #9CAFD4; ---scrollbar-background-color: #F9FAFC; - ---icon-background-color: #728DC1; ---icon-foreground-color: white; ---icon-doc-image: url('doc.svg'); ---icon-folder-open-image: url('folderopen.svg'); ---icon-folder-closed-image: url('folderclosed.svg'); - -/* brief member declaration list */ ---memdecl-background-color: #F9FAFC; ---memdecl-separator-color: #DEE4F0; ---memdecl-foreground-color: #555; ---memdecl-template-color: #4665A2; - -/* detailed member list */ ---memdef-border-color: #A8B8D9; ---memdef-title-background-color: #E2E8F2; ---memdef-title-gradient-image: url('nav_f.png'); ---memdef-proto-background-color: #DFE5F1; ---memdef-proto-text-color: #253555; ---memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); ---memdef-doc-background-color: white; ---memdef-param-name-color: #602020; ---memdef-template-color: #4665A2; - -/* tables */ ---table-cell-border-color: #2D4068; ---table-header-background-color: #374F7F; ---table-header-foreground-color: #FFFFFF; - -/* labels */ ---label-background-color: #728DC1; ---label-left-top-border-color: #5373B4; ---label-right-bottom-border-color: #C4CFE5; ---label-foreground-color: white; - -/** navigation bar/tree/menu */ ---nav-background-color: #F9FAFC; ---nav-foreground-color: #364D7C; ---nav-gradient-image: url('tab_b.png'); ---nav-gradient-hover-image: url('tab_h.png'); ---nav-gradient-active-image: url('tab_a.png'); ---nav-gradient-active-image-parent: url("../tab_a.png"); ---nav-separator-image: url('tab_s.png'); ---nav-breadcrumb-image: url('bc_s.png'); ---nav-breadcrumb-border-color: #C2CDE4; ---nav-splitbar-image: url('splitbar.png'); ---nav-font-size-level1: 13px; ---nav-font-size-level2: 10px; ---nav-font-size-level3: 9px; ---nav-text-normal-color: #283A5D; ---nav-text-hover-color: white; ---nav-text-active-color: white; ---nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); ---nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); ---nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); ---nav-menu-button-color: #364D7C; ---nav-menu-background-color: white; ---nav-menu-foreground-color: #555555; ---nav-menu-toggle-color: rgba(255, 255, 255, 0.5); ---nav-arrow-color: #9CAFD4; ---nav-arrow-selected-color: #9CAFD4; - -/* table of contents */ ---toc-background-color: #F4F6FA; ---toc-border-color: #D8DFEE; ---toc-header-color: #4665A2; ---toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); - -/** search field */ ---search-background-color: white; ---search-foreground-color: #909090; ---search-magnification-image: url('mag.svg'); ---search-magnification-select-image: url('mag_sel.svg'); ---search-active-color: black; ---search-filter-background-color: #F9FAFC; ---search-filter-foreground-color: black; ---search-filter-border-color: #90A5CE; ---search-filter-highlight-text-color: white; ---search-filter-highlight-bg-color: #3D578C; ---search-results-foreground-color: #425E97; ---search-results-background-color: #EEF1F7; ---search-results-border-color: black; ---search-box-shadow: inset 0.5px 0.5px 3px 0px #555; - -/** code fragments */ ---code-keyword-color: #008000; ---code-type-keyword-color: #604020; ---code-flow-keyword-color: #E08000; ---code-comment-color: #800000; ---code-preprocessor-color: #806020; ---code-string-literal-color: #002080; ---code-char-literal-color: #008080; ---code-xml-cdata-color: black; ---code-vhdl-digit-color: #FF00FF; ---code-vhdl-char-color: #000000; ---code-vhdl-keyword-color: #700070; ---code-vhdl-logic-color: #FF0000; ---code-link-color: #4665A2; ---code-external-link-color: #4665A2; ---fragment-foreground-color: black; ---fragment-background-color: #FBFCFD; ---fragment-border-color: #C4CFE5; ---fragment-lineno-border-color: #00FF00; ---fragment-lineno-background-color: #E8E8E8; ---fragment-lineno-foreground-color: black; ---fragment-lineno-link-fg-color: #4665A2; ---fragment-lineno-link-bg-color: #D8D8D8; ---fragment-lineno-link-hover-fg-color: #4665A2; ---fragment-lineno-link-hover-bg-color: #C8C8C8; ---fragment-copy-ok-color: #2EC82E; ---tooltip-foreground-color: black; ---tooltip-background-color: white; ---tooltip-border-color: gray; ---tooltip-doc-color: grey; ---tooltip-declaration-color: #006318; ---tooltip-link-color: #4665A2; ---tooltip-shadow: 1px 1px 7px gray; ---fold-line-color: #808080; ---fold-minus-image: url('minus.svg'); ---fold-plus-image: url('plus.svg'); ---fold-minus-image-relpath: url('../../minus.svg'); ---fold-plus-image-relpath: url('../../plus.svg'); - -/** font-family */ ---font-family-normal: Roboto,sans-serif; ---font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; ---font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; ---font-family-title: Tahoma,Arial,sans-serif; ---font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; ---font-family-search: Arial,Verdana,sans-serif; ---font-family-icon: Arial,Helvetica; ---font-family-tooltip: Roboto,sans-serif; - -/** special sections */ ---warning-color-bg: #f8d1cc; ---warning-color-hl: #b61825; ---warning-color-text: #75070f; ---note-color-bg: #faf3d8; ---note-color-hl: #f3a600; ---note-color-text: #5f4204; ---todo-color-bg: #e4f3ff; ---todo-color-hl: #1879C4; ---todo-color-text: #274a5c; ---test-color-bg: #e8e8ff; ---test-color-hl: #3939C4; ---test-color-text: #1a1a5c; ---deprecated-color-bg: #ecf0f3; ---deprecated-color-hl: #5b6269; ---deprecated-color-text: #43454a; ---bug-color-bg: #e4dafd; ---bug-color-hl: #5b2bdd; ---bug-color-text: #2a0d72; ---invariant-color-bg: #d8f1e3; ---invariant-color-hl: #44b86f; ---invariant-color-text: #265532; -} - -@media (prefers-color-scheme: dark) { - html:not(.dark-mode) { - color-scheme: dark; - -/* page base colors */ ---page-background-color: black; ---page-foreground-color: #C9D1D9; ---page-link-color: #90A5CE; ---page-visited-link-color: #A3B4D7; - -/* index */ ---index-odd-item-bg-color: #0B101A; ---index-even-item-bg-color: black; ---index-header-color: #C4CFE5; ---index-separator-color: #334975; - -/* header */ ---header-background-color: #070B11; ---header-separator-color: #141C2E; ---header-gradient-image: url('nav_hd.png'); ---group-header-separator-color: #283A5D; ---group-header-color: #90A5CE; ---inherit-header-color: #A0A0A0; - ---footer-foreground-color: #5B7AB7; ---footer-logo-width: 60px; ---citation-label-color: #90A5CE; ---glow-color: cyan; - ---title-background-color: #090D16; ---title-separator-color: #354C79; ---directory-separator-color: #283A5D; ---separator-color: #283A5D; - ---blockquote-background-color: #101826; ---blockquote-border-color: #283A5D; - ---scrollbar-thumb-color: #283A5D; ---scrollbar-background-color: #070B11; - ---icon-background-color: #334975; ---icon-foreground-color: #C4CFE5; ---icon-doc-image: url('docd.svg'); ---icon-folder-open-image: url('folderopend.svg'); ---icon-folder-closed-image: url('folderclosedd.svg'); - -/* brief member declaration list */ ---memdecl-background-color: #0B101A; ---memdecl-separator-color: #2C3F65; ---memdecl-foreground-color: #BBB; ---memdecl-template-color: #7C95C6; - -/* detailed member list */ ---memdef-border-color: #233250; ---memdef-title-background-color: #1B2840; ---memdef-title-gradient-image: url('nav_fd.png'); ---memdef-proto-background-color: #19243A; ---memdef-proto-text-color: #9DB0D4; ---memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); ---memdef-doc-background-color: black; ---memdef-param-name-color: #D28757; ---memdef-template-color: #7C95C6; - -/* tables */ ---table-cell-border-color: #283A5D; ---table-header-background-color: #283A5D; ---table-header-foreground-color: #C4CFE5; - -/* labels */ ---label-background-color: #354C7B; ---label-left-top-border-color: #4665A2; ---label-right-bottom-border-color: #283A5D; ---label-foreground-color: #CCCCCC; - -/** navigation bar/tree/menu */ ---nav-background-color: #101826; ---nav-foreground-color: #364D7C; ---nav-gradient-image: url('tab_bd.png'); ---nav-gradient-hover-image: url('tab_hd.png'); ---nav-gradient-active-image: url('tab_ad.png'); ---nav-gradient-active-image-parent: url("../tab_ad.png"); ---nav-separator-image: url('tab_sd.png'); ---nav-breadcrumb-image: url('bc_sd.png'); ---nav-breadcrumb-border-color: #2A3D61; ---nav-splitbar-image: url('splitbard.png'); ---nav-font-size-level1: 13px; ---nav-font-size-level2: 10px; ---nav-font-size-level3: 9px; ---nav-text-normal-color: #B6C4DF; ---nav-text-hover-color: #DCE2EF; ---nav-text-active-color: #DCE2EF; ---nav-text-normal-shadow: 0px 1px 1px black; ---nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); ---nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); ---nav-menu-button-color: #B6C4DF; ---nav-menu-background-color: #05070C; ---nav-menu-foreground-color: #BBBBBB; ---nav-menu-toggle-color: rgba(255, 255, 255, 0.2); ---nav-arrow-color: #334975; ---nav-arrow-selected-color: #90A5CE; - -/* table of contents */ ---toc-background-color: #151E30; ---toc-border-color: #202E4A; ---toc-header-color: #A3B4D7; ---toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); - -/** search field */ ---search-background-color: black; ---search-foreground-color: #C5C5C5; ---search-magnification-image: url('mag_d.svg'); ---search-magnification-select-image: url('mag_seld.svg'); ---search-active-color: #C5C5C5; ---search-filter-background-color: #101826; ---search-filter-foreground-color: #90A5CE; ---search-filter-border-color: #7C95C6; ---search-filter-highlight-text-color: #BCC9E2; ---search-filter-highlight-bg-color: #283A5D; ---search-results-background-color: #101826; ---search-results-foreground-color: #90A5CE; ---search-results-border-color: #7C95C6; ---search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; - -/** code fragments */ ---code-keyword-color: #CC99CD; ---code-type-keyword-color: #AB99CD; ---code-flow-keyword-color: #E08000; ---code-comment-color: #717790; ---code-preprocessor-color: #65CABE; ---code-string-literal-color: #7EC699; ---code-char-literal-color: #00E0F0; ---code-xml-cdata-color: #C9D1D9; ---code-vhdl-digit-color: #FF00FF; ---code-vhdl-char-color: #C0C0C0; ---code-vhdl-keyword-color: #CF53C9; ---code-vhdl-logic-color: #FF0000; ---code-link-color: #79C0FF; ---code-external-link-color: #79C0FF; ---fragment-foreground-color: #C9D1D9; ---fragment-background-color: #090D16; ---fragment-border-color: #30363D; ---fragment-lineno-border-color: #30363D; ---fragment-lineno-background-color: black; ---fragment-lineno-foreground-color: #6E7681; ---fragment-lineno-link-fg-color: #6E7681; ---fragment-lineno-link-bg-color: #303030; ---fragment-lineno-link-hover-fg-color: #8E96A1; ---fragment-lineno-link-hover-bg-color: #505050; ---fragment-copy-ok-color: #0EA80E; ---tooltip-foreground-color: #C9D1D9; ---tooltip-background-color: #202020; ---tooltip-border-color: #C9D1D9; ---tooltip-doc-color: #D9E1E9; ---tooltip-declaration-color: #20C348; ---tooltip-link-color: #79C0FF; ---tooltip-shadow: none; ---fold-line-color: #808080; ---fold-minus-image: url('minusd.svg'); ---fold-plus-image: url('plusd.svg'); ---fold-minus-image-relpath: url('../../minusd.svg'); ---fold-plus-image-relpath: url('../../plusd.svg'); - -/** font-family */ ---font-family-normal: Roboto,sans-serif; ---font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; ---font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; ---font-family-title: Tahoma,Arial,sans-serif; ---font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; ---font-family-search: Arial,Verdana,sans-serif; ---font-family-icon: Arial,Helvetica; ---font-family-tooltip: Roboto,sans-serif; - -/** special sections */ ---warning-color-bg: #2e1917; ---warning-color-hl: #ad2617; ---warning-color-text: #f5b1aa; ---note-color-bg: #3b2e04; ---note-color-hl: #f1b602; ---note-color-text: #ceb670; ---todo-color-bg: #163750; ---todo-color-hl: #1982D2; ---todo-color-text: #dcf0fa; ---test-color-bg: #121258; ---test-color-hl: #4242cf; ---test-color-text: #c0c0da; ---deprecated-color-bg: #2e323b; ---deprecated-color-hl: #738396; ---deprecated-color-text: #abb0bd; ---bug-color-bg: #2a2536; ---bug-color-hl: #7661b3; ---bug-color-text: #ae9ed6; ---invariant-color-bg: #303a35; ---invariant-color-hl: #76ce96; ---invariant-color-text: #cceed5; -}} -body { - background-color: var(--page-background-color); - color: var(--page-foreground-color); -} - -body, table, div, p, dl { - font-weight: 400; - font-size: 14px; - font-family: var(--font-family-normal); - line-height: 22px; -} - -/* @group Heading Levels */ - -.title { - font-family: var(--font-family-normal); - line-height: 28px; - font-size: 150%; - font-weight: bold; - margin: 10px 2px; -} - -h1.groupheader { - font-size: 150%; -} - -h2.groupheader { - border-bottom: 1px solid var(--group-header-separator-color); - color: var(--group-header-color); - font-size: 150%; - font-weight: normal; - margin-top: 1.75em; - padding-top: 8px; - padding-bottom: 4px; - width: 100%; -} - -h3.groupheader { - font-size: 100%; -} - -h1, h2, h3, h4, h5, h6 { - -webkit-transition: text-shadow 0.5s linear; - -moz-transition: text-shadow 0.5s linear; - -ms-transition: text-shadow 0.5s linear; - -o-transition: text-shadow 0.5s linear; - transition: text-shadow 0.5s linear; - margin-right: 15px; -} - -h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { - text-shadow: 0 0 15px var(--glow-color); -} - -dt { - font-weight: bold; -} - -p.startli, p.startdd { - margin-top: 2px; -} - -th p.starttd, th p.intertd, th p.endtd { - font-size: 100%; - font-weight: 700; -} - -p.starttd { - margin-top: 0px; -} - -p.endli { - margin-bottom: 0px; -} - -p.enddd { - margin-bottom: 4px; -} - -p.endtd { - margin-bottom: 2px; -} - -p.interli { -} - -p.interdd { -} - -p.intertd { -} - -/* @end */ - -caption { - font-weight: bold; -} - -span.legend { - font-size: 70%; - text-align: center; -} - -h3.version { - font-size: 90%; - text-align: center; -} - -div.navtab { - padding-right: 15px; - text-align: right; - line-height: 110%; -} - -div.navtab table { - border-spacing: 0; -} - -td.navtab { - padding-right: 6px; - padding-left: 6px; -} - -td.navtabHL { - background-image: var(--nav-gradient-active-image); - background-repeat:repeat-x; - padding-right: 6px; - padding-left: 6px; -} - -td.navtabHL a, td.navtabHL a:visited { - color: var(--nav-text-hover-color); - text-shadow: var(--nav-text-hover-shadow); -} - -a.navtab { - font-weight: bold; -} - -div.qindex{ - text-align: center; - width: 100%; - line-height: 140%; - font-size: 130%; - color: var(--index-separator-color); -} - -#main-menu a:focus { - outline: auto; - z-index: 10; - position: relative; -} - -dt.alphachar{ - font-size: 180%; - font-weight: bold; -} - -.alphachar a{ - color: var(--index-header-color); -} - -.alphachar a:hover, .alphachar a:visited{ - text-decoration: none; -} - -.classindex dl { - padding: 25px; - column-count:1 -} - -.classindex dd { - display:inline-block; - margin-left: 50px; - width: 90%; - line-height: 1.15em; -} - -.classindex dl.even { - background-color: var(--index-even-item-bg-color); -} - -.classindex dl.odd { - background-color: var(--index-odd-item-bg-color); -} - -@media(min-width: 1120px) { - .classindex dl { - column-count:2 - } -} - -@media(min-width: 1320px) { - .classindex dl { - column-count:3 - } -} - - -/* @group Link Styling */ - -a { - color: var(--page-link-color); - font-weight: normal; - text-decoration: none; -} - -.contents a:visited { - color: var(--page-visited-link-color); -} - -a:hover { - text-decoration: none; - background: linear-gradient(to bottom, transparent 0,transparent calc(100% - 1px), currentColor 100%); -} - -a:hover > span.arrow { - text-decoration: none; - background : var(--nav-background-color); -} - -a.el { - font-weight: bold; -} - -a.elRef { -} - -a.code, a.code:visited, a.line, a.line:visited { - color: var(--code-link-color); -} - -a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { - color: var(--code-external-link-color); -} - -a.code.hl_class { /* style for links to class names in code snippets */ } -a.code.hl_struct { /* style for links to struct names in code snippets */ } -a.code.hl_union { /* style for links to union names in code snippets */ } -a.code.hl_interface { /* style for links to interface names in code snippets */ } -a.code.hl_protocol { /* style for links to protocol names in code snippets */ } -a.code.hl_category { /* style for links to category names in code snippets */ } -a.code.hl_exception { /* style for links to exception names in code snippets */ } -a.code.hl_service { /* style for links to service names in code snippets */ } -a.code.hl_singleton { /* style for links to singleton names in code snippets */ } -a.code.hl_concept { /* style for links to concept names in code snippets */ } -a.code.hl_namespace { /* style for links to namespace names in code snippets */ } -a.code.hl_package { /* style for links to package names in code snippets */ } -a.code.hl_define { /* style for links to macro names in code snippets */ } -a.code.hl_function { /* style for links to function names in code snippets */ } -a.code.hl_variable { /* style for links to variable names in code snippets */ } -a.code.hl_typedef { /* style for links to typedef names in code snippets */ } -a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } -a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } -a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } -a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } -a.code.hl_friend { /* style for links to friend names in code snippets */ } -a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } -a.code.hl_property { /* style for links to property names in code snippets */ } -a.code.hl_event { /* style for links to event names in code snippets */ } -a.code.hl_sequence { /* style for links to sequence names in code snippets */ } -a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } - -/* @end */ - -dl.el { - margin-left: -1cm; -} - -ul.check { - list-style:none; - text-indent: -16px; - padding-left: 38px; -} -li.unchecked:before { - content: "\2610\A0"; -} -li.checked:before { - content: "\2611\A0"; -} - -ol { - text-indent: 0px; -} - -ul { - text-indent: 0px; - overflow: visible; -} - -ul.multicol { - -moz-column-gap: 1em; - -webkit-column-gap: 1em; - column-gap: 1em; - -moz-column-count: 3; - -webkit-column-count: 3; - column-count: 3; - list-style-type: none; -} - -#side-nav ul { - overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ -} - -#main-nav ul { - overflow: visible; /* reset ul rule for the navigation bar drop down lists */ -} - -.fragment { - text-align: left; - direction: ltr; - overflow-x: auto; - overflow-y: hidden; - position: relative; - min-height: 12px; - margin: 10px 0px; - padding: 10px 10px; - border: 1px solid var(--fragment-border-color); - border-radius: 4px; - background-color: var(--fragment-background-color); - color: var(--fragment-foreground-color); -} - -pre.fragment { - word-wrap: break-word; - font-size: 10pt; - line-height: 125%; - font-family: var(--font-family-monospace); -} - -.clipboard { - width: 24px; - height: 24px; - right: 5px; - top: 5px; - opacity: 0; - position: absolute; - display: inline; - overflow: auto; - fill: var(--fragment-foreground-color); - justify-content: center; - align-items: center; - cursor: pointer; -} - -.clipboard.success { - border: 1px solid var(--fragment-foreground-color); - border-radius: 4px; -} - -.fragment:hover .clipboard, .clipboard.success { - opacity: .28; -} - -.clipboard:hover, .clipboard.success { - opacity: 1 !important; -} - -.clipboard:active:not([class~=success]) svg { - transform: scale(.91); -} - -.clipboard.success svg { - fill: var(--fragment-copy-ok-color); -} - -.clipboard.success { - border-color: var(--fragment-copy-ok-color); -} - -div.line { - font-family: var(--font-family-monospace); - font-size: 13px; - min-height: 13px; - line-height: 1.2; - text-wrap: unrestricted; - white-space: -moz-pre-wrap; /* Moz */ - white-space: -pre-wrap; /* Opera 4-6 */ - white-space: -o-pre-wrap; /* Opera 7 */ - white-space: pre-wrap; /* CSS3 */ - word-wrap: break-word; /* IE 5.5+ */ - text-indent: -53px; - padding-left: 53px; - padding-bottom: 0px; - margin: 0px; - -webkit-transition-property: background-color, box-shadow; - -webkit-transition-duration: 0.5s; - -moz-transition-property: background-color, box-shadow; - -moz-transition-duration: 0.5s; - -ms-transition-property: background-color, box-shadow; - -ms-transition-duration: 0.5s; - -o-transition-property: background-color, box-shadow; - -o-transition-duration: 0.5s; - transition-property: background-color, box-shadow; - transition-duration: 0.5s; -} - -div.line:after { - content:"\000A"; - white-space: pre; -} - -div.line.glow { - background-color: var(--glow-color); - box-shadow: 0 0 10px var(--glow-color); -} - -span.fold { - margin-left: 5px; - margin-right: 1px; - margin-top: 0px; - margin-bottom: 0px; - padding: 0px; - display: inline-block; - width: 12px; - height: 12px; - background-repeat:no-repeat; - background-position:center; -} - -span.lineno { - padding-right: 4px; - margin-right: 9px; - text-align: right; - border-right: 2px solid var(--fragment-lineno-border-color); - color: var(--fragment-lineno-foreground-color); - background-color: var(--fragment-lineno-background-color); - white-space: pre; -} -span.lineno a, span.lineno a:visited { - color: var(--fragment-lineno-link-fg-color); - background-color: var(--fragment-lineno-link-bg-color); -} - -span.lineno a:hover { - color: var(--fragment-lineno-link-hover-fg-color); - background-color: var(--fragment-lineno-link-hover-bg-color); -} - -.lineno { - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -div.classindex ul { - list-style: none; - padding-left: 0; -} - -div.classindex span.ai { - display: inline-block; -} - -div.groupHeader { - margin-left: 16px; - margin-top: 12px; - font-weight: bold; -} - -div.groupText { - margin-left: 16px; - font-style: italic; -} - -body { - color: var(--page-foreground-color); - margin: 0; -} - -div.contents { - margin-top: 10px; - margin-left: 12px; - margin-right: 8px; -} - -p.formulaDsp { - text-align: center; -} - -img.dark-mode-visible { - display: none; -} -img.light-mode-visible { - display: none; -} - -img.formulaInl, img.inline { - vertical-align: middle; -} - -div.center { - text-align: center; - margin-top: 0px; - margin-bottom: 0px; - padding: 0px; -} - -div.center img { - border: 0px; -} - -address.footer { - text-align: right; - padding-right: 12px; -} - -img.footer { - border: 0px; - vertical-align: middle; - width: var(--footer-logo-width); -} - -.compoundTemplParams { - color: var(--memdecl-template-color); - font-size: 80%; - line-height: 120%; -} - -/* @group Code Colorization */ - -span.keyword { - color: var(--code-keyword-color); -} - -span.keywordtype { - color: var(--code-type-keyword-color); -} - -span.keywordflow { - color: var(--code-flow-keyword-color); -} - -span.comment { - color: var(--code-comment-color); -} - -span.preprocessor { - color: var(--code-preprocessor-color); -} - -span.stringliteral { - color: var(--code-string-literal-color); -} - -span.charliteral { - color: var(--code-char-literal-color); -} - -span.xmlcdata { - color: var(--code-xml-cdata-color); -} - -span.vhdldigit { - color: var(--code-vhdl-digit-color); -} - -span.vhdlchar { - color: var(--code-vhdl-char-color); -} - -span.vhdlkeyword { - color: var(--code-vhdl-keyword-color); -} - -span.vhdllogic { - color: var(--code-vhdl-logic-color); -} - -blockquote { - background-color: var(--blockquote-background-color); - border-left: 2px solid var(--blockquote-border-color); - margin: 0 24px 0 4px; - padding: 0 12px 0 16px; -} - -/* @end */ - -td.tiny { - font-size: 75%; -} - -.dirtab { - padding: 4px; - border-collapse: collapse; - border: 1px solid var(--table-cell-border-color); -} - -th.dirtab { - background-color: var(--table-header-background-color); - color: var(--table-header-foreground-color); - font-weight: bold; -} - -hr { - height: 0px; - border: none; - border-top: 1px solid var(--separator-color); -} - -hr.footer { - height: 1px; -} - -/* @group Member Descriptions */ - -table.memberdecls { - border-spacing: 0px; - padding: 0px; -} - -.memberdecls td, .fieldtable tr { - -webkit-transition-property: background-color, box-shadow; - -webkit-transition-duration: 0.5s; - -moz-transition-property: background-color, box-shadow; - -moz-transition-duration: 0.5s; - -ms-transition-property: background-color, box-shadow; - -ms-transition-duration: 0.5s; - -o-transition-property: background-color, box-shadow; - -o-transition-duration: 0.5s; - transition-property: background-color, box-shadow; - transition-duration: 0.5s; -} - -.memberdecls td.glow, .fieldtable tr.glow { - background-color: var(--glow-color); - box-shadow: 0 0 15px var(--glow-color); -} - -.mdescLeft, .mdescRight, -.memItemLeft, .memItemRight, -.memTemplItemLeft, .memTemplItemRight, .memTemplParams { - background-color: var(--memdecl-background-color); - border: none; - margin: 4px; - padding: 1px 0 0 8px; -} - -.mdescLeft, .mdescRight { - padding: 0px 8px 4px 8px; - color: var(--memdecl-foreground-color); -} - -.memSeparator { - border-bottom: 1px solid var(--memdecl-separator-color); - line-height: 1px; - margin: 0px; - padding: 0px; -} - -.memItemLeft, .memTemplItemLeft { - white-space: nowrap; -} - -.memItemRight, .memTemplItemRight { - width: 100%; -} - -.memTemplParams { - color: var(--memdecl-template-color); - white-space: nowrap; - font-size: 80%; -} - -/* @end */ - -/* @group Member Details */ - -/* Styles for detailed member documentation */ - -.memtitle { - padding: 8px; - border-top: 1px solid var(--memdef-border-color); - border-left: 1px solid var(--memdef-border-color); - border-right: 1px solid var(--memdef-border-color); - border-top-right-radius: 4px; - border-top-left-radius: 4px; - margin-bottom: -1px; - background-image: var(--memdef-title-gradient-image); - background-repeat: repeat-x; - background-color: var(--memdef-title-background-color); - line-height: 1.25; - font-weight: 300; - float:left; -} - -.permalink -{ - font-size: 65%; - display: inline-block; - vertical-align: middle; -} - -.memtemplate { - font-size: 80%; - color: var(--memdef-template-color); - font-weight: normal; - margin-left: 9px; -} - -.mempage { - width: 100%; -} - -.memitem { - padding: 0; - margin-bottom: 10px; - margin-right: 5px; - -webkit-transition: box-shadow 0.5s linear; - -moz-transition: box-shadow 0.5s linear; - -ms-transition: box-shadow 0.5s linear; - -o-transition: box-shadow 0.5s linear; - transition: box-shadow 0.5s linear; - display: table !important; - width: 100%; -} - -.memitem.glow { - box-shadow: 0 0 15px var(--glow-color); -} - -.memname { - font-weight: 400; - margin-left: 6px; -} - -.memname td { - vertical-align: bottom; -} - -.memproto, dl.reflist dt { - border-top: 1px solid var(--memdef-border-color); - border-left: 1px solid var(--memdef-border-color); - border-right: 1px solid var(--memdef-border-color); - padding: 6px 0px 6px 0px; - color: var(--memdef-proto-text-color); - font-weight: bold; - text-shadow: var(--memdef-proto-text-shadow); - background-color: var(--memdef-proto-background-color); - box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - border-top-right-radius: 4px; -} - -.overload { - font-family: var(--font-family-monospace); - font-size: 65%; -} - -.memdoc, dl.reflist dd { - border-bottom: 1px solid var(--memdef-border-color); - border-left: 1px solid var(--memdef-border-color); - border-right: 1px solid var(--memdef-border-color); - padding: 6px 10px 2px 10px; - border-top-width: 0; - background-image:url('nav_g.png'); - background-repeat:repeat-x; - background-color: var(--memdef-doc-background-color); - /* opera specific markup */ - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - /* firefox specific markup */ - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-bottomright: 4px; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; - /* webkit specific markup */ - -webkit-border-bottom-left-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -} - -dl.reflist dt { - padding: 5px; -} - -dl.reflist dd { - margin: 0px 0px 10px 0px; - padding: 5px; -} - -.paramkey { - text-align: right; -} - -.paramtype { - white-space: nowrap; - padding: 0px; - padding-bottom: 1px; -} - -.paramname { - white-space: nowrap; - padding: 0px; - padding-bottom: 1px; - margin-left: 2px; -} - -.paramname em { - color: var(--memdef-param-name-color); - font-style: normal; - margin-right: 1px; -} - -.paramname .paramdefval { - font-family: var(--font-family-monospace); -} - -.params, .retval, .exception, .tparams { - margin-left: 0px; - padding-left: 0px; -} - -.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { - font-weight: bold; - vertical-align: top; -} - -.params .paramtype, .tparams .paramtype { - font-style: italic; - vertical-align: top; -} - -.params .paramdir, .tparams .paramdir { - font-family: var(--font-family-monospace); - vertical-align: top; -} - -table.mlabels { - border-spacing: 0px; -} - -td.mlabels-left { - width: 100%; - padding: 0px; -} - -td.mlabels-right { - vertical-align: bottom; - padding: 0px; - white-space: nowrap; -} - -span.mlabels { - margin-left: 8px; -} - -span.mlabel { - background-color: var(--label-background-color); - border-top:1px solid var(--label-left-top-border-color); - border-left:1px solid var(--label-left-top-border-color); - border-right:1px solid var(--label-right-bottom-border-color); - border-bottom:1px solid var(--label-right-bottom-border-color); - text-shadow: none; - color: var(--label-foreground-color); - margin-right: 4px; - padding: 2px 3px; - border-radius: 3px; - font-size: 7pt; - white-space: nowrap; - vertical-align: middle; -} - - - -/* @end */ - -/* these are for tree view inside a (index) page */ - -div.directory { - margin: 10px 0px; - border-top: 1px solid var(--directory-separator-color); - border-bottom: 1px solid var(--directory-separator-color); - width: 100%; -} - -.directory table { - border-collapse:collapse; -} - -.directory td { - margin: 0px; - padding: 0px; - vertical-align: top; -} - -.directory td.entry { - white-space: nowrap; - padding-right: 6px; - padding-top: 3px; -} - -.directory td.entry a { - outline:none; -} - -.directory td.entry a img { - border: none; -} - -.directory td.desc { - width: 100%; - padding-left: 6px; - padding-right: 6px; - padding-top: 3px; - border-left: 1px solid rgba(0,0,0,0.05); -} - -.directory tr.odd { - padding-left: 6px; - background-color: var(--index-odd-item-bg-color); -} - -.directory tr.even { - padding-left: 6px; - background-color: var(--index-even-item-bg-color); -} - -.directory img { - vertical-align: -30%; -} - -.directory .levels { - white-space: nowrap; - width: 100%; - text-align: right; - font-size: 9pt; -} - -.directory .levels span { - cursor: pointer; - padding-left: 2px; - padding-right: 2px; - color: var(--page-link-color); -} - -.arrow { - color: var(--nav-arrow-color); - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - cursor: pointer; - font-size: 80%; - display: inline-block; - width: 16px; - height: 22px; -} - -.icon { - font-family: var(--font-family-icon); - line-height: normal; - font-weight: bold; - font-size: 12px; - height: 14px; - width: 16px; - display: inline-block; - background-color: var(--icon-background-color); - color: var(--icon-foreground-color); - text-align: center; - border-radius: 4px; - margin-left: 2px; - margin-right: 2px; -} - -.icona { - width: 24px; - height: 22px; - display: inline-block; -} - -.iconfopen { - width: 24px; - height: 18px; - margin-bottom: 4px; - background-image:var(--icon-folder-open-image); - background-repeat: repeat-y; - vertical-align:top; - display: inline-block; -} - -.iconfclosed { - width: 24px; - height: 18px; - margin-bottom: 4px; - background-image:var(--icon-folder-closed-image); - background-repeat: repeat-y; - vertical-align:top; - display: inline-block; -} - -.icondoc { - width: 24px; - height: 18px; - margin-bottom: 4px; - background-image:var(--icon-doc-image); - background-position: 0px -4px; - background-repeat: repeat-y; - vertical-align:top; - display: inline-block; -} - -/* @end */ - -div.dynheader { - margin-top: 8px; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -address { - font-style: normal; - color: var(--footer-foreground-color); -} - -table.doxtable caption { - caption-side: top; -} - -table.doxtable { - border-collapse:collapse; - margin-top: 4px; - margin-bottom: 4px; -} - -table.doxtable td, table.doxtable th { - border: 1px solid var(--table-cell-border-color); - padding: 3px 7px 2px; -} - -table.doxtable th { - background-color: var(--table-header-background-color); - color: var(--table-header-foreground-color); - font-size: 110%; - padding-bottom: 4px; - padding-top: 5px; -} - -table.fieldtable { - margin-bottom: 10px; - border: 1px solid var(--memdef-border-color); - border-spacing: 0px; - border-radius: 4px; - box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); -} - -.fieldtable td, .fieldtable th { - padding: 3px 7px 2px; -} - -.fieldtable td.fieldtype, .fieldtable td.fieldname { - white-space: nowrap; - border-right: 1px solid var(--memdef-border-color); - border-bottom: 1px solid var(--memdef-border-color); - vertical-align: top; -} - -.fieldtable td.fieldname { - padding-top: 3px; -} - -.fieldtable td.fielddoc { - border-bottom: 1px solid var(--memdef-border-color); -} - -.fieldtable td.fielddoc p:first-child { - margin-top: 0px; -} - -.fieldtable td.fielddoc p:last-child { - margin-bottom: 2px; -} - -.fieldtable tr:last-child td { - border-bottom: none; -} - -.fieldtable th { - background-image: var(--memdef-title-gradient-image); - background-repeat:repeat-x; - background-color: var(--memdef-title-background-color); - font-size: 90%; - color: var(--memdef-proto-text-color); - padding-bottom: 4px; - padding-top: 5px; - text-align:left; - font-weight: 400; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - border-bottom: 1px solid var(--memdef-border-color); -} - - -.tabsearch { - top: 0px; - left: 10px; - height: 36px; - background-image: var(--nav-gradient-image); - z-index: 101; - overflow: hidden; - font-size: 13px; -} - -.navpath ul -{ - font-size: 11px; - background-image: var(--nav-gradient-image); - background-repeat:repeat-x; - background-position: 0 -5px; - height:30px; - line-height:30px; - color:var(--nav-text-normal-color); - border:solid 1px var(--nav-breadcrumb-border-color); - overflow:hidden; - margin:0px; - padding:0px; -} - -.navpath li -{ - list-style-type:none; - float:left; - padding-left:10px; - padding-right:15px; - background-image:var(--nav-breadcrumb-image); - background-repeat:no-repeat; - background-position:right; - color: var(--nav-foreground-color); -} - -.navpath li.navelem a -{ - height:32px; - display:block; - outline: none; - color: var(--nav-text-normal-color); - font-family: var(--font-family-nav); - text-shadow: var(--nav-text-normal-shadow); - text-decoration: none; -} - -.navpath li.navelem a:hover -{ - color: var(--nav-text-hover-color); - text-shadow: var(--nav-text-hover-shadow); -} - -.navpath li.footer -{ - list-style-type:none; - float:right; - padding-left:10px; - padding-right:15px; - background-image:none; - background-repeat:no-repeat; - background-position:right; - color: var(--footer-foreground-color); - font-size: 8pt; -} - - -div.summary -{ - float: right; - font-size: 8pt; - padding-right: 5px; - width: 50%; - text-align: right; -} - -div.summary a -{ - white-space: nowrap; -} - -table.classindex -{ - margin: 10px; - white-space: nowrap; - margin-left: 3%; - margin-right: 3%; - width: 94%; - border: 0; - border-spacing: 0; - padding: 0; -} - -div.ingroups -{ - font-size: 8pt; - width: 50%; - text-align: left; -} - -div.ingroups a -{ - white-space: nowrap; -} - -div.header -{ - background-image: var(--header-gradient-image); - background-repeat:repeat-x; - background-color: var(--header-background-color); - margin: 0px; - border-bottom: 1px solid var(--header-separator-color); -} - -div.headertitle -{ - padding: 5px 5px 5px 10px; -} - -.PageDocRTL-title div.headertitle { - text-align: right; - direction: rtl; -} - -dl { - padding: 0 0 0 0; -} - -/* - -dl.section { - margin-left: 0px; - padding-left: 0px; -} - -dl.note { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #D0C000; -} - -dl.warning, dl.attention, dl.important { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #FF0000; -} - -dl.pre, dl.post, dl.invariant { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #00D000; -} - -dl.deprecated { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #505050; -} - -dl.todo { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #00C0E0; -} - -dl.test { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #3030E0; -} - -dl.bug { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #C08050; -} - -*/ - -dl.bug dt a, dl.deprecated dt a, dl.todo dt a, dl.test a { - font-weight: bold !important; -} - -dl.warning, dl.attention, dl.important, dl.note, dl.deprecated, dl.bug, -dl.invariant, dl.pre, dl.post, dl.todo, dl.test, dl.remark { - padding: 10px; - margin: 10px 0px; - overflow: hidden; - margin-left: 0; - border-radius: 4px; -} - -dl.section dd { - margin-bottom: 2px; -} - -dl.warning, dl.attention, dl.important { - background: var(--warning-color-bg); - border-left: 8px solid var(--warning-color-hl); - color: var(--warning-color-text); -} - -dl.warning dt, dl.attention dt, dl.important dt { - color: var(--warning-color-hl); -} - -dl.note, dl.remark { - background: var(--note-color-bg); - border-left: 8px solid var(--note-color-hl); - color: var(--note-color-text); -} - -dl.note dt, dl.remark dt { - color: var(--note-color-hl); -} - -dl.todo { - background: var(--todo-color-bg); - border-left: 8px solid var(--todo-color-hl); - color: var(--todo-color-text); -} - -dl.todo dt { - color: var(--todo-color-hl); -} - -dl.test { - background: var(--test-color-bg); - border-left: 8px solid var(--test-color-hl); - color: var(--test-color-text); -} - -dl.test dt { - color: var(--test-color-hl); -} - -dl.bug dt a { - color: var(--bug-color-hl) !important; -} - -dl.bug { - background: var(--bug-color-bg); - border-left: 8px solid var(--bug-color-hl); - color: var(--bug-color-text); -} - -dl.bug dt a { - color: var(--bug-color-hl) !important; -} - -dl.deprecated { - background: var(--deprecated-color-bg); - border-left: 8px solid var(--deprecated-color-hl); - color: var(--deprecated-color-text); -} - -dl.deprecated dt a { - color: var(--deprecated-color-hl) !important; -} - -dl.note dd, dl.warning dd, dl.pre dd, dl.post dd, -dl.remark dd, dl.attention dd, dl.important dd, dl.invariant dd, -dl.bug dd, dl.deprecated dd, dl.todo dd, dl.test dd { - margin-inline-start: 0px; -} - -dl.invariant, dl.pre, dl.post { - background: var(--invariant-color-bg); - border-left: 8px solid var(--invariant-color-hl); - color: var(--invariant-color-text); -} - -dl.invariant dt, dl.pre dt, dl.post dt { - color: var(--invariant-color-hl); -} - - -#projectrow -{ - height: 56px; -} - -#projectlogo -{ - text-align: center; - vertical-align: bottom; - border-collapse: separate; -} - -#projectlogo img -{ - border: 0px none; -} - -#projectalign -{ - vertical-align: middle; - padding-left: 0.5em; -} - -#projectname -{ - font-size: 200%; - font-family: var(--font-family-title); - margin: 0px; - padding: 2px 0px; -} - -#projectbrief -{ - font-size: 90%; - font-family: var(--font-family-title); - margin: 0px; - padding: 0px; -} - -#projectnumber -{ - font-size: 50%; - font-family: 50% var(--font-family-title); - margin: 0px; - padding: 0px; -} - -#titlearea -{ - padding: 0px; - margin: 0px; - width: 100%; - border-bottom: 1px solid var(--title-separator-color); - background-color: var(--title-background-color); -} - -.image -{ - text-align: center; -} - -.dotgraph -{ - text-align: center; -} - -.mscgraph -{ - text-align: center; -} - -.plantumlgraph -{ - text-align: center; -} - -.diagraph -{ - text-align: center; -} - -.caption -{ - font-weight: bold; -} - -dl.citelist { - margin-bottom:50px; -} - -dl.citelist dt { - color:var(--citation-label-color); - float:left; - font-weight:bold; - margin-right:10px; - padding:5px; - text-align:right; - width:52px; -} - -dl.citelist dd { - margin:2px 0 2px 72px; - padding:5px 0; -} - -div.toc { - padding: 14px 25px; - background-color: var(--toc-background-color); - border: 1px solid var(--toc-border-color); - border-radius: 7px 7px 7px 7px; - float: right; - height: auto; - margin: 0 8px 10px 10px; - width: 200px; -} - -div.toc li { - background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; - font: 10px/1.2 var(--font-family-toc); - margin-top: 5px; - padding-left: 10px; - padding-top: 2px; -} - -div.toc h3 { - font: bold 12px/1.2 var(--font-family-toc); - color: var(--toc-header-color); - border-bottom: 0 none; - margin: 0; -} - -div.toc ul { - list-style: none outside none; - border: medium none; - padding: 0px; -} - -div.toc li.level1 { - margin-left: 0px; -} - -div.toc li.level2 { - margin-left: 15px; -} - -div.toc li.level3 { - margin-left: 15px; -} - -div.toc li.level4 { - margin-left: 15px; -} - -span.emoji { - /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html - * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; - */ -} - -span.obfuscator { - display: none; -} - -.inherit_header { - font-weight: bold; - color: var(--inherit-header-color); - cursor: pointer; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.inherit_header td { - padding: 6px 0px 2px 5px; -} - -.inherit { - display: none; -} - -tr.heading h2 { - margin-top: 12px; - margin-bottom: 4px; -} - -/* tooltip related style info */ - -.ttc { - position: absolute; - display: none; -} - -#powerTip { - cursor: default; - /*white-space: nowrap;*/ - color: var(--tooltip-foreground-color); - background-color: var(--tooltip-background-color); - border: 1px solid var(--tooltip-border-color); - border-radius: 4px 4px 4px 4px; - box-shadow: var(--tooltip-shadow); - display: none; - font-size: smaller; - max-width: 80%; - opacity: 0.9; - padding: 1ex 1em 1em; - position: absolute; - z-index: 2147483647; -} - -#powerTip div.ttdoc { - color: var(--tooltip-doc-color); - font-style: italic; -} - -#powerTip div.ttname a { - font-weight: bold; -} - -#powerTip a { - color: var(--tooltip-link-color); -} - -#powerTip div.ttname { - font-weight: bold; -} - -#powerTip div.ttdeci { - color: var(--tooltip-declaration-color); -} - -#powerTip div { - margin: 0px; - padding: 0px; - font-size: 12px; - font-family: var(--font-family-tooltip); - line-height: 16px; -} - -#powerTip:before, #powerTip:after { - content: ""; - position: absolute; - margin: 0px; -} - -#powerTip.n:after, #powerTip.n:before, -#powerTip.s:after, #powerTip.s:before, -#powerTip.w:after, #powerTip.w:before, -#powerTip.e:after, #powerTip.e:before, -#powerTip.ne:after, #powerTip.ne:before, -#powerTip.se:after, #powerTip.se:before, -#powerTip.nw:after, #powerTip.nw:before, -#powerTip.sw:after, #powerTip.sw:before { - border: solid transparent; - content: " "; - height: 0; - width: 0; - position: absolute; -} - -#powerTip.n:after, #powerTip.s:after, -#powerTip.w:after, #powerTip.e:after, -#powerTip.nw:after, #powerTip.ne:after, -#powerTip.sw:after, #powerTip.se:after { - border-color: rgba(255, 255, 255, 0); -} - -#powerTip.n:before, #powerTip.s:before, -#powerTip.w:before, #powerTip.e:before, -#powerTip.nw:before, #powerTip.ne:before, -#powerTip.sw:before, #powerTip.se:before { - border-color: rgba(128, 128, 128, 0); -} - -#powerTip.n:after, #powerTip.n:before, -#powerTip.ne:after, #powerTip.ne:before, -#powerTip.nw:after, #powerTip.nw:before { - top: 100%; -} - -#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { - border-top-color: var(--tooltip-background-color); - border-width: 10px; - margin: 0px -10px; -} -#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { - border-top-color: var(--tooltip-border-color); - border-width: 11px; - margin: 0px -11px; -} -#powerTip.n:after, #powerTip.n:before { - left: 50%; -} - -#powerTip.nw:after, #powerTip.nw:before { - right: 14px; -} - -#powerTip.ne:after, #powerTip.ne:before { - left: 14px; -} - -#powerTip.s:after, #powerTip.s:before, -#powerTip.se:after, #powerTip.se:before, -#powerTip.sw:after, #powerTip.sw:before { - bottom: 100%; -} - -#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { - border-bottom-color: var(--tooltip-background-color); - border-width: 10px; - margin: 0px -10px; -} - -#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { - border-bottom-color: var(--tooltip-border-color); - border-width: 11px; - margin: 0px -11px; -} - -#powerTip.s:after, #powerTip.s:before { - left: 50%; -} - -#powerTip.sw:after, #powerTip.sw:before { - right: 14px; -} - -#powerTip.se:after, #powerTip.se:before { - left: 14px; -} - -#powerTip.e:after, #powerTip.e:before { - left: 100%; -} -#powerTip.e:after { - border-left-color: var(--tooltip-border-color); - border-width: 10px; - top: 50%; - margin-top: -10px; -} -#powerTip.e:before { - border-left-color: var(--tooltip-border-color); - border-width: 11px; - top: 50%; - margin-top: -11px; -} - -#powerTip.w:after, #powerTip.w:before { - right: 100%; -} -#powerTip.w:after { - border-right-color: var(--tooltip-border-color); - border-width: 10px; - top: 50%; - margin-top: -10px; -} -#powerTip.w:before { - border-right-color: var(--tooltip-border-color); - border-width: 11px; - top: 50%; - margin-top: -11px; -} - -@media print -{ - #top { display: none; } - #side-nav { display: none; } - #nav-path { display: none; } - body { overflow:visible; } - h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } - .summary { display: none; } - .memitem { page-break-inside: avoid; } - #doc-content - { - margin-left:0 !important; - height:auto !important; - width:auto !important; - overflow:inherit; - display:inline; - } -} - -/* @group Markdown */ - -table.markdownTable { - border-collapse:collapse; - margin-top: 4px; - margin-bottom: 4px; -} - -table.markdownTable td, table.markdownTable th { - border: 1px solid var(--table-cell-border-color); - padding: 3px 7px 2px; -} - -table.markdownTable tr { -} - -th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { - background-color: var(--table-header-background-color); - color: var(--table-header-foreground-color); - font-size: 110%; - padding-bottom: 4px; - padding-top: 5px; -} - -th.markdownTableHeadLeft, td.markdownTableBodyLeft { - text-align: left -} - -th.markdownTableHeadRight, td.markdownTableBodyRight { - text-align: right -} - -th.markdownTableHeadCenter, td.markdownTableBodyCenter { - text-align: center -} - -tt, code, kbd, samp -{ - display: inline-block; -} -/* @end */ - -u { - text-decoration: underline; -} - -details>summary { - list-style-type: none; -} - -details > summary::-webkit-details-marker { - display: none; -} - -details>summary::before { - content: "\25ba"; - padding-right:4px; - font-size: 80%; -} - -details[open]>summary::before { - content: "\25bc"; - padding-right:4px; - font-size: 80%; -} - -body { - scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); -} - -::-webkit-scrollbar { - background-color: var(--scrollbar-background-color); - height: 12px; - width: 12px; -} -::-webkit-scrollbar-thumb { - border-radius: 6px; - box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); - border: solid 2px transparent; -} -::-webkit-scrollbar-corner { - background-color: var(--scrollbar-background-color); -} - diff --git a/doxygen/doxydoc.NET/html/doxygen.svg b/doxygen/doxydoc.NET/html/doxygen.svg deleted file mode 100644 index 79a7635..0000000 --- a/doxygen/doxydoc.NET/html/doxygen.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doxygen/doxydoc.NET/html/doxygen_crawl.html b/doxygen/doxydoc.NET/html/doxygen_crawl.html deleted file mode 100644 index 83baf4f..0000000 --- a/doxygen/doxydoc.NET/html/doxygen_crawl.html +++ /dev/null @@ -1,937 +0,0 @@ - - - -Validator / crawler helper - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doxygen/doxydoc.NET/html/dynsections.js b/doxygen/doxydoc.NET/html/dynsections.js deleted file mode 100644 index b05f4c8..0000000 --- a/doxygen/doxydoc.NET/html/dynsections.js +++ /dev/null @@ -1,198 +0,0 @@ -/* - @licstart The following is the entire license notice for the JavaScript code in this file. - - The MIT License (MIT) - - Copyright (C) 1997-2020 by Dimitri van Heesch - - Permission is hereby granted, free of charge, to any person obtaining a copy of this software - and associated documentation files (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, publish, distribute, - sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all copies or - substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING - BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - @licend The above is the entire license notice for the JavaScript code in this file - */ - -function toggleVisibility(linkObj) { - return dynsection.toggleVisibility(linkObj); -} - -let dynsection = { - - // helper function - updateStripes : function() { - $('table.directory tr'). - removeClass('even').filter(':visible:even').addClass('even'); - $('table.directory tr'). - removeClass('odd').filter(':visible:odd').addClass('odd'); - }, - - toggleVisibility : function(linkObj) { - const base = $(linkObj).attr('id'); - const summary = $('#'+base+'-summary'); - const content = $('#'+base+'-content'); - const trigger = $('#'+base+'-trigger'); - const src=$(trigger).attr('src'); - if (content.is(':visible')===true) { - content.hide(); - summary.show(); - $(linkObj).addClass('closed').removeClass('opened'); - $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); - } else { - content.show(); - summary.hide(); - $(linkObj).removeClass('closed').addClass('opened'); - $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); - } - return false; - }, - - toggleLevel : function(level) { - $('table.directory tr').each(function() { - const l = this.id.split('_').length-1; - const i = $('#img'+this.id.substring(3)); - const a = $('#arr'+this.id.substring(3)); - if (l'); - // add vertical lines to other rows - $('span[class=lineno]').not(':eq(0)').append(''); - // add toggle controls to lines with fold divs - $('div[class=foldopen]').each(function() { - // extract specific id to use - const id = $(this).attr('id').replace('foldopen',''); - // extract start and end foldable fragment attributes - const start = $(this).attr('data-start'); - const end = $(this).attr('data-end'); - // replace normal fold span with controls for the first line of a foldable fragment - $(this).find('span[class=fold]:first').replaceWith(''); - // append div for folded (closed) representation - $(this).after(''); - // extract the first line from the "open" section to represent closed content - const line = $(this).children().first().clone(); - // remove any glow that might still be active on the original line - $(line).removeClass('glow'); - if (start) { - // if line already ends with a start marker (e.g. trailing {), remove it - $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); - } - // replace minus with plus symbol - $(line).find('span[class=fold]').css('background-image',codefold.plusImg[relPath]); - // append ellipsis - $(line).append(' '+start+''+end); - // insert constructed line into closed div - $('#foldclosed'+id).html(line); - }); - }, -}; -/* @license-end */ diff --git a/doxygen/doxydoc.NET/html/folderclosed.svg b/doxygen/doxydoc.NET/html/folderclosed.svg deleted file mode 100644 index b04bed2..0000000 --- a/doxygen/doxydoc.NET/html/folderclosed.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - diff --git a/doxygen/doxydoc.NET/html/folderclosedd.svg b/doxygen/doxydoc.NET/html/folderclosedd.svg deleted file mode 100644 index 52f0166..0000000 --- a/doxygen/doxydoc.NET/html/folderclosedd.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - diff --git a/doxygen/doxydoc.NET/html/folderopen.svg b/doxygen/doxydoc.NET/html/folderopen.svg deleted file mode 100644 index f6896dd..0000000 --- a/doxygen/doxydoc.NET/html/folderopen.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - diff --git a/doxygen/doxydoc.NET/html/folderopend.svg b/doxygen/doxydoc.NET/html/folderopend.svg deleted file mode 100644 index 2d1f06e..0000000 --- a/doxygen/doxydoc.NET/html/folderopend.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - diff --git a/doxygen/doxydoc.NET/html/functions.html b/doxygen/doxydoc.NET/html/functions.html deleted file mode 100644 index 30a18e7..0000000 --- a/doxygen/doxydoc.NET/html/functions.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - -lib60870.NET: Class Members - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented class members with links to the class documentation for each member:
    - -

    - a -

    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/functions_c.html b/doxygen/doxydoc.NET/html/functions_c.html deleted file mode 100644 index 19bb35b..0000000 --- a/doxygen/doxydoc.NET/html/functions_c.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - -lib60870.NET: Class Members - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented class members with links to the class documentation for each member:
    - -

    - c -

    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/functions_d.html b/doxygen/doxydoc.NET/html/functions_d.html deleted file mode 100644 index f3df4dd..0000000 --- a/doxygen/doxydoc.NET/html/functions_d.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - -lib60870.NET: Class Members - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented class members with links to the class documentation for each member:
    - -

    - d -

    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/functions_dup.js b/doxygen/doxydoc.NET/html/functions_dup.js deleted file mode 100644 index 1b94e73..0000000 --- a/doxygen/doxydoc.NET/html/functions_dup.js +++ /dev/null @@ -1,25 +0,0 @@ -var functions_dup = -[ - [ "a", "functions.html", null ], - [ "c", "functions_c.html", null ], - [ "d", "functions_d.html", null ], - [ "e", "functions_e.html", null ], - [ "f", "functions_f.html", null ], - [ "g", "functions_g.html", null ], - [ "h", "functions_h.html", null ], - [ "i", "functions_i.html", null ], - [ "k", "functions_k.html", null ], - [ "l", "functions_l.html", null ], - [ "m", "functions_m.html", null ], - [ "n", "functions_n.html", null ], - [ "o", "functions_o.html", null ], - [ "p", "functions_p.html", null ], - [ "q", "functions_q.html", null ], - [ "r", "functions_r.html", null ], - [ "s", "functions_s.html", null ], - [ "t", "functions_t.html", null ], - [ "u", "functions_u.html", null ], - [ "v", "functions_v.html", null ], - [ "w", "functions_w.html", null ], - [ "y", "functions_y.html", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/functions_e.html b/doxygen/doxydoc.NET/html/functions_e.html deleted file mode 100644 index a88efb3..0000000 --- a/doxygen/doxydoc.NET/html/functions_e.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - -lib60870.NET: Class Members - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented class members with links to the class documentation for each member:
    - -

    - e -

    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/functions_f.html b/doxygen/doxydoc.NET/html/functions_f.html deleted file mode 100644 index 36a2855..0000000 --- a/doxygen/doxydoc.NET/html/functions_f.html +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - -lib60870.NET: Class Members - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented class members with links to the class documentation for each member:
    - -

    - f -

    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/functions_func.html b/doxygen/doxydoc.NET/html/functions_func.html deleted file mode 100644 index f040a49..0000000 --- a/doxygen/doxydoc.NET/html/functions_func.html +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - - -lib60870.NET: Class Members - Functions - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented functions with links to the class documentation for each member:
    - -

    - a -

    - - -

    - c -

    - - -

    - d -

    - - -

    - e -

    - - -

    - f -

    - - -

    - g -

    - - -

    - i -

    - - -

    - l -

    - - -

    - m -

    - - -

    - r -

    - - -

    - s -

    - - -

    - t -

    - - -

    - u -

    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/functions_g.html b/doxygen/doxydoc.NET/html/functions_g.html deleted file mode 100644 index eda991c..0000000 --- a/doxygen/doxydoc.NET/html/functions_g.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - -lib60870.NET: Class Members - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented class members with links to the class documentation for each member:
    - -

    - g -

    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/functions_h.html b/doxygen/doxydoc.NET/html/functions_h.html deleted file mode 100644 index 69e02b3..0000000 --- a/doxygen/doxydoc.NET/html/functions_h.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - -lib60870.NET: Class Members - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented class members with links to the class documentation for each member:
    - -

    - h -

    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/functions_i.html b/doxygen/doxydoc.NET/html/functions_i.html deleted file mode 100644 index fc4d782..0000000 --- a/doxygen/doxydoc.NET/html/functions_i.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - -lib60870.NET: Class Members - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented class members with links to the class documentation for each member:
    - -

    - i -

    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/functions_k.html b/doxygen/doxydoc.NET/html/functions_k.html deleted file mode 100644 index ef3e4aa..0000000 --- a/doxygen/doxydoc.NET/html/functions_k.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - -lib60870.NET: Class Members - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented class members with links to the class documentation for each member:
    - -

    - k -

    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/functions_l.html b/doxygen/doxydoc.NET/html/functions_l.html deleted file mode 100644 index 222fa4e..0000000 --- a/doxygen/doxydoc.NET/html/functions_l.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - -lib60870.NET: Class Members - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented class members with links to the class documentation for each member:
    - -

    - l -

    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/functions_m.html b/doxygen/doxydoc.NET/html/functions_m.html deleted file mode 100644 index 964e6b8..0000000 --- a/doxygen/doxydoc.NET/html/functions_m.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - -lib60870.NET: Class Members - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented class members with links to the class documentation for each member:
    - -

    - m -

    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/functions_n.html b/doxygen/doxydoc.NET/html/functions_n.html deleted file mode 100644 index 7492385..0000000 --- a/doxygen/doxydoc.NET/html/functions_n.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - -lib60870.NET: Class Members - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented class members with links to the class documentation for each member:
    - -

    - n -

    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/functions_o.html b/doxygen/doxydoc.NET/html/functions_o.html deleted file mode 100644 index 49e6b27..0000000 --- a/doxygen/doxydoc.NET/html/functions_o.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - -lib60870.NET: Class Members - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented class members with links to the class documentation for each member:
    - -

    - o -

    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/functions_p.html b/doxygen/doxydoc.NET/html/functions_p.html deleted file mode 100644 index 0685423..0000000 --- a/doxygen/doxydoc.NET/html/functions_p.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - -lib60870.NET: Class Members - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented class members with links to the class documentation for each member:
    - -

    - p -

    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/functions_prop.html b/doxygen/doxydoc.NET/html/functions_prop.html deleted file mode 100644 index d5a6061..0000000 --- a/doxygen/doxydoc.NET/html/functions_prop.html +++ /dev/null @@ -1,293 +0,0 @@ - - - - - - - -lib60870.NET: Class Members - Properties - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented properties with links to the class documentation for each member:
    - -

    - a -

    - - -

    - c -

    - - -

    - d -

    - - -

    - e -

    - - -

    - f -

    - - -

    - g -

    - - -

    - h -

    - - -

    - i -

    - - -

    - k -

    - - -

    - l -

    - - -

    - m -

    - - -

    - n -

    - - -

    - o -

    - - -

    - p -

    - - -

    - q -

    - - -

    - r -

    - - -

    - s -

    - - -

    - t -

    - - -

    - u -

    - - -

    - v -

    - - -

    - w -

    - - -

    - y -

    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/functions_q.html b/doxygen/doxydoc.NET/html/functions_q.html deleted file mode 100644 index 78eeb72..0000000 --- a/doxygen/doxydoc.NET/html/functions_q.html +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - -lib60870.NET: Class Members - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented class members with links to the class documentation for each member:
    - -

    - q -

    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/functions_r.html b/doxygen/doxydoc.NET/html/functions_r.html deleted file mode 100644 index a00d2c5..0000000 --- a/doxygen/doxydoc.NET/html/functions_r.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - -lib60870.NET: Class Members - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented class members with links to the class documentation for each member:
    - -

    - r -

    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/functions_s.html b/doxygen/doxydoc.NET/html/functions_s.html deleted file mode 100644 index 8eb69cb..0000000 --- a/doxygen/doxydoc.NET/html/functions_s.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - -lib60870.NET: Class Members - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented class members with links to the class documentation for each member:
    - -

    - s -

    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/functions_t.html b/doxygen/doxydoc.NET/html/functions_t.html deleted file mode 100644 index 2427388..0000000 --- a/doxygen/doxydoc.NET/html/functions_t.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - -lib60870.NET: Class Members - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented class members with links to the class documentation for each member:
    - -

    - t -

    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/functions_u.html b/doxygen/doxydoc.NET/html/functions_u.html deleted file mode 100644 index d77eff9..0000000 --- a/doxygen/doxydoc.NET/html/functions_u.html +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - -lib60870.NET: Class Members - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented class members with links to the class documentation for each member:
    - -

    - u -

    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/functions_v.html b/doxygen/doxydoc.NET/html/functions_v.html deleted file mode 100644 index 3c957c1..0000000 --- a/doxygen/doxydoc.NET/html/functions_v.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - -lib60870.NET: Class Members - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented class members with links to the class documentation for each member:
    - -

    - v -

    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/functions_vars.html b/doxygen/doxydoc.NET/html/functions_vars.html deleted file mode 100644 index ddf9322..0000000 --- a/doxygen/doxydoc.NET/html/functions_vars.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - -lib60870.NET: Class Members - Variables - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented variables with links to the class documentation for each member:
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/functions_w.html b/doxygen/doxydoc.NET/html/functions_w.html deleted file mode 100644 index 7b5b1be..0000000 --- a/doxygen/doxydoc.NET/html/functions_w.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - -lib60870.NET: Class Members - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented class members with links to the class documentation for each member:
    - -

    - w -

    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/functions_y.html b/doxygen/doxydoc.NET/html/functions_y.html deleted file mode 100644 index 6f44ca5..0000000 --- a/doxygen/doxydoc.NET/html/functions_y.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - -lib60870.NET: Class Members - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented class members with links to the class documentation for each member:
    - -

    - y -

    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/graph_legend.dot b/doxygen/doxydoc.NET/html/graph_legend.dot deleted file mode 100644 index 97a6d61..0000000 --- a/doxygen/doxydoc.NET/html/graph_legend.dot +++ /dev/null @@ -1,24 +0,0 @@ -digraph "Graph Legend" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node9 [id="Node000009",label="Inherited",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node10 -> Node9 [dir="back",color="steelblue1",style="solid" tooltip=" "]; - Node10 [id="Node000010",label="PublicBase",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",tooltip=" "]; - Node11 -> Node10 [dir="back",color="steelblue1",style="solid" tooltip=" "]; - Node11 [id="Node000011",label="Truncated",height=0.2,width=0.4,color="red", fillcolor="#FFF0F0", style="filled",tooltip=" "]; - Node13 -> Node9 [dir="back",color="darkgreen",style="solid" tooltip=" "]; - Node13 [label="ProtectedBase",color="gray40",fillcolor="white",style="filled" tooltip=" "]; - Node14 -> Node9 [dir="back",color="firebrick4",style="solid" tooltip=" "]; - Node14 [label="PrivateBase",color="gray40",fillcolor="white",style="filled" tooltip=" "]; - Node15 -> Node9 [dir="back",color="steelblue1",style="solid" tooltip=" "]; - Node15 [id="Node000015",label="Undocumented",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; - Node16 -> Node9 [dir="back",color="steelblue1",style="solid" tooltip=" "]; - Node16 [label="Templ\< int \>",color="gray40",fillcolor="white",style="filled" tooltip=" "]; - Node17 -> Node16 [dir="back",color="orange",style="dashed",label="< int >",fontcolor="grey" tooltip=" "]; - Node17 [label="Templ\< T \>",color="gray40",fillcolor="white",style="filled" tooltip=" "]; - Node18 -> Node9 [dir="back",color="darkorchid3",style="dashed",label="m_usedClass",fontcolor="grey" tooltip=" "]; - Node18 [label="Used",color="gray40",fillcolor="white",style="filled" tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/graph_legend.html b/doxygen/doxydoc.NET/html/graph_legend.html deleted file mode 100644 index ff41a63..0000000 --- a/doxygen/doxydoc.NET/html/graph_legend.html +++ /dev/null @@ -1,173 +0,0 @@ - - - - - - - -lib60870.NET: Graph Legend - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Graph Legend
    -
    -
    -

    This page explains how to interpret the graphs that are generated by doxygen.

    -

    Consider the following example:

    /*! Invisible class because of truncation */
    -
    class Invisible { };
    -
    -
    /*! Truncated class, inheritance relation is hidden */
    -
    class Truncated : public Invisible { };
    -
    -
    /* Class not documented with doxygen comments */
    -
    class Undocumented { };
    -
    -
    /*! Class that is inherited using public inheritance */
    -
    class PublicBase : public Truncated { };
    -
    -
    /*! A template class */
    -
    template<class T> class Templ { };
    -
    -
    /*! Class that is inherited using protected inheritance */
    -
    class ProtectedBase { };
    -
    -
    /*! Class that is inherited using private inheritance */
    -
    class PrivateBase { };
    -
    -
    /*! Class that is used by the Inherited class */
    -
    class Used { };
    -
    -
    /*! Super class that inherits a number of other classes */
    -
    class Inherited : public PublicBase,
    -
    protected ProtectedBase,
    -
    private PrivateBase,
    -
    public Undocumented,
    -
    public Templ<int>
    -
    {
    -
    private:
    -
    Used *m_usedClass;
    -
    };
    -

    This will result in the following graph:

    -

    The boxes in the above graph have the following meaning:

    -
      -
    • -A filled gray box represents the struct or class for which the graph is generated.
    • -
    • -A box with a black border denotes a documented struct or class.
    • -
    • -A box with a gray border denotes an undocumented struct or class.
    • -
    • -A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
    • -
    -

    The arrows have the following meaning:

    -
      -
    • -A blue arrow is used to visualize a public inheritance relation between two classes.
    • -
    • -A dark green arrow is used for protected inheritance.
    • -
    • -A dark red arrow is used for private inheritance.
    • -
    • -A purple dashed arrow is used if a class is contained or used by another class. The arrow is labelled with the variable(s) through which the pointed class or struct is accessible.
    • -
    • -A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labelled with the template parameters of the instance.
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/hierarchy.html b/doxygen/doxydoc.NET/html/hierarchy.html deleted file mode 100644 index 565443d..0000000 --- a/doxygen/doxydoc.NET/html/hierarchy.html +++ /dev/null @@ -1,234 +0,0 @@ - - - - - - - -lib60870.NET: Class Hierarchy - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Class Hierarchy
    -
    -
    -
    -

    Go to the graphical class hierarchy

    -This inheritance list is sorted roughly, but not completely, alphabetically:
    -
    [detail level 1234]
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     Clib60870.CS104.APCIParametersParameters for the CS 104 APCI (Application Protocol Control Information)
     Clib60870.CS101.ApplicationLayerParameters
     Clib60870.CS101.ASDUThis class represents an application layer message. It contains some generic message information and one or more InformationObject instances of the same type. It is used to send and receive messages
     Clib60870.ASDUQueue
     Clib60870.CS101.BinaryCounterReadingBinary counter reading. Used for tranmission of integrated totals
     Clib60870.CS104.ConnectionStatisticsProvides some Connection statistics
     Clib60870.CP16Time2a
     Clib60870.CP24Time2a
     Clib60870.CP32Time2a
     Clib60870.CP56Time2a
     CException
     Clib60870.ASDUParsingException
     Clib60870.CS101.ASDUQueueException
     Clib60870.ConnectionException
     Clib60870.CS101.FilesAvailableRepresents the available files in a file client or file server
     Clib60870.FrameAbstract class to encode an application layer frame
     Clib60870.CS101.IFileProvider
     Clib60870.CS101.TransparentFileSimple implementation of IFileProvider that can be used to provide transparent files. Derived classed should override the TransferComplete method
     Clib60870.CS101.IFileReceiver
     Clib60870.CS101.IMasterConnectionProvides functions to be used in Slave callbacks to send data back to the master
     Clib60870.CS101.CS101SlaveCS 101 slave implementation (implements Slave interface)
     Clib60870.CS104.ClientConnectionRepresents a client (master) connection
     Clib60870.CS101.InformationObject
     Clib60870.CS101.Bitstring32
     Clib60870.CS101.Bitstring32Command
     Clib60870.CS101.ClockSynchronizationCommand
     Clib60870.CS101.CounterInterrogationCommand
     Clib60870.CS101.DelayAcquisitionCommand
     Clib60870.CS101.DoubleCommand
     Clib60870.CS101.DoublePointInformationDouble point information object (M_DP_NA_1)
     Clib60870.CS101.EndOfInitializationEnd of initialization information object (M_EI_NA_1)
     Clib60870.CS101.EventOfProtectionEquipmentEvent of protection equipment information object (M_EP_TA_1)
     Clib60870.CS101.EventOfProtectionEquipmentWithCP56Time2aEvent of protection equipment information object with CP56Time2a time tag (M_EP_TD_1)
     Clib60870.CS101.FileACKACK file/section - F_AF_NA_1 (124)
     Clib60870.CS101.FileCallOrSelectCall/Select directory/file/section - F_SC_NA_1 (122)
     Clib60870.CS101.FileDirectoryFile directory - F_DR_TA_1 (126)
     Clib60870.CS101.FileLastSegmentOrSectionLast segment/section - F_LS_NA_1 (123)
     Clib60870.CS101.FileReadyFile ready - F_FR_NA_1 (120)
     Clib60870.CS101.FileSegmentFile segment - F_SG_NA_1 (125)
     Clib60870.CS101.IntegratedTotalsIntegrated totals information object (M_IT_NA_1)
     Clib60870.CS101.InterrogationCommand
     Clib60870.CS101.MeasuredValueNormalizedWithoutQualityMeasured value normalized without quality information object (M_ME_ND_1)
     Clib60870.CS101.MeasuredValueScaled
     Clib60870.CS101.MeasuredValueShort
     Clib60870.CS101.PackedOutputCircuitInfo
     Clib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a
     Clib60870.CS101.PackedSinglePointWithSCD
     Clib60870.CS101.PackedStartEventsOfProtectionEquipment
     Clib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a
     Clib60870.CS101.ParameterActivation
     Clib60870.CS101.ParameterFloatValue
     Clib60870.CS101.ParameterNormalizedValue
     Clib60870.CS101.ParameterScaledValue
     Clib60870.CS101.ReadCommand
     Clib60870.CS101.ResetProcessCommand
     Clib60870.CS101.SectionReadySection ready - F_SR_NA_1 (121)
     Clib60870.CS101.SetpointCommandNormalized
     Clib60870.CS101.SetpointCommandScaled
     Clib60870.CS101.SetpointCommandShort
     Clib60870.CS101.SingleCommand
     Clib60870.CS101.SinglePointInformation
     Clib60870.CS101.StepPositionInformationStep position information object (M_ST_NA_1)
     Clib60870.CS101.TestCommand
     Clib60870.CS101.TestCommandWithCP56Time2a
     Clib60870.CS101.IPrivateIOFactory
     Clib60870.LibraryCommonCommon information functions about the library
     Clib60870.linklayer.LinkLayerParametersLink layer specific parameters
     Clib60870.CS101.MasterCommon interface for CS104 and CS101 balanced and unbalanced master
     Clib60870.CS101.CS101Master
     Clib60870.CS104.ConnectionA single connection to a CS 104 (IEC 60870-5-104) server. Implements the Master interface
     Clib60870.CS101.OutputCircuitInfoOutput circuit information of protection equipment According to IEC 60870-5-101:2003 7.2.6.12
     Clib60870.CS101.PrivateInformationObjectTypesHold a list of private information object (IO) types to be used for parsing
     Clib60870.CS101.QualifierOfInterrogation
     Clib60870.CS101.QualityDescriptor
     Clib60870.CS101.QualityDescriptorPQDP - Quality descriptor for events of protection equipment according to IEC 60870-5-101:2003 7.2.6.4
     Clib60870.CS104.RedundancyGroupRepresentation of a redundancy group. A redundancy group is a group of connections that share a unique event queue. Only one connection in a redundancy group can be active
     Clib60870.CS101.ScaledValue
     Clib60870.CS101.SetpointCommandQualifier
     Clib60870.SingleCommandQualifier
     Clib60870.CS101.SingleEvent
     Clib60870.CS101.Slave
     Clib60870.CS101.CS101SlaveCS 101 slave implementation (implements Slave interface)
     Clib60870.CS104.ServerThis class represents a single IEC 60870-5 server (slave or controlled station). It is also the main access to the CS 104 server API
     Clib60870.CS101.StartEventSPE - Start events of protection equipment according to IEC 60870-5-101:2003 7.2.6.11
     Clib60870.CS101.StatusAndStatusChangeDetection
     CStream
     Clib60870.linklayer.TcpClientVirtualSerialPortTCP client virtual serial port. Can be used to tunnel CS 101 protocol over TCP/IP
     Clib60870.linklayer.TcpServerVirtualSerialPort
     Clib60870.CS104.TlsSecurityInformation
    -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/hierarchy.js b/doxygen/doxydoc.NET/html/hierarchy.js deleted file mode 100644 index 6882ddc..0000000 --- a/doxygen/doxydoc.NET/html/hierarchy.js +++ /dev/null @@ -1,142 +0,0 @@ -var hierarchy = -[ - [ "lib60870.CS104.APCIParameters", "classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html", null ], - [ "lib60870.CS101.ApplicationLayerParameters", "classlib60870_1_1_c_s101_1_1_application_layer_parameters.html", null ], - [ "lib60870.CS101.ASDU", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html", null ], - [ "lib60870.ASDUQueue", "classlib60870_1_1_a_s_d_u_queue.html", null ], - [ "lib60870.CS101.BinaryCounterReading", "classlib60870_1_1_c_s101_1_1_binary_counter_reading.html", null ], - [ "lib60870.CS104.ConnectionStatistics", "classlib60870_1_1_c_s104_1_1_connection_statistics.html", null ], - [ "lib60870.CP16Time2a", "classlib60870_1_1_c_p16_time2a.html", null ], - [ "lib60870.CP24Time2a", "classlib60870_1_1_c_p24_time2a.html", null ], - [ "lib60870.CP32Time2a", "classlib60870_1_1_c_p32_time2a.html", null ], - [ "lib60870.CP56Time2a", "classlib60870_1_1_c_p56_time2a.html", null ], - [ "Exception", null, [ - [ "lib60870.ASDUParsingException", "classlib60870_1_1_a_s_d_u_parsing_exception.html", null ], - [ "lib60870.CS101.ASDUQueueException", "classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception.html", null ], - [ "lib60870.ConnectionException", "classlib60870_1_1_connection_exception.html", [ - [ "lib60870.linklayer.LinkLayerBusyException", "classlib60870_1_1linklayer_1_1_link_layer_busy_exception.html", null ] - ] ] - ] ], - [ "lib60870.CS101.FilesAvailable", "classlib60870_1_1_c_s101_1_1_files_available.html", null ], - [ "lib60870.Frame", "classlib60870_1_1_frame.html", null ], - [ "lib60870.CS101.IFileProvider", "interfacelib60870_1_1_c_s101_1_1_i_file_provider.html", [ - [ "lib60870.CS101.TransparentFile", "classlib60870_1_1_c_s101_1_1_transparent_file.html", null ] - ] ], - [ "lib60870.CS101.IFileReceiver", "interfacelib60870_1_1_c_s101_1_1_i_file_receiver.html", null ], - [ "lib60870.CS101.IMasterConnection", "interfacelib60870_1_1_c_s101_1_1_i_master_connection.html", [ - [ "lib60870.CS101.CS101Slave", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html", null ], - [ "lib60870.CS104.ClientConnection", "classlib60870_1_1_c_s104_1_1_client_connection.html", null ] - ] ], - [ "lib60870.CS101.InformationObject", "classlib60870_1_1_c_s101_1_1_information_object.html", [ - [ "lib60870.CS101.Bitstring32", "classlib60870_1_1_c_s101_1_1_bitstring32.html", [ - [ "lib60870.CS101.Bitstring32WithCP24Time2a", "classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a.html", null ], - [ "lib60870.CS101.Bitstring32WithCP56Time2a", "classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a.html", null ] - ] ], - [ "lib60870.CS101.Bitstring32Command", "classlib60870_1_1_c_s101_1_1_bitstring32_command.html", [ - [ "lib60870.CS101.Bitstring32CommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a.html", null ] - ] ], - [ "lib60870.CS101.ClockSynchronizationCommand", "classlib60870_1_1_c_s101_1_1_clock_synchronization_command.html", null ], - [ "lib60870.CS101.CounterInterrogationCommand", "classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html", null ], - [ "lib60870.CS101.DelayAcquisitionCommand", "classlib60870_1_1_c_s101_1_1_delay_acquisition_command.html", null ], - [ "lib60870.CS101.DoubleCommand", "classlib60870_1_1_c_s101_1_1_double_command.html", [ - [ "lib60870.CS101.DoubleCommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a.html", null ], - [ "lib60870.CS101.StepCommand", "classlib60870_1_1_c_s101_1_1_step_command.html", [ - [ "lib60870.CS101.StepCommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a.html", null ] - ] ] - ] ], - [ "lib60870.CS101.DoublePointInformation", "classlib60870_1_1_c_s101_1_1_double_point_information.html", [ - [ "lib60870.CS101.DoublePointWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a.html", null ], - [ "lib60870.CS101.DoublePointWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a.html", null ] - ] ], - [ "lib60870.CS101.EndOfInitialization", "classlib60870_1_1_c_s101_1_1_end_of_initialization.html", null ], - [ "lib60870.CS101.EventOfProtectionEquipment", "classlib60870_1_1_c_s101_1_1_event_of_protection_equipment.html", null ], - [ "lib60870.CS101.EventOfProtectionEquipmentWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a.html", null ], - [ "lib60870.CS101.FileACK", "classlib60870_1_1_c_s101_1_1_file_a_c_k.html", null ], - [ "lib60870.CS101.FileCallOrSelect", "classlib60870_1_1_c_s101_1_1_file_call_or_select.html", null ], - [ "lib60870.CS101.FileDirectory", "classlib60870_1_1_c_s101_1_1_file_directory.html", null ], - [ "lib60870.CS101.FileLastSegmentOrSection", "classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html", null ], - [ "lib60870.CS101.FileReady", "classlib60870_1_1_c_s101_1_1_file_ready.html", null ], - [ "lib60870.CS101.FileSegment", "classlib60870_1_1_c_s101_1_1_file_segment.html", null ], - [ "lib60870.CS101.IntegratedTotals", "classlib60870_1_1_c_s101_1_1_integrated_totals.html", [ - [ "lib60870.CS101.IntegratedTotalsWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a.html", null ], - [ "lib60870.CS101.IntegratedTotalsWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a.html", null ] - ] ], - [ "lib60870.CS101.InterrogationCommand", "classlib60870_1_1_c_s101_1_1_interrogation_command.html", null ], - [ "lib60870.CS101.MeasuredValueNormalizedWithoutQuality", "classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html", [ - [ "lib60870.CS101.MeasuredValueNormalized", "classlib60870_1_1_c_s101_1_1_measured_value_normalized.html", [ - [ "lib60870.CS101.MeasuredValueNormalizedWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a.html", null ], - [ "lib60870.CS101.MeasuredValueNormalizedWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a.html", null ] - ] ] - ] ], - [ "lib60870.CS101.MeasuredValueScaled", "classlib60870_1_1_c_s101_1_1_measured_value_scaled.html", [ - [ "lib60870.CS101.MeasuredValueScaledWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a.html", null ], - [ "lib60870.CS101.MeasuredValueScaledWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a.html", null ] - ] ], - [ "lib60870.CS101.MeasuredValueShort", "classlib60870_1_1_c_s101_1_1_measured_value_short.html", [ - [ "lib60870.CS101.MeasuredValueShortWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a.html", null ], - [ "lib60870.CS101.MeasuredValueShortWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a.html", null ] - ] ], - [ "lib60870.CS101.PackedOutputCircuitInfo", "classlib60870_1_1_c_s101_1_1_packed_output_circuit_info.html", null ], - [ "lib60870.CS101.PackedOutputCircuitInfoWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a.html", null ], - [ "lib60870.CS101.PackedSinglePointWithSCD", "classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d.html", null ], - [ "lib60870.CS101.PackedStartEventsOfProtectionEquipment", "classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment.html", null ], - [ "lib60870.CS101.PackedStartEventsOfProtectionEquipmentWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a.html", null ], - [ "lib60870.CS101.ParameterActivation", "classlib60870_1_1_c_s101_1_1_parameter_activation.html", null ], - [ "lib60870.CS101.ParameterFloatValue", "classlib60870_1_1_c_s101_1_1_parameter_float_value.html", null ], - [ "lib60870.CS101.ParameterNormalizedValue", "classlib60870_1_1_c_s101_1_1_parameter_normalized_value.html", null ], - [ "lib60870.CS101.ParameterScaledValue", "classlib60870_1_1_c_s101_1_1_parameter_scaled_value.html", null ], - [ "lib60870.CS101.ReadCommand", "classlib60870_1_1_c_s101_1_1_read_command.html", null ], - [ "lib60870.CS101.ResetProcessCommand", "classlib60870_1_1_c_s101_1_1_reset_process_command.html", null ], - [ "lib60870.CS101.SectionReady", "classlib60870_1_1_c_s101_1_1_section_ready.html", null ], - [ "lib60870.CS101.SetpointCommandNormalized", "classlib60870_1_1_c_s101_1_1_setpoint_command_normalized.html", [ - [ "lib60870.CS101.SetpointCommandNormalizedWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a.html", null ] - ] ], - [ "lib60870.CS101.SetpointCommandScaled", "classlib60870_1_1_c_s101_1_1_setpoint_command_scaled.html", [ - [ "lib60870.CS101.SetpointCommandScaledWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a.html", null ] - ] ], - [ "lib60870.CS101.SetpointCommandShort", "classlib60870_1_1_c_s101_1_1_setpoint_command_short.html", [ - [ "lib60870.CS101.SetpointCommandShortWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a.html", null ] - ] ], - [ "lib60870.CS101.SingleCommand", "classlib60870_1_1_c_s101_1_1_single_command.html", [ - [ "lib60870.CS101.SingleCommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a.html", null ] - ] ], - [ "lib60870.CS101.SinglePointInformation", "classlib60870_1_1_c_s101_1_1_single_point_information.html", [ - [ "lib60870.CS101.SinglePointWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a.html", null ], - [ "lib60870.CS101.SinglePointWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a.html", null ] - ] ], - [ "lib60870.CS101.StepPositionInformation", "classlib60870_1_1_c_s101_1_1_step_position_information.html", [ - [ "lib60870.CS101.StepPositionWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a.html", null ], - [ "lib60870.CS101.StepPositionWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a.html", null ] - ] ], - [ "lib60870.CS101.TestCommand", "classlib60870_1_1_c_s101_1_1_test_command.html", null ], - [ "lib60870.CS101.TestCommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html", null ] - ] ], - [ "lib60870.CS101.IPrivateIOFactory", "interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html", null ], - [ "lib60870.LibraryCommon", "classlib60870_1_1_library_common.html", null ], - [ "lib60870.linklayer.LinkLayerParameters", "classlib60870_1_1linklayer_1_1_link_layer_parameters.html", null ], - [ "lib60870.CS101.Master", "classlib60870_1_1_c_s101_1_1_master.html", [ - [ "lib60870.CS101.CS101Master", "classlib60870_1_1_c_s101_1_1_c_s101_master.html", null ], - [ "lib60870.CS104.Connection", "classlib60870_1_1_c_s104_1_1_connection.html", null ] - ] ], - [ "lib60870.CS101.OutputCircuitInfo", "classlib60870_1_1_c_s101_1_1_output_circuit_info.html", null ], - [ "lib60870.CS101.PrivateInformationObjectTypes", "classlib60870_1_1_c_s101_1_1_private_information_object_types.html", null ], - [ "lib60870.CS101.QualifierOfInterrogation", "classlib60870_1_1_c_s101_1_1_qualifier_of_interrogation.html", null ], - [ "lib60870.CS101.QualityDescriptor", "classlib60870_1_1_c_s101_1_1_quality_descriptor.html", null ], - [ "lib60870.CS101.QualityDescriptorP", "classlib60870_1_1_c_s101_1_1_quality_descriptor_p.html", null ], - [ "lib60870.CS104.RedundancyGroup", "classlib60870_1_1_c_s104_1_1_redundancy_group.html", null ], - [ "lib60870.CS101.ScaledValue", "classlib60870_1_1_c_s101_1_1_scaled_value.html", null ], - [ "lib60870.CS101.SetpointCommandQualifier", "classlib60870_1_1_c_s101_1_1_setpoint_command_qualifier.html", null ], - [ "lib60870.SingleCommandQualifier", "classlib60870_1_1_single_command_qualifier.html", null ], - [ "lib60870.CS101.SingleEvent", "classlib60870_1_1_c_s101_1_1_single_event.html", null ], - [ "lib60870.CS101.Slave", "classlib60870_1_1_c_s101_1_1_slave.html", [ - [ "lib60870.CS101.CS101Slave", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html", null ], - [ "lib60870.CS104.Server", "classlib60870_1_1_c_s104_1_1_server.html", null ] - ] ], - [ "lib60870.CS101.StartEvent", "classlib60870_1_1_c_s101_1_1_start_event.html", null ], - [ "lib60870.CS101.StatusAndStatusChangeDetection", "classlib60870_1_1_c_s101_1_1_status_and_status_change_detection.html", null ], - [ "Stream", null, [ - [ "lib60870.linklayer.TcpClientVirtualSerialPort", "classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html", null ], - [ "lib60870.linklayer.TcpServerVirtualSerialPort", "classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.html", null ] - ] ], - [ "lib60870.CS104.TlsSecurityInformation", "classlib60870_1_1_c_s104_1_1_tls_security_information.html", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/index.html b/doxygen/doxydoc.NET/html/index.html deleted file mode 100644 index 2706d82..0000000 --- a/doxygen/doxydoc.NET/html/index.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - -lib60870.NET: Main Page - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.NET Documentation
    -
    -
    - -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/inherit_graph_0.dot b/doxygen/doxydoc.NET/html/inherit_graph_0.dot deleted file mode 100644 index ff17533..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_0.dot +++ /dev/null @@ -1,17 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="Exception",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; - Node0 -> Node1 [id="edge1_Node000000_Node000001",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node1 [id="Node000001",label="lib60870.ASDUParsingException",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_a_s_d_u_parsing_exception.html",tooltip=" "]; - Node0 -> Node2 [id="edge2_Node000000_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="lib60870.CS101.ASDUQueue\lException",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception.html",tooltip=" "]; - Node0 -> Node3 [id="edge3_Node000000_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="lib60870.ConnectionException",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_connection_exception.html",tooltip=" "]; - Node3 -> Node4 [id="edge4_Node000003_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node4 [id="Node000004",label="lib60870.linklayer.LinkLayer\lBusyException",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1linklayer_1_1_link_layer_busy_exception.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_1.dot b/doxygen/doxydoc.NET/html/inherit_graph_1.dot deleted file mode 100644 index f88e3a4..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_1.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.ASDUQueue",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_a_s_d_u_queue.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_10.dot b/doxygen/doxydoc.NET/html/inherit_graph_10.dot deleted file mode 100644 index 2d93f2f..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_10.dot +++ /dev/null @@ -1,11 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CS101.IFileProvider",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$interfacelib60870_1_1_c_s101_1_1_i_file_provider.html",tooltip=" "]; - Node0 -> Node1 [id="edge5_Node000000_Node000001",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node1 [id="Node000001",label="lib60870.CS101.TransparentFile",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_transparent_file.html",tooltip="Simple implementation of IFileProvider that can be used to provide transparent files...."]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_11.dot b/doxygen/doxydoc.NET/html/inherit_graph_11.dot deleted file mode 100644 index e353c44..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_11.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CS101.IFileReceiver",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$interfacelib60870_1_1_c_s101_1_1_i_file_receiver.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_12.dot b/doxygen/doxydoc.NET/html/inherit_graph_12.dot deleted file mode 100644 index 97b6e8e..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_12.dot +++ /dev/null @@ -1,17 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CS101.IMasterConnection",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$interfacelib60870_1_1_c_s101_1_1_i_master_connection.html",tooltip="Provides functions to be used in Slave callbacks to send data back to the master."]; - Node0 -> Node1 [id="edge6_Node000000_Node000001",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node1 [id="Node000001",label="lib60870.CS101.CS101Slave",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_c_s101_slave.html",tooltip="CS 101 slave implementation (implements Slave interface)"]; - Node0 -> Node4 [id="edge7_Node000000_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node4 [id="Node000004",label="lib60870.CS104.ClientConnection",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s104_1_1_client_connection.html",tooltip="Represents a client (master) connection."]; - Node2 [id="Node000002",label="lib60870.CS101.Slave",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_slave.html",tooltip=" "]; - Node2 -> Node1 [id="edge8_Node000002_Node000001",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 -> Node3 [id="edge9_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="lib60870.CS104.Server",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s104_1_1_server.html",tooltip="This class represents a single IEC 60870-5 server (slave or controlled station). It is also the main ..."]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_13.dot b/doxygen/doxydoc.NET/html/inherit_graph_13.dot deleted file mode 100644 index b87cd21..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_13.dot +++ /dev/null @@ -1,141 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CS101.Information\lObject",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_information_object.html",tooltip=" "]; - Node0 -> Node1 [id="edge10_Node000000_Node000001",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node1 [id="Node000001",label="lib60870.CS101.Bitstring32",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32.html",tooltip=" "]; - Node1 -> Node2 [id="edge11_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="lib60870.CS101.Bitstring32\lWithCP24Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a.html",tooltip=" "]; - Node1 -> Node3 [id="edge12_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="lib60870.CS101.Bitstring32\lWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a.html",tooltip=" "]; - Node0 -> Node4 [id="edge13_Node000000_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node4 [id="Node000004",label="lib60870.CS101.Bitstring32\lCommand",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32_command.html",tooltip=" "]; - Node4 -> Node5 [id="edge14_Node000004_Node000005",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node5 [id="Node000005",label="lib60870.CS101.Bitstring32\lCommandWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a.html",tooltip=" "]; - Node0 -> Node6 [id="edge15_Node000000_Node000006",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node6 [id="Node000006",label="lib60870.CS101.ClockSynchronization\lCommand",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_clock_synchronization_command.html",tooltip=" "]; - Node0 -> Node7 [id="edge16_Node000000_Node000007",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node7 [id="Node000007",label="lib60870.CS101.CounterInterrogation\lCommand",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html",tooltip=" "]; - Node0 -> Node8 [id="edge17_Node000000_Node000008",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node8 [id="Node000008",label="lib60870.CS101.DelayAcquisition\lCommand",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_delay_acquisition_command.html",tooltip=" "]; - Node0 -> Node9 [id="edge18_Node000000_Node000009",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node9 [id="Node000009",label="lib60870.CS101.DoubleCommand",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_command.html",tooltip=" "]; - Node9 -> Node10 [id="edge19_Node000009_Node000010",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node10 [id="Node000010",label="lib60870.CS101.DoubleCommand\lWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a.html",tooltip=" "]; - Node9 -> Node11 [id="edge20_Node000009_Node000011",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node11 [id="Node000011",label="lib60870.CS101.StepCommand",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_command.html",tooltip=" "]; - Node11 -> Node12 [id="edge21_Node000011_Node000012",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node12 [id="Node000012",label="lib60870.CS101.StepCommand\lWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a.html",tooltip=" "]; - Node0 -> Node13 [id="edge22_Node000000_Node000013",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node13 [id="Node000013",label="lib60870.CS101.DoublePoint\lInformation",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_point_information.html",tooltip="Double point information object (M_DP_NA_1)"]; - Node13 -> Node14 [id="edge23_Node000013_Node000014",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node14 [id="Node000014",label="lib60870.CS101.DoublePoint\lWithCP24Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a.html",tooltip="Double point information object with CP24Time2a time tag (M_DP_TA_1)"]; - Node13 -> Node15 [id="edge24_Node000013_Node000015",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node15 [id="Node000015",label="lib60870.CS101.DoublePoint\lWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a.html",tooltip="Double point information object with CP56Time2a time tag (M_DP_TB_1)"]; - Node0 -> Node16 [id="edge25_Node000000_Node000016",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node16 [id="Node000016",label="lib60870.CS101.EndOfInitialization",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_end_of_initialization.html",tooltip="End of initialization information object (M_EI_NA_1)"]; - Node0 -> Node17 [id="edge26_Node000000_Node000017",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node17 [id="Node000017",label="lib60870.CS101.EventOfProtection\lEquipment",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_event_of_protection_equipment.html",tooltip="Event of protection equipment information object (M_EP_TA_1)"]; - Node0 -> Node18 [id="edge27_Node000000_Node000018",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node18 [id="Node000018",label="lib60870.CS101.EventOfProtection\lEquipmentWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a.html",tooltip="Event of protection equipment information object with CP56Time2a time tag (M_EP_TD_1)"]; - Node0 -> Node19 [id="edge28_Node000000_Node000019",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node19 [id="Node000019",label="lib60870.CS101.FileACK",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_file_a_c_k.html",tooltip="ACK file/section - F_AF_NA_1 (124)"]; - Node0 -> Node20 [id="edge29_Node000000_Node000020",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node20 [id="Node000020",label="lib60870.CS101.FileCallOr\lSelect",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_file_call_or_select.html",tooltip="Call/Select directory/file/section - F_SC_NA_1 (122)"]; - Node0 -> Node21 [id="edge30_Node000000_Node000021",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node21 [id="Node000021",label="lib60870.CS101.FileDirectory",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_file_directory.html",tooltip="File directory - F_DR_TA_1 (126)"]; - Node0 -> Node22 [id="edge31_Node000000_Node000022",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node22 [id="Node000022",label="lib60870.CS101.FileLastSegment\lOrSection",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html",tooltip="Last segment/section - F_LS_NA_1 (123)"]; - Node0 -> Node23 [id="edge32_Node000000_Node000023",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node23 [id="Node000023",label="lib60870.CS101.FileReady",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_file_ready.html",tooltip="File ready - F_FR_NA_1 (120)"]; - Node0 -> Node24 [id="edge33_Node000000_Node000024",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node24 [id="Node000024",label="lib60870.CS101.FileSegment",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_file_segment.html",tooltip="File segment - F_SG_NA_1 (125)"]; - Node0 -> Node25 [id="edge34_Node000000_Node000025",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node25 [id="Node000025",label="lib60870.CS101.Integrated\lTotals",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_integrated_totals.html",tooltip="Integrated totals information object (M_IT_NA_1)"]; - Node25 -> Node26 [id="edge35_Node000025_Node000026",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node26 [id="Node000026",label="lib60870.CS101.Integrated\lTotalsWithCP24Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a.html",tooltip="Integrated totals information object with CP24Time2a time tag (M_IT_TA_1)"]; - Node25 -> Node27 [id="edge36_Node000025_Node000027",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node27 [id="Node000027",label="lib60870.CS101.Integrated\lTotalsWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a.html",tooltip="Integrated totals information object with CP56Time2a time tag (M_IT_TB_1)"]; - Node0 -> Node28 [id="edge37_Node000000_Node000028",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node28 [id="Node000028",label="lib60870.CS101.Interrogation\lCommand",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_interrogation_command.html",tooltip=" "]; - Node0 -> Node29 [id="edge38_Node000000_Node000029",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node29 [id="Node000029",label="lib60870.CS101.MeasuredValue\lNormalizedWithoutQuality",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html",tooltip="Measured value normalized without quality information object (M_ME_ND_1)"]; - Node29 -> Node30 [id="edge39_Node000029_Node000030",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node30 [id="Node000030",label="lib60870.CS101.MeasuredValue\lNormalized",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized.html",tooltip="Measured value normalized information object (M_ME_NA_1)"]; - Node30 -> Node31 [id="edge40_Node000030_Node000031",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node31 [id="Node000031",label="lib60870.CS101.MeasuredValue\lNormalizedWithCP24Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a.html",tooltip="Measured value normalized with CP24Time2a time tag (M_ME_TA_1)"]; - Node30 -> Node32 [id="edge41_Node000030_Node000032",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node32 [id="Node000032",label="lib60870.CS101.MeasuredValue\lNormalizedWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a.html",tooltip="Measured value normalized with CP56Time2a time tag (M_ME_TD_1)"]; - Node0 -> Node33 [id="edge42_Node000000_Node000033",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node33 [id="Node000033",label="lib60870.CS101.MeasuredValue\lScaled",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_scaled.html",tooltip=" "]; - Node33 -> Node34 [id="edge43_Node000033_Node000034",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node34 [id="Node000034",label="lib60870.CS101.MeasuredValue\lScaledWithCP24Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a.html",tooltip=" "]; - Node33 -> Node35 [id="edge44_Node000033_Node000035",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node35 [id="Node000035",label="lib60870.CS101.MeasuredValue\lScaledWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a.html",tooltip=" "]; - Node0 -> Node36 [id="edge45_Node000000_Node000036",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node36 [id="Node000036",label="lib60870.CS101.MeasuredValue\lShort",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_short.html",tooltip=" "]; - Node36 -> Node37 [id="edge46_Node000036_Node000037",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node37 [id="Node000037",label="lib60870.CS101.MeasuredValue\lShortWithCP24Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a.html",tooltip=" "]; - Node36 -> Node38 [id="edge47_Node000036_Node000038",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node38 [id="Node000038",label="lib60870.CS101.MeasuredValue\lShortWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a.html",tooltip=" "]; - Node0 -> Node39 [id="edge48_Node000000_Node000039",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node39 [id="Node000039",label="lib60870.CS101.PackedOutput\lCircuitInfo",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_packed_output_circuit_info.html",tooltip=" "]; - Node0 -> Node40 [id="edge49_Node000000_Node000040",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node40 [id="Node000040",label="lib60870.CS101.PackedOutput\lCircuitInfoWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a.html",tooltip=" "]; - Node0 -> Node41 [id="edge50_Node000000_Node000041",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node41 [id="Node000041",label="lib60870.CS101.PackedSingle\lPointWithSCD",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d.html",tooltip=" "]; - Node0 -> Node42 [id="edge51_Node000000_Node000042",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node42 [id="Node000042",label="lib60870.CS101.PackedStart\lEventsOfProtectionEquipment",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment.html",tooltip=" "]; - Node0 -> Node43 [id="edge52_Node000000_Node000043",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node43 [id="Node000043",label="lib60870.CS101.PackedStart\lEventsOfProtectionEquipmentWith\lCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a.html",tooltip=" "]; - Node0 -> Node44 [id="edge53_Node000000_Node000044",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node44 [id="Node000044",label="lib60870.CS101.Parameter\lActivation",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_parameter_activation.html",tooltip=" "]; - Node0 -> Node45 [id="edge54_Node000000_Node000045",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node45 [id="Node000045",label="lib60870.CS101.Parameter\lFloatValue",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_parameter_float_value.html",tooltip=" "]; - Node0 -> Node46 [id="edge55_Node000000_Node000046",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node46 [id="Node000046",label="lib60870.CS101.Parameter\lNormalizedValue",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_parameter_normalized_value.html",tooltip=" "]; - Node0 -> Node47 [id="edge56_Node000000_Node000047",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node47 [id="Node000047",label="lib60870.CS101.Parameter\lScaledValue",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_parameter_scaled_value.html",tooltip=" "]; - Node0 -> Node48 [id="edge57_Node000000_Node000048",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node48 [id="Node000048",label="lib60870.CS101.ReadCommand",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_read_command.html",tooltip=" "]; - Node0 -> Node49 [id="edge58_Node000000_Node000049",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node49 [id="Node000049",label="lib60870.CS101.ResetProcess\lCommand",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_reset_process_command.html",tooltip=" "]; - Node0 -> Node50 [id="edge59_Node000000_Node000050",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node50 [id="Node000050",label="lib60870.CS101.SectionReady",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_section_ready.html",tooltip="Section ready - F_SR_NA_1 (121)"]; - Node0 -> Node51 [id="edge60_Node000000_Node000051",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node51 [id="Node000051",label="lib60870.CS101.SetpointCommand\lNormalized",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_normalized.html",tooltip=" "]; - Node51 -> Node52 [id="edge61_Node000051_Node000052",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node52 [id="Node000052",label="lib60870.CS101.SetpointCommand\lNormalizedWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a.html",tooltip=" "]; - Node0 -> Node53 [id="edge62_Node000000_Node000053",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node53 [id="Node000053",label="lib60870.CS101.SetpointCommand\lScaled",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_scaled.html",tooltip=" "]; - Node53 -> Node54 [id="edge63_Node000053_Node000054",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node54 [id="Node000054",label="lib60870.CS101.SetpointCommand\lScaledWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a.html",tooltip=" "]; - Node0 -> Node55 [id="edge64_Node000000_Node000055",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node55 [id="Node000055",label="lib60870.CS101.SetpointCommand\lShort",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_short.html",tooltip=" "]; - Node55 -> Node56 [id="edge65_Node000055_Node000056",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node56 [id="Node000056",label="lib60870.CS101.SetpointCommand\lShortWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a.html",tooltip=" "]; - Node0 -> Node57 [id="edge66_Node000000_Node000057",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node57 [id="Node000057",label="lib60870.CS101.SingleCommand",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_command.html",tooltip=" "]; - Node57 -> Node58 [id="edge67_Node000057_Node000058",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node58 [id="Node000058",label="lib60870.CS101.SingleCommand\lWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a.html",tooltip=" "]; - Node0 -> Node59 [id="edge68_Node000000_Node000059",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node59 [id="Node000059",label="lib60870.CS101.SinglePoint\lInformation",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_point_information.html",tooltip=" "]; - Node59 -> Node60 [id="edge69_Node000059_Node000060",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node60 [id="Node000060",label="lib60870.CS101.SinglePoint\lWithCP24Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a.html",tooltip=" "]; - Node59 -> Node61 [id="edge70_Node000059_Node000061",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node61 [id="Node000061",label="lib60870.CS101.SinglePoint\lWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a.html",tooltip="Single point with CP56Time2a timestamp (M_SP_TB_1)"]; - Node0 -> Node62 [id="edge71_Node000000_Node000062",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node62 [id="Node000062",label="lib60870.CS101.StepPosition\lInformation",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_position_information.html",tooltip="Step position information object (M_ST_NA_1)"]; - Node62 -> Node63 [id="edge72_Node000062_Node000063",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node63 [id="Node000063",label="lib60870.CS101.StepPosition\lWithCP24Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a.html",tooltip="Step position information object with CP24Time2a time tag (M_ST_TA_1)"]; - Node62 -> Node64 [id="edge73_Node000062_Node000064",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node64 [id="Node000064",label="lib60870.CS101.StepPosition\lWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a.html",tooltip="Step position information object with CP56Time2a time tag (M_ST_TB_1)"]; - Node0 -> Node65 [id="edge74_Node000000_Node000065",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node65 [id="Node000065",label="lib60870.CS101.TestCommand",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_test_command.html",tooltip=" "]; - Node0 -> Node66 [id="edge75_Node000000_Node000066",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node66 [id="Node000066",label="lib60870.CS101.TestCommand\lWithCP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_14.dot b/doxygen/doxydoc.NET/html/inherit_graph_14.dot deleted file mode 100644 index f835821..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_14.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CS101.IPrivateIOFactory",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_15.dot b/doxygen/doxydoc.NET/html/inherit_graph_15.dot deleted file mode 100644 index d97ba3b..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_15.dot +++ /dev/null @@ -1,13 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CS101.Master",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_master.html",tooltip="Common interface for CS104 and CS101 balanced and unbalanced master."]; - Node0 -> Node1 [id="edge76_Node000000_Node000001",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node1 [id="Node000001",label="lib60870.CS101.CS101Master",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_c_s101_master.html",tooltip=" "]; - Node0 -> Node2 [id="edge77_Node000000_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="lib60870.CS104.Connection",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s104_1_1_connection.html",tooltip="A single connection to a CS 104 (IEC 60870-5-104) server. Implements the Master interface."]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_16.dot b/doxygen/doxydoc.NET/html/inherit_graph_16.dot deleted file mode 100644 index fdcf92f..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_16.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CS101.OutputCircuitInfo",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_output_circuit_info.html",tooltip="Output circuit information of protection equipment According to IEC 60870-5-101:2003 7...."]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_17.dot b/doxygen/doxydoc.NET/html/inherit_graph_17.dot deleted file mode 100644 index af34d53..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_17.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CS101.PrivateInformation\lObjectTypes",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_private_information_object_types.html",tooltip="Hold a list of private information object (IO) types to be used for parsing."]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_18.dot b/doxygen/doxydoc.NET/html/inherit_graph_18.dot deleted file mode 100644 index c553bf8..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_18.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CS101.Qualifier\lOfInterrogation",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_qualifier_of_interrogation.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_19.dot b/doxygen/doxydoc.NET/html/inherit_graph_19.dot deleted file mode 100644 index fa3defd..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_19.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CS101.QualityDescriptor",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_quality_descriptor.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_2.dot b/doxygen/doxydoc.NET/html/inherit_graph_2.dot deleted file mode 100644 index 9b4c4b5..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_2.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CP16Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_p16_time2a.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_20.dot b/doxygen/doxydoc.NET/html/inherit_graph_20.dot deleted file mode 100644 index f1a3e2f..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_20.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CS101.QualityDescriptorP",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_quality_descriptor_p.html",tooltip="QDP - Quality descriptor for events of protection equipment according to IEC 60870-5-101:2003 7...."]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_21.dot b/doxygen/doxydoc.NET/html/inherit_graph_21.dot deleted file mode 100644 index d7cc977..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_21.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CS101.ScaledValue",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_scaled_value.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_22.dot b/doxygen/doxydoc.NET/html/inherit_graph_22.dot deleted file mode 100644 index b55c5d8..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_22.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CS101.SetpointCommand\lQualifier",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_setpoint_command_qualifier.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_23.dot b/doxygen/doxydoc.NET/html/inherit_graph_23.dot deleted file mode 100644 index 3a18f99..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_23.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CS101.SingleEvent",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_single_event.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_24.dot b/doxygen/doxydoc.NET/html/inherit_graph_24.dot deleted file mode 100644 index 0b35f85..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_24.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CS101.StartEvent",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_start_event.html",tooltip="SPE - Start events of protection equipment according to IEC 60870-5-101:2003 7.2.6...."]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_25.dot b/doxygen/doxydoc.NET/html/inherit_graph_25.dot deleted file mode 100644 index 9df9e05..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_25.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CS101.StatusAnd\lStatusChangeDetection",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_status_and_status_change_detection.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_26.dot b/doxygen/doxydoc.NET/html/inherit_graph_26.dot deleted file mode 100644 index 6a87a07..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_26.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CS104.APCIParameters",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html",tooltip="Parameters for the CS 104 APCI (Application Protocol Control Information)"]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_27.dot b/doxygen/doxydoc.NET/html/inherit_graph_27.dot deleted file mode 100644 index 9d03519..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_27.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CS104.Connection\lStatistics",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s104_1_1_connection_statistics.html",tooltip="Provides some Connection statistics."]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_28.dot b/doxygen/doxydoc.NET/html/inherit_graph_28.dot deleted file mode 100644 index 858b76e..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_28.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CS104.Redundancy\lGroup",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s104_1_1_redundancy_group.html",tooltip="Representation of a redundancy group. A redundancy group is a group of connections that share a uniqu..."]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_29.dot b/doxygen/doxydoc.NET/html/inherit_graph_29.dot deleted file mode 100644 index 2371058..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_29.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CS104.TlsSecurity\lInformation",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s104_1_1_tls_security_information.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_3.dot b/doxygen/doxydoc.NET/html/inherit_graph_3.dot deleted file mode 100644 index b602d55..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_3.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CP24Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_p24_time2a.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_30.dot b/doxygen/doxydoc.NET/html/inherit_graph_30.dot deleted file mode 100644 index 9aaa9ca..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_30.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.Frame",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_frame.html",tooltip="Abstract class to encode an application layer frame."]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_31.dot b/doxygen/doxydoc.NET/html/inherit_graph_31.dot deleted file mode 100644 index 3e796d5..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_31.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.LibraryCommon",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_library_common.html",tooltip="Common information functions about the library."]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_32.dot b/doxygen/doxydoc.NET/html/inherit_graph_32.dot deleted file mode 100644 index feddf2a..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_32.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.linklayer.LinkLayer\lParameters",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1linklayer_1_1_link_layer_parameters.html",tooltip="Link layer specific parameters."]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_33.dot b/doxygen/doxydoc.NET/html/inherit_graph_33.dot deleted file mode 100644 index 025fe80..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_33.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.SingleCommandQualifier",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_single_command_qualifier.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_34.dot b/doxygen/doxydoc.NET/html/inherit_graph_34.dot deleted file mode 100644 index 1b0d5a5..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_34.dot +++ /dev/null @@ -1,13 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="Stream",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; - Node0 -> Node1 [id="edge78_Node000000_Node000001",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node1 [id="Node000001",label="lib60870.linklayer.TcpClient\lVirtualSerialPort",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html",tooltip="TCP client virtual serial port. Can be used to tunnel CS 101 protocol over TCP/IP."]; - Node0 -> Node2 [id="edge79_Node000000_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="lib60870.linklayer.TcpServer\lVirtualSerialPort",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_4.dot b/doxygen/doxydoc.NET/html/inherit_graph_4.dot deleted file mode 100644 index 4d897da..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_4.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CP32Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_p32_time2a.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_5.dot b/doxygen/doxydoc.NET/html/inherit_graph_5.dot deleted file mode 100644 index 529590d..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_5.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CP56Time2a",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_p56_time2a.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_6.dot b/doxygen/doxydoc.NET/html/inherit_graph_6.dot deleted file mode 100644 index 4d695dd..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_6.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CS101.Application\lLayerParameters",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_application_layer_parameters.html",tooltip=" "]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_7.dot b/doxygen/doxydoc.NET/html/inherit_graph_7.dot deleted file mode 100644 index 0c0c424..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_7.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CS101.ASDU",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_a_s_d_u.html",tooltip="This class represents an application layer message. It contains some generic message information and ..."]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_8.dot b/doxygen/doxydoc.NET/html/inherit_graph_8.dot deleted file mode 100644 index 0e0116e..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_8.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CS101.BinaryCounter\lReading",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_binary_counter_reading.html",tooltip="Binary counter reading. Used for tranmission of integrated totals."]; -} diff --git a/doxygen/doxydoc.NET/html/inherit_graph_9.dot b/doxygen/doxydoc.NET/html/inherit_graph_9.dot deleted file mode 100644 index 24305fd..0000000 --- a/doxygen/doxydoc.NET/html/inherit_graph_9.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - rankdir="LR"; - Node0 [id="Node000000",label="lib60870.CS101.FilesAvailable",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_files_available.html",tooltip="Represents the available files in a file client or file server."]; -} diff --git a/doxygen/doxydoc.NET/html/inherits.html b/doxygen/doxydoc.NET/html/inherits.html deleted file mode 100644 index 064d107..0000000 --- a/doxygen/doxydoc.NET/html/inherits.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - - -lib60870.NET: Class Hierarchy - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Class Hierarchy
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider-members.html b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider-members.html deleted file mode 100644 index 1cbb7c8..0000000 --- a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider-members.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.IFileProvider Member List
    -
    - -
    - - - - diff --git a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider.html b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider.html deleted file mode 100644 index 2f653ed..0000000 --- a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider.html +++ /dev/null @@ -1,342 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.IFileProvider Interface Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.IFileProvider Interface Reference
    -
    -
    -
    -Inheritance diagram for lib60870.CS101.IFileProvider:
    -
    -
    Inheritance graph
    -
    [legend]
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    int GetCA ()
     Returns the CA (Comman address) of the file.
     
    int GetIOA ()
     Returns the IOA (information object address of the file)
     
    NameOfFile GetNameOfFile ()
     Gets the type ("name") of the file.
     
    -DateTime GetFileDate ()
     
    int GetFileSize ()
     Gets the size of the file in bytes.
     
    int GetSectionSize (int sectionNumber)
     Gets the size of a section in byzes.
     
    bool GetSegmentData (int sectionNumber, int offset, int segmentSize, byte[] segmentData)
     Gets the segment data.
     
    void TransferComplete (bool success)
     Indicates that the transfer is complete. When success equals true the file data can be deleted.
     
    -

    Member Function Documentation

    - -

    ◆ GetCA()

    - -
    -
    - - - - - - - -
    int lib60870.CS101.IFileProvider.GetCA ()
    -
    - -

    Returns the CA (Comman address) of the file.

    -
    Returns
    The CA
    - -

    Implemented in lib60870.CS101.TransparentFile.

    - -
    -
    - -

    ◆ GetFileSize()

    - -
    -
    - - - - - - - -
    int lib60870.CS101.IFileProvider.GetFileSize ()
    -
    - -

    Gets the size of the file in bytes.

    -
    Returns
    The file size in bytes
    - -

    Implemented in lib60870.CS101.TransparentFile.

    - -
    -
    - -

    ◆ GetIOA()

    - -
    -
    - - - - - - - -
    int lib60870.CS101.IFileProvider.GetIOA ()
    -
    - -

    Returns the IOA (information object address of the file)

    -
    Returns
    The IOA
    - -

    Implemented in lib60870.CS101.TransparentFile.

    - -
    -
    - -

    ◆ GetNameOfFile()

    - -
    -
    - - - - - - - -
    NameOfFile lib60870.CS101.IFileProvider.GetNameOfFile ()
    -
    - -

    Gets the type ("name") of the file.

    -
    Returns
    The file type
    - -

    Implemented in lib60870.CS101.TransparentFile.

    - -
    -
    - -

    ◆ GetSectionSize()

    - -
    -
    - - - - - - - -
    int lib60870.CS101.IFileProvider.GetSectionSize (int sectionNumber)
    -
    - -

    Gets the size of a section in byzes.

    -
    Returns
    The section size in bytes or -1 if the section does not exist
    -
    Parameters
    - - -
    sectionNumberNumber of section (starting with 0)
    -
    -
    - -

    Implemented in lib60870.CS101.TransparentFile.

    - -
    -
    - -

    ◆ GetSegmentData()

    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    bool lib60870.CS101.IFileProvider.GetSegmentData (int sectionNumber,
    int offset,
    int segmentSize,
    byte[] segmentData )
    -
    - -

    Gets the segment data.

    -
    Returns
    true, if segment data was gotten, false otherwise.
    -
    Parameters
    - - - - - -
    sectionNumberSection number.
    offsetOffset.
    segmentSizeSegment size.
    segmentDataSegment data.
    -
    -
    - -

    Implemented in lib60870.CS101.TransparentFile.

    - -
    -
    - -

    ◆ TransferComplete()

    - -
    -
    - - - - - - - -
    void lib60870.CS101.IFileProvider.TransferComplete (bool success)
    -
    - -

    Indicates that the transfer is complete. When success equals true the file data can be deleted.

    -
    Parameters
    - - -
    successIf set to true success.
    -
    -
    - -

    Implemented in lib60870.CS101.TransparentFile.

    - -
    -
    -
    The documentation for this interface was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/FileServices.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider.js b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider.js deleted file mode 100644 index 0218dc5..0000000 --- a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider.js +++ /dev/null @@ -1,10 +0,0 @@ -var interfacelib60870_1_1_c_s101_1_1_i_file_provider = -[ - [ "GetCA", "interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a8bd0b5d9ca9019f7f8dab6c43a5d7945", null ], - [ "GetFileSize", "interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a6b9b192c358b22d132893c90a636daf2", null ], - [ "GetIOA", "interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a68c3470850586f634e731dd250c957da", null ], - [ "GetNameOfFile", "interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a9aa9aeb003e1e5726a5b634cfa1c5548", null ], - [ "GetSectionSize", "interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a953c9bc0b2dd47ba192649ce3b954318", null ], - [ "GetSegmentData", "interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a238a851573b79de09af78b4f93deb7f2", null ], - [ "TransferComplete", "interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#ada2d36e95fe8caf9a22d04fcd77b6a8f", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider__inherit__graph.dot b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider__inherit__graph.dot deleted file mode 100644 index d9caa1a..0000000 --- a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_provider__inherit__graph.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "lib60870.CS101.IFileProvider" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.IFileProvider",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; - Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="lib60870.CS101.TransparentFile",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_transparent_file.html",tooltip="Simple implementation of IFileProvider that can be used to provide transparent files...."]; -} diff --git a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_receiver-members.html b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_receiver-members.html deleted file mode 100644 index 3156537..0000000 --- a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_receiver-members.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.IFileReceiver Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.IFileReceiver, including all inherited members.

    - - - -
    Finished(FileErrorCode result) (defined in lib60870.CS101.IFileReceiver)lib60870.CS101.IFileReceiver
    SegmentReceived(byte sectionName, int offset, int size, byte[] data) (defined in lib60870.CS101.IFileReceiver)lib60870.CS101.IFileReceiver
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_receiver.html b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_receiver.html deleted file mode 100644 index cd9eae4..0000000 --- a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_file_receiver.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.IFileReceiver Interface Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.IFileReceiver Interface Reference
    -
    -
    - - - - - - -

    -Public Member Functions

    -void Finished (FileErrorCode result)
     
    -void SegmentReceived (byte sectionName, int offset, int size, byte[] data)
     
    -
    The documentation for this interface was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/FileServices.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_master_connection-members.html b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_master_connection-members.html deleted file mode 100644 index e86b383..0000000 --- a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_master_connection-members.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.IMasterConnection Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.IMasterConnection, including all inherited members.

    - - - - - -
    GetApplicationLayerParameters() (defined in lib60870.CS101.IMasterConnection)lib60870.CS101.IMasterConnection
    SendACT_CON(ASDU asdu, bool negative) (defined in lib60870.CS101.IMasterConnection)lib60870.CS101.IMasterConnection
    SendACT_TERM(ASDU asdu) (defined in lib60870.CS101.IMasterConnection)lib60870.CS101.IMasterConnection
    SendASDU(ASDU asdu) (defined in lib60870.CS101.IMasterConnection)lib60870.CS101.IMasterConnection
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_master_connection.html b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_master_connection.html deleted file mode 100644 index 5735d83..0000000 --- a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_master_connection.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.IMasterConnection Interface Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.IMasterConnection Interface Reference
    -
    -
    - -

    Provides functions to be used in Slave callbacks to send data back to the master. - More...

    -
    -Inheritance diagram for lib60870.CS101.IMasterConnection:
    -
    -
    Inheritance graph
    -
    [legend]
    - - - - - - - - - - -

    -Public Member Functions

    void SendASDU (ASDU asdu)
     
    void SendACT_CON (ASDU asdu, bool negative)
     
    void SendACT_TERM (ASDU asdu)
     
    ApplicationLayerParameters GetApplicationLayerParameters ()
     
    -

    Detailed Description

    -

    Provides functions to be used in Slave callbacks to send data back to the master.

    -

    Member Function Documentation

    - -

    ◆ GetApplicationLayerParameters()

    - -
    -
    - - - - - - - -
    ApplicationLayerParameters lib60870.CS101.IMasterConnection.GetApplicationLayerParameters ()
    -
    - -

    Implemented in lib60870.CS104.ClientConnection.

    - -
    -
    - -

    ◆ SendACT_CON()

    - -
    -
    - - - - - - - - - - - -
    void lib60870.CS101.IMasterConnection.SendACT_CON (ASDU asdu,
    bool negative )
    -
    - -

    Implemented in lib60870.CS104.ClientConnection.

    - -
    -
    - -

    ◆ SendACT_TERM()

    - -
    -
    - - - - - - - -
    void lib60870.CS101.IMasterConnection.SendACT_TERM (ASDU asdu)
    -
    - -

    Implemented in lib60870.CS104.ClientConnection.

    - -
    -
    - -

    ◆ SendASDU()

    - -
    -
    - - - - - - - -
    void lib60870.CS101.IMasterConnection.SendASDU (ASDU asdu)
    -
    - -

    Implemented in lib60870.CS104.ClientConnection.

    - -
    -
    -
    The documentation for this interface was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/Slave.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_master_connection__inherit__graph.dot b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_master_connection__inherit__graph.dot deleted file mode 100644 index 1641e37..0000000 --- a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_master_connection__inherit__graph.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "lib60870.CS101.IMasterConnection" -{ - // LATEX_PDF_SIZE - bgcolor="transparent"; - edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; - node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; - Node1 [id="Node000001",label="lib60870.CS101.IMasterConnection",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip="Provides functions to be used in Slave callbacks to send data back to the master."]; - Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node2 [id="Node000002",label="lib60870.CS101.CS101Slave",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s101_1_1_c_s101_slave.html",tooltip="CS 101 slave implementation (implements Slave interface)"]; - Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; - Node3 [id="Node000003",label="lib60870.CS104.ClientConnection",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$classlib60870_1_1_c_s104_1_1_client_connection.html",tooltip="Represents a client (master) connection."]; -} diff --git a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory-members.html b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory-members.html deleted file mode 100644 index 0db070e..0000000 --- a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory-members.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - -lib60870.NET: Member List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    lib60870.CS101.IPrivateIOFactory Member List
    -
    -
    - -

    This is the complete list of members for lib60870.CS101.IPrivateIOFactory, including all inherited members.

    - - - -
    Decode(ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)lib60870.CS101.IPrivateIOFactory
    GetEncodedSize()lib60870.CS101.IPrivateIOFactory
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html deleted file mode 100644 index e158ed5..0000000 --- a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101.IPrivateIOFactory Interface Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101.IPrivateIOFactory Interface Reference
    -
    -
    - - - - - - - - -

    -Public Member Functions

    InformationObject Decode (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence)
     Decode the information object and create a new InformationObject instance.
     
    int GetEncodedSize ()
     Gets the encoded payload size of the object (information object size without the IOA)
     
    -

    Member Function Documentation

    - -

    ◆ Decode()

    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    InformationObject lib60870.CS101.IPrivateIOFactory.Decode (ApplicationLayerParameters parameters,
    byte[] msg,
    int startIndex,
    bool isSequence )
    -
    - -

    Decode the information object and create a new InformationObject instance.

    -
    Parameters
    - - - - - -
    parametersApplication layer parameters required for decoding
    msgthe received message
    startIndexstart index of the payload in the message
    isSequenceIf set to true is sequence.
    -
    -
    - -
    -
    - -

    ◆ GetEncodedSize()

    - -
    -
    - - - - - - - -
    int lib60870.CS101.IPrivateIOFactory.GetEncodedSize ()
    -
    - -

    Gets the encoded payload size of the object (information object size without the IOA)

    -
    Returns
    The encoded size in bytes
    - -
    -
    -
    The documentation for this interface was generated from the following file:
      -
    • C:/Users/IlyesBekaddour/Desktop/Workspace/lib60870.net/lib60870/CS101/InformationObject.cs
    • -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.js b/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.js deleted file mode 100644 index bef9f27..0000000 --- a/doxygen/doxydoc.NET/html/interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.js +++ /dev/null @@ -1,5 +0,0 @@ -var interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory = -[ - [ "Decode", "interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html#ad705ef8ea182c4977221c7b3cc23d632", null ], - [ "GetEncodedSize", "interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html#a26a0623584b57db1a35b9e8fe1b7e02c", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/jquery.js b/doxygen/doxydoc.NET/html/jquery.js deleted file mode 100644 index 1dffb65..0000000 --- a/doxygen/doxydoc.NET/html/jquery.js +++ /dev/null @@ -1,34 +0,0 @@ -/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 - * http://www.smartmenus.org/ - * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html b/doxygen/doxydoc.NET/html/md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html deleted file mode 100644 index de5d5bd..0000000 --- a/doxygen/doxydoc.NET/html/md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - -lib60870.NET: README lib60870.NET v2.3.0 - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    README lib60870.NET v2.3.0
    -
    -
    -

    lib60870.NET library for IEC 60870-5 based protocols in C#

    -

    The current implementation contains code for the IEC 60870-5-101/104 protocols only.

    -

    Please also consider the User Guide.

    -

    -Compiling and running the examples:

    -

    lib60870.NET:

    -

    Open the provided solution file in the lib60870.NET folder with MonoDevelop or Visual Studio. You should be able to build and run the library and examples with any recent version of MonoDevelop or Visual Studio

    -

    -Contact:

    -

    For bug reports, hints or support please contact info@.nosp@m.mz-a.nosp@m.utoma.nosp@m.tion.nosp@m..de

    -

    -Licensing

    -

    This software is licensed under the GPLv3 (https://www.gnu.org/licenses/gpl-3.0.en.html).

    -

    -Commercial licenses and support

    -

    Support and commercial license options are provided by MZ Automation GmbH. Please contact info@.nosp@m.mz-a.nosp@m.utoma.nosp@m.tion.nosp@m..de for more details. Support for IEC 60870-5-103 (companion standard for protection devices) is only available with a commercial license.

    -

    -Contributing

    -

    If you want to contribute to the improvement and development of the library please send me comments, feature requests, bug reports, or patches. For more than trivial contributions I require you to sign a Contributor License Agreement. Please contact info@.nosp@m.mz-a.nosp@m.utoma.nosp@m.tion.nosp@m..de.

    -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/menu.js b/doxygen/doxydoc.NET/html/menu.js deleted file mode 100644 index 0fd1e99..0000000 --- a/doxygen/doxydoc.NET/html/menu.js +++ /dev/null @@ -1,134 +0,0 @@ -/* - @licstart The following is the entire license notice for the JavaScript code in this file. - - The MIT License (MIT) - - Copyright (C) 1997-2020 by Dimitri van Heesch - - Permission is hereby granted, free of charge, to any person obtaining a copy of this software - and associated documentation files (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, publish, distribute, - sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all copies or - substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING - BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - @licend The above is the entire license notice for the JavaScript code in this file - */ -function initMenu(relPath,searchEnabled,serverSide,searchPage,search,treeview) { - function makeTree(data,relPath) { - let result=''; - if ('children' in data) { - result+='
      '; - for (let i in data.children) { - let url; - const link = data.children[i].url; - if (link.substring(0,1)=='^') { - url = link.substring(1); - } else { - url = relPath+link; - } - result+='
    • '+ - data.children[i].text+''+ - makeTree(data.children[i],relPath)+'
    • '; - } - result+='
    '; - } - return result; - } - let searchBoxHtml; - if (searchEnabled) { - if (serverSide) { - searchBoxHtml='
    '+ - '
    '+ - '
     '+ - ''+ - '
    '+ - '
    '+ - '
    '+ - '
    '; - } else { - searchBoxHtml='
    '+ - ''+ - ' '+ - ''+ - ''+ - ''+ - ''+ - ''+ - '
    '; - } - } - - $('#main-nav').before('
    '+ - ''+ - ''+ - '
    '); - $('#main-nav').append(makeTree(menudata,relPath)); - $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); - if (searchBoxHtml) { - $('#main-menu').append('
  • '); - } - const $mainMenuState = $('#main-menu-state'); - let prevWidth = 0; - if ($mainMenuState.length) { - const initResizableIfExists = function() { - if (typeof initResizable==='function') initResizable(treeview); - } - // animate mobile menu - $mainMenuState.change(function() { - const $menu = $('#main-menu'); - let options = { duration: 250, step: initResizableIfExists }; - if (this.checked) { - options['complete'] = () => $menu.css('display', 'block'); - $menu.hide().slideDown(options); - } else { - options['complete'] = () => $menu.css('display', 'none'); - $menu.show().slideUp(options); - } - }); - // set default menu visibility - const resetState = function() { - const $menu = $('#main-menu'); - const newWidth = $(window).outerWidth(); - if (newWidth!=prevWidth) { - if ($(window).outerWidth()<768) { - $mainMenuState.prop('checked',false); $menu.hide(); - $('#searchBoxPos1').html(searchBoxHtml); - $('#searchBoxPos2').hide(); - } else { - $menu.show(); - $('#searchBoxPos1').empty(); - $('#searchBoxPos2').html(searchBoxHtml); - $('#searchBoxPos2').show(); - } - if (typeof searchBox!=='undefined') { - searchBox.CloseResultsWindow(); - } - prevWidth = newWidth; - } - } - $(window).ready(function() { resetState(); initResizableIfExists(); }); - $(window).resize(resetState); - } - $('#main-menu').smartmenus(); -} -/* @license-end */ diff --git a/doxygen/doxydoc.NET/html/menudata.js b/doxygen/doxydoc.NET/html/menudata.js deleted file mode 100644 index 059e5c8..0000000 --- a/doxygen/doxydoc.NET/html/menudata.js +++ /dev/null @@ -1,99 +0,0 @@ -/* - @licstart The following is the entire license notice for the JavaScript code in this file. - - The MIT License (MIT) - - Copyright (C) 1997-2020 by Dimitri van Heesch - - Permission is hereby granted, free of charge, to any person obtaining a copy of this software - and associated documentation files (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, publish, distribute, - sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all copies or - substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING - BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - @licend The above is the entire license notice for the JavaScript code in this file -*/ -var menudata={children:[ -{text:"Main Page",url:"index.html"}, -{text:"Related Pages",url:"pages.html"}, -{text:"Packages",url:"namespaces.html",children:[ -{text:"Package List",url:"namespaces.html"}, -{text:"Package Members",url:"namespacemembers.html",children:[ -{text:"All",url:"namespacemembers.html"}, -{text:"Functions",url:"namespacemembers_func.html"}, -{text:"Enumerations",url:"namespacemembers_enum.html"}]}]}, -{text:"Classes",url:"annotated.html",children:[ -{text:"Class List",url:"annotated.html"}, -{text:"Class Index",url:"classes.html"}, -{text:"Class Hierarchy",url:"inherits.html"}, -{text:"Class Members",url:"functions.html",children:[ -{text:"All",url:"functions.html",children:[ -{text:"a",url:"functions.html#index_a"}, -{text:"c",url:"functions_c.html#index_c"}, -{text:"d",url:"functions_d.html#index_d"}, -{text:"e",url:"functions_e.html#index_e"}, -{text:"f",url:"functions_f.html#index_f"}, -{text:"g",url:"functions_g.html#index_g"}, -{text:"h",url:"functions_h.html#index_h"}, -{text:"i",url:"functions_i.html#index_i"}, -{text:"k",url:"functions_k.html#index_k"}, -{text:"l",url:"functions_l.html#index_l"}, -{text:"m",url:"functions_m.html#index_m"}, -{text:"n",url:"functions_n.html#index_n"}, -{text:"o",url:"functions_o.html#index_o"}, -{text:"p",url:"functions_p.html#index_p"}, -{text:"q",url:"functions_q.html#index_q"}, -{text:"r",url:"functions_r.html#index_r"}, -{text:"s",url:"functions_s.html#index_s"}, -{text:"t",url:"functions_t.html#index_t"}, -{text:"u",url:"functions_u.html#index_u"}, -{text:"v",url:"functions_v.html#index_v"}, -{text:"w",url:"functions_w.html#index_w"}, -{text:"y",url:"functions_y.html#index_y"}]}, -{text:"Functions",url:"functions_func.html",children:[ -{text:"a",url:"functions_func.html#index_a"}, -{text:"c",url:"functions_func.html#index_c"}, -{text:"d",url:"functions_func.html#index_d"}, -{text:"e",url:"functions_func.html#index_e"}, -{text:"f",url:"functions_func.html#index_f"}, -{text:"g",url:"functions_func.html#index_g"}, -{text:"i",url:"functions_func.html#index_i"}, -{text:"l",url:"functions_func.html#index_l"}, -{text:"m",url:"functions_func.html#index_m"}, -{text:"r",url:"functions_func.html#index_r"}, -{text:"s",url:"functions_func.html#index_s"}, -{text:"t",url:"functions_func.html#index_t"}, -{text:"u",url:"functions_func.html#index_u"}]}, -{text:"Variables",url:"functions_vars.html"}, -{text:"Properties",url:"functions_prop.html",children:[ -{text:"a",url:"functions_prop.html#index_a"}, -{text:"c",url:"functions_prop.html#index_c"}, -{text:"d",url:"functions_prop.html#index_d"}, -{text:"e",url:"functions_prop.html#index_e"}, -{text:"f",url:"functions_prop.html#index_f"}, -{text:"g",url:"functions_prop.html#index_g"}, -{text:"h",url:"functions_prop.html#index_h"}, -{text:"i",url:"functions_prop.html#index_i"}, -{text:"k",url:"functions_prop.html#index_k"}, -{text:"l",url:"functions_prop.html#index_l"}, -{text:"m",url:"functions_prop.html#index_m"}, -{text:"n",url:"functions_prop.html#index_n"}, -{text:"o",url:"functions_prop.html#index_o"}, -{text:"p",url:"functions_prop.html#index_p"}, -{text:"q",url:"functions_prop.html#index_q"}, -{text:"r",url:"functions_prop.html#index_r"}, -{text:"s",url:"functions_prop.html#index_s"}, -{text:"t",url:"functions_prop.html#index_t"}, -{text:"u",url:"functions_prop.html#index_u"}, -{text:"v",url:"functions_prop.html#index_v"}, -{text:"w",url:"functions_prop.html#index_w"}, -{text:"y",url:"functions_prop.html#index_y"}]}]}]}]} diff --git a/doxygen/doxydoc.NET/html/minus.svg b/doxygen/doxydoc.NET/html/minus.svg deleted file mode 100644 index f70d0c1..0000000 --- a/doxygen/doxydoc.NET/html/minus.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/doxygen/doxydoc.NET/html/minusd.svg b/doxygen/doxydoc.NET/html/minusd.svg deleted file mode 100644 index 5f8e879..0000000 --- a/doxygen/doxydoc.NET/html/minusd.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/doxygen/doxydoc.NET/html/mz_logo.ico b/doxygen/doxydoc.NET/html/mz_logo.ico deleted file mode 100644 index 81b7786bf54b086d8d4dbce2f54bf377a00e2955..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55030 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 QN - - - - - - -lib60870.NET: lib60870 Namespace Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870 Namespace Reference
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Classes

    class  ASDUParsingException
     
    class  ASDUQueue
     
    class  BufferFrame
     Implementation of Frame to encode into a given byte array.
     
    class  ConnectionException
     
    class  CP16Time2a
     
    class  CP24Time2a
     
    class  CP32Time2a
     
    class  CP56Time2a
     
    class  Frame
     Abstract class to encode an application layer frame. More...
     
    class  LibraryCommon
     Common information functions about the library. More...
     
    class  SingleCommandQualifier
     
    class  SystemUtils
     Some system related helper functions.
     
    - - - - -

    -Functions

    -delegate bool RawMessageHandler (object parameter, byte[] message, int messageSize)
     Raw message handler. Can be used to access the raw message. Returns true when message should be handled by the protocol stack, false, otherwise.
     
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/namespacelib60870.js b/doxygen/doxydoc.NET/html/namespacelib60870.js deleted file mode 100644 index f0a8fa7..0000000 --- a/doxygen/doxydoc.NET/html/namespacelib60870.js +++ /dev/null @@ -1,17 +0,0 @@ -var namespacelib60870 = -[ - [ "CS101", "namespacelib60870_1_1_c_s101.html", "namespacelib60870_1_1_c_s101" ], - [ "CS104", "namespacelib60870_1_1_c_s104.html", "namespacelib60870_1_1_c_s104" ], - [ "linklayer", "namespacelib60870_1_1linklayer.html", "namespacelib60870_1_1linklayer" ], - [ "ASDUParsingException", "classlib60870_1_1_a_s_d_u_parsing_exception.html", null ], - [ "ASDUQueue", "classlib60870_1_1_a_s_d_u_queue.html", null ], - [ "ConnectionException", "classlib60870_1_1_connection_exception.html", null ], - [ "CP16Time2a", "classlib60870_1_1_c_p16_time2a.html", null ], - [ "CP24Time2a", "classlib60870_1_1_c_p24_time2a.html", "classlib60870_1_1_c_p24_time2a" ], - [ "CP32Time2a", "classlib60870_1_1_c_p32_time2a.html", "classlib60870_1_1_c_p32_time2a" ], - [ "CP56Time2a", "classlib60870_1_1_c_p56_time2a.html", "classlib60870_1_1_c_p56_time2a" ], - [ "Frame", "classlib60870_1_1_frame.html", null ], - [ "LibraryCommon", "classlib60870_1_1_library_common.html", null ], - [ "SingleCommandQualifier", "classlib60870_1_1_single_command_qualifier.html", null ], - [ "RawMessageHandler", "namespacelib60870.html#a059755b125d35287c474551f4ffc619f", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s101.html b/doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s101.html deleted file mode 100644 index f04970d..0000000 --- a/doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s101.html +++ /dev/null @@ -1,648 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS101 Namespace Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS101 Namespace Reference
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Classes

    class  ApplicationLayerParameters
     
    class  ASDU
     This class represents an application layer message. It contains some generic message information and one or more InformationObject instances of the same type. It is used to send and receive messages. More...
     
    class  ASDUQueueException
     
    class  BinaryCounterReading
     Binary counter reading. Used for tranmission of integrated totals. More...
     
    class  Bitstring32
     
    class  Bitstring32Command
     
    class  Bitstring32CommandWithCP56Time2a
     
    class  Bitstring32WithCP24Time2a
     
    class  Bitstring32WithCP56Time2a
     
    class  ClockSynchronizationCommand
     
    class  CounterInterrogationCommand
     
    class  CS101Master
     
    class  CS101n104File
     Encapsulates a IFileProvider object to add some state information.
     
    class  CS101Slave
     CS 101 slave implementation (implements Slave interface) More...
     
    class  DelayAcquisitionCommand
     
    class  DoubleCommand
     
    class  DoubleCommandWithCP56Time2a
     
    class  DoublePointInformation
     Double point information object (M_DP_NA_1) More...
     
    class  DoublePointWithCP24Time2a
     Double point information object with CP24Time2a time tag (M_DP_TA_1) More...
     
    class  DoublePointWithCP56Time2a
     Double point information object with CP56Time2a time tag (M_DP_TB_1) More...
     
    class  EndOfInitialization
     End of initialization information object (M_EI_NA_1) More...
     
    class  EventOfProtectionEquipment
     Event of protection equipment information object (M_EP_TA_1) More...
     
    class  EventOfProtectionEquipmentWithCP56Time2a
     Event of protection equipment information object with CP56Time2a time tag (M_EP_TD_1) More...
     
    class  FileACK
     ACK file/section - F_AF_NA_1 (124) More...
     
    class  FileCallOrSelect
     Call/Select directory/file/section - F_SC_NA_1 (122) More...
     
    class  FileClient
     
    class  FileDirectory
     File directory - F_DR_TA_1 (126) More...
     
    class  FileLastSegmentOrSection
     Last segment/section - F_LS_NA_1 (123) More...
     
    class  FileReady
     File ready - F_FR_NA_1 (120) More...
     
    class  FilesAvailable
     Represents the available files in a file client or file server. More...
     
    class  FileSegment
     File segment - F_SG_NA_1 (125) More...
     
    class  FileServer
     
    interface  IFileProvider
     
    interface  IFileReceiver
     
    interface  IMasterConnection
     Provides functions to be used in Slave callbacks to send data back to the master. More...
     
    class  InformationObject
     
    class  IntegratedTotals
     Integrated totals information object (M_IT_NA_1) More...
     
    class  IntegratedTotalsWithCP24Time2a
     Integrated totals information object with CP24Time2a time tag (M_IT_TA_1) More...
     
    class  IntegratedTotalsWithCP56Time2a
     Integrated totals information object with CP56Time2a time tag (M_IT_TB_1) More...
     
    class  InterrogationCommand
     
    interface  IPrivateIOFactory
     
    class  Master
     Common interface for CS104 and CS101 balanced and unbalanced master. More...
     
    class  MeasuredValueNormalized
     Measured value normalized information object (M_ME_NA_1) More...
     
    class  MeasuredValueNormalizedWithCP24Time2a
     Measured value normalized with CP24Time2a time tag (M_ME_TA_1) More...
     
    class  MeasuredValueNormalizedWithCP56Time2a
     Measured value normalized with CP56Time2a time tag (M_ME_TD_1) More...
     
    class  MeasuredValueNormalizedWithoutQuality
     Measured value normalized without quality information object (M_ME_ND_1) More...
     
    class  MeasuredValueScaled
     
    class  MeasuredValueScaledWithCP24Time2a
     
    class  MeasuredValueScaledWithCP56Time2a
     
    class  MeasuredValueShort
     
    class  MeasuredValueShortWithCP24Time2a
     
    class  MeasuredValueShortWithCP56Time2a
     
    class  OutputCircuitInfo
     Output circuit information of protection equipment According to IEC 60870-5-101:2003 7.2.6.12. More...
     
    class  PackedOutputCircuitInfo
     
    class  PackedOutputCircuitInfoWithCP56Time2a
     
    class  PackedSinglePointWithSCD
     
    class  PackedStartEventsOfProtectionEquipment
     
    class  PackedStartEventsOfProtectionEquipmentWithCP56Time2a
     
    class  ParameterActivation
     
    class  ParameterFloatValue
     
    class  ParameterNormalizedValue
     
    class  ParameterScaledValue
     
    class  PrivateInformationObjectTypes
     Hold a list of private information object (IO) types to be used for parsing. More...
     
    class  QualifierOfInterrogation
     
    class  QualityDescriptor
     
    class  QualityDescriptorP
     QDP - Quality descriptor for events of protection equipment according to IEC 60870-5-101:2003 7.2.6.4. More...
     
    class  ReadCommand
     
    class  ResetProcessCommand
     
    class  ScaledValue
     
    class  SectionReady
     Section ready - F_SR_NA_1 (121) More...
     
    class  SetpointCommandNormalized
     
    class  SetpointCommandNormalizedWithCP56Time2a
     
    class  SetpointCommandQualifier
     
    class  SetpointCommandScaled
     
    class  SetpointCommandScaledWithCP56Time2a
     
    class  SetpointCommandShort
     
    class  SetpointCommandShortWithCP56Time2a
     
    class  SingleCommand
     
    class  SingleCommandWithCP56Time2a
     
    class  SingleEvent
     
    class  SinglePointInformation
     
    class  SinglePointWithCP24Time2a
     
    class  SinglePointWithCP56Time2a
     Single point with CP56Time2a timestamp (M_SP_TB_1) More...
     
    class  Slave
     
    class  StartEvent
     SPE - Start events of protection equipment according to IEC 60870-5-101:2003 7.2.6.11. More...
     
    class  StatusAndStatusChangeDetection
     
    class  StepCommand
     
    class  StepCommandWithCP56Time2a
     
    class  StepPositionInformation
     Step position information object (M_ST_NA_1) More...
     
    class  StepPositionWithCP24Time2a
     Step position information object with CP24Time2a time tag (M_ST_TA_1) More...
     
    class  StepPositionWithCP56Time2a
     Step position information object with CP56Time2a time tag (M_ST_TB_1) More...
     
    class  TestCommand
     
    class  TestCommandWithCP56Time2a
     
    class  TransparentFile
     Simple implementation of IFileProvider that can be used to provide transparent files. Derived classed should override the TransferComplete method. More...
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Enumerations

    enum  CauseOfTransmission {
    -  PERIODIC = 1 -, BACKGROUND_SCAN = 2 -, SPONTANEOUS = 3 -, INITIALIZED = 4 -,
    -  REQUEST = 5 -, ACTIVATION = 6 -, ACTIVATION_CON = 7 -, DEACTIVATION = 8 -,
    -  DEACTIVATION_CON = 9 -, ACTIVATION_TERMINATION = 10 -, RETURN_INFO_REMOTE = 11 -, RETURN_INFO_LOCAL = 12 -,
    -  FILE_TRANSFER = 13 -, AUTHENTICATION = 14 -, MAINTENANCE_OF_AUTH_SESSION_KEY = 15 -, MAINTENANCE_OF_USER_ROLE_AND_UPDATE_KEY = 16 -,
    -  INTERROGATED_BY_STATION = 20 -, INTERROGATED_BY_GROUP_1 = 21 -, INTERROGATED_BY_GROUP_2 = 22 -, INTERROGATED_BY_GROUP_3 = 23 -,
    -  INTERROGATED_BY_GROUP_4 = 24 -, INTERROGATED_BY_GROUP_5 = 25 -, INTERROGATED_BY_GROUP_6 = 26 -, INTERROGATED_BY_GROUP_7 = 27 -,
    -  INTERROGATED_BY_GROUP_8 = 28 -, INTERROGATED_BY_GROUP_9 = 29 -, INTERROGATED_BY_GROUP_10 = 30 -, INTERROGATED_BY_GROUP_11 = 31 -,
    -  INTERROGATED_BY_GROUP_12 = 32 -, INTERROGATED_BY_GROUP_13 = 33 -, INTERROGATED_BY_GROUP_14 = 34 -, INTERROGATED_BY_GROUP_15 = 35 -,
    -  INTERROGATED_BY_GROUP_16 = 36 -, REQUESTED_BY_GENERAL_COUNTER = 37 -, REQUESTED_BY_GROUP_1_COUNTER = 38 -, REQUESTED_BY_GROUP_2_COUNTER = 39 -,
    -  REQUESTED_BY_GROUP_3_COUNTER = 40 -, REQUESTED_BY_GROUP_4_COUNTER = 41 -, UNKNOWN_TYPE_ID = 44 -, UNKNOWN_CAUSE_OF_TRANSMISSION = 45 -,
    -  UNKNOWN_COMMON_ADDRESS_OF_ASDU = 46 -, UNKNOWN_INFORMATION_OBJECT_ADDRESS = 47 -
    - }
     The cause of transmission (COT)
     
    enum  DoublePointValue { INTERMEDIATE = 0 -, OFF = 1 -, ON = 2 -, INDETERMINATE = 3 - }
     Double point value.
     
    enum  NameOfFile : ushort {
    -  DEFAULT = 0 -, TRANSPARENT_FILE = 1 -, DISTURBANCE_DATA = 2 -, SEQUENCES_OF_EVENTS = 3 -,
    -  SEQUENCES_OF_ANALOGUE_VALUES = 4 -
    - }
     Name of file (NOF) - describes the type of a file.
     
    enum  SelectAndCallQualifier : byte {
    -  DEFAULT = 0 -, SELECT_FILE = 1 -, REQUEST_FILE = 2 -, DEACTIVATE_FILE = 3 -,
    -  DELETE_FILE = 4 -, SELECT_SECTION = 5 -, REQUEST_SECTION = 6 -, DEACTIVATE_SECTION = 7 -
    - }
     Select and call qualifier (SCQ)
     
    enum  LastSectionOrSegmentQualifier : byte {
    -  NOT_USED = 0 -, FILE_TRANSFER_WITHOUT_DEACT = 1 -, FILE_TRANSFER_WITH_DEACT = 2 -, SECTION_TRANSFER_WITHOUT_DEACT = 3 -,
    -  SECTION_TRANSFER_WITH_DEACT = 4 -
    - }
     Last section or segment qualifier (LSQ)
     
    enum  AcknowledgeQualifier {
    -  NOT_USED = 0 -, POS_ACK_FILE = 1 -, NEG_ACK_FILE = 2 -, POS_ACK_SECTION = 3 -,
    -  NEG_ACK_SECTION = 4 -
    - }
     Acknowledge qualifier (AFQ)
     
    enum  FileError {
    -  DEFAULT = 0 -, REQ_MEMORY_NOT_AVAILABLE = 1 -, CHECKSUM_FAILED = 2 -, UNEXPECTED_COMM_SERVICE = 3 -,
    -  UNEXPECTED_NAME_OF_FILE = 4 -, UNEXPECTED_NAME_OF_SECTION = 5 -
    - }
     File Error.
     
    enum  FileErrorCode {
    -  SUCCESS -, TIMEOUT -, FILE_NOT_READY -, SECTION_NOT_READY -,
    -  UNKNOWN_CA -, UNKNOWN_IOA -, UNKNOWN_SERVICE -, PROTOCOL_ERROR -,
    -  ABORTED_BY_REMOTE -
    - }
     
    enum  StepCommandValue { INVALID_0 = 0 -, LOWER = 1 -, HIGHER = 2 -, INVALID_3 = 3 - }
     Regulating step command state (RCS) according to IEC 60870-5-101:2003 7.2.6.17.
     
    enum  EventState { INDETERMINATE_0 = 0 -, OFF = 1 -, ON = 2 -, INDETERMINATE_3 = 3 - }
     
    enum  TypeID {
    -  M_SP_NA_1 = 1 -, M_SP_TA_1 = 2 -, M_DP_NA_1 = 3 -, M_DP_TA_1 = 4 -,
    -  M_ST_NA_1 = 5 -, M_ST_TA_1 = 6 -, M_BO_NA_1 = 7 -, M_BO_TA_1 = 8 -,
    -  M_ME_NA_1 = 9 -, M_ME_TA_1 = 10 -, M_ME_NB_1 = 11 -, M_ME_TB_1 = 12 -,
    -  M_ME_NC_1 = 13 -, M_ME_TC_1 = 14 -, M_IT_NA_1 = 15 -, M_IT_TA_1 = 16 -,
    -  M_EP_TA_1 = 17 -, M_EP_TB_1 = 18 -, M_EP_TC_1 = 19 -, M_PS_NA_1 = 20 -,
    -  M_ME_ND_1 = 21 -, M_SP_TB_1 = 30 -, M_DP_TB_1 = 31 -, M_ST_TB_1 = 32 -,
    -  M_BO_TB_1 = 33 -, M_ME_TD_1 = 34 -, M_ME_TE_1 = 35 -, M_ME_TF_1 = 36 -,
    -  M_IT_TB_1 = 37 -, M_EP_TD_1 = 38 -, M_EP_TE_1 = 39 -, M_EP_TF_1 = 40 -,
    -  C_SC_NA_1 = 45 -, C_DC_NA_1 = 46 -, C_RC_NA_1 = 47 -, C_SE_NA_1 = 48 -,
    -  C_SE_NB_1 = 49 -, C_SE_NC_1 = 50 -, C_BO_NA_1 = 51 -, C_SC_TA_1 = 58 -,
    -  C_DC_TA_1 = 59 -, C_RC_TA_1 = 60 -, C_SE_TA_1 = 61 -, C_SE_TB_1 = 62 -,
    -  C_SE_TC_1 = 63 -, C_BO_TA_1 = 64 -, M_EI_NA_1 = 70 -, C_IC_NA_1 = 100 -,
    -  C_CI_NA_1 = 101 -, C_RD_NA_1 = 102 -, C_CS_NA_1 = 103 -, C_TS_NA_1 = 104 -,
    -  C_RP_NA_1 = 105 -, C_CD_NA_1 = 106 -, C_TS_TA_1 = 107 -, P_ME_NA_1 = 110 -,
    -  P_ME_NB_1 = 111 -, P_ME_NC_1 = 112 -, P_AC_NA_1 = 113 -, F_FR_NA_1 = 120 -,
    -  F_SR_NA_1 = 121 -, F_SC_NA_1 = 122 -, F_LS_NA_1 = 123 -, F_AF_NA_1 = 124 -,
    -  F_SG_NA_1 = 125 -, F_DR_TA_1 = 126 -, F_SC_NB_1 = 127 -
    - }
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Functions

    -delegate IFileReceiver FileReadyHandler (object parameter, int ca, int ioa, NameOfFile nof, int lengthOfFile)
     File ready handler. Will be called by the FileServer when a master sends a FILE READY (file download announcement) message to the slave.
     
    -delegate void DebugLogger (string message)
     
    -delegate bool ASDUReceivedHandler (object parameter, int slaveAddress, ASDU asdu)
     Handler that is called when a new ASDU is received.
     
    -delegate bool InterrogationHandler (object parameter, IMasterConnection connection, ASDU asdu, byte qoi)
     Handler for interrogation command (C_IC_NA_1 - 100).
     
    -delegate bool CounterInterrogationHandler (object parameter, IMasterConnection connection, ASDU asdu, byte qoi)
     Handler for counter interrogation command (C_CI_NA_1 - 101).
     
    -delegate bool ReadHandler (object parameter, IMasterConnection connection, ASDU asdu, int ioa)
     Handler for read command (C_RD_NA_1 - 102)
     
    -delegate bool ClockSynchronizationHandler (object parameter, IMasterConnection connection, ASDU asdu, CP56Time2a newTime)
     Handler for clock synchronization command (C_CS_NA_1 - 103)
     
    -delegate bool ResetProcessHandler (object parameter, IMasterConnection connection, ASDU asdu, byte qrp)
     Handler for reset process command (C_RP_NA_1 - 105)
     
    -delegate bool DelayAcquisitionHandler (object parameter, IMasterConnection connection, ASDU asdu, CP16Time2a delayTime)
     Handler for delay acquisition command (C_CD_NA:1 - 106)
     
    -delegate bool ASDUHandler (object parameter, IMasterConnection connection, ASDU asdu)
     Handler for ASDUs that are not handled by other handlers (default handler)
     
    -

    Enumeration Type Documentation

    - -

    ◆ TypeID

    - -
    -
    - - - - -
    enum lib60870.CS101.TypeID
    -
    - - -
    Enumerator
    M_ME_NA_1 

    Measured Value, normalized value.

    -
    - -
    -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s101.js b/doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s101.js deleted file mode 100644 index 086a388..0000000 --- a/doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s101.js +++ /dev/null @@ -1,267 +0,0 @@ -var namespacelib60870_1_1_c_s101 = -[ - [ "ApplicationLayerParameters", "classlib60870_1_1_c_s101_1_1_application_layer_parameters.html", null ], - [ "ASDU", "classlib60870_1_1_c_s101_1_1_a_s_d_u.html", "classlib60870_1_1_c_s101_1_1_a_s_d_u" ], - [ "ASDUQueueException", "classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception.html", null ], - [ "BinaryCounterReading", "classlib60870_1_1_c_s101_1_1_binary_counter_reading.html", "classlib60870_1_1_c_s101_1_1_binary_counter_reading" ], - [ "Bitstring32", "classlib60870_1_1_c_s101_1_1_bitstring32.html", null ], - [ "Bitstring32Command", "classlib60870_1_1_c_s101_1_1_bitstring32_command.html", null ], - [ "Bitstring32CommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a.html", null ], - [ "Bitstring32WithCP24Time2a", "classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a.html", null ], - [ "Bitstring32WithCP56Time2a", "classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a.html", null ], - [ "ClockSynchronizationCommand", "classlib60870_1_1_c_s101_1_1_clock_synchronization_command.html", null ], - [ "CounterInterrogationCommand", "classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html", "classlib60870_1_1_c_s101_1_1_counter_interrogation_command" ], - [ "CS101Master", "classlib60870_1_1_c_s101_1_1_c_s101_master.html", "classlib60870_1_1_c_s101_1_1_c_s101_master" ], - [ "CS101Slave", "classlib60870_1_1_c_s101_1_1_c_s101_slave.html", "classlib60870_1_1_c_s101_1_1_c_s101_slave" ], - [ "DelayAcquisitionCommand", "classlib60870_1_1_c_s101_1_1_delay_acquisition_command.html", null ], - [ "DoubleCommand", "classlib60870_1_1_c_s101_1_1_double_command.html", null ], - [ "DoubleCommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a.html", null ], - [ "DoublePointInformation", "classlib60870_1_1_c_s101_1_1_double_point_information.html", null ], - [ "DoublePointWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a.html", null ], - [ "DoublePointWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a.html", null ], - [ "EndOfInitialization", "classlib60870_1_1_c_s101_1_1_end_of_initialization.html", "classlib60870_1_1_c_s101_1_1_end_of_initialization" ], - [ "EventOfProtectionEquipment", "classlib60870_1_1_c_s101_1_1_event_of_protection_equipment.html", null ], - [ "EventOfProtectionEquipmentWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a.html", null ], - [ "FileACK", "classlib60870_1_1_c_s101_1_1_file_a_c_k.html", "classlib60870_1_1_c_s101_1_1_file_a_c_k" ], - [ "FileCallOrSelect", "classlib60870_1_1_c_s101_1_1_file_call_or_select.html", "classlib60870_1_1_c_s101_1_1_file_call_or_select" ], - [ "FileDirectory", "classlib60870_1_1_c_s101_1_1_file_directory.html", "classlib60870_1_1_c_s101_1_1_file_directory" ], - [ "FileLastSegmentOrSection", "classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html", "classlib60870_1_1_c_s101_1_1_file_last_segment_or_section" ], - [ "FileReady", "classlib60870_1_1_c_s101_1_1_file_ready.html", "classlib60870_1_1_c_s101_1_1_file_ready" ], - [ "FilesAvailable", "classlib60870_1_1_c_s101_1_1_files_available.html", "classlib60870_1_1_c_s101_1_1_files_available" ], - [ "FileSegment", "classlib60870_1_1_c_s101_1_1_file_segment.html", null ], - [ "IFileProvider", "interfacelib60870_1_1_c_s101_1_1_i_file_provider.html", "interfacelib60870_1_1_c_s101_1_1_i_file_provider" ], - [ "IFileReceiver", "interfacelib60870_1_1_c_s101_1_1_i_file_receiver.html", null ], - [ "IMasterConnection", "interfacelib60870_1_1_c_s101_1_1_i_master_connection.html", null ], - [ "InformationObject", "classlib60870_1_1_c_s101_1_1_information_object.html", "classlib60870_1_1_c_s101_1_1_information_object" ], - [ "IntegratedTotals", "classlib60870_1_1_c_s101_1_1_integrated_totals.html", null ], - [ "IntegratedTotalsWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a.html", null ], - [ "IntegratedTotalsWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a.html", null ], - [ "InterrogationCommand", "classlib60870_1_1_c_s101_1_1_interrogation_command.html", null ], - [ "IPrivateIOFactory", "interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html", "interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory" ], - [ "Master", "classlib60870_1_1_c_s101_1_1_master.html", "classlib60870_1_1_c_s101_1_1_master" ], - [ "MeasuredValueNormalized", "classlib60870_1_1_c_s101_1_1_measured_value_normalized.html", null ], - [ "MeasuredValueNormalizedWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a.html", null ], - [ "MeasuredValueNormalizedWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a.html", null ], - [ "MeasuredValueNormalizedWithoutQuality", "classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html", null ], - [ "MeasuredValueScaled", "classlib60870_1_1_c_s101_1_1_measured_value_scaled.html", "classlib60870_1_1_c_s101_1_1_measured_value_scaled" ], - [ "MeasuredValueScaledWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a.html", null ], - [ "MeasuredValueScaledWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a.html", null ], - [ "MeasuredValueShort", "classlib60870_1_1_c_s101_1_1_measured_value_short.html", null ], - [ "MeasuredValueShortWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a.html", null ], - [ "MeasuredValueShortWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a.html", null ], - [ "OutputCircuitInfo", "classlib60870_1_1_c_s101_1_1_output_circuit_info.html", "classlib60870_1_1_c_s101_1_1_output_circuit_info" ], - [ "PackedOutputCircuitInfo", "classlib60870_1_1_c_s101_1_1_packed_output_circuit_info.html", null ], - [ "PackedOutputCircuitInfoWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a.html", null ], - [ "PackedSinglePointWithSCD", "classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d.html", null ], - [ "PackedStartEventsOfProtectionEquipment", "classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment.html", null ], - [ "PackedStartEventsOfProtectionEquipmentWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a.html", null ], - [ "ParameterActivation", "classlib60870_1_1_c_s101_1_1_parameter_activation.html", "classlib60870_1_1_c_s101_1_1_parameter_activation" ], - [ "ParameterFloatValue", "classlib60870_1_1_c_s101_1_1_parameter_float_value.html", null ], - [ "ParameterNormalizedValue", "classlib60870_1_1_c_s101_1_1_parameter_normalized_value.html", null ], - [ "ParameterScaledValue", "classlib60870_1_1_c_s101_1_1_parameter_scaled_value.html", null ], - [ "PrivateInformationObjectTypes", "classlib60870_1_1_c_s101_1_1_private_information_object_types.html", null ], - [ "QualifierOfInterrogation", "classlib60870_1_1_c_s101_1_1_qualifier_of_interrogation.html", null ], - [ "QualityDescriptor", "classlib60870_1_1_c_s101_1_1_quality_descriptor.html", null ], - [ "QualityDescriptorP", "classlib60870_1_1_c_s101_1_1_quality_descriptor_p.html", null ], - [ "ReadCommand", "classlib60870_1_1_c_s101_1_1_read_command.html", null ], - [ "ResetProcessCommand", "classlib60870_1_1_c_s101_1_1_reset_process_command.html", "classlib60870_1_1_c_s101_1_1_reset_process_command" ], - [ "ScaledValue", "classlib60870_1_1_c_s101_1_1_scaled_value.html", null ], - [ "SectionReady", "classlib60870_1_1_c_s101_1_1_section_ready.html", "classlib60870_1_1_c_s101_1_1_section_ready" ], - [ "SetpointCommandNormalized", "classlib60870_1_1_c_s101_1_1_setpoint_command_normalized.html", null ], - [ "SetpointCommandNormalizedWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a.html", null ], - [ "SetpointCommandQualifier", "classlib60870_1_1_c_s101_1_1_setpoint_command_qualifier.html", null ], - [ "SetpointCommandScaled", "classlib60870_1_1_c_s101_1_1_setpoint_command_scaled.html", null ], - [ "SetpointCommandScaledWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a.html", null ], - [ "SetpointCommandShort", "classlib60870_1_1_c_s101_1_1_setpoint_command_short.html", null ], - [ "SetpointCommandShortWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a.html", null ], - [ "SingleCommand", "classlib60870_1_1_c_s101_1_1_single_command.html", "classlib60870_1_1_c_s101_1_1_single_command" ], - [ "SingleCommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a.html", null ], - [ "SingleEvent", "classlib60870_1_1_c_s101_1_1_single_event.html", null ], - [ "SinglePointInformation", "classlib60870_1_1_c_s101_1_1_single_point_information.html", null ], - [ "SinglePointWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a.html", null ], - [ "SinglePointWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a.html", null ], - [ "Slave", "classlib60870_1_1_c_s101_1_1_slave.html", "classlib60870_1_1_c_s101_1_1_slave" ], - [ "StartEvent", "classlib60870_1_1_c_s101_1_1_start_event.html", "classlib60870_1_1_c_s101_1_1_start_event" ], - [ "StatusAndStatusChangeDetection", "classlib60870_1_1_c_s101_1_1_status_and_status_change_detection.html", null ], - [ "StepCommand", "classlib60870_1_1_c_s101_1_1_step_command.html", null ], - [ "StepCommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a.html", null ], - [ "StepPositionInformation", "classlib60870_1_1_c_s101_1_1_step_position_information.html", "classlib60870_1_1_c_s101_1_1_step_position_information" ], - [ "StepPositionWithCP24Time2a", "classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a.html", null ], - [ "StepPositionWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a.html", null ], - [ "TestCommand", "classlib60870_1_1_c_s101_1_1_test_command.html", null ], - [ "TestCommandWithCP56Time2a", "classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html", "classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a" ], - [ "TransparentFile", "classlib60870_1_1_c_s101_1_1_transparent_file.html", "classlib60870_1_1_c_s101_1_1_transparent_file" ], - [ "AcknowledgeQualifier", "namespacelib60870_1_1_c_s101.html#af2506d56be1cd94a330f0f26d45ececc", [ - [ "NOT_USED", "namespacelib60870_1_1_c_s101.html#af2506d56be1cd94a330f0f26d45ececca29b49ac013c4624b51d17a503baf07d1", null ], - [ "POS_ACK_FILE", "namespacelib60870_1_1_c_s101.html#af2506d56be1cd94a330f0f26d45ececca49be006d9bd0a9c532d1e26f241877a6", null ], - [ "NEG_ACK_FILE", "namespacelib60870_1_1_c_s101.html#af2506d56be1cd94a330f0f26d45ececca22eb29b0b62a6538c9a67e3bab7d6729", null ], - [ "POS_ACK_SECTION", "namespacelib60870_1_1_c_s101.html#af2506d56be1cd94a330f0f26d45ececca2581eea24ac7f24203fa2c244eead58e", null ], - [ "NEG_ACK_SECTION", "namespacelib60870_1_1_c_s101.html#af2506d56be1cd94a330f0f26d45ececca977593995bf100b51e24460e374820fe", null ] - ] ], - [ "CauseOfTransmission", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cc", [ - [ "PERIODIC", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccad9d83fc826ae0d42075af007a477e2c9", null ], - [ "BACKGROUND_SCAN", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca0d00e22b7d8fd09ee49bf50f7f1c5210", null ], - [ "SPONTANEOUS", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccab737bea05b06a56b320bc5c93f114331", null ], - [ "INITIALIZED", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccadee5f03c2c4e73657824e028494b18c0", null ], - [ "REQUEST", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccaad6c35880c58d97c03d60a6ad0f23737", null ], - [ "ACTIVATION", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccaa62e9496bde05da2a14255d4a533bab9", null ], - [ "ACTIVATION_CON", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca07122f304b1ce18d4decd99129e122c3", null ], - [ "DEACTIVATION", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccac12cd7e956b40f674ea37329d588d086", null ], - [ "DEACTIVATION_CON", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca1931fde91833781b7200f44e261d54cb", null ], - [ "ACTIVATION_TERMINATION", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca13f0e69255aebb2b29e8f324cab9c087", null ], - [ "RETURN_INFO_REMOTE", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca64bc588ed54506354c78e2d78b5ab9a5", null ], - [ "RETURN_INFO_LOCAL", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca79f6db516cbe95b755539cb279da54e7", null ], - [ "FILE_TRANSFER", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca1435335ae73283d491ff80015d540c41", null ], - [ "AUTHENTICATION", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccac1f244be04c43841756fff0cdb74f994", null ], - [ "MAINTENANCE_OF_AUTH_SESSION_KEY", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca33cf657d0fa462fbe504bd426649ade2", null ], - [ "MAINTENANCE_OF_USER_ROLE_AND_UPDATE_KEY", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccacfcea62f5090675fd048a8395f8aded7", null ], - [ "INTERROGATED_BY_STATION", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca97af44147bf0e196870dfaf43f733823", null ], - [ "INTERROGATED_BY_GROUP_1", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccade0439d37ad6c9ed3c5781892221ca01", null ], - [ "INTERROGATED_BY_GROUP_2", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca2bdcdbffa3a8b791ec02fd56710f8e67", null ], - [ "INTERROGATED_BY_GROUP_3", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccaa17779b8ba08ddb51b856c99f6c52d7a", null ], - [ "INTERROGATED_BY_GROUP_4", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca786eaa3f3715492f0aabea0417b9920b", null ], - [ "INTERROGATED_BY_GROUP_5", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca259d7c0d0814f335583b7341797a1248", null ], - [ "INTERROGATED_BY_GROUP_6", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccad94d68c7cb935b28f14e49f52e7ac034", null ], - [ "INTERROGATED_BY_GROUP_7", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca2b2f592977dcfd82521b1084d565f628", null ], - [ "INTERROGATED_BY_GROUP_8", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccab90252c3a74afebfd4c09ded5a9ddf56", null ], - [ "INTERROGATED_BY_GROUP_9", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca76543764a887ecd7b43bd413c5358fbc", null ], - [ "INTERROGATED_BY_GROUP_10", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccac6f6cf5db98948ad72cfa743546da51c", null ], - [ "INTERROGATED_BY_GROUP_11", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca846080f0be72abc949a6d8054e35d85c", null ], - [ "INTERROGATED_BY_GROUP_12", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccafba7475c103af5daafb3a13d614df030", null ], - [ "INTERROGATED_BY_GROUP_13", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccac878dfeeddf94ab18ee7fd6a42e66800", null ], - [ "INTERROGATED_BY_GROUP_14", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccacbcdfb5fa9a1074f4773fe374b8a1b2a", null ], - [ "INTERROGATED_BY_GROUP_15", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccab822360ee6d4dd4641616cfa0a888f96", null ], - [ "INTERROGATED_BY_GROUP_16", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca4d45f86dcf150feafc31571831aec60c", null ], - [ "REQUESTED_BY_GENERAL_COUNTER", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca4ea758ddeaf232c4be02f12f17cc2f3f", null ], - [ "REQUESTED_BY_GROUP_1_COUNTER", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca8f23fe2479b84e5d5381881c874e8339", null ], - [ "REQUESTED_BY_GROUP_2_COUNTER", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca465e2b77ee700544a37e8dc0fe811858", null ], - [ "REQUESTED_BY_GROUP_3_COUNTER", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca53ec0b40996e51b17c1fc32b7b1b7c1e", null ], - [ "REQUESTED_BY_GROUP_4_COUNTER", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca6d8fff24a6a56d7d57250cdb0b5d2656", null ], - [ "UNKNOWN_TYPE_ID", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca10fe0de0548e6a9816513500231b7872", null ], - [ "UNKNOWN_CAUSE_OF_TRANSMISSION", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374ccaa9f052e684420f3cfc12361759645ec3", null ], - [ "UNKNOWN_COMMON_ADDRESS_OF_ASDU", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca9f88466a9e519fc7955ab0bab7ac153c", null ], - [ "UNKNOWN_INFORMATION_OBJECT_ADDRESS", "namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cca0cb02b2fc8dad3ee00753192f00d3a74", null ] - ] ], - [ "DoublePointValue", "namespacelib60870_1_1_c_s101.html#aff74ed75cebe96a815464d1ef856e3ad", [ - [ "INTERMEDIATE", "namespacelib60870_1_1_c_s101.html#aff74ed75cebe96a815464d1ef856e3ada41dc7c9e385c4d2b6c1f7836973951bf", null ], - [ "OFF", "namespacelib60870_1_1_c_s101.html#aff74ed75cebe96a815464d1ef856e3ada88559a0cfd8250c9d65970cc145c92d4", null ], - [ "ON", "namespacelib60870_1_1_c_s101.html#aff74ed75cebe96a815464d1ef856e3ada90651ebea9a35ec4e018c8157492e17c", null ], - [ "INDETERMINATE", "namespacelib60870_1_1_c_s101.html#aff74ed75cebe96a815464d1ef856e3ada717bb676b27571e4f5392a911194842a", null ] - ] ], - [ "FileError", "namespacelib60870_1_1_c_s101.html#a69c8264ee40e2407023b71a5dfd09e0f", [ - [ "DEFAULT", "namespacelib60870_1_1_c_s101.html#a69c8264ee40e2407023b71a5dfd09e0fa5b39c8b553c821e7cddc6da64b5bd2ee", null ], - [ "REQ_MEMORY_NOT_AVAILABLE", "namespacelib60870_1_1_c_s101.html#a69c8264ee40e2407023b71a5dfd09e0fae0a0fbb6d576b0ebc57da0717c9b1943", null ], - [ "CHECKSUM_FAILED", "namespacelib60870_1_1_c_s101.html#a69c8264ee40e2407023b71a5dfd09e0fa0aaa16e0a9def62ff9f96c5db827fd78", null ], - [ "UNEXPECTED_COMM_SERVICE", "namespacelib60870_1_1_c_s101.html#a69c8264ee40e2407023b71a5dfd09e0faea3cb6be1ec819d1f0bbf8f1b143890c", null ], - [ "UNEXPECTED_NAME_OF_FILE", "namespacelib60870_1_1_c_s101.html#a69c8264ee40e2407023b71a5dfd09e0fa6b87ef1b6f4a063d1154bb666e5b6306", null ], - [ "UNEXPECTED_NAME_OF_SECTION", "namespacelib60870_1_1_c_s101.html#a69c8264ee40e2407023b71a5dfd09e0fa4d56c751e7fbf4b6ff7b18d5e8c2882a", null ] - ] ], - [ "LastSectionOrSegmentQualifier", "namespacelib60870_1_1_c_s101.html#a7030b42dc57243516c07cb22a1992183", [ - [ "NOT_USED", "namespacelib60870_1_1_c_s101.html#a7030b42dc57243516c07cb22a1992183a29b49ac013c4624b51d17a503baf07d1", null ], - [ "FILE_TRANSFER_WITHOUT_DEACT", "namespacelib60870_1_1_c_s101.html#a7030b42dc57243516c07cb22a1992183a3e4fcf2723d3e8b8e35c5bea443c2fd3", null ], - [ "FILE_TRANSFER_WITH_DEACT", "namespacelib60870_1_1_c_s101.html#a7030b42dc57243516c07cb22a1992183a6e32e506b3aacff63d0d16390e1ccb3f", null ], - [ "SECTION_TRANSFER_WITHOUT_DEACT", "namespacelib60870_1_1_c_s101.html#a7030b42dc57243516c07cb22a1992183a5eb6c7bbbcb88adf2465ba3f306856bd", null ], - [ "SECTION_TRANSFER_WITH_DEACT", "namespacelib60870_1_1_c_s101.html#a7030b42dc57243516c07cb22a1992183a19264adc13cb89a2b0d4d6c7e126db51", null ] - ] ], - [ "NameOfFile", "namespacelib60870_1_1_c_s101.html#a5da0329a39b420cbbf859758eaceba93", [ - [ "DEFAULT", "namespacelib60870_1_1_c_s101.html#a5da0329a39b420cbbf859758eaceba93a5b39c8b553c821e7cddc6da64b5bd2ee", null ], - [ "TRANSPARENT_FILE", "namespacelib60870_1_1_c_s101.html#a5da0329a39b420cbbf859758eaceba93a2d18e760bfde6792ec47ea638bca1419", null ], - [ "DISTURBANCE_DATA", "namespacelib60870_1_1_c_s101.html#a5da0329a39b420cbbf859758eaceba93af8a8531f269526e2cdd6cb67d5661734", null ], - [ "SEQUENCES_OF_EVENTS", "namespacelib60870_1_1_c_s101.html#a5da0329a39b420cbbf859758eaceba93ab981d9d396d5ee12e44b9ff0a44c915e", null ], - [ "SEQUENCES_OF_ANALOGUE_VALUES", "namespacelib60870_1_1_c_s101.html#a5da0329a39b420cbbf859758eaceba93a27f3376781085bbcdbb69412b826a437", null ] - ] ], - [ "SelectAndCallQualifier", "namespacelib60870_1_1_c_s101.html#ac5a919dfe39a648cc5ea40d072ca98a3", [ - [ "DEFAULT", "namespacelib60870_1_1_c_s101.html#ac5a919dfe39a648cc5ea40d072ca98a3a5b39c8b553c821e7cddc6da64b5bd2ee", null ], - [ "SELECT_FILE", "namespacelib60870_1_1_c_s101.html#ac5a919dfe39a648cc5ea40d072ca98a3a0a5636b3d4a92cb2d2765d5942d10827", null ], - [ "REQUEST_FILE", "namespacelib60870_1_1_c_s101.html#ac5a919dfe39a648cc5ea40d072ca98a3abbe83a2308504c9892ab86eb39f11e3c", null ], - [ "DEACTIVATE_FILE", "namespacelib60870_1_1_c_s101.html#ac5a919dfe39a648cc5ea40d072ca98a3a5e0a8537b237cd36e5a3cf5c81269957", null ], - [ "DELETE_FILE", "namespacelib60870_1_1_c_s101.html#ac5a919dfe39a648cc5ea40d072ca98a3a1fffa6180b5fb6b758779d01127ae95a", null ], - [ "SELECT_SECTION", "namespacelib60870_1_1_c_s101.html#ac5a919dfe39a648cc5ea40d072ca98a3a0be513e7635e75e9c385ce71ffd890a9", null ], - [ "REQUEST_SECTION", "namespacelib60870_1_1_c_s101.html#ac5a919dfe39a648cc5ea40d072ca98a3ae457052e488d117b6795d622aa91f9b5", null ], - [ "DEACTIVATE_SECTION", "namespacelib60870_1_1_c_s101.html#ac5a919dfe39a648cc5ea40d072ca98a3a86d7f9901e2f3300ce34ab6baf10bf48", null ] - ] ], - [ "StepCommandValue", "namespacelib60870_1_1_c_s101.html#a8b8573d2c7289fab9db7a1ce5ff40286", [ - [ "INVALID_0", "namespacelib60870_1_1_c_s101.html#a8b8573d2c7289fab9db7a1ce5ff40286a2d89af028887e2c01151359084134305", null ], - [ "LOWER", "namespacelib60870_1_1_c_s101.html#a8b8573d2c7289fab9db7a1ce5ff40286aa7c48ba367e019d004bfb0239b85f2b3", null ], - [ "HIGHER", "namespacelib60870_1_1_c_s101.html#a8b8573d2c7289fab9db7a1ce5ff40286a5bc0a7ce2c77ccd49169277e9289e5d1", null ], - [ "INVALID_3", "namespacelib60870_1_1_c_s101.html#a8b8573d2c7289fab9db7a1ce5ff40286a5f48180707bf286894e0357c3e390cd0", null ] - ] ], - [ "TypeID", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bb", [ - [ "M_SP_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba51cbc2bb20a7470300bfa2139279b635", null ], - [ "M_SP_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba9a40fcd6cc2c2347830d278c30b45826", null ], - [ "M_DP_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba1ba0ca670f21d77d31ee36a9ca39b4ab", null ], - [ "M_DP_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba03860275ea0672ca47dae2d3e13fbd97", null ], - [ "M_ST_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba312b24d11baa01ebaf2a7fd34945767a", null ], - [ "M_ST_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba3f1c295c65a5a044176367add39913b0", null ], - [ "M_BO_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbaf0c04d33dee33c790cd1ba86d48c974d", null ], - [ "M_BO_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbae213bf9dd1a002a5a08452a88f7f49eb", null ], - [ "M_ME_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba6725773b3371787d2445c3dfad2d68fb", null ], - [ "M_ME_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba8a6f3f970ec2efcdefe4855c7bbc67ea", null ], - [ "M_ME_NB_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbaa94001a74a0db3aaa21fa1e27e9e9cab", null ], - [ "M_ME_TB_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbae139f46e3919f06d95fad3bd62c8a8c5", null ], - [ "M_ME_NC_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba272ed5a9d710f1d314cb1273c58cd2f3", null ], - [ "M_ME_TC_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbad652cd758a1b9db2b4939e08bcd5fd3a", null ], - [ "M_IT_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbac9f49bf985741005acba52c23c0b1a89", null ], - [ "M_IT_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbaf84329f985e4c2b74b9fde3570ab4109", null ], - [ "M_EP_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbabd0487ea6253a1a7415da39ff8b7160c", null ], - [ "M_EP_TB_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbad4f16952e560700878634df949e714e9", null ], - [ "M_EP_TC_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba72d79e34c64068abb2623e9010f5cfb9", null ], - [ "M_PS_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba452d4b64bdbb96703f823d8b07920c39", null ], - [ "M_ME_ND_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba1ae741202506f138c68d10dbc79908bf", null ], - [ "M_SP_TB_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba0b1ad1295a141bef31e2d896395a10dd", null ], - [ "M_DP_TB_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba15be3fbeead3dcc6060fdf4fabc1b955", null ], - [ "M_ST_TB_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbae94c695bf05bb3690f20bf9b16f34110", null ], - [ "M_BO_TB_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba932c149f2bd3f13dde06d0c51538473c", null ], - [ "M_ME_TD_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba4a65e6ef8205d9e4d9b5c0d1198ca88e", null ], - [ "M_ME_TE_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbaec990bb5f91926bc2f37be606ae48ba7", null ], - [ "M_ME_TF_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba030c30f68889dacd0b4f169b8bda0a20", null ], - [ "M_IT_TB_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba533e06821b2eeb5f4e562fe719eb0b22", null ], - [ "M_EP_TD_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbafcd4dec2edff21e5353ff8e31686fa1d", null ], - [ "M_EP_TE_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba4e4f1cec2277b3873a1d8ed3f9eee010", null ], - [ "M_EP_TF_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba238f4e12ebca75c50c61e6ae87d9fb63", null ], - [ "C_SC_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba9e0ad39b75b5c81abd517f3e5939d77f", null ], - [ "C_DC_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbade3036df871f3be580cd56c60f7e7bff", null ], - [ "C_RC_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba8e5710d257fa976d73b6239f9fe90569", null ], - [ "C_SE_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba473cb4056bfe4c9a5d5a3644cbe17b25", null ], - [ "C_SE_NB_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba2854665c5115d211e1421ca77e021132", null ], - [ "C_SE_NC_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba17b3631f0b9408de5013e42a0358465d", null ], - [ "C_BO_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbafb307fe0afd430c437d35d2072099741", null ], - [ "C_SC_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba0a70f4b2c38ad070fcd0b46f4969300b", null ], - [ "C_DC_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba411938aa15eb565aefd906b0ac6e8df9", null ], - [ "C_RC_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba955a9f2b8ae96fa1e2e44e04d07f7b2c", null ], - [ "C_SE_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba6d9b75f7665fe9ad1963adab172a3924", null ], - [ "C_SE_TB_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba446a07353342023c25a92b6e92558700", null ], - [ "C_SE_TC_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba3b359bd5fadae64f3d163d6cfac44aef", null ], - [ "C_BO_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba6346a6dc822ed3e3601099f31a4175a7", null ], - [ "M_EI_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba9dc5edec294a862070eabdf26366f28f", null ], - [ "C_IC_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba8f3d441ec3f0d327736385acc4dd2519", null ], - [ "C_CI_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba6e91c35eef0635c0c86d507134737554", null ], - [ "C_RD_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba8f5fd97859f3b19245a0fa1e6ce21ec5", null ], - [ "C_CS_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba706da99c602be47c51b9950ce70226c8", null ], - [ "C_TS_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbaed3d31337627588b5b3fce7d959bdf10", null ], - [ "C_RP_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba40cdb88317753c429951f9cc43c0ed4b", null ], - [ "C_CD_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbacecd68f3d67f171ee614325036a9862a", null ], - [ "C_TS_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba12e3e5c1e7275659b8eb304b75bae928", null ], - [ "P_ME_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbab3c51291bd896a3ec2b3fc4e855ee33f", null ], - [ "P_ME_NB_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbaf4cf070e543b656b211c091792d75697", null ], - [ "P_ME_NC_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbae4bdff67aa8ffdbdb8fd5343fe561167", null ], - [ "P_AC_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba640f62d1046ea6718391bf82b325f7cc", null ], - [ "F_FR_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba798c94f729782a7a5793267c1e7d915a", null ], - [ "F_SR_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba6a5fadc289fb4549c286c8a47e7e2f52", null ], - [ "F_SC_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba7f72c269c2e8704722b8aaeacaa68c75", null ], - [ "F_LS_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba82be50d32717bbd38d8500b2cf7a5003", null ], - [ "F_AF_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bbafe14df78b3e61b965aa9f7ece94a509c", null ], - [ "F_SG_NA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba52643361131bc5fac37e04522c9c4468", null ], - [ "F_DR_TA_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba73787f14bc1e199afa281279a0243b7b", null ], - [ "F_SC_NB_1", "namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba2dc2e7379c07af393d3c9c2b6f5235d0", null ] - ] ], - [ "ASDUHandler", "namespacelib60870_1_1_c_s101.html#a494130feab85dbe337f659d383e4e8c5", null ], - [ "ASDUReceivedHandler", "namespacelib60870_1_1_c_s101.html#a95f9a71d670882525fbe3bf342cdf54e", null ], - [ "ClockSynchronizationHandler", "namespacelib60870_1_1_c_s101.html#a1d5c09e5cefc2e9711adad5ce978f0e7", null ], - [ "CounterInterrogationHandler", "namespacelib60870_1_1_c_s101.html#a027c45142e293bb4601aa52dd83c5d15", null ], - [ "DelayAcquisitionHandler", "namespacelib60870_1_1_c_s101.html#ad94b7a69be5b593e6e694b884206d184", null ], - [ "FileReadyHandler", "namespacelib60870_1_1_c_s101.html#a0c7346f0e183f14b92c4fc6c373678e9", null ], - [ "InterrogationHandler", "namespacelib60870_1_1_c_s101.html#a94c2e7c6e902d29db88c7a1d512099ed", null ], - [ "ReadHandler", "namespacelib60870_1_1_c_s101.html#a9230fe256069619a54c2c428acc32e06", null ], - [ "ResetProcessHandler", "namespacelib60870_1_1_c_s101.html#ad784b6cb8b22c0417207232c8d98e2db", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s104.html b/doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s104.html deleted file mode 100644 index 82a437b..0000000 --- a/doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s104.html +++ /dev/null @@ -1,342 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.CS104 Namespace Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.CS104 Namespace Reference
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - -

    -Classes

    class  APCIParameters
     Parameters for the CS 104 APCI (Application Protocol Control Information) More...
     
    class  ClientConnection
     Represents a client (master) connection. More...
     
    class  Connection
     A single connection to a CS 104 (IEC 60870-5-104) server. Implements the Master interface. More...
     
    class  ConnectionStatistics
     Provides some Connection statistics. More...
     
    class  RedundancyGroup
     Representation of a redundancy group. A redundancy group is a group of connections that share a unique event queue. Only one connection in a redundancy group can be active. More...
     
    class  Server
     This class represents a single IEC 60870-5 server (slave or controlled station). It is also the main access to the CS 104 server API. More...
     
    class  TlsSecurityInformation
     
    - - - - - - - - - - - - - - - - - -

    -Enumerations

    enum  MasterConnectionState { M_CON_STATE_STOPPED = 0 -, M_CON_STATE_STARTED = 1 -, M_CON_STATE_UNCONFIRMED_STOPPED = 2 - }
     
    enum  ConnectionEvent {
    -  OPENED = 0 -, CLOSED = 1 -, STARTDT_CON_RECEIVED = 2 -, STOPDT_CON_RECEIVED = 3 -,
    -  CONNECT_FAILED = 4 -
    - }
     Connection event for CS 104 client (Connection) More...
     
    enum  CS104_ConState {
    -  STATE_IDLE = 0 -, STATE_INACTIVE = 1 -, STATE_ACTIVE = 2 -, STATE_WAITING_FOR_STARTDT_CON = 3 -,
    -  STATE_WAITING_FOR_STOPDT_CON = 4 -
    - }
     
    enum  ClientConnectionEvent { OPENED -, ACTIVE -, INACTIVE -, CLOSED - }
     Connection events for the Server. More...
     
    enum  ServerMode { SINGLE_REDUNDANCY_GROUP -, CONNECTION_IS_REDUNDANCY_GROUP -, MULTIPLE_REDUNDANCY_GROUPS - }
     Server mode (redundancy group support) More...
     
    enum  EnqueueMode { REMOVE_OLDEST -, IGNORE -, THROW_EXCEPTION - }
     Specifies queue behavior when queue is full. More...
     
    - - - - - - - - - - - - -

    -Functions

    -delegate bool ASDUReceivedHandler (object parameter, ASDU asdu)
     ASDU received handler.
     
    -delegate void ConnectionHandler (object parameter, ConnectionEvent connectionEvent)
     Callback handler for connection events.
     
    delegate bool ConnectionRequestHandler (object parameter, IPAddress ipAddress)
     Connection request handler is called when a client tries to connect to the server.
     
    -delegate void ConnectionEventHandler (object parameter, ClientConnection connection, ClientConnectionEvent eventType)
     
    -

    Enumeration Type Documentation

    - -

    ◆ ClientConnectionEvent

    - -
    -
    - -

    Connection events for the Server.

    - - - - - -
    Enumerator
    OPENED 

    A new connection is opened.

    -
    ACTIVE 

    The connection entered active state.

    -
    INACTIVE 

    The connection entered inactive state.

    -
    CLOSED 

    The connection is closed.

    -
    - -
    -
    - -

    ◆ ConnectionEvent

    - -
    -
    - -

    Connection event for CS 104 client (Connection)

    - - - - - - -
    Enumerator
    OPENED 

    The connection has been opened.

    -
    CLOSED 

    The connection has been closed.

    -
    STARTDT_CON_RECEIVED 

    Conformation of START DT command received (server will send and accept application layer messages)

    -
    STOPDT_CON_RECEIVED 

    Conformation of STOP DT command received (server will no longer send or accept application layer messages)

    -
    CONNECT_FAILED 

    The connect attempt has failed.

    -
    - -
    -
    - -

    ◆ EnqueueMode

    - -
    -
    - - - - -
    enum lib60870.CS104.EnqueueMode
    -
    - -

    Specifies queue behavior when queue is full.

    - - - - -
    Enumerator
    REMOVE_OLDEST 

    Remove the oldest ASDU from the queue and add the new ASDU.

    -
    IGNORE 

    Don't add the new ASDU when the queue is full.

    -
    THROW_EXCEPTION 

    Don't add the new ASDU when the queue is full and throw an exception.

    -
    - -
    -
    - -

    ◆ ServerMode

    - -
    -
    - - - - -
    enum lib60870.CS104.ServerMode
    -
    - -

    Server mode (redundancy group support)

    - - - - -
    Enumerator
    SINGLE_REDUNDANCY_GROUP 

    There is only one redundancy group. There can only be one active connections. All other connections are standy connections.

    -
    CONNECTION_IS_REDUNDANCY_GROUP 

    Every connection is an own redundancy group. This enables simple multi-client server.

    -
    MULTIPLE_REDUNDANCY_GROUPS 

    Mutliple redundancy groups. Each redundancy group can have only a single active connection. Each redundancy group has its own event queue.

    -
    - -
    -
    -

    Function Documentation

    - -

    ◆ ConnectionRequestHandler()

    - -
    -
    - - - - - - - - - - - -
    delegate bool lib60870.CS104.ConnectionRequestHandler (object parameter,
    IPAddress ipAddress )
    -
    - -

    Connection request handler is called when a client tries to connect to the server.

    -
    Parameters
    - - - -
    parameterUser provided parameter
    ipAddressIP address of the connecting client
    -
    -
    -
    Returns
    true if the connection has to be accepted, false otherwise
    - -
    -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s104.js b/doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s104.js deleted file mode 100644 index 432a837..0000000 --- a/doxygen/doxydoc.NET/html/namespacelib60870_1_1_c_s104.js +++ /dev/null @@ -1,36 +0,0 @@ -var namespacelib60870_1_1_c_s104 = -[ - [ "APCIParameters", "classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html", "classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters" ], - [ "ClientConnection", "classlib60870_1_1_c_s104_1_1_client_connection.html", "classlib60870_1_1_c_s104_1_1_client_connection" ], - [ "Connection", "classlib60870_1_1_c_s104_1_1_connection.html", "classlib60870_1_1_c_s104_1_1_connection" ], - [ "ConnectionStatistics", "classlib60870_1_1_c_s104_1_1_connection_statistics.html", "classlib60870_1_1_c_s104_1_1_connection_statistics" ], - [ "RedundancyGroup", "classlib60870_1_1_c_s104_1_1_redundancy_group.html", "classlib60870_1_1_c_s104_1_1_redundancy_group" ], - [ "Server", "classlib60870_1_1_c_s104_1_1_server.html", "classlib60870_1_1_c_s104_1_1_server" ], - [ "TlsSecurityInformation", "classlib60870_1_1_c_s104_1_1_tls_security_information.html", "classlib60870_1_1_c_s104_1_1_tls_security_information" ], - [ "ClientConnectionEvent", "namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015d", [ - [ "OPENED", "namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015dae670c2408064392c6da7d0b721f7349c", null ], - [ "ACTIVE", "namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015da18ff74f43da410c5529f7d6fca84f115", null ], - [ "INACTIVE", "namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015da6b273343c454f9c53dcfc9c4ccf171d2", null ], - [ "CLOSED", "namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015da110ccf2f5d2ff4eda1fd1a494293467d", null ] - ] ], - [ "ConnectionEvent", "namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3", [ - [ "OPENED", "namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3ae670c2408064392c6da7d0b721f7349c", null ], - [ "CLOSED", "namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3a110ccf2f5d2ff4eda1fd1a494293467d", null ], - [ "STARTDT_CON_RECEIVED", "namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3abd9bb95a16a48d296aa230827d9c966b", null ], - [ "STOPDT_CON_RECEIVED", "namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3a98f20c03aaaaa367a27938cfb6b6d1da", null ], - [ "CONNECT_FAILED", "namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3a4820f088c518fab18fe3d9ca70fa7f64", null ] - ] ], - [ "EnqueueMode", "namespacelib60870_1_1_c_s104.html#ac35ab675c5aa217ded7ded419a5557df", [ - [ "REMOVE_OLDEST", "namespacelib60870_1_1_c_s104.html#ac35ab675c5aa217ded7ded419a5557dfac2bdd6ff983cc664116781c3a3dc0a83", null ], - [ "IGNORE", "namespacelib60870_1_1_c_s104.html#ac35ab675c5aa217ded7ded419a5557dfaa2e843feab94ef623fea888f07c28696", null ], - [ "THROW_EXCEPTION", "namespacelib60870_1_1_c_s104.html#ac35ab675c5aa217ded7ded419a5557dfa5c2e82fadad4dae10ff499facac4ab02", null ] - ] ], - [ "ServerMode", "namespacelib60870_1_1_c_s104.html#a40215e8d03911ca6748ebfd78218d744", [ - [ "SINGLE_REDUNDANCY_GROUP", "namespacelib60870_1_1_c_s104.html#a40215e8d03911ca6748ebfd78218d744aa3afc5caf4e3e1af74862fca807d9ba0", null ], - [ "CONNECTION_IS_REDUNDANCY_GROUP", "namespacelib60870_1_1_c_s104.html#a40215e8d03911ca6748ebfd78218d744a9d445a07d2444cf077d5b4a53243916a", null ], - [ "MULTIPLE_REDUNDANCY_GROUPS", "namespacelib60870_1_1_c_s104.html#a40215e8d03911ca6748ebfd78218d744a07a1fe963762929879e3998233ae368c", null ] - ] ], - [ "ASDUReceivedHandler", "namespacelib60870_1_1_c_s104.html#afb099e1be184222c607404d595cd6992", null ], - [ "ConnectionHandler", "namespacelib60870_1_1_c_s104.html#aa16788ce99f06cdcca23787226650a74", null ], - [ "ConnectionRequestHandler", "namespacelib60870_1_1_c_s104.html#ac8c6f665636c4cd4938333429bc9b03f", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/namespacelib60870_1_1linklayer.html b/doxygen/doxydoc.NET/html/namespacelib60870_1_1linklayer.html deleted file mode 100644 index 82f1254..0000000 --- a/doxygen/doxydoc.NET/html/namespacelib60870_1_1linklayer.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - - -lib60870.NET: lib60870.linklayer Namespace Reference - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    lib60870.linklayer Namespace Reference
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Classes

    interface  IPrimaryLinkLayerCallbacks
     
    interface  IPrimaryLinkLayerUnbalanced
     
    interface  ISecondaryApplicationLayer
     
    class  LinkLayer
     
    class  LinkLayerBusyException
     
    class  LinkLayerParameters
     Link layer specific parameters. More...
     
    class  PrimaryLinkLayer
     
    class  PrimaryLinkLayerBalanced
     
    class  PrimaryLinkLayerUnbalanced
     
    class  SecondaryLinkLayer
     
    class  SecondaryLinkLayerBalanced
     
    class  SecondaryLinkLayerUnbalanced
     
    class  SerialTransceiverFT12
     Serial transceiver for FT 1.2 type frames.
     
    class  TcpClientVirtualSerialPort
     TCP client virtual serial port. Can be used to tunnel CS 101 protocol over TCP/IP. More...
     
    class  TcpServerVirtualSerialPort
     
    - - - - - -

    -Enumerations

    enum  LinkLayerState { IDLE -, ERROR -, BUSY -, AVAILABLE - }
     
    enum  LinkLayerMode { UNBALANCED -, BALANCED - }
     
    - - - - - - - -

    -Functions

    delegate void LinkLayerStateChanged (object parameter, int address, LinkLayerState newState)
     Will be called by the stack when the state of a link layer connection changes.
     
    delegate bool TcpConnectionEventHandler (object parameter, IPAddress ipAddress, bool connect)
     Connection event handler. Can be used to track connections and accept/deny specific clients.
     
    -

    Function Documentation

    - -

    ◆ LinkLayerStateChanged()

    - -
    -
    - - - - - - - - - - - - - - - - -
    delegate void lib60870.linklayer.LinkLayerStateChanged (object parameter,
    int address,
    LinkLayerState newState )
    -
    - -

    Will be called by the stack when the state of a link layer connection changes.

    -
    Parameters
    - - -
    addressAddress of the slave (only used for unbalanced master mode)
    -
    -
    - -
    -
    - -

    ◆ TcpConnectionEventHandler()

    - -
    -
    - - - - - - - - - - - - - - - - -
    delegate bool lib60870.linklayer.TcpConnectionEventHandler (object parameter,
    IPAddress ipAddress,
    bool connect )
    -
    - -

    Connection event handler. Can be used to track connections and accept/deny specific clients.

    -
    Parameters
    - - - - -
    parameterUser provided paramter
    ipAddressIP address of the client
    connecttrue when client is connecting, false when disconnected
    -
    -
    -
    Returns
    true when connection is accepted, false otherwise
    - -
    -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/namespacelib60870_1_1linklayer.js b/doxygen/doxydoc.NET/html/namespacelib60870_1_1linklayer.js deleted file mode 100644 index 2ebc411..0000000 --- a/doxygen/doxydoc.NET/html/namespacelib60870_1_1linklayer.js +++ /dev/null @@ -1,9 +0,0 @@ -var namespacelib60870_1_1linklayer = -[ - [ "LinkLayerBusyException", "classlib60870_1_1linklayer_1_1_link_layer_busy_exception.html", null ], - [ "LinkLayerParameters", "classlib60870_1_1linklayer_1_1_link_layer_parameters.html", "classlib60870_1_1linklayer_1_1_link_layer_parameters" ], - [ "TcpClientVirtualSerialPort", "classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html", "classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port" ], - [ "TcpServerVirtualSerialPort", "classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.html", "classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port" ], - [ "LinkLayerStateChanged", "namespacelib60870_1_1linklayer.html#aeca494b2e7a508585564b223d2f7851b", null ], - [ "TcpConnectionEventHandler", "namespacelib60870_1_1linklayer.html#a4bb957c442dc029dac0241ceef925e65", null ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/namespacemembers.html b/doxygen/doxydoc.NET/html/namespacemembers.html deleted file mode 100644 index a7ccafc..0000000 --- a/doxygen/doxydoc.NET/html/namespacemembers.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - -lib60870.NET: Package Members - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented namespace members with links to the namespaces they belong to:
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/namespacemembers_enum.html b/doxygen/doxydoc.NET/html/namespacemembers_enum.html deleted file mode 100644 index 3df7024..0000000 --- a/doxygen/doxydoc.NET/html/namespacemembers_enum.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - -lib60870.NET: Package Members - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented namespace enums with links to the namespaces they belong to:
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/namespacemembers_func.html b/doxygen/doxydoc.NET/html/namespacemembers_func.html deleted file mode 100644 index 5fa6686..0000000 --- a/doxygen/doxydoc.NET/html/namespacemembers_func.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - -lib60870.NET: Package Members - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented namespace functions with links to the namespaces they belong to:
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/namespaces.html b/doxygen/doxydoc.NET/html/namespaces.html deleted file mode 100644 index 48718a1..0000000 --- a/doxygen/doxydoc.NET/html/namespaces.html +++ /dev/null @@ -1,233 +0,0 @@ - - - - - - - -lib60870.NET: Package List - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Package List
    -
    -
    -
    Here are the packages with brief descriptions (if available):
    -
    [detail level 123]
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     Nlib60870
     NCS101
     NCS104
     Nlinklayer
     CASDUParsingException
     CASDUQueue
     CConnectionException
     CCP16Time2a
     CCP24Time2a
     CCP32Time2a
     CCP56Time2a
     CFrameAbstract class to encode an application layer frame
     CLibraryCommonCommon information functions about the library
     CSingleCommandQualifier
    -
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/namespaces_dup.js b/doxygen/doxydoc.NET/html/namespaces_dup.js deleted file mode 100644 index cb94ce4..0000000 --- a/doxygen/doxydoc.NET/html/namespaces_dup.js +++ /dev/null @@ -1,4 +0,0 @@ -var namespaces_dup = -[ - [ "lib60870", "namespacelib60870.html", "namespacelib60870" ] -]; \ No newline at end of file diff --git a/doxygen/doxydoc.NET/html/nav_f.png b/doxygen/doxydoc.NET/html/nav_f.png deleted file mode 100644 index 72a58a529ed3a9ed6aa0c51a79cf207e026deee2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U diff --git a/doxygen/doxydoc.NET/html/nav_fd.png b/doxygen/doxydoc.NET/html/nav_fd.png deleted file mode 100644 index 032fbdd4c54f54fa9a2e6423b94ef4b2ebdfaceb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQU#tajv*C{Z|C~*H7f|XvG1G8 zt7aS*L7xwMeS}!z6R#{C5tIw-s~AJ==F^i}x3XyJseHR@yF& zerFf(Zf;Dd{+(0lDIROL@Sj-Ju2JQ8&-n%4%q?>|^bShc&lR?}7HeMo@BDl5N(aHY Uj$gdr1MOz;boFyt=akR{0D!zeaR2}S diff --git a/doxygen/doxydoc.NET/html/nav_g.png b/doxygen/doxydoc.NET/html/nav_g.png deleted file mode 100644 index 2093a237a94f6c83e19ec6e5fd42f7ddabdafa81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1ilyoDK$?Q$B+ufw|5PB85lU25BhtE tr?otc=hd~V+ws&_A@j8Fiv!KF$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL6W-eg#Jd_@e6*DPn)w;=|1H}Zvm9l6xXXB%>yL=NQU;mg M>FVdQ&MBb@0Bdt1Qvd(} diff --git a/doxygen/doxydoc.NET/html/navtree.css b/doxygen/doxydoc.NET/html/navtree.css deleted file mode 100644 index 69211d4..0000000 --- a/doxygen/doxydoc.NET/html/navtree.css +++ /dev/null @@ -1,149 +0,0 @@ -#nav-tree .children_ul { - margin:0; - padding:4px; -} - -#nav-tree ul { - list-style:none outside none; - margin:0px; - padding:0px; -} - -#nav-tree li { - white-space:nowrap; - margin:0px; - padding:0px; -} - -#nav-tree .plus { - margin:0px; -} - -#nav-tree .selected { - background-image: url('tab_a.png'); - background-repeat:repeat-x; - color: var(--nav-text-active-color); - text-shadow: var(--nav-text-active-shadow); -} - -#nav-tree .selected .arrow { - color: var(--nav-arrow-selected-color); - text-shadow: none; -} - -#nav-tree img { - margin:0px; - padding:0px; - border:0px; - vertical-align: middle; -} - -#nav-tree a { - text-decoration:none; - padding:0px; - margin:0px; -} - -#nav-tree .label { - margin:0px; - padding:0px; - font: 12px var(--font-family-nav); -} - -#nav-tree .label a { - padding:2px; -} - -#nav-tree .selected a { - text-decoration:none; - color:var(--nav-text-active-color); -} - -#nav-tree .children_ul { - margin:0px; - padding:0px; -} - -#nav-tree .item { - margin:0px; - padding:0px; -} - -#nav-tree { - padding: 0px 0px; - font-size:14px; - overflow:auto; -} - -#doc-content { - overflow:auto; - display:block; - padding:0px; - margin:0px; - -webkit-overflow-scrolling : touch; /* iOS 5+ */ -} - -#side-nav { - padding:0 6px 0 0; - margin: 0px; - display:block; - position: absolute; - left: 0px; - width: $width; - overflow : hidden; -} - -.ui-resizable .ui-resizable-handle { - display:block; -} - -.ui-resizable-e { - background-image:var(--nav-splitbar-image); - background-size:100%; - background-repeat:repeat-y; - background-attachment: scroll; - cursor:ew-resize; - height:100%; - right:0; - top:0; - width:6px; -} - -.ui-resizable-handle { - display:none; - font-size:0.1px; - position:absolute; - z-index:1; -} - -#nav-tree-contents { - margin: 6px 0px 0px 0px; -} - -#nav-tree { - background-repeat:repeat-x; - background-color: var(--nav-background-color); - -webkit-overflow-scrolling : touch; /* iOS 5+ */ -} - -#nav-sync { - position:absolute; - top:5px; - right:24px; - z-index:0; -} - -#nav-sync img { - opacity:0.3; -} - -#nav-sync img:hover { - opacity:0.9; -} - -@media print -{ - #nav-tree { display: none; } - div.ui-resizable-handle { display: none; position: relative; } -} - diff --git a/doxygen/doxydoc.NET/html/navtree.js b/doxygen/doxydoc.NET/html/navtree.js deleted file mode 100644 index 9027ce6..0000000 --- a/doxygen/doxydoc.NET/html/navtree.js +++ /dev/null @@ -1,483 +0,0 @@ -/* - @licstart The following is the entire license notice for the JavaScript code in this file. - - The MIT License (MIT) - - Copyright (C) 1997-2020 by Dimitri van Heesch - - Permission is hereby granted, free of charge, to any person obtaining a copy of this software - and associated documentation files (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, publish, distribute, - sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all copies or - substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING - BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - @licend The above is the entire license notice for the JavaScript code in this file - */ - -function initNavTree(toroot,relpath) { - let navTreeSubIndices = []; - const ARROW_DOWN = '▼'; - const ARROW_RIGHT = '►'; - const NAVPATH_COOKIE_NAME = ''+'navpath'; - - const getData = function(varName) { - const i = varName.lastIndexOf('/'); - const n = i>=0 ? varName.substring(i+1) : varName; - return eval(n.replace(/-/g,'_')); - } - - const stripPath = function(uri) { - return uri.substring(uri.lastIndexOf('/')+1); - } - - const stripPath2 = function(uri) { - const i = uri.lastIndexOf('/'); - const s = uri.substring(i+1); - const m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/); - return m ? uri.substring(i-6) : s; - } - - const hashValue = function() { - return $(location).attr('hash').substring(1).replace(/[^\w-]/g,''); - } - - const hashUrl = function() { - return '#'+hashValue(); - } - - const pathName = function() { - return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;()]/g, ''); - } - - const storeLink = function(link) { - if (!$("#nav-sync").hasClass('sync')) { - Cookie.writeSetting(NAVPATH_COOKIE_NAME,link,0); - } - } - - const deleteLink = function() { - Cookie.eraseSetting(NAVPATH_COOKIE_NAME); - } - - const cachedLink = function() { - return Cookie.readSetting(NAVPATH_COOKIE_NAME,''); - } - - const getScript = function(scriptName,func) { - const head = document.getElementsByTagName("head")[0]; - const script = document.createElement('script'); - script.id = scriptName; - script.type = 'text/javascript'; - script.onload = func; - script.src = scriptName+'.js'; - head.appendChild(script); - } - - const createIndent = function(o,domNode,node) { - let level=-1; - let n = node; - while (n.parentNode) { level++; n=n.parentNode; } - if (node.childrenData) { - const imgNode = document.createElement("span"); - imgNode.className = 'arrow'; - imgNode.style.paddingLeft=(16*level).toString()+'px'; - imgNode.innerHTML=ARROW_RIGHT; - node.plus_img = imgNode; - node.expandToggle = document.createElement("a"); - node.expandToggle.href = "javascript:void(0)"; - node.expandToggle.onclick = function() { - if (node.expanded) { - $(node.getChildrenUL()).slideUp("fast"); - node.plus_img.innerHTML=ARROW_RIGHT; - node.expanded = false; - } else { - expandNode(o, node, false, true); - } - } - node.expandToggle.appendChild(imgNode); - domNode.appendChild(node.expandToggle); - } else { - let span = document.createElement("span"); - span.className = 'arrow'; - span.style.width = 16*(level+1)+'px'; - span.innerHTML = ' '; - domNode.appendChild(span); - } - } - - let animationInProgress = false; - - const gotoAnchor = function(anchor,aname) { - let pos, docContent = $('#doc-content'); - let ancParent = $(anchor.parent()); - if (ancParent.hasClass('memItemLeft') || ancParent.hasClass('memtitle') || - ancParent.hasClass('fieldname') || ancParent.hasClass('fieldtype') || - ancParent.is(':header')) { - pos = ancParent.position().top; - } else if (anchor.position()) { - pos = anchor.position().top; - } - if (pos) { - const dcOffset = docContent.offset().top; - const dcHeight = docContent.height(); - const dcScrHeight = docContent[0].scrollHeight - const dcScrTop = docContent.scrollTop(); - let dist = Math.abs(Math.min(pos-dcOffset,dcScrHeight-dcHeight-dcScrTop)); - animationInProgress = true; - docContent.animate({ - scrollTop: pos + dcScrTop - dcOffset - },Math.max(50,Math.min(500,dist)),function() { - animationInProgress=false; - if (anchor.parent().attr('class')=='memItemLeft') { - let rows = $('.memberdecls tr[class$="'+hashValue()+'"]'); - glowEffect(rows.children(),300); // member without details - } else if (anchor.parent().attr('class')=='fieldname') { - glowEffect(anchor.parent().parent(),1000); // enum value - } else if (anchor.parent().attr('class')=='fieldtype') { - glowEffect(anchor.parent().parent(),1000); // struct field - } else if (anchor.parent().is(":header")) { - glowEffect(anchor.parent(),1000); // section header - } else { - glowEffect(anchor.next(),1000); // normal member - } - }); - } - } - - const newNode = function(o, po, text, link, childrenData, lastNode) { - const node = { - children : [], - childrenData : childrenData, - depth : po.depth + 1, - relpath : po.relpath, - isLast : lastNode, - li : document.createElement("li"), - parentNode : po, - itemDiv : document.createElement("div"), - labelSpan : document.createElement("span"), - label : document.createTextNode(text), - expanded : false, - childrenUL : null, - getChildrenUL : function() { - if (!this.childrenUL) { - this.childrenUL = document.createElement("ul"); - this.childrenUL.className = "children_ul"; - this.childrenUL.style.display = "none"; - this.li.appendChild(node.childrenUL); - } - return node.childrenUL; - }, - }; - - node.itemDiv.className = "item"; - node.labelSpan.className = "label"; - createIndent(o,node.itemDiv,node); - node.itemDiv.appendChild(node.labelSpan); - node.li.appendChild(node.itemDiv); - - const a = document.createElement("a"); - node.labelSpan.appendChild(a); - po.getChildrenUL().appendChild(node.li); - a.appendChild(node.label); - if (link) { - let url; - if (link.substring(0,1)=='^') { - url = link.substring(1); - link = url; - } else { - url = node.relpath+link; - } - a.className = stripPath(link.replace('#',':')); - if (link.indexOf('#')!=-1) { - const aname = '#'+link.split('#')[1]; - const srcPage = stripPath(pathName()); - const targetPage = stripPath(link.split('#')[0]); - a.href = srcPage!=targetPage ? url : aname; - a.onclick = function() { - storeLink(link); - aPPar = $(a).parent().parent(); - if (!aPPar.hasClass('selected')) { - $('.item').removeClass('selected'); - $('.item').removeAttr('id'); - aPPar.addClass('selected'); - aPPar.attr('id','selected'); - } - const anchor = $(aname); - gotoAnchor(anchor,aname); - }; - } else { - a.href = url; - a.onclick = () => storeLink(link); - } - } else if (childrenData != null) { - a.className = "nolink"; - a.href = "javascript:void(0)"; - a.onclick = node.expandToggle.onclick; - } - return node; - } - - const showRoot = function() { - const headerHeight = $("#top").height(); - const footerHeight = $("#nav-path").height(); - const windowHeight = $(window).height() - headerHeight - footerHeight; - (function() { // retry until we can scroll to the selected item - try { - const navtree=$('#nav-tree'); - navtree.scrollTo('#selected',100,{offset:-windowHeight/2}); - } catch (err) { - setTimeout(arguments.callee, 0); - } - })(); - } - - const expandNode = function(o, node, imm, setFocus) { - if (node.childrenData && !node.expanded) { - if (typeof(node.childrenData)==='string') { - const varName = node.childrenData; - getScript(node.relpath+varName,function() { - node.childrenData = getData(varName); - expandNode(o, node, imm, setFocus); - }); - } else { - if (!node.childrenVisited) { - getNode(o, node); - } - $(node.getChildrenUL()).slideDown("fast"); - node.plus_img.innerHTML = ARROW_DOWN; - node.expanded = true; - if (setFocus) { - $(node.expandToggle).focus(); - } - } - } - } - - const glowEffect = function(n,duration) { - n.addClass('glow').delay(duration).queue(function(next) { - $(this).removeClass('glow');next(); - }); - } - - const highlightAnchor = function() { - const aname = hashUrl(); - const anchor = $(aname); - gotoAnchor(anchor,aname); - } - - const selectAndHighlight = function(hash,n) { - let a; - if (hash) { - const link=stripPath(pathName())+':'+hash.substring(1); - a=$('.item a[class$="'+link+'"]'); - } - if (a && a.length) { - a.parent().parent().addClass('selected'); - a.parent().parent().attr('id','selected'); - highlightAnchor(); - } else if (n) { - $(n.itemDiv).addClass('selected'); - $(n.itemDiv).attr('id','selected'); - } - let topOffset=5; - if ($('#nav-tree-contents .item:first').hasClass('selected')) { - topOffset+=25; - } - $('#nav-sync').css('top',topOffset+'px'); - showRoot(); - } - - const showNode = function(o, node, index, hash) { - if (node && node.childrenData) { - if (typeof(node.childrenData)==='string') { - const varName = node.childrenData; - getScript(node.relpath+varName,function() { - node.childrenData = getData(varName); - showNode(o,node,index,hash); - }); - } else { - if (!node.childrenVisited) { - getNode(o, node); - } - $(node.getChildrenUL()).css({'display':'block'}); - node.plus_img.innerHTML = ARROW_DOWN; - node.expanded = true; - const n = node.children[o.breadcrumbs[index]]; - if (index+11 ? '#'+parts[1].replace(/[^\w-]/g,'') : ''; - } - if (hash.match(/^#l\d+$/)) { - const anchor=$('a[name='+hash.substring(1)+']'); - glowEffect(anchor.parent(),1000); // line number - hash=''; // strip line number anchors - } - const url=root+hash; - let i=-1; - while (NAVTREEINDEX[i+1]<=url) i++; - if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index - if (navTreeSubIndices[i]) { - gotoNode(o,i,root,hash,relpath) - } else { - getScript(relpath+'navtreeindex'+i,function() { - navTreeSubIndices[i] = eval('NAVTREEINDEX'+i); - if (navTreeSubIndices[i]) { - gotoNode(o,i,root,hash,relpath); - } - }); - } - } - - const showSyncOff = function(n,relpath) { - n.html(''); - } - - const showSyncOn = function(n,relpath) { - n.html(''); - } - - const o = { - toroot : toroot, - node : { - childrenData : NAVTREE, - children : [], - childrenUL : document.createElement("ul"), - getChildrenUL : function() { return this.childrenUL }, - li : document.getElementById("nav-tree-contents"), - depth : 0, - relpath : relpath, - expanded : false, - isLast : true, - plus_img : document.createElement("span"), - }, - }; - o.node.li.appendChild(o.node.childrenUL); - o.node.plus_img.className = 'arrow'; - o.node.plus_img.innerHTML = ARROW_RIGHT; - - const navSync = $('#nav-sync'); - if (cachedLink()) { - showSyncOff(navSync,relpath); - navSync.removeClass('sync'); - } else { - showSyncOn(navSync,relpath); - } - - navSync.click(() => { - const navSync = $('#nav-sync'); - if (navSync.hasClass('sync')) { - navSync.removeClass('sync'); - showSyncOff(navSync,relpath); - storeLink(stripPath2(pathName())+hashUrl()); - } else { - navSync.addClass('sync'); - showSyncOn(navSync,relpath); - deleteLink(); - } - }); - - navTo(o,toroot,hashUrl(),relpath); - showRoot(); - - $(window).bind('hashchange', () => { - if (!animationInProgress) { - if (window.location.hash && window.location.hash.length>1) { - let a; - if ($(location).attr('hash')) { - const clslink=stripPath(pathName())+':'+hashValue(); - a=$('.item a[class$="'+clslink.replace(/1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM - - - - - - -lib60870.NET: Related Pages - - - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    lib60870.NET 2.3.0 -
    -
    IEC 60870-5-101/104 Protocol Source Code Library for C#/.NET
    -
    -
    - - - - - - - - -
    -
    - -
    -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Related Pages
    -
    -
    -
    Here is a list of all related documentation pages:
    -
    -
    - - - - diff --git a/doxygen/doxydoc.NET/html/plus.svg b/doxygen/doxydoc.NET/html/plus.svg deleted file mode 100644 index 0752016..0000000 --- a/doxygen/doxydoc.NET/html/plus.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/doxygen/doxydoc.NET/html/plusd.svg b/doxygen/doxydoc.NET/html/plusd.svg deleted file mode 100644 index 0c65bfe..0000000 --- a/doxygen/doxydoc.NET/html/plusd.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/doxygen/doxydoc.NET/html/resize.js b/doxygen/doxydoc.NET/html/resize.js deleted file mode 100644 index 7d8cdc7..0000000 --- a/doxygen/doxydoc.NET/html/resize.js +++ /dev/null @@ -1,145 +0,0 @@ -/* - @licstart The following is the entire license notice for the JavaScript code in this file. - - The MIT License (MIT) - - Copyright (C) 1997-2020 by Dimitri van Heesch - - Permission is hereby granted, free of charge, to any person obtaining a copy of this software - and associated documentation files (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, publish, distribute, - sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all copies or - substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING - BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - @licend The above is the entire license notice for the JavaScript code in this file - */ - -function initResizable(treeview) { - let sidenav,navtree,content,header,footer,barWidth=6; - const RESIZE_COOKIE_NAME = ''+'width'; - - function resizeWidth() { - const sidenavWidth = $(sidenav).outerWidth(); - content.css({marginLeft:parseInt(sidenavWidth)+"px"}); - if (typeof page_layout!=='undefined' && page_layout==1) { - footer.css({marginLeft:parseInt(sidenavWidth)+"px"}); - } - Cookie.writeSetting(RESIZE_COOKIE_NAME,sidenavWidth-barWidth); - } - - function restoreWidth(navWidth) { - content.css({marginLeft:parseInt(navWidth)+barWidth+"px"}); - if (typeof page_layout!=='undefined' && page_layout==1) { - footer.css({marginLeft:parseInt(navWidth)+barWidth+"px"}); - } - sidenav.css({width:navWidth + "px"}); - } - - function resizeHeight(treeview) { - const headerHeight = header.outerHeight(); - const windowHeight = $(window).height(); - let contentHeight; - if (treeview) - { - const footerHeight = footer.outerHeight(); - let navtreeHeight,sideNavHeight; - if (typeof page_layout==='undefined' || page_layout==0) { /* DISABLE_INDEX=NO */ - contentHeight = windowHeight - headerHeight - footerHeight; - navtreeHeight = contentHeight; - sideNavHeight = contentHeight; - } else if (page_layout==1) { /* DISABLE_INDEX=YES */ - contentHeight = windowHeight - footerHeight; - navtreeHeight = windowHeight - headerHeight; - sideNavHeight = windowHeight; - } - navtree.css({height:navtreeHeight + "px"}); - sidenav.css({height:sideNavHeight + "px"}); - } - else - { - contentHeight = windowHeight - headerHeight; - } - content.css({height:contentHeight + "px"}); - if (location.hash.slice(1)) { - (document.getElementById(location.hash.slice(1))||document.body).scrollIntoView(); - } - } - - function collapseExpand() { - let newWidth; - if (sidenav.width()>0) { - newWidth=0; - } else { - const width = Cookie.readSetting(RESIZE_COOKIE_NAME,250); - newWidth = (width>250 && width<$(window).width()) ? width : 250; - } - restoreWidth(newWidth); - const sidenavWidth = $(sidenav).outerWidth(); - Cookie.writeSetting(RESIZE_COOKIE_NAME,sidenavWidth-barWidth); - } - - header = $("#top"); - content = $("#doc-content"); - footer = $("#nav-path"); - sidenav = $("#side-nav"); - if (!treeview) { -// title = $("#titlearea"); -// titleH = $(title).height(); -// let animating = false; -// content.on("scroll", function() { -// slideOpts = { duration: 200, -// step: function() { -// contentHeight = $(window).height() - header.outerHeight(); -// content.css({ height : contentHeight + "px" }); -// }, -// done: function() { animating=false; } -// }; -// if (content.scrollTop()>titleH && title.css('display')!='none' && !animating) { -// title.slideUp(slideOpts); -// animating=true; -// } else if (content.scrollTop()<=titleH && title.css('display')=='none' && !animating) { -// title.slideDown(slideOpts); -// animating=true; -// } -// }); - } else { - navtree = $("#nav-tree"); - $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } }); - $(sidenav).resizable({ minWidth: 0 }); - } - $(window).resize(function() { resizeHeight(treeview); }); - if (treeview) - { - const device = navigator.userAgent.toLowerCase(); - const touch_device = device.match(/(iphone|ipod|ipad|android)/); - if (touch_device) { /* wider split bar for touch only devices */ - $(sidenav).css({ paddingRight:'20px' }); - $('.ui-resizable-e').css({ width:'20px' }); - $('#nav-sync').css({ right:'34px' }); - barWidth=20; - } - const width = Cookie.readSetting(RESIZE_COOKIE_NAME,250); - if (width) { restoreWidth(width); } else { resizeWidth(); } - } - resizeHeight(treeview); - const url = location.href; - const i=url.indexOf("#"); - if (i>=0) window.location.hash=url.substr(i); - const _preventDefault = function(evt) { evt.preventDefault(); }; - if (treeview) - { - $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); - $(".ui-resizable-handle").dblclick(collapseExpand); - } - $(window).on('load',resizeHeight); -} -/* @license-end */ diff --git a/doxygen/doxydoc.NET/html/search/all_0.js b/doxygen/doxydoc.NET/html/search/all_0.js deleted file mode 100644 index 0eff422..0000000 --- a/doxygen/doxydoc.NET/html/search/all_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['0_0',['README lib60870.NET v2.3.0',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html',1,'']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/all_1.js b/doxygen/doxydoc.NET/html/search/all_1.js deleted file mode 100644 index a6774a2..0000000 --- a/doxygen/doxydoc.NET/html/search/all_1.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['3_200_0',['README lib60870.NET v2.3.0',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html',1,'']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/all_10.js b/doxygen/doxydoc.NET/html/search/all_10.js deleted file mode 100644 index d16ee87..0000000 --- a/doxygen/doxydoc.NET/html/search/all_10.js +++ /dev/null @@ -1,14 +0,0 @@ -var searchData= -[ - ['packedoutputcircuitinfo_0',['PackedOutputCircuitInfo',['../classlib60870_1_1_c_s101_1_1_packed_output_circuit_info.html',1,'lib60870::CS101']]], - ['packedoutputcircuitinfowithcp56time2a_1',['PackedOutputCircuitInfoWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['packedsinglepointwithscd_2',['PackedSinglePointWithSCD',['../classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d.html',1,'lib60870::CS101']]], - ['packedstarteventsofprotectionequipment_3',['PackedStartEventsOfProtectionEquipment',['../classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment.html',1,'lib60870::CS101']]], - ['packedstarteventsofprotectionequipmentwithcp56time2a_4',['PackedStartEventsOfProtectionEquipmentWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['parameteractivation_5',['ParameterActivation',['../classlib60870_1_1_c_s101_1_1_parameter_activation.html',1,'lib60870::CS101']]], - ['parameterfloatvalue_6',['ParameterFloatValue',['../classlib60870_1_1_c_s101_1_1_parameter_float_value.html',1,'lib60870::CS101']]], - ['parameternormalizedvalue_7',['ParameterNormalizedValue',['../classlib60870_1_1_c_s101_1_1_parameter_normalized_value.html',1,'lib60870::CS101']]], - ['parameters_8',['Parameters',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#ab063f08cb01b7c3ca5bdc86cbafec7d2',1,'lib60870::CS101::CS101Slave']]], - ['parameterscaledvalue_9',['ParameterScaledValue',['../classlib60870_1_1_c_s101_1_1_parameter_scaled_value.html',1,'lib60870::CS101']]], - ['privateinformationobjecttypes_10',['PrivateInformationObjectTypes',['../classlib60870_1_1_c_s101_1_1_private_information_object_types.html',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/all_11.js b/doxygen/doxydoc.NET/html/search/all_11.js deleted file mode 100644 index 14ae30e..0000000 --- a/doxygen/doxydoc.NET/html/search/all_11.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['qcc_0',['QCC',['../classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html#a839093d6c7666896a4bcf2c9b079564e',1,'lib60870::CS101::CounterInterrogationCommand']]], - ['qpa_1',['QPA',['../classlib60870_1_1_c_s101_1_1_parameter_activation.html#ab541aa687b71edc3411f12acd9adb618',1,'lib60870::CS101::ParameterActivation']]], - ['qrp_2',['QRP',['../classlib60870_1_1_c_s101_1_1_reset_process_command.html#ab87ef8bc0fa796dd5544ef39df6db59a',1,'lib60870::CS101::ResetProcessCommand']]], - ['qualifierofinterrogation_3',['QualifierOfInterrogation',['../classlib60870_1_1_c_s101_1_1_qualifier_of_interrogation.html',1,'lib60870::CS101']]], - ['qualitydescriptor_4',['QualityDescriptor',['../classlib60870_1_1_c_s101_1_1_quality_descriptor.html',1,'lib60870::CS101']]], - ['qualitydescriptorp_5',['QualityDescriptorP',['../classlib60870_1_1_c_s101_1_1_quality_descriptor_p.html',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/all_12.js b/doxygen/doxydoc.NET/html/search/all_12.js deleted file mode 100644 index 8bffee3..0000000 --- a/doxygen/doxydoc.NET/html/search/all_12.js +++ /dev/null @@ -1,21 +0,0 @@ -var searchData= -[ - ['rawmessagehandler_0',['RawMessageHandler',['../namespacelib60870.html#a059755b125d35287c474551f4ffc619f',1,'lib60870']]], - ['rcvdmsgcounter_1',['RcvdMsgCounter',['../classlib60870_1_1_c_s104_1_1_connection_statistics.html#a763d4accdb60725988746edc43675f2e',1,'lib60870::CS104::ConnectionStatistics']]], - ['rcvdtestfractcounter_2',['RcvdTestFrActCounter',['../classlib60870_1_1_c_s104_1_1_connection_statistics.html#aba25451b06261758d07cc6d0f64292bd',1,'lib60870::CS104::ConnectionStatistics']]], - ['rcvdtestfrconcounter_3',['RcvdTestFrConCounter',['../classlib60870_1_1_c_s104_1_1_connection_statistics.html#a4aef0532af04bf8cc51ab76069845eb8',1,'lib60870::CS104::ConnectionStatistics']]], - ['readcommand_4',['ReadCommand',['../classlib60870_1_1_c_s101_1_1_read_command.html',1,'lib60870::CS101']]], - ['readhandler_5',['ReadHandler',['../namespacelib60870_1_1_c_s101.html#a9230fe256069619a54c2c428acc32e06',1,'lib60870::CS101']]], - ['readme_20lib60870_20net_20v2_203_200_6',['README lib60870.NET v2.3.0',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html',1,'']]], - ['receivemessageloop_7',['ReceiveMessageLoop',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a19871be23f60399362713e78b8c07404',1,'lib60870::CS101::CS101Slave']]], - ['receivesequencenumber_8',['ReceiveSequenceNumber',['../classlib60870_1_1_c_s104_1_1_connection.html#ab6a705b8f4d600160fa842031363e63e',1,'lib60870::CS104::Connection']]], - ['receivetimeout_9',['ReceiveTimeout',['../classlib60870_1_1_c_s104_1_1_connection.html#a3bf1bdcc082cd5347acb0fcb29078000',1,'lib60870.CS104.Connection.ReceiveTimeout'],['../classlib60870_1_1_c_s104_1_1_server.html#a5cbb4d451a08d3b381fce39b5bf4ed3e',1,'lib60870.CS104.Server.ReceiveTimeout']]], - ['redundancygroup_10',['RedundancyGroup',['../classlib60870_1_1_c_s104_1_1_redundancy_group.html',1,'lib60870.CS104.RedundancyGroup'],['../classlib60870_1_1_c_s104_1_1_redundancy_group.html#a3bfc0c71f3919a451288a9b2581e6560',1,'lib60870.CS104.RedundancyGroup.RedundancyGroup()']]], - ['remoteendpoint_11',['RemoteEndpoint',['../classlib60870_1_1_c_s104_1_1_client_connection.html#ad59a914894aa422d1bff8b601cc100f3',1,'lib60870::CS104::ClientConnection']]], - ['remove_5foldest_12',['REMOVE_OLDEST',['../namespacelib60870_1_1_c_s104.html#ac35ab675c5aa217ded7ded419a5557dfac2bdd6ff983cc664116781c3a3dc0a83',1,'lib60870::CS104']]], - ['removefile_13',['RemoveFile',['../classlib60870_1_1_c_s101_1_1_files_available.html#a894040bf5b71a47feaa4eab80cf7a0d9',1,'lib60870::CS101::FilesAvailable']]], - ['resetprocesscommand_14',['ResetProcessCommand',['../classlib60870_1_1_c_s101_1_1_reset_process_command.html',1,'lib60870::CS101']]], - ['resetprocesshandler_15',['ResetProcessHandler',['../namespacelib60870_1_1_c_s101.html#ad784b6cb8b22c0417207232c8d98e2db',1,'lib60870::CS101']]], - ['run_16',['Run',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#a4f258e8494717432a01be4ee1fcb5063',1,'lib60870.CS101.CS101Master.Run()'],['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#adeb6feabfe4b01f17bc863ea0281d79c',1,'lib60870.CS101.CS101Slave.Run()']]], - ['running_20the_20examples_3a_17',['Compiling and running the examples:',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html#autotoc_md1',1,'']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/all_13.js b/doxygen/doxydoc.NET/html/search/all_13.js deleted file mode 100644 index cc2f531..0000000 --- a/doxygen/doxydoc.NET/html/search/all_13.js +++ /dev/null @@ -1,93 +0,0 @@ -var searchData= -[ - ['scaledvalue_0',['ScaledValue',['../classlib60870_1_1_c_s101_1_1_scaled_value.html',1,'lib60870::CS101']]], - ['scq_1',['SCQ',['../classlib60870_1_1_c_s101_1_1_file_call_or_select.html#a6acae49243536a7db32643ffccdc17c8',1,'lib60870::CS101::FileCallOrSelect']]], - ['second_2',['Second',['../classlib60870_1_1_c_p24_time2a.html#a44e08d428c8cbb76a84836b2ed19ae60',1,'lib60870.CP24Time2a.Second'],['../classlib60870_1_1_c_p32_time2a.html#ae0c845c0ce9555c5ea2dd8514b6222dd',1,'lib60870.CP32Time2a.Second'],['../classlib60870_1_1_c_p56_time2a.html#a02627aa0a76a5e3bfd4007a07f042a2c',1,'lib60870.CP56Time2a.Second']]], - ['sectionready_3',['SectionReady',['../classlib60870_1_1_c_s101_1_1_section_ready.html',1,'lib60870::CS101']]], - ['select_4',['Select',['../classlib60870_1_1_c_s101_1_1_single_command.html#a1829a95a868ed80cae41cc66f8d23867',1,'lib60870::CS101::SingleCommand']]], - ['selectandcallqualifier_5',['SelectAndCallQualifier',['../namespacelib60870_1_1_c_s101.html#ac5a919dfe39a648cc5ea40d072ca98a3',1,'lib60870::CS101']]], - ['sendact_5fcon_6',['SendACT_CON',['../classlib60870_1_1_c_s104_1_1_client_connection.html#a677c04ff5484b981e8464af8d9f86540',1,'lib60870::CS104::ClientConnection']]], - ['sendact_5fterm_7',['SendACT_TERM',['../classlib60870_1_1_c_s104_1_1_client_connection.html#aa5d85670797c2046051a4a10071fe611',1,'lib60870::CS104::ClientConnection']]], - ['sendasdu_8',['SendASDU',['../classlib60870_1_1_c_s101_1_1_master.html#a6917b74951e51d7e80bd0ae352bd6147',1,'lib60870.CS101.Master.SendASDU()'],['../classlib60870_1_1_c_s104_1_1_client_connection.html#a92362655a693e3081af86a00a24955ef',1,'lib60870.CS104.ClientConnection.SendASDU()'],['../classlib60870_1_1_c_s104_1_1_connection.html#ac8604cef7b2781cb63a16de0bff9a308',1,'lib60870.CS104.Connection.SendASDU()']]], - ['sendclocksynccommand_9',['SendClockSyncCommand',['../classlib60870_1_1_c_s101_1_1_master.html#a71ae908a23d89528f78f061fa466104f',1,'lib60870.CS101.Master.SendClockSyncCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#aa91efa113abc4e69578a487a2a934871',1,'lib60870.CS104.Connection.SendClockSyncCommand()']]], - ['sendcontrolcommand_10',['SendControlCommand',['../classlib60870_1_1_c_s101_1_1_master.html#a83a31edf0e9e4360e4dc613735f851d5',1,'lib60870.CS101.Master.SendControlCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a5f1458066ec9a11a12ff68c7416071fa',1,'lib60870.CS104.Connection.SendControlCommand()']]], - ['sendcounterinterrogationcommand_11',['SendCounterInterrogationCommand',['../classlib60870_1_1_c_s101_1_1_master.html#a6b9a6af0acad8fa03468630363eb99a8',1,'lib60870.CS101.Master.SendCounterInterrogationCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#ae8629df4fb0e9cf3868728e52ec995ca',1,'lib60870.CS104.Connection.SendCounterInterrogationCommand()']]], - ['senddelayacquisitioncommand_12',['SendDelayAcquisitionCommand',['../classlib60870_1_1_c_s101_1_1_master.html#afbc769788f9720e9a3d63268500b8710',1,'lib60870.CS101.Master.SendDelayAcquisitionCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#af178dab629740182d7c7e07eb32a4117',1,'lib60870.CS104.Connection.SendDelayAcquisitionCommand()']]], - ['sendfile_13',['SendFile',['../classlib60870_1_1_c_s101_1_1_master.html#ad988de86e0a0ed0d052dc599b3fc98f3',1,'lib60870.CS101.Master.SendFile()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a889e1aef3301cb272286a1279ae6caa3',1,'lib60870.CS104.Connection.SendFile()']]], - ['sendinterrogationcommand_14',['SendInterrogationCommand',['../classlib60870_1_1_c_s101_1_1_master.html#ab25cd6997967e5a60943f391c2b2ddc0',1,'lib60870.CS101.Master.SendInterrogationCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a25c57d614b315bad886edbaead69bd3d',1,'lib60870.CS104.Connection.SendInterrogationCommand()']]], - ['sendlinklayertestfunction_15',['SendLinkLayerTestFunction',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a1ee5095020096c7958e2230dbd273100',1,'lib60870::CS101::CS101Slave']]], - ['sendreadcommand_16',['SendReadCommand',['../classlib60870_1_1_c_s101_1_1_master.html#a52bcf5912b59e4ac44061730c3702eb4',1,'lib60870.CS101.Master.SendReadCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#aeaa8a8dbf8e2449d0222837b9d5ae3d8',1,'lib60870.CS104.Connection.SendReadCommand()']]], - ['sendresetprocesscommand_17',['SendResetProcessCommand',['../classlib60870_1_1_c_s101_1_1_master.html#a6440a2d388ca610f80190dda3c11b623',1,'lib60870.CS101.Master.SendResetProcessCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#ab615b3065cf5248d9b9951c4e178fa80',1,'lib60870.CS104.Connection.SendResetProcessCommand(CauseOfTransmission cot, int ca, byte qrp)']]], - ['sendsequencenumber_18',['SendSequenceNumber',['../classlib60870_1_1_c_s104_1_1_connection.html#a38bffb6d3d17033d40383529aa69c105',1,'lib60870::CS104::Connection']]], - ['sendstartdt_19',['SendStartDT',['../classlib60870_1_1_c_s104_1_1_connection.html#a57d40edfe14bfe66f832a7647e3173ae',1,'lib60870::CS104::Connection']]], - ['sendstartdt_5fcon_20',['SendStartDT_CON',['../classlib60870_1_1_c_s104_1_1_connection.html#a65d8586e819b9c537b2461611b0bb9ca',1,'lib60870::CS104::Connection']]], - ['sendstopdt_21',['SendStopDT',['../classlib60870_1_1_c_s104_1_1_connection.html#a2510773333d6aaea354c5730f2bc139f',1,'lib60870::CS104::Connection']]], - ['sendstopdt_5fcon_22',['SendStopDT_CON',['../classlib60870_1_1_c_s104_1_1_connection.html#a6723565d01d05539a320810217955743',1,'lib60870::CS104::Connection']]], - ['sendtestcommand_23',['SendTestCommand',['../classlib60870_1_1_c_s101_1_1_master.html#a77d37b1e27cdd4eec1a314f3e2a09432',1,'lib60870.CS101.Master.SendTestCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a310efefcea197178942abe509b04f463',1,'lib60870.CS104.Connection.SendTestCommand()']]], - ['sendtestcommandwithcp56time2a_24',['SendTestCommandWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_master.html#a97c6f3b896c0588761bb1b113ef7f7be',1,'lib60870.CS101.Master.SendTestCommandWithCP56Time2a()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a3d38dafcc825eb9bba7258c2525a56ad',1,'lib60870.CS104.Connection.SendTestCommandWithCP56Time2a(int ca, ushort tsc, CP56Time2a time)']]], - ['sendtestfr_5fact_25',['SendTestFR_ACT',['../classlib60870_1_1_c_s104_1_1_connection.html#afe81514340488a718a49706233816052',1,'lib60870::CS104::Connection']]], - ['sendtestfr_5fcon_26',['SendTestFR_CON',['../classlib60870_1_1_c_s104_1_1_connection.html#a876db462369040f272cddd144833ab56',1,'lib60870::CS104::Connection']]], - ['sentmsgcounter_27',['SentMsgCounter',['../classlib60870_1_1_c_s104_1_1_connection_statistics.html#ad04c56b6a2a9520d5296c56d12f2b5b0',1,'lib60870::CS104::ConnectionStatistics']]], - ['sequencenumber_28',['SequenceNumber',['../classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#ae04563ca55ecc0df58e80263d50db184',1,'lib60870::CS101::BinaryCounterReading']]], - ['server_29',['Server',['../classlib60870_1_1_c_s104_1_1_server.html',1,'lib60870.CS104.Server'],['../classlib60870_1_1_c_s104_1_1_server.html#aae44fa0f507ea4b8d343686a9345e419',1,'lib60870.CS104.Server.Server()'],['../classlib60870_1_1_c_s104_1_1_server.html#a12b5bdf509e0b569295b8821c016770b',1,'lib60870.CS104.Server.Server(TlsSecurityInformation securityInfo)'],['../classlib60870_1_1_c_s104_1_1_server.html#a4b25619314b9e2586d21d83f3ed9fcd0',1,'lib60870.CS104.Server.Server(APCIParameters apciParameters, ApplicationLayerParameters alParameters)'],['../classlib60870_1_1_c_s104_1_1_server.html#a4a25393ccd928dc4abbb13c14e3579c2',1,'lib60870.CS104.Server.Server(APCIParameters apciParameters, ApplicationLayerParameters alParameters, TlsSecurityInformation securityInfo)']]], - ['servermode_30',['ServerMode',['../classlib60870_1_1_c_s104_1_1_server.html#a9c05718964db1a69771955715585c4da',1,'lib60870.CS104.Server.ServerMode'],['../namespacelib60870_1_1_c_s104.html#a40215e8d03911ca6748ebfd78218d744',1,'lib60870.CS104.ServerMode']]], - ['setasduhandler_31',['SetASDUHandler',['../classlib60870_1_1_c_s101_1_1_slave.html#a5bde494544e568d0d9c25b43449eb8ee',1,'lib60870::CS101::Slave']]], - ['setasdureceivedhandler_32',['SetASDUReceivedHandler',['../classlib60870_1_1_c_s104_1_1_connection.html#a7fd6fb3ca802d91197f1927f2e4f8712',1,'lib60870::CS104::Connection']]], - ['setclocksynchronizationhandler_33',['SetClockSynchronizationHandler',['../classlib60870_1_1_c_s101_1_1_slave.html#a83b600bacb0829048c432686991db8a7',1,'lib60870::CS101::Slave']]], - ['setconnectioneventhandler_34',['SetConnectionEventHandler',['../classlib60870_1_1_c_s104_1_1_server.html#afa4ae496c2260bc6b501a60259c35282',1,'lib60870::CS104::Server']]], - ['setconnectionhandler_35',['SetConnectionHandler',['../classlib60870_1_1_c_s104_1_1_connection.html#afa545f647708d76bc23b3e5cbad1ac46',1,'lib60870::CS104::Connection']]], - ['setconnectionrequesthandler_36',['SetConnectionRequestHandler',['../classlib60870_1_1_c_s104_1_1_server.html#a8c3dbeea77158bb5014d9739bb8f1116',1,'lib60870::CS104::Server']]], - ['setconnecttimeout_37',['SetConnectTimeout',['../classlib60870_1_1_c_s104_1_1_connection.html#af5de8a91a2f77bfa69421b3e3da9276e',1,'lib60870::CS104::Connection']]], - ['setcounterinterrogationhandler_38',['SetCounterInterrogationHandler',['../classlib60870_1_1_c_s101_1_1_slave.html#ad6e8b2878a13fea3b23b0b41b4da2983',1,'lib60870::CS101::Slave']]], - ['setfilereadyhandler_39',['SetFileReadyHandler',['../classlib60870_1_1_c_s101_1_1_slave.html#a3d25c95061010fa26c02cca5de0ae3cd',1,'lib60870::CS101::Slave']]], - ['setinterrogationhandler_40',['SetInterrogationHandler',['../classlib60870_1_1_c_s101_1_1_slave.html#af5871de4b26756b7b6f88e7acdc96e84',1,'lib60870::CS101::Slave']]], - ['setlocaladdress_41',['SetLocalAddress',['../classlib60870_1_1_c_s104_1_1_server.html#af7db8efa36f1bfc559ac96308a907d07',1,'lib60870.CS104.Server.SetLocalAddress()'],['../classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.html#a52cf94c390fdb9de1da505a259dc85a1',1,'lib60870.linklayer.TcpServerVirtualSerialPort.SetLocalAddress()']]], - ['setlocalport_42',['SetLocalPort',['../classlib60870_1_1_c_s104_1_1_server.html#aa3ddaa0a4c43ca80f35f523d84347753',1,'lib60870::CS104::Server']]], - ['setpointcommandnormalized_43',['SetpointCommandNormalized',['../classlib60870_1_1_c_s101_1_1_setpoint_command_normalized.html',1,'lib60870::CS101']]], - ['setpointcommandnormalizedwithcp56time2a_44',['SetpointCommandNormalizedWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['setpointcommandqualifier_45',['SetpointCommandQualifier',['../classlib60870_1_1_c_s101_1_1_setpoint_command_qualifier.html',1,'lib60870::CS101']]], - ['setpointcommandscaled_46',['SetpointCommandScaled',['../classlib60870_1_1_c_s101_1_1_setpoint_command_scaled.html',1,'lib60870::CS101']]], - ['setpointcommandscaledwithcp56time2a_47',['SetpointCommandScaledWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['setpointcommandshort_48',['SetpointCommandShort',['../classlib60870_1_1_c_s101_1_1_setpoint_command_short.html',1,'lib60870::CS101']]], - ['setpointcommandshortwithcp56time2a_49',['SetpointCommandShortWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['setreadhandler_50',['SetReadHandler',['../classlib60870_1_1_c_s101_1_1_slave.html#a7f0490bec09dbf3a8fb1e1e8e21503c0',1,'lib60870::CS101::Slave']]], - ['setreceivedrawmessagehandler_51',['SetReceivedRawMessageHandler',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a01bd8b909386de3b9426d5c953a716e3',1,'lib60870.CS101.CS101Slave.SetReceivedRawMessageHandler()'],['../classlib60870_1_1_c_s101_1_1_master.html#a43ddedf33710bf27df6f10265787d359',1,'lib60870.CS101.Master.SetReceivedRawMessageHandler()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a54fa6f1012457a6e0f492441cc4bfa23',1,'lib60870.CS104.Connection.SetReceivedRawMessageHandler()']]], - ['setsentrawmessagehandler_52',['SetSentRawMessageHandler',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a0fa4e121ca94fc5a017587c1382d7f42',1,'lib60870.CS101.CS101Slave.SetSentRawMessageHandler()'],['../classlib60870_1_1_c_s101_1_1_master.html#ac850d2199ac83075bfe52648eec57993',1,'lib60870.CS101.Master.SetSentRawMessageHandler()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a787c8ff4943b9991328550f69807ef6e',1,'lib60870.CS104.Connection.SetSentRawMessageHandler()']]], - ['settimeouts_53',['SetTimeouts',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#a1a60eeb2565d2111ecea43db4e4b1909',1,'lib60870::CS101::CS101Master']]], - ['settlssecurity_54',['SetTlsSecurity',['../classlib60870_1_1_c_s104_1_1_connection.html#a33eae01473eb5dc6545a74601b3d9a85',1,'lib60870::CS104::Connection']]], - ['setuserdataqueuesizes_55',['SetUserDataQueueSizes',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a6c28db4c5b92dbc3b67e25d86c5a19df',1,'lib60870::CS101::CS101Slave']]], - ['sie_56',['SIE',['../classlib60870_1_1_c_s101_1_1_start_event.html#a63a1bca793fe829680fc745c8b537b1d',1,'lib60870::CS101::StartEvent']]], - ['single_5fredundancy_5fgroup_57',['SINGLE_REDUNDANCY_GROUP',['../namespacelib60870_1_1_c_s104.html#a40215e8d03911ca6748ebfd78218d744aa3afc5caf4e3e1af74862fca807d9ba0',1,'lib60870::CS104']]], - ['singlecommand_58',['SingleCommand',['../classlib60870_1_1_c_s101_1_1_single_command.html',1,'lib60870::CS101']]], - ['singlecommandqualifier_59',['SingleCommandQualifier',['../classlib60870_1_1_single_command_qualifier.html',1,'lib60870']]], - ['singlecommandwithcp56time2a_60',['SingleCommandWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['singleevent_61',['SingleEvent',['../classlib60870_1_1_c_s101_1_1_single_event.html',1,'lib60870::CS101']]], - ['singlepointinformation_62',['SinglePointInformation',['../classlib60870_1_1_c_s101_1_1_single_point_information.html',1,'lib60870::CS101']]], - ['singlepointwithcp24time2a_63',['SinglePointWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a.html',1,'lib60870::CS101']]], - ['singlepointwithcp56time2a_64',['SinglePointWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['sl1_65',['SL1',['../classlib60870_1_1_c_s101_1_1_start_event.html#a53c47cb469138b00f2d266da9ee91338',1,'lib60870::CS101::StartEvent']]], - ['sl2_66',['SL2',['../classlib60870_1_1_c_s101_1_1_start_event.html#a43c8205b9e5b018a89c57658d2fc7443',1,'lib60870::CS101::StartEvent']]], - ['sl3_67',['SL3',['../classlib60870_1_1_c_s101_1_1_start_event.html#a686791b47a50ff83badd20384b00a604',1,'lib60870::CS101::StartEvent']]], - ['slave_68',['Slave',['../classlib60870_1_1_c_s101_1_1_slave.html',1,'lib60870::CS101']]], - ['slaveaddress_69',['SlaveAddress',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#aa7d93ac85baacaeaa6c70abce6856f58',1,'lib60870::CS101::CS101Master']]], - ['sof_70',['SOF',['../classlib60870_1_1_c_s101_1_1_file_directory.html#af1f8d171f735aae0eed368015a3be40d',1,'lib60870::CS101::FileDirectory']]], - ['srd_71',['SRD',['../classlib60870_1_1_c_s101_1_1_start_event.html#a058cea08569048ffde04da4dab3630d7',1,'lib60870::CS101::StartEvent']]], - ['srq_72',['SRQ',['../classlib60870_1_1_c_s101_1_1_section_ready.html#a5bbd3b419683eaa394c20ca9e3f1ba34',1,'lib60870::CS101::SectionReady']]], - ['start_73',['Start',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#a5bcaaddeb16ce3472d5567d430cf304d',1,'lib60870.CS101.CS101Master.Start()'],['../classlib60870_1_1_c_s104_1_1_server.html#af8d37c78f23fafbb74091b7d3d0ed684',1,'lib60870.CS104.Server.Start()'],['../classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html#a1417a91389e864dd32cff7e80def1021',1,'lib60870.linklayer.TcpClientVirtualSerialPort.Start()']]], - ['startdt_5fcon_5freceived_74',['STARTDT_CON_RECEIVED',['../namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3abd9bb95a16a48d296aa230827d9c966b',1,'lib60870::CS104']]], - ['startevent_75',['StartEvent',['../classlib60870_1_1_c_s101_1_1_start_event.html',1,'lib60870::CS101']]], - ['state_76',['State',['../classlib60870_1_1_c_s101_1_1_single_command.html#ae642167ac8c59c6a2f5552919c3606a4',1,'lib60870::CS101::SingleCommand']]], - ['statusandstatuschangedetection_77',['StatusAndStatusChangeDetection',['../classlib60870_1_1_c_s101_1_1_status_and_status_change_detection.html',1,'lib60870::CS101']]], - ['stepcommand_78',['StepCommand',['../classlib60870_1_1_c_s101_1_1_step_command.html',1,'lib60870::CS101']]], - ['stepcommandvalue_79',['StepCommandValue',['../namespacelib60870_1_1_c_s101.html#a8b8573d2c7289fab9db7a1ce5ff40286',1,'lib60870::CS101']]], - ['stepcommandwithcp56time2a_80',['StepCommandWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['steppositioninformation_81',['StepPositionInformation',['../classlib60870_1_1_c_s101_1_1_step_position_information.html',1,'lib60870::CS101']]], - ['steppositionwithcp24time2a_82',['StepPositionWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a.html',1,'lib60870::CS101']]], - ['steppositionwithcp56time2a_83',['StepPositionWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['stop_84',['Stop',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#a4b4ca2b56ec115d9b5f1eba13ff5c22a',1,'lib60870.CS101.CS101Master.Stop()'],['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a6502368270e7b7efa3a59778d58bda3a',1,'lib60870.CS101.CS101Slave.Stop()'],['../classlib60870_1_1_c_s104_1_1_server.html#a07fc33e78e4b8d156e1bbe08170c62cf',1,'lib60870.CS104.Server.Stop()'],['../classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html#aba1035cd8d8a91290dd7d19ec48bfb34',1,'lib60870.linklayer.TcpClientVirtualSerialPort.Stop()']]], - ['stopdt_5fcon_5freceived_85',['STOPDT_CON_RECEIVED',['../namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3a98f20c03aaaaa367a27938cfb6b6d1da',1,'lib60870::CS104']]], - ['substitued_86',['Substitued',['../classlib60870_1_1_c_p24_time2a.html#a4400a44009413f637412cb34d7d73820',1,'lib60870::CP24Time2a']]], - ['substituted_87',['Substituted',['../classlib60870_1_1_c_p32_time2a.html#ae4e8f2da41474e5fbeb67412cb1a1523',1,'lib60870.CP32Time2a.Substituted'],['../classlib60870_1_1_c_p56_time2a.html#a3b8f17e2e0ea8e6482dfae2fbea87173',1,'lib60870.CP56Time2a.Substituted']]], - ['support_88',['Commercial licenses and support',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html#autotoc_md4',1,'']]], - ['supportssequence_89',['SupportsSequence',['../classlib60870_1_1_c_s101_1_1_information_object.html#a8e277f6a5d421d25ae9c9eb9b169887e',1,'lib60870::CS101::InformationObject']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/all_14.js b/doxygen/doxydoc.NET/html/search/all_14.js deleted file mode 100644 index b8934cd..0000000 --- a/doxygen/doxydoc.NET/html/search/all_14.js +++ /dev/null @@ -1,26 +0,0 @@ -var searchData= -[ - ['t0_0',['T0',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#adb7f9816ddbbf8925f5372308efed78f',1,'lib60870::CS104::APCIParameters']]], - ['t1_1',['T1',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#a11f40dff24e0352eb76b4d456afe9e68',1,'lib60870::CS104::APCIParameters']]], - ['t2_2',['T2',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#a0320d85982ccb2814e8829c51d4eb7b8',1,'lib60870::CS104::APCIParameters']]], - ['t3_3',['T3',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#ad68a65bbce99a4a7533a8c1291a52e0a',1,'lib60870::CS104::APCIParameters']]], - ['tcpclientvirtualserialport_4',['TcpClientVirtualSerialPort',['../classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html',1,'lib60870.linklayer.TcpClientVirtualSerialPort'],['../classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html#a38baef0d15205486d0f5d07106473836',1,'lib60870.linklayer.TcpClientVirtualSerialPort.TcpClientVirtualSerialPort()']]], - ['tcpconnectioneventhandler_5',['TcpConnectionEventHandler',['../namespacelib60870_1_1linklayer.html#a4bb957c442dc029dac0241ceef925e65',1,'lib60870::linklayer']]], - ['tcpservervirtualserialport_6',['TcpServerVirtualSerialPort',['../classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.html',1,'lib60870::linklayer']]], - ['testcommand_7',['TestCommand',['../classlib60870_1_1_c_s101_1_1_test_command.html',1,'lib60870::CS101']]], - ['testcommandwithcp56time2a_8',['TestCommandWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['the_20examples_3a_9',['Compiling and running the examples:',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html#autotoc_md1',1,'']]], - ['throw_5fexception_10',['THROW_EXCEPTION',['../namespacelib60870_1_1_c_s104.html#ac35ab675c5aa217ded7ded419a5557dfa5c2e82fadad4dae10ff499facac4ab02',1,'lib60870::CS104']]], - ['time_11',['Time',['../classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html#abcedc8616644f69702da1eb4dddb1860',1,'lib60870::CS101::TestCommandWithCP56Time2a']]], - ['timeoutforack_12',['TimeoutForACK',['../classlib60870_1_1linklayer_1_1_link_layer_parameters.html#a2f97069460fa1a3873ca1cf91331d739',1,'lib60870::linklayer::LinkLayerParameters']]], - ['timeoutlinkstate_13',['TimeoutLinkState',['../classlib60870_1_1linklayer_1_1_link_layer_parameters.html#ac79c13d5078a838e029e78a588e261a1',1,'lib60870::linklayer::LinkLayerParameters']]], - ['timeoutrepeat_14',['TimeoutRepeat',['../classlib60870_1_1linklayer_1_1_link_layer_parameters.html#a8907a50f70413012cf82de440e2b5581',1,'lib60870::linklayer::LinkLayerParameters']]], - ['tlssecurityinformation_15',['TlsSecurityInformation',['../classlib60870_1_1_c_s104_1_1_tls_security_information.html',1,'lib60870::CS104']]], - ['transfercomplete_16',['TransferComplete',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#ada2d36e95fe8caf9a22d04fcd77b6a8f',1,'lib60870.CS101.IFileProvider.TransferComplete()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#a533ea7bd0c80d98d5ea48748c14ee376',1,'lib60870.CS101.TransparentFile.TransferComplete()']]], - ['transient_17',['Transient',['../classlib60870_1_1_c_s101_1_1_step_position_information.html#aba392b47665d183b882892dc252f285f',1,'lib60870::CS101::StepPositionInformation']]], - ['transparentfile_18',['TransparentFile',['../classlib60870_1_1_c_s101_1_1_transparent_file.html',1,'lib60870::CS101']]], - ['tsc_19',['TSC',['../classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html#ae5a610ff07bf26fbc6eb1e54efbd99df',1,'lib60870::CS101::TestCommandWithCP56Time2a']]], - ['type_20',['Type',['../classlib60870_1_1_c_s101_1_1_information_object.html#af2eba7ad5825d5d34258ce9747a615be',1,'lib60870::CS101::InformationObject']]], - ['typeid_21',['TypeID',['../namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bb',1,'lib60870::CS101']]], - ['typeid_22',['TypeId',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#ab0c3a8cae06afc0eea93c454815feb23',1,'lib60870::CS101::ASDU']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/all_15.js b/doxygen/doxydoc.NET/html/search/all_15.js deleted file mode 100644 index 596270f..0000000 --- a/doxygen/doxydoc.NET/html/search/all_15.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['usesendmessagequeue_0',['UseSendMessageQueue',['../classlib60870_1_1_c_s104_1_1_connection.html#a452b4617dc369f3e9d6f509a0634fc21',1,'lib60870::CS104::Connection']]], - ['usesinglecharack_1',['UseSingleCharACK',['../classlib60870_1_1linklayer_1_1_link_layer_parameters.html#a35b88393725992cef49bbf6f7e196c5b',1,'lib60870::linklayer::LinkLayerParameters']]], - ['useslaveaddress_2',['UseSlaveAddress',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#a9923e8174758fdfa15198fcbde7502de',1,'lib60870::CS101::CS101Master']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/all_16.js b/doxygen/doxydoc.NET/html/search/all_16.js deleted file mode 100644 index 0d54d5a..0000000 --- a/doxygen/doxydoc.NET/html/search/all_16.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['v2_203_200_0',['README lib60870.NET v2.3.0',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html',1,'']]], - ['value_1',['Value',['../classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#a548b83c567fc345f85573f31d3a71f03',1,'lib60870.CS101.BinaryCounterReading.Value'],['../classlib60870_1_1_c_s101_1_1_step_position_information.html#a00370bb63d3ec53ded04f4d8108990cf',1,'lib60870.CS101.StepPositionInformation.Value']]], - ['version_5fmajor_2',['VERSION_MAJOR',['../classlib60870_1_1_library_common.html#a6802d07db8d3ceb789e272fa0fece307',1,'lib60870::LibraryCommon']]], - ['version_5fminor_3',['VERSION_MINOR',['../classlib60870_1_1_library_common.html#adb58059e12584a6dc84d4f8dbdcd8b2c',1,'lib60870::LibraryCommon']]], - ['version_5fpatch_4',['VERSION_PATCH',['../classlib60870_1_1_library_common.html#a4c87994c9e83099e161330a4ec39857c',1,'lib60870::LibraryCommon']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/all_17.js b/doxygen/doxydoc.NET/html/search/all_17.js deleted file mode 100644 index ceac164..0000000 --- a/doxygen/doxydoc.NET/html/search/all_17.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['w_0',['W',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#ac86b4a16c31fd7ad6af55e6c7b6f048b',1,'lib60870::CS104::APCIParameters']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/all_18.js b/doxygen/doxydoc.NET/html/search/all_18.js deleted file mode 100644 index 9eedd8c..0000000 --- a/doxygen/doxydoc.NET/html/search/all_18.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['year_0',['Year',['../classlib60870_1_1_c_p56_time2a.html#acd2210101a5b5235b4779e3ecf00527e',1,'lib60870::CP56Time2a']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/all_2.js b/doxygen/doxydoc.NET/html/search/all_2.js deleted file mode 100644 index c1b40d2..0000000 --- a/doxygen/doxydoc.NET/html/search/all_2.js +++ /dev/null @@ -1,24 +0,0 @@ -var searchData= -[ - ['acknowledgequalifier_0',['AcknowledgeQualifier',['../namespacelib60870_1_1_c_s101.html#af2506d56be1cd94a330f0f26d45ececc',1,'lib60870::CS101']]], - ['ackqualifier_1',['AckQualifier',['../classlib60870_1_1_c_s101_1_1_file_a_c_k.html#a9f6b95cc90ebe3515dff6af81c294d81',1,'lib60870::CS101::FileACK']]], - ['active_2',['ACTIVE',['../namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015da18ff74f43da410c5529f7d6fca84f115',1,'lib60870::CS104']]], - ['addallowedclient_3',['AddAllowedClient',['../classlib60870_1_1_c_s104_1_1_redundancy_group.html#a971ee15ef8b50bf62d75e552dbc5a118',1,'lib60870.CS104.RedundancyGroup.AddAllowedClient(IPAddress ipAddress)'],['../classlib60870_1_1_c_s104_1_1_redundancy_group.html#a30f6faca907a9496271e7c43e12ba220',1,'lib60870.CS104.RedundancyGroup.AddAllowedClient(string ipString)']]], - ['addfile_4',['AddFile',['../classlib60870_1_1_c_s101_1_1_files_available.html#a72840ada81d664c1d63531ce022e57e5',1,'lib60870::CS101::FilesAvailable']]], - ['addinformationobject_5',['AddInformationObject',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a2cc4f6257884b76e9e9f6b40cd3037c2',1,'lib60870::CS101::ASDU']]], - ['addredundancygroup_6',['AddRedundancyGroup',['../classlib60870_1_1_c_s104_1_1_server.html#af970d8d63a4d220d54e213250e90eada',1,'lib60870::CS104::Server']]], - ['addresslength_7',['AddressLength',['../classlib60870_1_1linklayer_1_1_link_layer_parameters.html#abfa30c4ae394e96224933817b768d248',1,'lib60870::linklayer::LinkLayerParameters']]], - ['adjusted_8',['Adjusted',['../classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#aacf2720e880dbb0f70ea212c59c8e31f',1,'lib60870::CS101::BinaryCounterReading']]], - ['allowonlyspecificcertificates_9',['AllowOnlySpecificCertificates',['../classlib60870_1_1_c_s104_1_1_tls_security_information.html#aecf70336635c0bfe0fe713a5e427fa3e',1,'lib60870::CS104::TlsSecurityInformation']]], - ['and_20running_20the_20examples_3a_10',['Compiling and running the examples:',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html#autotoc_md1',1,'']]], - ['and_20support_11',['Commercial licenses and support',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html#autotoc_md4',1,'']]], - ['apciparameters_12',['APCIParameters',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html',1,'lib60870::CS104']]], - ['applicationlayerparameters_13',['ApplicationLayerParameters',['../classlib60870_1_1_c_s101_1_1_application_layer_parameters.html',1,'lib60870::CS101']]], - ['asdu_14',['ASDU',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html',1,'lib60870.CS101.ASDU'],['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a921d30b69cb8515973939210c0fd23b6',1,'lib60870.CS101.ASDU.ASDU()']]], - ['asduhandler_15',['ASDUHandler',['../namespacelib60870_1_1_c_s101.html#a494130feab85dbe337f659d383e4e8c5',1,'lib60870::CS101']]], - ['asduparsingexception_16',['ASDUParsingException',['../classlib60870_1_1_a_s_d_u_parsing_exception.html',1,'lib60870']]], - ['asduqueue_17',['ASDUQueue',['../classlib60870_1_1_a_s_d_u_queue.html',1,'lib60870']]], - ['asduqueueexception_18',['ASDUQueueException',['../classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception.html',1,'lib60870::CS101']]], - ['asdureceivedhandler_19',['ASDUReceivedHandler',['../namespacelib60870_1_1_c_s101.html#a95f9a71d670882525fbe3bf342cdf54e',1,'lib60870.CS101.ASDUReceivedHandler()'],['../namespacelib60870_1_1_c_s104.html#afb099e1be184222c607404d595cd6992',1,'lib60870.CS104.ASDUReceivedHandler()']]], - ['autostart_20',['Autostart',['../classlib60870_1_1_c_s104_1_1_connection.html#aa941946c92bfe52f71c137c3fbf6d601',1,'lib60870::CS104::Connection']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/all_3.js b/doxygen/doxydoc.NET/html/search/all_3.js deleted file mode 100644 index ef923eb..0000000 --- a/doxygen/doxydoc.NET/html/search/all_3.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['binarycounterreading_0',['BinaryCounterReading',['../classlib60870_1_1_c_s101_1_1_binary_counter_reading.html',1,'lib60870::CS101']]], - ['bitstring32_1',['Bitstring32',['../classlib60870_1_1_c_s101_1_1_bitstring32.html',1,'lib60870::CS101']]], - ['bitstring32command_2',['Bitstring32Command',['../classlib60870_1_1_c_s101_1_1_bitstring32_command.html',1,'lib60870::CS101']]], - ['bitstring32commandwithcp56time2a_3',['Bitstring32CommandWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['bitstring32withcp24time2a_4',['Bitstring32WithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a.html',1,'lib60870::CS101']]], - ['bitstring32withcp56time2a_5',['Bitstring32WithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a.html',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/all_4.js b/doxygen/doxydoc.NET/html/search/all_4.js deleted file mode 100644 index a9336b3..0000000 --- a/doxygen/doxydoc.NET/html/search/all_4.js +++ /dev/null @@ -1,43 +0,0 @@ -var searchData= -[ - ['ca_0',['Ca',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a5d217b9cc0ecf22e127aa25c89e8a2f1',1,'lib60870::CS101::ASDU']]], - ['carry_1',['Carry',['../classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#a8d73e781be2f98f00d09f91e0c3d774a',1,'lib60870::CS101::BinaryCounterReading']]], - ['causeoftransmission_2',['CauseOfTransmission',['../namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cc',1,'lib60870::CS101']]], - ['certificatevalidationcallback_3',['CertificateValidationCallback',['../classlib60870_1_1_c_s104_1_1_tls_security_information.html#ab90e1e052fa15e1b211109d30529b491',1,'lib60870.CS104.TlsSecurityInformation.CertificateValidationCallback'],['../classlib60870_1_1_c_s104_1_1_client_connection.html#aa936b912c162118b6a9834030f924491',1,'lib60870.CS104.ClientConnection.CertificateValidationCallback()']]], - ['chainvalidation_4',['ChainValidation',['../classlib60870_1_1_c_s104_1_1_tls_security_information.html#a2b367122104e8ac1469d6240c427fe86',1,'lib60870::CS104::TlsSecurityInformation']]], - ['chs_5',['CHS',['../classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html#af2302361352eb1447b4bfb6541772c50',1,'lib60870::CS101::FileLastSegmentOrSection']]], - ['cl1_6',['CL1',['../classlib60870_1_1_c_s101_1_1_output_circuit_info.html#ac474a5e41cac7e82a2225cb27792fcf7',1,'lib60870::CS101::OutputCircuitInfo']]], - ['cl2_7',['CL2',['../classlib60870_1_1_c_s101_1_1_output_circuit_info.html#a6507ca6be64921d3931911033d496661',1,'lib60870::CS101::OutputCircuitInfo']]], - ['cl3_8',['CL3',['../classlib60870_1_1_c_s101_1_1_output_circuit_info.html#ad9d84ee2a4315546c531867e4d9a5e28',1,'lib60870::CS101::OutputCircuitInfo']]], - ['clientconnection_9',['ClientConnection',['../classlib60870_1_1_c_s104_1_1_client_connection.html',1,'lib60870::CS104']]], - ['clientconnectionevent_10',['ClientConnectionEvent',['../namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015d',1,'lib60870::CS104']]], - ['clocksynchronizationcommand_11',['ClockSynchronizationCommand',['../classlib60870_1_1_c_s101_1_1_clock_synchronization_command.html',1,'lib60870::CS101']]], - ['clocksynchronizationhandler_12',['ClockSynchronizationHandler',['../namespacelib60870_1_1_c_s101.html#a1d5c09e5cefc2e9711adad5ce978f0e7',1,'lib60870::CS101']]], - ['closed_13',['CLOSED',['../namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3a110ccf2f5d2ff4eda1fd1a494293467d',1,'lib60870.CS104.CLOSED'],['../namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015da110ccf2f5d2ff4eda1fd1a494293467d',1,'lib60870.CS104.CLOSED']]], - ['coi_14',['COI',['../classlib60870_1_1_c_s101_1_1_end_of_initialization.html#ad48e8ec133c8bf5ed7f389063492d67b',1,'lib60870::CS101::EndOfInitialization']]], - ['commercial_20licenses_20and_20support_15',['Commercial licenses and support',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html#autotoc_md4',1,'']]], - ['compiling_20and_20running_20the_20examples_3a_16',['Compiling and running the examples:',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html#autotoc_md1',1,'']]], - ['connect_17',['Connect',['../classlib60870_1_1_c_s104_1_1_connection.html#a2f21059cd28bf0a85f9ed4a666c6e96f',1,'lib60870::CS104::Connection']]], - ['connect_5ffailed_18',['CONNECT_FAILED',['../namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3a4820f088c518fab18fe3d9ca70fa7f64',1,'lib60870::CS104']]], - ['connectasync_19',['ConnectAsync',['../classlib60870_1_1_c_s104_1_1_connection.html#af8aed177bd279389527cbfa8eede3ba6',1,'lib60870::CS104::Connection']]], - ['connected_20',['Connected',['../classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html#a8e6479066b29f09067340b7fc1b29cbc',1,'lib60870::linklayer::TcpClientVirtualSerialPort']]], - ['connection_21',['Connection',['../classlib60870_1_1_c_s104_1_1_connection.html',1,'lib60870.CS104.Connection'],['../classlib60870_1_1_c_s104_1_1_connection.html#a6fe992399ec28f325cb953737e4006a0',1,'lib60870.CS104.Connection.Connection(string hostname, int tcpPort=2404)'],['../classlib60870_1_1_c_s104_1_1_connection.html#a3eae55571e202eb6736600f1e77ebe39',1,'lib60870.CS104.Connection.Connection(string hostname, APCIParameters apciParameters, ApplicationLayerParameters alParameters)'],['../classlib60870_1_1_c_s104_1_1_connection.html#a02efd3de4daa87455c94621c8a225eda',1,'lib60870.CS104.Connection.Connection(string hostname, int tcpPort, APCIParameters apciParameters, ApplicationLayerParameters alParameters)'],['../classlib60870_1_1_c_s104_1_1_connection.html#ab6fa4b93d7a17e5eb0eabb97e0e8360f',1,'lib60870.CS104.Connection.Connection(string hostname, TlsSecurityInformation tlsInfo, int tcpPort=19998)'],['../classlib60870_1_1_c_s104_1_1_connection.html#a54aa828ed44ffbc63fdd71d3860bf541',1,'lib60870.CS104.Connection.Connection(string hostname, int tcpPort, APCIParameters apciParameters, ApplicationLayerParameters alParameters, TlsSecurityInformation tlsInfo)']]], - ['connection_5fis_5fredundancy_5fgroup_22',['CONNECTION_IS_REDUNDANCY_GROUP',['../namespacelib60870_1_1_c_s104.html#a40215e8d03911ca6748ebfd78218d744a9d445a07d2444cf077d5b4a53243916a',1,'lib60870::CS104']]], - ['connectionevent_23',['ConnectionEvent',['../namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3',1,'lib60870::CS104']]], - ['connectionexception_24',['ConnectionException',['../classlib60870_1_1_connection_exception.html',1,'lib60870']]], - ['connectionhandler_25',['ConnectionHandler',['../namespacelib60870_1_1_c_s104.html#aa16788ce99f06cdcca23787226650a74',1,'lib60870::CS104']]], - ['connectionrequesthandler_26',['ConnectionRequestHandler',['../namespacelib60870_1_1_c_s104.html#ac8c6f665636c4cd4938333429bc9b03f',1,'lib60870::CS104']]], - ['connectionstatistics_27',['ConnectionStatistics',['../classlib60870_1_1_c_s104_1_1_connection_statistics.html',1,'lib60870::CS104']]], - ['connecttimeout_28',['ConnectTimeout',['../classlib60870_1_1_c_s104_1_1_connection.html#a5bc80935ee36a7bcca2c4807f0abeed4',1,'lib60870::CS104::Connection']]], - ['contact_3a_29',['Contact:',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html#autotoc_md2',1,'']]], - ['contributing_30',['Contributing',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html#autotoc_md5',1,'']]], - ['cot_31',['Cot',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a68dd2e6df66c5c4298a357ac5da8fed1',1,'lib60870::CS101::ASDU']]], - ['counterinterrogationcommand_32',['CounterInterrogationCommand',['../classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html',1,'lib60870::CS101']]], - ['counterinterrogationhandler_33',['CounterInterrogationHandler',['../namespacelib60870_1_1_c_s101.html#a027c45142e293bb4601aa52dd83c5d15',1,'lib60870::CS101']]], - ['cp16time2a_34',['CP16Time2a',['../classlib60870_1_1_c_p16_time2a.html',1,'lib60870']]], - ['cp24time2a_35',['CP24Time2a',['../classlib60870_1_1_c_p24_time2a.html',1,'lib60870']]], - ['cp32time2a_36',['CP32Time2a',['../classlib60870_1_1_c_p32_time2a.html',1,'lib60870']]], - ['cp56time2a_37',['CP56Time2a',['../classlib60870_1_1_c_p56_time2a.html',1,'lib60870']]], - ['cs101master_38',['CS101Master',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html',1,'lib60870::CS101']]], - ['cs101slave_39',['CS101Slave',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html',1,'lib60870.CS101.CS101Slave'],['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a2e94b7ad7d65489e0dbe94fb76d79420',1,'lib60870.CS101.CS101Slave.CS101Slave(SerialPort port, LinkLayerParameters parameters=null)'],['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a7d63775d354c7e0b9a3b50927ed74134',1,'lib60870.CS101.CS101Slave.CS101Slave(Stream serialStream, LinkLayerParameters parameters=null)']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/all_5.js b/doxygen/doxydoc.NET/html/search/all_5.js deleted file mode 100644 index 3e38554..0000000 --- a/doxygen/doxydoc.NET/html/search/all_5.js +++ /dev/null @@ -1,15 +0,0 @@ -var searchData= -[ - ['dayofmonth_0',['DayOfMonth',['../classlib60870_1_1_c_p56_time2a.html#a533808a9bd35fd250ff3197ce8b4e8fa',1,'lib60870::CP56Time2a']]], - ['dayofweek_1',['DayOfWeek',['../classlib60870_1_1_c_p56_time2a.html#afddcdbd7c4557c88032eb519a57b4019',1,'lib60870::CP56Time2a']]], - ['decode_2',['Decode',['../interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html#ad705ef8ea182c4977221c7b3cc23d632',1,'lib60870::CS101::IPrivateIOFactory']]], - ['delayacquisitioncommand_3',['DelayAcquisitionCommand',['../classlib60870_1_1_c_s101_1_1_delay_acquisition_command.html',1,'lib60870::CS101']]], - ['delayacquisitionhandler_4',['DelayAcquisitionHandler',['../namespacelib60870_1_1_c_s101.html#ad94b7a69be5b593e6e694b884206d184',1,'lib60870::CS101']]], - ['dir_5',['DIR',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#aceff4f3985519a296c989418c7ad71b0',1,'lib60870.CS101.CS101Master.DIR'],['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#ae1d00e6ee950d56d5487384070651148',1,'lib60870.CS101.CS101Slave.DIR']]], - ['doublecommand_6',['DoubleCommand',['../classlib60870_1_1_c_s101_1_1_double_command.html',1,'lib60870::CS101']]], - ['doublecommandwithcp56time2a_7',['DoubleCommandWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['doublepointinformation_8',['DoublePointInformation',['../classlib60870_1_1_c_s101_1_1_double_point_information.html',1,'lib60870::CS101']]], - ['doublepointvalue_9',['DoublePointValue',['../namespacelib60870_1_1_c_s101.html#aff74ed75cebe96a815464d1ef856e3ad',1,'lib60870::CS101']]], - ['doublepointwithcp24time2a_10',['DoublePointWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a.html',1,'lib60870::CS101']]], - ['doublepointwithcp56time2a_11',['DoublePointWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a.html',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/all_6.js b/doxygen/doxydoc.NET/html/search/all_6.js deleted file mode 100644 index 566a60b..0000000 --- a/doxygen/doxydoc.NET/html/search/all_6.js +++ /dev/null @@ -1,11 +0,0 @@ -var searchData= -[ - ['endofinitialization_0',['EndOfInitialization',['../classlib60870_1_1_c_s101_1_1_end_of_initialization.html',1,'lib60870::CS101']]], - ['enqueueasdu_1',['EnqueueASDU',['../classlib60870_1_1_c_s104_1_1_redundancy_group.html#af72be4629377a6c78f4f9733f4e251b4',1,'lib60870.CS104.RedundancyGroup.EnqueueASDU()'],['../classlib60870_1_1_c_s104_1_1_server.html#aa6f1a77ab87c08ca663ab88dcf1b9dbe',1,'lib60870.CS104.Server.EnqueueASDU(ASDU asdu)']]], - ['enqueuemode_2',['EnqueueMode',['../classlib60870_1_1_c_s104_1_1_server.html#a102d175703f4f357e5749265352ce71e',1,'lib60870.CS104.Server.EnqueueMode'],['../namespacelib60870_1_1_c_s104.html#ac35ab675c5aa217ded7ded419a5557df',1,'lib60870.CS104.EnqueueMode']]], - ['enqueueuserdataclass1_3',['EnqueueUserDataClass1',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a5a8573dbafd2ce027d9d7603b3347211',1,'lib60870::CS101::CS101Slave']]], - ['enqueueuserdataclass2_4',['EnqueueUserDataClass2',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a605411588ecb89ab825520cac38d547e',1,'lib60870::CS101::CS101Slave']]], - ['eventofprotectionequipment_5',['EventOfProtectionEquipment',['../classlib60870_1_1_c_s101_1_1_event_of_protection_equipment.html',1,'lib60870::CS101']]], - ['eventofprotectionequipmentwithcp56time2a_6',['EventOfProtectionEquipmentWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['examples_3a_7',['Compiling and running the examples:',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html#autotoc_md1',1,'']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/all_7.js b/doxygen/doxydoc.NET/html/search/all_7.js deleted file mode 100644 index 4fca83f..0000000 --- a/doxygen/doxydoc.NET/html/search/all_7.js +++ /dev/null @@ -1,15 +0,0 @@ -var searchData= -[ - ['fileack_0',['FileACK',['../classlib60870_1_1_c_s101_1_1_file_a_c_k.html',1,'lib60870::CS101']]], - ['filecallorselect_1',['FileCallOrSelect',['../classlib60870_1_1_c_s101_1_1_file_call_or_select.html',1,'lib60870::CS101']]], - ['filedirectory_2',['FileDirectory',['../classlib60870_1_1_c_s101_1_1_file_directory.html',1,'lib60870::CS101']]], - ['fileerror_3',['FileError',['../namespacelib60870_1_1_c_s101.html#a69c8264ee40e2407023b71a5dfd09e0f',1,'lib60870::CS101']]], - ['filelastsegmentorsection_4',['FileLastSegmentOrSection',['../classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html',1,'lib60870::CS101']]], - ['fileready_5',['FileReady',['../classlib60870_1_1_c_s101_1_1_file_ready.html',1,'lib60870.CS101.FileReady'],['../classlib60870_1_1_c_s101_1_1_file_ready.html#a109625172b98152e626a426c260295e6',1,'lib60870.CS101.FileReady.FileReady()']]], - ['filereadyhandler_6',['FileReadyHandler',['../namespacelib60870_1_1_c_s101.html#a0c7346f0e183f14b92c4fc6c373678e9',1,'lib60870::CS101']]], - ['filesavailable_7',['FilesAvailable',['../classlib60870_1_1_c_s101_1_1_files_available.html',1,'lib60870::CS101']]], - ['filesegment_8',['FileSegment',['../classlib60870_1_1_c_s101_1_1_file_segment.html',1,'lib60870::CS101']]], - ['filetimeout_9',['FileTimeout',['../classlib60870_1_1_c_s101_1_1_slave.html#a063b9d1a19a2960a91afc69204cc11f7',1,'lib60870::CS101::Slave']]], - ['frame_10',['Frame',['../classlib60870_1_1_frame.html',1,'lib60870']]], - ['frq_11',['FRQ',['../classlib60870_1_1_c_s101_1_1_file_ready.html#a68e7d332f311fb83d9bb617b6e54ec0a',1,'lib60870::CS101::FileReady']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/all_8.js b/doxygen/doxydoc.NET/html/search/all_8.js deleted file mode 100644 index 289738a..0000000 --- a/doxygen/doxydoc.NET/html/search/all_8.js +++ /dev/null @@ -1,23 +0,0 @@ -var searchData= -[ - ['gc_0',['GC',['../classlib60870_1_1_c_s101_1_1_output_circuit_info.html#a1eeab57adef2da4f97af4fc96b07ad6c',1,'lib60870::CS101::OutputCircuitInfo']]], - ['getapciparameters_1',['GetAPCIParameters',['../classlib60870_1_1_c_s104_1_1_server.html#a859b8ac2c4b9cd87efc490173c8cd38a',1,'lib60870::CS104::Server']]], - ['getapplicationlayerparameters_2',['GetApplicationLayerParameters',['../classlib60870_1_1_c_s101_1_1_master.html#ac8f077926245f7194b3aba089a7ce520',1,'lib60870.CS101.Master.GetApplicationLayerParameters()'],['../classlib60870_1_1_c_s104_1_1_client_connection.html#a92d801095c3038a96b26093e7d38628a',1,'lib60870.CS104.ClientConnection.GetApplicationLayerParameters()'],['../classlib60870_1_1_c_s104_1_1_server.html#a21f35d1f590dae3b557c413e2f05d01d',1,'lib60870.CS104.Server.GetApplicationLayerParameters()']]], - ['getavailablefiles_3',['GetAvailableFiles',['../classlib60870_1_1_c_s101_1_1_slave.html#a5e85ada660492fecd182e654a75c8b42',1,'lib60870::CS101::Slave']]], - ['getca_4',['GetCA',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a8bd0b5d9ca9019f7f8dab6c43a5d7945',1,'lib60870.CS101.IFileProvider.GetCA()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#a7f9d7004443cb8285f67ef8362544313',1,'lib60870.CS101.TransparentFile.GetCA()']]], - ['getdatetime_5',['GetDateTime',['../classlib60870_1_1_c_p32_time2a.html#a57711ec4af4479936d10b2bf6df355a4',1,'lib60870.CP32Time2a.GetDateTime()'],['../classlib60870_1_1_c_p56_time2a.html#a83f9707e94051e90f0ab9b2f5dc1b3df',1,'lib60870.CP56Time2a.GetDateTime()']]], - ['getdirectory_6',['GetDirectory',['../classlib60870_1_1_c_s104_1_1_connection.html#a131c3dd3059b67c6ec0b2351c5e1e50c',1,'lib60870::CS104::Connection']]], - ['getelement_7',['GetElement',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a3d57c6dab7100c5933373231c459d31f',1,'lib60870.CS101.ASDU.GetElement(int index, PrivateInformationObjectTypes privateObjectTypes)'],['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a752cdac37f9f37c859eb4de5bf01c746',1,'lib60870.CS101.ASDU.GetElement(int index, IPrivateIOFactory ioFactory)'],['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a163ff2a748b560ecd08692a00ce83d57',1,'lib60870.CS101.ASDU.GetElement(int index)']]], - ['getencodedsize_8',['GetEncodedSize',['../classlib60870_1_1_c_s101_1_1_information_object.html#a2e5cb4ff206963db465c10d06c6e1954',1,'lib60870.CS101.InformationObject.GetEncodedSize()'],['../interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html#a26a0623584b57db1a35b9e8fe1b7e02c',1,'lib60870.CS101.IPrivateIOFactory.GetEncodedSize()']]], - ['getfile_9',['GetFile',['../classlib60870_1_1_c_s101_1_1_master.html#a67284f6ec618c943766040e3877acc7b',1,'lib60870.CS101.Master.GetFile()'],['../classlib60870_1_1_c_s104_1_1_connection.html#adca074f2aa74aae897fbfc85a4bbe6d5',1,'lib60870.CS104.Connection.GetFile(int ca, int ioa, NameOfFile nof, IFileReceiver receiver)'],['../classlib60870_1_1_c_s104_1_1_connection.html#a25c9f162dfde01896bb30e8f61092183',1,'lib60870.CS104.Connection.GetFile(int ca, int ioa, NameOfFile nof, IFileReceiver receiver, int timeout)']]], - ['getfiles_10',['GetFiles',['../classlib60870_1_1_c_s101_1_1_files_available.html#ad07db9fbd1ca2f1643991d7b446bf7c4',1,'lib60870::CS101::FilesAvailable']]], - ['getfilesize_11',['GetFileSize',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a6b9b192c358b22d132893c90a636daf2',1,'lib60870.CS101.IFileProvider.GetFileSize()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#a7eaa164b404cd4f32302c7f044b774ab',1,'lib60870.CS101.TransparentFile.GetFileSize()']]], - ['getioa_12',['GetIOA',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a68c3470850586f634e731dd250c957da',1,'lib60870.CS101.IFileProvider.GetIOA()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#a955484a99eb32c9a8c37a76959add633',1,'lib60870.CS101.TransparentFile.GetIOA()']]], - ['getlibraryversionstring_13',['GetLibraryVersionString',['../classlib60870_1_1_library_common.html#a3de9d184ceeaeaa3ad95bdfea5f0d902',1,'lib60870::LibraryCommon']]], - ['getmilliseconds_14',['GetMilliseconds',['../classlib60870_1_1_c_p24_time2a.html#afa47b9c056d5787d0368779f462fd2ff',1,'lib60870::CP24Time2a']]], - ['getnameoffile_15',['GetNameOfFile',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a9aa9aeb003e1e5726a5b634cfa1c5548',1,'lib60870.CS101.IFileProvider.GetNameOfFile()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#a069c64d7b35226bb030fc5e0dfcbd5bd',1,'lib60870.CS101.TransparentFile.GetNameOfFile()']]], - ['getsectionsize_16',['GetSectionSize',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a953c9bc0b2dd47ba192649ce3b954318',1,'lib60870.CS101.IFileProvider.GetSectionSize()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#a4a53ae94f1bc4d70ebac30d1af9ba596',1,'lib60870.CS101.TransparentFile.GetSectionSize()']]], - ['getsegmentdata_17',['GetSegmentData',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a238a851573b79de09af78b4f93deb7f2',1,'lib60870.CS101.IFileProvider.GetSegmentData()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#adefa9e2224dba9bb842481db21e94216',1,'lib60870.CS101.TransparentFile.GetSegmentData()']]], - ['getstatistics_18',['GetStatistics',['../classlib60870_1_1_c_s104_1_1_connection.html#a5867e9bda4cf3d6647ebf50603e1be17',1,'lib60870::CS104::Connection']]], - ['gs_19',['GS',['../classlib60870_1_1_c_s101_1_1_start_event.html#a6cf3d354c2df01eb808748353f743b33',1,'lib60870::CS101::StartEvent']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/all_9.js b/doxygen/doxydoc.NET/html/search/all_9.js deleted file mode 100644 index d6aecbc..0000000 --- a/doxygen/doxydoc.NET/html/search/all_9.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['hour_0',['Hour',['../classlib60870_1_1_c_p32_time2a.html#a4cfa66063d1b214990d69515af388552',1,'lib60870.CP32Time2a.Hour'],['../classlib60870_1_1_c_p56_time2a.html#a34891c411294a0cb5bf2f1d4adb3286a',1,'lib60870.CP56Time2a.Hour']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/all_a.js b/doxygen/doxydoc.NET/html/search/all_a.js deleted file mode 100644 index fb508da..0000000 --- a/doxygen/doxydoc.NET/html/search/all_a.js +++ /dev/null @@ -1,25 +0,0 @@ -var searchData= -[ - ['ifileprovider_0',['IFileProvider',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html',1,'lib60870::CS101']]], - ['ifilereceiver_1',['IFileReceiver',['../interfacelib60870_1_1_c_s101_1_1_i_file_receiver.html',1,'lib60870::CS101']]], - ['ignore_2',['IGNORE',['../namespacelib60870_1_1_c_s104.html#ac35ab675c5aa217ded7ded419a5557dfaa2e843feab94ef623fea888f07c28696',1,'lib60870::CS104']]], - ['imasterconnection_3',['IMasterConnection',['../interfacelib60870_1_1_c_s101_1_1_i_master_connection.html',1,'lib60870::CS101']]], - ['inactive_4',['INACTIVE',['../namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015da6b273343c454f9c53dcfc9c4ccf171d2',1,'lib60870::CS104']]], - ['informationobject_5',['InformationObject',['../classlib60870_1_1_c_s101_1_1_information_object.html',1,'lib60870::CS101']]], - ['integratedtotals_6',['IntegratedTotals',['../classlib60870_1_1_c_s101_1_1_integrated_totals.html',1,'lib60870::CS101']]], - ['integratedtotalswithcp24time2a_7',['IntegratedTotalsWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a.html',1,'lib60870::CS101']]], - ['integratedtotalswithcp56time2a_8',['IntegratedTotalsWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['interrogationcommand_9',['InterrogationCommand',['../classlib60870_1_1_c_s101_1_1_interrogation_command.html',1,'lib60870::CS101']]], - ['interrogationhandler_10',['InterrogationHandler',['../namespacelib60870_1_1_c_s101.html#a94c2e7c6e902d29db88c7a1d512099ed',1,'lib60870::CS101']]], - ['invalid_11',['Invalid',['../classlib60870_1_1_c_p24_time2a.html#acb0606324a0b221df177d242cd97f7c7',1,'lib60870.CP24Time2a.Invalid'],['../classlib60870_1_1_c_p32_time2a.html#a9bc00071f0d79994977adcc9ea1564b4',1,'lib60870.CP32Time2a.Invalid'],['../classlib60870_1_1_c_p56_time2a.html#a7c00ef3b8b3f7fb1bb9a6cad0440f6dd',1,'lib60870.CP56Time2a.Invalid'],['../classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#a9c84bd5840b810546affba3f452b11e0',1,'lib60870.CS101.BinaryCounterReading.Invalid']]], - ['iprivateiofactory_12',['IPrivateIOFactory',['../interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html',1,'lib60870::CS101']]], - ['isactive_13',['IsActive',['../classlib60870_1_1_c_s104_1_1_client_connection.html#afa8806c545bf905a3548afa9732de38b',1,'lib60870::CS104::ClientConnection']]], - ['iscatchall_14',['IsCatchAll',['../classlib60870_1_1_c_s104_1_1_redundancy_group.html#aa09df33fcd23dcf486800f45f3d41d32',1,'lib60870::CS104::RedundancyGroup']]], - ['isnegative_15',['IsNegative',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a808a4ea51526b2ecbe0d9e23df1a018b',1,'lib60870::CS101::ASDU']]], - ['isrunning_16',['IsRunning',['../classlib60870_1_1_c_s104_1_1_connection.html#a83f3dfb64fa61b1d3fef93e938c692a1',1,'lib60870.CS104.Connection.IsRunning'],['../classlib60870_1_1_c_s104_1_1_server.html#a8d16b6e5d54bee55912a00c0cb3b28fc',1,'lib60870.CS104.Server.IsRunning()']]], - ['issequence_17',['IsSequence',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a874af72bec9618876b47a8da155de96f',1,'lib60870::CS101::ASDU']]], - ['istest_18',['IsTest',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#ae315fe2504e41a213cd76330cb56cc24',1,'lib60870::CS101::ASDU']]], - ['istransmitbufferfull_19',['IsTransmitBufferFull',['../classlib60870_1_1_c_s104_1_1_connection.html#a079f96f5d2be9416e9c0c4518542eb07',1,'lib60870::CS104::Connection']]], - ['isuserdataclass1queuefull_20',['IsUserDataClass1QueueFull',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a9903e812bc9779389eb09e855ae3dd74',1,'lib60870::CS101::CS101Slave']]], - ['isuserdataclass2queuefull_21',['IsUserDataClass2QueueFull',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a24cdca7a10754390b15ce735f848cdb3',1,'lib60870::CS101::CS101Slave']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/all_b.js b/doxygen/doxydoc.NET/html/search/all_b.js deleted file mode 100644 index bf97588..0000000 --- a/doxygen/doxydoc.NET/html/search/all_b.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['k_0',['K',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#a0e3fc557d1c66308e6e38383ec9a5287',1,'lib60870::CS104::APCIParameters']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/all_c.js b/doxygen/doxydoc.NET/html/search/all_c.js deleted file mode 100644 index bf0a22f..0000000 --- a/doxygen/doxydoc.NET/html/search/all_c.js +++ /dev/null @@ -1,21 +0,0 @@ -var searchData= -[ - ['lastsectionorsegmentqualifier_0',['LastSectionOrSegmentQualifier',['../namespacelib60870_1_1_c_s101.html#a7030b42dc57243516c07cb22a1992183',1,'lib60870::CS101']]], - ['lib60870_1',['lib60870',['../namespacelib60870.html',1,'']]], - ['lib60870_20net_20v2_203_200_2',['README lib60870.NET v2.3.0',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html',1,'']]], - ['lib60870_3a_3acs101_3',['CS101',['../namespacelib60870_1_1_c_s101.html',1,'lib60870']]], - ['lib60870_3a_3acs104_4',['CS104',['../namespacelib60870_1_1_c_s104.html',1,'lib60870']]], - ['lib60870_3a_3alinklayer_5',['linklayer',['../namespacelib60870_1_1linklayer.html',1,'lib60870']]], - ['librarycommon_6',['LibraryCommon',['../classlib60870_1_1_library_common.html',1,'lib60870']]], - ['licenses_20and_20support_7',['Commercial licenses and support',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html#autotoc_md4',1,'']]], - ['licensing_8',['Licensing',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html#autotoc_md3',1,'']]], - ['linklayeraddress_9',['LinkLayerAddress',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#aeb21ec9a8522c48ad37c263762d300a4',1,'lib60870::CS101::CS101Slave']]], - ['linklayeraddressotherstation_10',['LinkLayerAddressOtherStation',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#aa3c5ac017a1ea8fdbbb686c52076cc75',1,'lib60870::CS101::CS101Slave']]], - ['linklayerbusyexception_11',['LinkLayerBusyException',['../classlib60870_1_1linklayer_1_1_link_layer_busy_exception.html',1,'lib60870::linklayer']]], - ['linklayermode_12',['LinkLayerMode',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#ad9d9bad745efb1fd3ce5bcbe894f6d97',1,'lib60870::CS101::CS101Slave']]], - ['linklayerparameters_13',['LinkLayerParameters',['../classlib60870_1_1linklayer_1_1_link_layer_parameters.html',1,'lib60870::linklayer']]], - ['linklayerstatechanged_14',['LinkLayerStateChanged',['../namespacelib60870_1_1linklayer.html#aeca494b2e7a508585564b223d2f7851b',1,'lib60870::linklayer']]], - ['localcertificateselectioncallback_15',['LocalCertificateSelectionCallback',['../classlib60870_1_1_c_s104_1_1_connection.html#ab773a1837cbbd532d5406f05b9d3cf3f',1,'lib60870::CS104::Connection']]], - ['localipaddress_16',['LocalIpAddress',['../classlib60870_1_1_c_s104_1_1_connection.html#abfa6d1581b6702a9f1dbdb96a79f5bc3',1,'lib60870::CS104::Connection']]], - ['localtcpport_17',['LocalTcpPort',['../classlib60870_1_1_c_s104_1_1_connection.html#a871e51aa4130ab9185014a4a845fdd2a',1,'lib60870::CS104::Connection']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/all_d.js b/doxygen/doxydoc.NET/html/search/all_d.js deleted file mode 100644 index 59b0604..0000000 --- a/doxygen/doxydoc.NET/html/search/all_d.js +++ /dev/null @@ -1,23 +0,0 @@ -var searchData= -[ - ['m_5fme_5fna_5f1_0',['M_ME_NA_1',['../namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba6725773b3371787d2445c3dfad2d68fb',1,'lib60870::CS101']]], - ['master_1',['Master',['../classlib60870_1_1_c_s101_1_1_master.html',1,'lib60870::CS101']]], - ['masterconnection_5fhasunconfirmedmessages_2',['MasterConnection_hasUnconfirmedMessages',['../classlib60870_1_1_c_s104_1_1_client_connection.html#a16acd0a66071c7d1f4d111fafd7a2421',1,'lib60870::CS104::ClientConnection']]], - ['maxhighprioqueuesize_3',['MaxHighPrioQueueSize',['../classlib60870_1_1_c_s104_1_1_server.html#a408a31dd3cf6e781d7295804bd96d767',1,'lib60870::CS104::Server']]], - ['maxopenconnections_4',['MaxOpenConnections',['../classlib60870_1_1_c_s104_1_1_server.html#adcea16c6c2db799bc5b6750e82ca2235',1,'lib60870::CS104::Server']]], - ['maxqueuesize_5',['MaxQueueSize',['../classlib60870_1_1_c_s104_1_1_server.html#acef2c82d580d17114847df8409f6bf4f',1,'lib60870::CS104::Server']]], - ['measuredvaluenormalized_6',['MeasuredValueNormalized',['../classlib60870_1_1_c_s101_1_1_measured_value_normalized.html',1,'lib60870::CS101']]], - ['measuredvaluenormalizedwithcp24time2a_7',['MeasuredValueNormalizedWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a.html',1,'lib60870::CS101']]], - ['measuredvaluenormalizedwithcp56time2a_8',['MeasuredValueNormalizedWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['measuredvaluenormalizedwithoutquality_9',['MeasuredValueNormalizedWithoutQuality',['../classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html',1,'lib60870::CS101']]], - ['measuredvaluescaled_10',['MeasuredValueScaled',['../classlib60870_1_1_c_s101_1_1_measured_value_scaled.html',1,'lib60870.CS101.MeasuredValueScaled'],['../classlib60870_1_1_c_s101_1_1_measured_value_scaled.html#a05819e48801faf682acea7f5c53d93e7',1,'lib60870.CS101.MeasuredValueScaled.MeasuredValueScaled()']]], - ['measuredvaluescaledwithcp24time2a_11',['MeasuredValueScaledWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a.html',1,'lib60870::CS101']]], - ['measuredvaluescaledwithcp56time2a_12',['MeasuredValueScaledWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['measuredvalueshort_13',['MeasuredValueShort',['../classlib60870_1_1_c_s101_1_1_measured_value_short.html',1,'lib60870::CS101']]], - ['measuredvalueshortwithcp24time2a_14',['MeasuredValueShortWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a.html',1,'lib60870::CS101']]], - ['measuredvalueshortwithcp56time2a_15',['MeasuredValueShortWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['millisecond_16',['Millisecond',['../classlib60870_1_1_c_p24_time2a.html#a54e60600dccb34252b428488223f419e',1,'lib60870.CP24Time2a.Millisecond'],['../classlib60870_1_1_c_p32_time2a.html#a144afbb4092fbe1a3196f30cba13fc37',1,'lib60870.CP32Time2a.Millisecond'],['../classlib60870_1_1_c_p56_time2a.html#a2e0c82ecba6b07880f9416101f004ecc',1,'lib60870.CP56Time2a.Millisecond']]], - ['minute_17',['Minute',['../classlib60870_1_1_c_p24_time2a.html#a1bdb66a13e77ea4ca5938c7609a38225',1,'lib60870.CP24Time2a.Minute'],['../classlib60870_1_1_c_p32_time2a.html#a723b8ffeb4915b7347aa97c65b2f4365',1,'lib60870.CP32Time2a.Minute'],['../classlib60870_1_1_c_p56_time2a.html#af5a5ead5f041e47e0f4e201acb707d13',1,'lib60870.CP56Time2a.Minute']]], - ['month_18',['Month',['../classlib60870_1_1_c_p56_time2a.html#aeda1719c2e81de05a616f166036ef1f7',1,'lib60870::CP56Time2a']]], - ['multiple_5fredundancy_5fgroups_19',['MULTIPLE_REDUNDANCY_GROUPS',['../namespacelib60870_1_1_c_s104.html#a40215e8d03911ca6748ebfd78218d744a07a1fe963762929879e3998233ae368c',1,'lib60870::CS104']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/all_e.js b/doxygen/doxydoc.NET/html/search/all_e.js deleted file mode 100644 index 492a33d..0000000 --- a/doxygen/doxydoc.NET/html/search/all_e.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['name_0',['Name',['../classlib60870_1_1_c_s104_1_1_redundancy_group.html#ab5d3a9a8d2fcca1e07fbb547cd072248',1,'lib60870::CS104::RedundancyGroup']]], - ['nameoffile_1',['NameOfFile',['../namespacelib60870_1_1_c_s101.html#a5da0329a39b420cbbf859758eaceba93',1,'lib60870::CS101']]], - ['net_20v2_203_200_2',['README lib60870.NET v2.3.0',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html',1,'']]], - ['numberofelements_3',['NumberOfElements',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a8ab49764dd886c58be639d229e664af5',1,'lib60870::CS101::ASDU']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/all_f.js b/doxygen/doxydoc.NET/html/search/all_f.js deleted file mode 100644 index efaecc1..0000000 --- a/doxygen/doxydoc.NET/html/search/all_f.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['oa_0',['Oa',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a73566a1f53fc1c1492804c4bcf068438',1,'lib60870::CS101::ASDU']]], - ['openconnections_1',['OpenConnections',['../classlib60870_1_1_c_s104_1_1_server.html#a63dda97b27c78743dee7374d66cdda53',1,'lib60870::CS104::Server']]], - ['opened_2',['OPENED',['../namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3ae670c2408064392c6da7d0b721f7349c',1,'lib60870.CS104.OPENED'],['../namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015dae670c2408064392c6da7d0b721f7349c',1,'lib60870.CS104.OPENED']]], - ['outputcircuitinfo_3',['OutputCircuitInfo',['../classlib60870_1_1_c_s101_1_1_output_circuit_info.html',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/classes_0.js b/doxygen/doxydoc.NET/html/search/classes_0.js deleted file mode 100644 index 3f5b5bc..0000000 --- a/doxygen/doxydoc.NET/html/search/classes_0.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['apciparameters_0',['APCIParameters',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html',1,'lib60870::CS104']]], - ['applicationlayerparameters_1',['ApplicationLayerParameters',['../classlib60870_1_1_c_s101_1_1_application_layer_parameters.html',1,'lib60870::CS101']]], - ['asdu_2',['ASDU',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html',1,'lib60870::CS101']]], - ['asduparsingexception_3',['ASDUParsingException',['../classlib60870_1_1_a_s_d_u_parsing_exception.html',1,'lib60870']]], - ['asduqueue_4',['ASDUQueue',['../classlib60870_1_1_a_s_d_u_queue.html',1,'lib60870']]], - ['asduqueueexception_5',['ASDUQueueException',['../classlib60870_1_1_c_s101_1_1_a_s_d_u_queue_exception.html',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/classes_1.js b/doxygen/doxydoc.NET/html/search/classes_1.js deleted file mode 100644 index ef923eb..0000000 --- a/doxygen/doxydoc.NET/html/search/classes_1.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['binarycounterreading_0',['BinaryCounterReading',['../classlib60870_1_1_c_s101_1_1_binary_counter_reading.html',1,'lib60870::CS101']]], - ['bitstring32_1',['Bitstring32',['../classlib60870_1_1_c_s101_1_1_bitstring32.html',1,'lib60870::CS101']]], - ['bitstring32command_2',['Bitstring32Command',['../classlib60870_1_1_c_s101_1_1_bitstring32_command.html',1,'lib60870::CS101']]], - ['bitstring32commandwithcp56time2a_3',['Bitstring32CommandWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_bitstring32_command_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['bitstring32withcp24time2a_4',['Bitstring32WithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p24_time2a.html',1,'lib60870::CS101']]], - ['bitstring32withcp56time2a_5',['Bitstring32WithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_bitstring32_with_c_p56_time2a.html',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/classes_2.js b/doxygen/doxydoc.NET/html/search/classes_2.js deleted file mode 100644 index 3e62f2a..0000000 --- a/doxygen/doxydoc.NET/html/search/classes_2.js +++ /dev/null @@ -1,15 +0,0 @@ -var searchData= -[ - ['clientconnection_0',['ClientConnection',['../classlib60870_1_1_c_s104_1_1_client_connection.html',1,'lib60870::CS104']]], - ['clocksynchronizationcommand_1',['ClockSynchronizationCommand',['../classlib60870_1_1_c_s101_1_1_clock_synchronization_command.html',1,'lib60870::CS101']]], - ['connection_2',['Connection',['../classlib60870_1_1_c_s104_1_1_connection.html',1,'lib60870::CS104']]], - ['connectionexception_3',['ConnectionException',['../classlib60870_1_1_connection_exception.html',1,'lib60870']]], - ['connectionstatistics_4',['ConnectionStatistics',['../classlib60870_1_1_c_s104_1_1_connection_statistics.html',1,'lib60870::CS104']]], - ['counterinterrogationcommand_5',['CounterInterrogationCommand',['../classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html',1,'lib60870::CS101']]], - ['cp16time2a_6',['CP16Time2a',['../classlib60870_1_1_c_p16_time2a.html',1,'lib60870']]], - ['cp24time2a_7',['CP24Time2a',['../classlib60870_1_1_c_p24_time2a.html',1,'lib60870']]], - ['cp32time2a_8',['CP32Time2a',['../classlib60870_1_1_c_p32_time2a.html',1,'lib60870']]], - ['cp56time2a_9',['CP56Time2a',['../classlib60870_1_1_c_p56_time2a.html',1,'lib60870']]], - ['cs101master_10',['CS101Master',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html',1,'lib60870::CS101']]], - ['cs101slave_11',['CS101Slave',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/classes_3.js b/doxygen/doxydoc.NET/html/search/classes_3.js deleted file mode 100644 index b7e4559..0000000 --- a/doxygen/doxydoc.NET/html/search/classes_3.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['delayacquisitioncommand_0',['DelayAcquisitionCommand',['../classlib60870_1_1_c_s101_1_1_delay_acquisition_command.html',1,'lib60870::CS101']]], - ['doublecommand_1',['DoubleCommand',['../classlib60870_1_1_c_s101_1_1_double_command.html',1,'lib60870::CS101']]], - ['doublecommandwithcp56time2a_2',['DoubleCommandWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_double_command_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['doublepointinformation_3',['DoublePointInformation',['../classlib60870_1_1_c_s101_1_1_double_point_information.html',1,'lib60870::CS101']]], - ['doublepointwithcp24time2a_4',['DoublePointWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_double_point_with_c_p24_time2a.html',1,'lib60870::CS101']]], - ['doublepointwithcp56time2a_5',['DoublePointWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_double_point_with_c_p56_time2a.html',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/classes_4.js b/doxygen/doxydoc.NET/html/search/classes_4.js deleted file mode 100644 index e2f51ce..0000000 --- a/doxygen/doxydoc.NET/html/search/classes_4.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['endofinitialization_0',['EndOfInitialization',['../classlib60870_1_1_c_s101_1_1_end_of_initialization.html',1,'lib60870::CS101']]], - ['eventofprotectionequipment_1',['EventOfProtectionEquipment',['../classlib60870_1_1_c_s101_1_1_event_of_protection_equipment.html',1,'lib60870::CS101']]], - ['eventofprotectionequipmentwithcp56time2a_2',['EventOfProtectionEquipmentWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_event_of_protection_equipment_with_c_p56_time2a.html',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/classes_5.js b/doxygen/doxydoc.NET/html/search/classes_5.js deleted file mode 100644 index 6f60443..0000000 --- a/doxygen/doxydoc.NET/html/search/classes_5.js +++ /dev/null @@ -1,11 +0,0 @@ -var searchData= -[ - ['fileack_0',['FileACK',['../classlib60870_1_1_c_s101_1_1_file_a_c_k.html',1,'lib60870::CS101']]], - ['filecallorselect_1',['FileCallOrSelect',['../classlib60870_1_1_c_s101_1_1_file_call_or_select.html',1,'lib60870::CS101']]], - ['filedirectory_2',['FileDirectory',['../classlib60870_1_1_c_s101_1_1_file_directory.html',1,'lib60870::CS101']]], - ['filelastsegmentorsection_3',['FileLastSegmentOrSection',['../classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html',1,'lib60870::CS101']]], - ['fileready_4',['FileReady',['../classlib60870_1_1_c_s101_1_1_file_ready.html',1,'lib60870::CS101']]], - ['filesavailable_5',['FilesAvailable',['../classlib60870_1_1_c_s101_1_1_files_available.html',1,'lib60870::CS101']]], - ['filesegment_6',['FileSegment',['../classlib60870_1_1_c_s101_1_1_file_segment.html',1,'lib60870::CS101']]], - ['frame_7',['Frame',['../classlib60870_1_1_frame.html',1,'lib60870']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/classes_6.js b/doxygen/doxydoc.NET/html/search/classes_6.js deleted file mode 100644 index 330c939..0000000 --- a/doxygen/doxydoc.NET/html/search/classes_6.js +++ /dev/null @@ -1,12 +0,0 @@ -var searchData= -[ - ['ifileprovider_0',['IFileProvider',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html',1,'lib60870::CS101']]], - ['ifilereceiver_1',['IFileReceiver',['../interfacelib60870_1_1_c_s101_1_1_i_file_receiver.html',1,'lib60870::CS101']]], - ['imasterconnection_2',['IMasterConnection',['../interfacelib60870_1_1_c_s101_1_1_i_master_connection.html',1,'lib60870::CS101']]], - ['informationobject_3',['InformationObject',['../classlib60870_1_1_c_s101_1_1_information_object.html',1,'lib60870::CS101']]], - ['integratedtotals_4',['IntegratedTotals',['../classlib60870_1_1_c_s101_1_1_integrated_totals.html',1,'lib60870::CS101']]], - ['integratedtotalswithcp24time2a_5',['IntegratedTotalsWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p24_time2a.html',1,'lib60870::CS101']]], - ['integratedtotalswithcp56time2a_6',['IntegratedTotalsWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_integrated_totals_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['interrogationcommand_7',['InterrogationCommand',['../classlib60870_1_1_c_s101_1_1_interrogation_command.html',1,'lib60870::CS101']]], - ['iprivateiofactory_8',['IPrivateIOFactory',['../interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/classes_7.js b/doxygen/doxydoc.NET/html/search/classes_7.js deleted file mode 100644 index 3770299..0000000 --- a/doxygen/doxydoc.NET/html/search/classes_7.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['librarycommon_0',['LibraryCommon',['../classlib60870_1_1_library_common.html',1,'lib60870']]], - ['linklayerbusyexception_1',['LinkLayerBusyException',['../classlib60870_1_1linklayer_1_1_link_layer_busy_exception.html',1,'lib60870::linklayer']]], - ['linklayerparameters_2',['LinkLayerParameters',['../classlib60870_1_1linklayer_1_1_link_layer_parameters.html',1,'lib60870::linklayer']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/classes_8.js b/doxygen/doxydoc.NET/html/search/classes_8.js deleted file mode 100644 index b7f2361..0000000 --- a/doxygen/doxydoc.NET/html/search/classes_8.js +++ /dev/null @@ -1,14 +0,0 @@ -var searchData= -[ - ['master_0',['Master',['../classlib60870_1_1_c_s101_1_1_master.html',1,'lib60870::CS101']]], - ['measuredvaluenormalized_1',['MeasuredValueNormalized',['../classlib60870_1_1_c_s101_1_1_measured_value_normalized.html',1,'lib60870::CS101']]], - ['measuredvaluenormalizedwithcp24time2a_2',['MeasuredValueNormalizedWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p24_time2a.html',1,'lib60870::CS101']]], - ['measuredvaluenormalizedwithcp56time2a_3',['MeasuredValueNormalizedWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_measured_value_normalized_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['measuredvaluenormalizedwithoutquality_4',['MeasuredValueNormalizedWithoutQuality',['../classlib60870_1_1_c_s101_1_1_measured_value_normalized_without_quality.html',1,'lib60870::CS101']]], - ['measuredvaluescaled_5',['MeasuredValueScaled',['../classlib60870_1_1_c_s101_1_1_measured_value_scaled.html',1,'lib60870::CS101']]], - ['measuredvaluescaledwithcp24time2a_6',['MeasuredValueScaledWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p24_time2a.html',1,'lib60870::CS101']]], - ['measuredvaluescaledwithcp56time2a_7',['MeasuredValueScaledWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_measured_value_scaled_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['measuredvalueshort_8',['MeasuredValueShort',['../classlib60870_1_1_c_s101_1_1_measured_value_short.html',1,'lib60870::CS101']]], - ['measuredvalueshortwithcp24time2a_9',['MeasuredValueShortWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p24_time2a.html',1,'lib60870::CS101']]], - ['measuredvalueshortwithcp56time2a_10',['MeasuredValueShortWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_measured_value_short_with_c_p56_time2a.html',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/classes_9.js b/doxygen/doxydoc.NET/html/search/classes_9.js deleted file mode 100644 index ef286c0..0000000 --- a/doxygen/doxydoc.NET/html/search/classes_9.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['outputcircuitinfo_0',['OutputCircuitInfo',['../classlib60870_1_1_c_s101_1_1_output_circuit_info.html',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/classes_a.js b/doxygen/doxydoc.NET/html/search/classes_a.js deleted file mode 100644 index 340d010..0000000 --- a/doxygen/doxydoc.NET/html/search/classes_a.js +++ /dev/null @@ -1,13 +0,0 @@ -var searchData= -[ - ['packedoutputcircuitinfo_0',['PackedOutputCircuitInfo',['../classlib60870_1_1_c_s101_1_1_packed_output_circuit_info.html',1,'lib60870::CS101']]], - ['packedoutputcircuitinfowithcp56time2a_1',['PackedOutputCircuitInfoWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_packed_output_circuit_info_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['packedsinglepointwithscd_2',['PackedSinglePointWithSCD',['../classlib60870_1_1_c_s101_1_1_packed_single_point_with_s_c_d.html',1,'lib60870::CS101']]], - ['packedstarteventsofprotectionequipment_3',['PackedStartEventsOfProtectionEquipment',['../classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment.html',1,'lib60870::CS101']]], - ['packedstarteventsofprotectionequipmentwithcp56time2a_4',['PackedStartEventsOfProtectionEquipmentWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_packed_start_events_of_protection_equipment_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['parameteractivation_5',['ParameterActivation',['../classlib60870_1_1_c_s101_1_1_parameter_activation.html',1,'lib60870::CS101']]], - ['parameterfloatvalue_6',['ParameterFloatValue',['../classlib60870_1_1_c_s101_1_1_parameter_float_value.html',1,'lib60870::CS101']]], - ['parameternormalizedvalue_7',['ParameterNormalizedValue',['../classlib60870_1_1_c_s101_1_1_parameter_normalized_value.html',1,'lib60870::CS101']]], - ['parameterscaledvalue_8',['ParameterScaledValue',['../classlib60870_1_1_c_s101_1_1_parameter_scaled_value.html',1,'lib60870::CS101']]], - ['privateinformationobjecttypes_9',['PrivateInformationObjectTypes',['../classlib60870_1_1_c_s101_1_1_private_information_object_types.html',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/classes_b.js b/doxygen/doxydoc.NET/html/search/classes_b.js deleted file mode 100644 index 6f013af..0000000 --- a/doxygen/doxydoc.NET/html/search/classes_b.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['qualifierofinterrogation_0',['QualifierOfInterrogation',['../classlib60870_1_1_c_s101_1_1_qualifier_of_interrogation.html',1,'lib60870::CS101']]], - ['qualitydescriptor_1',['QualityDescriptor',['../classlib60870_1_1_c_s101_1_1_quality_descriptor.html',1,'lib60870::CS101']]], - ['qualitydescriptorp_2',['QualityDescriptorP',['../classlib60870_1_1_c_s101_1_1_quality_descriptor_p.html',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/classes_c.js b/doxygen/doxydoc.NET/html/search/classes_c.js deleted file mode 100644 index f756bcd..0000000 --- a/doxygen/doxydoc.NET/html/search/classes_c.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['readcommand_0',['ReadCommand',['../classlib60870_1_1_c_s101_1_1_read_command.html',1,'lib60870::CS101']]], - ['redundancygroup_1',['RedundancyGroup',['../classlib60870_1_1_c_s104_1_1_redundancy_group.html',1,'lib60870::CS104']]], - ['resetprocesscommand_2',['ResetProcessCommand',['../classlib60870_1_1_c_s101_1_1_reset_process_command.html',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/classes_d.js b/doxygen/doxydoc.NET/html/search/classes_d.js deleted file mode 100644 index e84b961..0000000 --- a/doxygen/doxydoc.NET/html/search/classes_d.js +++ /dev/null @@ -1,28 +0,0 @@ -var searchData= -[ - ['scaledvalue_0',['ScaledValue',['../classlib60870_1_1_c_s101_1_1_scaled_value.html',1,'lib60870::CS101']]], - ['sectionready_1',['SectionReady',['../classlib60870_1_1_c_s101_1_1_section_ready.html',1,'lib60870::CS101']]], - ['server_2',['Server',['../classlib60870_1_1_c_s104_1_1_server.html',1,'lib60870::CS104']]], - ['setpointcommandnormalized_3',['SetpointCommandNormalized',['../classlib60870_1_1_c_s101_1_1_setpoint_command_normalized.html',1,'lib60870::CS101']]], - ['setpointcommandnormalizedwithcp56time2a_4',['SetpointCommandNormalizedWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_setpoint_command_normalized_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['setpointcommandqualifier_5',['SetpointCommandQualifier',['../classlib60870_1_1_c_s101_1_1_setpoint_command_qualifier.html',1,'lib60870::CS101']]], - ['setpointcommandscaled_6',['SetpointCommandScaled',['../classlib60870_1_1_c_s101_1_1_setpoint_command_scaled.html',1,'lib60870::CS101']]], - ['setpointcommandscaledwithcp56time2a_7',['SetpointCommandScaledWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_setpoint_command_scaled_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['setpointcommandshort_8',['SetpointCommandShort',['../classlib60870_1_1_c_s101_1_1_setpoint_command_short.html',1,'lib60870::CS101']]], - ['setpointcommandshortwithcp56time2a_9',['SetpointCommandShortWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_setpoint_command_short_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['singlecommand_10',['SingleCommand',['../classlib60870_1_1_c_s101_1_1_single_command.html',1,'lib60870::CS101']]], - ['singlecommandqualifier_11',['SingleCommandQualifier',['../classlib60870_1_1_single_command_qualifier.html',1,'lib60870']]], - ['singlecommandwithcp56time2a_12',['SingleCommandWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_single_command_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['singleevent_13',['SingleEvent',['../classlib60870_1_1_c_s101_1_1_single_event.html',1,'lib60870::CS101']]], - ['singlepointinformation_14',['SinglePointInformation',['../classlib60870_1_1_c_s101_1_1_single_point_information.html',1,'lib60870::CS101']]], - ['singlepointwithcp24time2a_15',['SinglePointWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_single_point_with_c_p24_time2a.html',1,'lib60870::CS101']]], - ['singlepointwithcp56time2a_16',['SinglePointWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_single_point_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['slave_17',['Slave',['../classlib60870_1_1_c_s101_1_1_slave.html',1,'lib60870::CS101']]], - ['startevent_18',['StartEvent',['../classlib60870_1_1_c_s101_1_1_start_event.html',1,'lib60870::CS101']]], - ['statusandstatuschangedetection_19',['StatusAndStatusChangeDetection',['../classlib60870_1_1_c_s101_1_1_status_and_status_change_detection.html',1,'lib60870::CS101']]], - ['stepcommand_20',['StepCommand',['../classlib60870_1_1_c_s101_1_1_step_command.html',1,'lib60870::CS101']]], - ['stepcommandwithcp56time2a_21',['StepCommandWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_step_command_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['steppositioninformation_22',['StepPositionInformation',['../classlib60870_1_1_c_s101_1_1_step_position_information.html',1,'lib60870::CS101']]], - ['steppositionwithcp24time2a_23',['StepPositionWithCP24Time2a',['../classlib60870_1_1_c_s101_1_1_step_position_with_c_p24_time2a.html',1,'lib60870::CS101']]], - ['steppositionwithcp56time2a_24',['StepPositionWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_step_position_with_c_p56_time2a.html',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/classes_e.js b/doxygen/doxydoc.NET/html/search/classes_e.js deleted file mode 100644 index 5a9f58b..0000000 --- a/doxygen/doxydoc.NET/html/search/classes_e.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['tcpclientvirtualserialport_0',['TcpClientVirtualSerialPort',['../classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html',1,'lib60870::linklayer']]], - ['tcpservervirtualserialport_1',['TcpServerVirtualSerialPort',['../classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.html',1,'lib60870::linklayer']]], - ['testcommand_2',['TestCommand',['../classlib60870_1_1_c_s101_1_1_test_command.html',1,'lib60870::CS101']]], - ['testcommandwithcp56time2a_3',['TestCommandWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html',1,'lib60870::CS101']]], - ['tlssecurityinformation_4',['TlsSecurityInformation',['../classlib60870_1_1_c_s104_1_1_tls_security_information.html',1,'lib60870::CS104']]], - ['transparentfile_5',['TransparentFile',['../classlib60870_1_1_c_s101_1_1_transparent_file.html',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/close.svg b/doxygen/doxydoc.NET/html/search/close.svg deleted file mode 100644 index 337d6cc..0000000 --- a/doxygen/doxydoc.NET/html/search/close.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - diff --git a/doxygen/doxydoc.NET/html/search/enums_0.js b/doxygen/doxydoc.NET/html/search/enums_0.js deleted file mode 100644 index 6971cb3..0000000 --- a/doxygen/doxydoc.NET/html/search/enums_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['acknowledgequalifier_0',['AcknowledgeQualifier',['../namespacelib60870_1_1_c_s101.html#af2506d56be1cd94a330f0f26d45ececc',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/enums_1.js b/doxygen/doxydoc.NET/html/search/enums_1.js deleted file mode 100644 index 71b2c84..0000000 --- a/doxygen/doxydoc.NET/html/search/enums_1.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['causeoftransmission_0',['CauseOfTransmission',['../namespacelib60870_1_1_c_s101.html#a62caf0573073c630f38f5374f9d374cc',1,'lib60870::CS101']]], - ['clientconnectionevent_1',['ClientConnectionEvent',['../namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015d',1,'lib60870::CS104']]], - ['connectionevent_2',['ConnectionEvent',['../namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3',1,'lib60870::CS104']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/enums_2.js b/doxygen/doxydoc.NET/html/search/enums_2.js deleted file mode 100644 index 2ae0de2..0000000 --- a/doxygen/doxydoc.NET/html/search/enums_2.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['doublepointvalue_0',['DoublePointValue',['../namespacelib60870_1_1_c_s101.html#aff74ed75cebe96a815464d1ef856e3ad',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/enums_3.js b/doxygen/doxydoc.NET/html/search/enums_3.js deleted file mode 100644 index 6850829..0000000 --- a/doxygen/doxydoc.NET/html/search/enums_3.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['enqueuemode_0',['EnqueueMode',['../namespacelib60870_1_1_c_s104.html#ac35ab675c5aa217ded7ded419a5557df',1,'lib60870::CS104']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/enums_4.js b/doxygen/doxydoc.NET/html/search/enums_4.js deleted file mode 100644 index 2d1a06b..0000000 --- a/doxygen/doxydoc.NET/html/search/enums_4.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['fileerror_0',['FileError',['../namespacelib60870_1_1_c_s101.html#a69c8264ee40e2407023b71a5dfd09e0f',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/enums_5.js b/doxygen/doxydoc.NET/html/search/enums_5.js deleted file mode 100644 index a1bdf1e..0000000 --- a/doxygen/doxydoc.NET/html/search/enums_5.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['lastsectionorsegmentqualifier_0',['LastSectionOrSegmentQualifier',['../namespacelib60870_1_1_c_s101.html#a7030b42dc57243516c07cb22a1992183',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/enums_6.js b/doxygen/doxydoc.NET/html/search/enums_6.js deleted file mode 100644 index abc40e3..0000000 --- a/doxygen/doxydoc.NET/html/search/enums_6.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['nameoffile_0',['NameOfFile',['../namespacelib60870_1_1_c_s101.html#a5da0329a39b420cbbf859758eaceba93',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/enums_7.js b/doxygen/doxydoc.NET/html/search/enums_7.js deleted file mode 100644 index 6c7fecc..0000000 --- a/doxygen/doxydoc.NET/html/search/enums_7.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['selectandcallqualifier_0',['SelectAndCallQualifier',['../namespacelib60870_1_1_c_s101.html#ac5a919dfe39a648cc5ea40d072ca98a3',1,'lib60870::CS101']]], - ['servermode_1',['ServerMode',['../namespacelib60870_1_1_c_s104.html#a40215e8d03911ca6748ebfd78218d744',1,'lib60870::CS104']]], - ['stepcommandvalue_2',['StepCommandValue',['../namespacelib60870_1_1_c_s101.html#a8b8573d2c7289fab9db7a1ce5ff40286',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/enums_8.js b/doxygen/doxydoc.NET/html/search/enums_8.js deleted file mode 100644 index f54e6a0..0000000 --- a/doxygen/doxydoc.NET/html/search/enums_8.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['typeid_0',['TypeID',['../namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bb',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/enumvalues_0.js b/doxygen/doxydoc.NET/html/search/enumvalues_0.js deleted file mode 100644 index f6b3b01..0000000 --- a/doxygen/doxydoc.NET/html/search/enumvalues_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['active_0',['ACTIVE',['../namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015da18ff74f43da410c5529f7d6fca84f115',1,'lib60870::CS104']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/enumvalues_1.js b/doxygen/doxydoc.NET/html/search/enumvalues_1.js deleted file mode 100644 index 0dcb786..0000000 --- a/doxygen/doxydoc.NET/html/search/enumvalues_1.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['closed_0',['CLOSED',['../namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3a110ccf2f5d2ff4eda1fd1a494293467d',1,'lib60870.CS104.CLOSED'],['../namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015da110ccf2f5d2ff4eda1fd1a494293467d',1,'lib60870.CS104.CLOSED']]], - ['connect_5ffailed_1',['CONNECT_FAILED',['../namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3a4820f088c518fab18fe3d9ca70fa7f64',1,'lib60870::CS104']]], - ['connection_5fis_5fredundancy_5fgroup_2',['CONNECTION_IS_REDUNDANCY_GROUP',['../namespacelib60870_1_1_c_s104.html#a40215e8d03911ca6748ebfd78218d744a9d445a07d2444cf077d5b4a53243916a',1,'lib60870::CS104']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/enumvalues_2.js b/doxygen/doxydoc.NET/html/search/enumvalues_2.js deleted file mode 100644 index a4a417d..0000000 --- a/doxygen/doxydoc.NET/html/search/enumvalues_2.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['ignore_0',['IGNORE',['../namespacelib60870_1_1_c_s104.html#ac35ab675c5aa217ded7ded419a5557dfaa2e843feab94ef623fea888f07c28696',1,'lib60870::CS104']]], - ['inactive_1',['INACTIVE',['../namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015da6b273343c454f9c53dcfc9c4ccf171d2',1,'lib60870::CS104']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/enumvalues_3.js b/doxygen/doxydoc.NET/html/search/enumvalues_3.js deleted file mode 100644 index d9c9cf3..0000000 --- a/doxygen/doxydoc.NET/html/search/enumvalues_3.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['m_5fme_5fna_5f1_0',['M_ME_NA_1',['../namespacelib60870_1_1_c_s101.html#ab5704840b8a660c958fff8193e2050bba6725773b3371787d2445c3dfad2d68fb',1,'lib60870::CS101']]], - ['multiple_5fredundancy_5fgroups_1',['MULTIPLE_REDUNDANCY_GROUPS',['../namespacelib60870_1_1_c_s104.html#a40215e8d03911ca6748ebfd78218d744a07a1fe963762929879e3998233ae368c',1,'lib60870::CS104']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/enumvalues_4.js b/doxygen/doxydoc.NET/html/search/enumvalues_4.js deleted file mode 100644 index 4fdded2..0000000 --- a/doxygen/doxydoc.NET/html/search/enumvalues_4.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['opened_0',['OPENED',['../namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3ae670c2408064392c6da7d0b721f7349c',1,'lib60870.CS104.OPENED'],['../namespacelib60870_1_1_c_s104.html#a3a49c7b3520c5e1ef85be308efce015dae670c2408064392c6da7d0b721f7349c',1,'lib60870.CS104.OPENED']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/enumvalues_5.js b/doxygen/doxydoc.NET/html/search/enumvalues_5.js deleted file mode 100644 index 889ca99..0000000 --- a/doxygen/doxydoc.NET/html/search/enumvalues_5.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['remove_5foldest_0',['REMOVE_OLDEST',['../namespacelib60870_1_1_c_s104.html#ac35ab675c5aa217ded7ded419a5557dfac2bdd6ff983cc664116781c3a3dc0a83',1,'lib60870::CS104']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/enumvalues_6.js b/doxygen/doxydoc.NET/html/search/enumvalues_6.js deleted file mode 100644 index fa4a965..0000000 --- a/doxygen/doxydoc.NET/html/search/enumvalues_6.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['single_5fredundancy_5fgroup_0',['SINGLE_REDUNDANCY_GROUP',['../namespacelib60870_1_1_c_s104.html#a40215e8d03911ca6748ebfd78218d744aa3afc5caf4e3e1af74862fca807d9ba0',1,'lib60870::CS104']]], - ['startdt_5fcon_5freceived_1',['STARTDT_CON_RECEIVED',['../namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3abd9bb95a16a48d296aa230827d9c966b',1,'lib60870::CS104']]], - ['stopdt_5fcon_5freceived_2',['STOPDT_CON_RECEIVED',['../namespacelib60870_1_1_c_s104.html#ab3a0df9cd576575f95b3a4962577dec3a98f20c03aaaaa367a27938cfb6b6d1da',1,'lib60870::CS104']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/enumvalues_7.js b/doxygen/doxydoc.NET/html/search/enumvalues_7.js deleted file mode 100644 index 5534cfb..0000000 --- a/doxygen/doxydoc.NET/html/search/enumvalues_7.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['throw_5fexception_0',['THROW_EXCEPTION',['../namespacelib60870_1_1_c_s104.html#ac35ab675c5aa217ded7ded419a5557dfa5c2e82fadad4dae10ff499facac4ab02',1,'lib60870::CS104']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/functions_0.js b/doxygen/doxydoc.NET/html/search/functions_0.js deleted file mode 100644 index 3b735d7..0000000 --- a/doxygen/doxydoc.NET/html/search/functions_0.js +++ /dev/null @@ -1,10 +0,0 @@ -var searchData= -[ - ['addallowedclient_0',['AddAllowedClient',['../classlib60870_1_1_c_s104_1_1_redundancy_group.html#a971ee15ef8b50bf62d75e552dbc5a118',1,'lib60870.CS104.RedundancyGroup.AddAllowedClient(IPAddress ipAddress)'],['../classlib60870_1_1_c_s104_1_1_redundancy_group.html#a30f6faca907a9496271e7c43e12ba220',1,'lib60870.CS104.RedundancyGroup.AddAllowedClient(string ipString)']]], - ['addfile_1',['AddFile',['../classlib60870_1_1_c_s101_1_1_files_available.html#a72840ada81d664c1d63531ce022e57e5',1,'lib60870::CS101::FilesAvailable']]], - ['addinformationobject_2',['AddInformationObject',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a2cc4f6257884b76e9e9f6b40cd3037c2',1,'lib60870::CS101::ASDU']]], - ['addredundancygroup_3',['AddRedundancyGroup',['../classlib60870_1_1_c_s104_1_1_server.html#af970d8d63a4d220d54e213250e90eada',1,'lib60870::CS104::Server']]], - ['asdu_4',['ASDU',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a921d30b69cb8515973939210c0fd23b6',1,'lib60870::CS101::ASDU']]], - ['asduhandler_5',['ASDUHandler',['../namespacelib60870_1_1_c_s101.html#a494130feab85dbe337f659d383e4e8c5',1,'lib60870::CS101']]], - ['asdureceivedhandler_6',['ASDUReceivedHandler',['../namespacelib60870_1_1_c_s101.html#a95f9a71d670882525fbe3bf342cdf54e',1,'lib60870.CS101.ASDUReceivedHandler()'],['../namespacelib60870_1_1_c_s104.html#afb099e1be184222c607404d595cd6992',1,'lib60870.CS104.ASDUReceivedHandler()']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/functions_1.js b/doxygen/doxydoc.NET/html/search/functions_1.js deleted file mode 100644 index a4a3b72..0000000 --- a/doxygen/doxydoc.NET/html/search/functions_1.js +++ /dev/null @@ -1,12 +0,0 @@ -var searchData= -[ - ['certificatevalidationcallback_0',['CertificateValidationCallback',['../classlib60870_1_1_c_s104_1_1_client_connection.html#aa936b912c162118b6a9834030f924491',1,'lib60870::CS104::ClientConnection']]], - ['clocksynchronizationhandler_1',['ClockSynchronizationHandler',['../namespacelib60870_1_1_c_s101.html#a1d5c09e5cefc2e9711adad5ce978f0e7',1,'lib60870::CS101']]], - ['connect_2',['Connect',['../classlib60870_1_1_c_s104_1_1_connection.html#a2f21059cd28bf0a85f9ed4a666c6e96f',1,'lib60870::CS104::Connection']]], - ['connectasync_3',['ConnectAsync',['../classlib60870_1_1_c_s104_1_1_connection.html#af8aed177bd279389527cbfa8eede3ba6',1,'lib60870::CS104::Connection']]], - ['connection_4',['Connection',['../classlib60870_1_1_c_s104_1_1_connection.html#a6fe992399ec28f325cb953737e4006a0',1,'lib60870.CS104.Connection.Connection(string hostname, int tcpPort=2404)'],['../classlib60870_1_1_c_s104_1_1_connection.html#a3eae55571e202eb6736600f1e77ebe39',1,'lib60870.CS104.Connection.Connection(string hostname, APCIParameters apciParameters, ApplicationLayerParameters alParameters)'],['../classlib60870_1_1_c_s104_1_1_connection.html#a02efd3de4daa87455c94621c8a225eda',1,'lib60870.CS104.Connection.Connection(string hostname, int tcpPort, APCIParameters apciParameters, ApplicationLayerParameters alParameters)'],['../classlib60870_1_1_c_s104_1_1_connection.html#ab6fa4b93d7a17e5eb0eabb97e0e8360f',1,'lib60870.CS104.Connection.Connection(string hostname, TlsSecurityInformation tlsInfo, int tcpPort=19998)'],['../classlib60870_1_1_c_s104_1_1_connection.html#a54aa828ed44ffbc63fdd71d3860bf541',1,'lib60870.CS104.Connection.Connection(string hostname, int tcpPort, APCIParameters apciParameters, ApplicationLayerParameters alParameters, TlsSecurityInformation tlsInfo)']]], - ['connectionhandler_5',['ConnectionHandler',['../namespacelib60870_1_1_c_s104.html#aa16788ce99f06cdcca23787226650a74',1,'lib60870::CS104']]], - ['connectionrequesthandler_6',['ConnectionRequestHandler',['../namespacelib60870_1_1_c_s104.html#ac8c6f665636c4cd4938333429bc9b03f',1,'lib60870::CS104']]], - ['counterinterrogationhandler_7',['CounterInterrogationHandler',['../namespacelib60870_1_1_c_s101.html#a027c45142e293bb4601aa52dd83c5d15',1,'lib60870::CS101']]], - ['cs101slave_8',['CS101Slave',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a2e94b7ad7d65489e0dbe94fb76d79420',1,'lib60870.CS101.CS101Slave.CS101Slave(SerialPort port, LinkLayerParameters parameters=null)'],['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a7d63775d354c7e0b9a3b50927ed74134',1,'lib60870.CS101.CS101Slave.CS101Slave(Stream serialStream, LinkLayerParameters parameters=null)']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/functions_2.js b/doxygen/doxydoc.NET/html/search/functions_2.js deleted file mode 100644 index 6a95d33..0000000 --- a/doxygen/doxydoc.NET/html/search/functions_2.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['decode_0',['Decode',['../interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html#ad705ef8ea182c4977221c7b3cc23d632',1,'lib60870::CS101::IPrivateIOFactory']]], - ['delayacquisitionhandler_1',['DelayAcquisitionHandler',['../namespacelib60870_1_1_c_s101.html#ad94b7a69be5b593e6e694b884206d184',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/functions_3.js b/doxygen/doxydoc.NET/html/search/functions_3.js deleted file mode 100644 index 4e10a32..0000000 --- a/doxygen/doxydoc.NET/html/search/functions_3.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['enqueueasdu_0',['EnqueueASDU',['../classlib60870_1_1_c_s104_1_1_redundancy_group.html#af72be4629377a6c78f4f9733f4e251b4',1,'lib60870.CS104.RedundancyGroup.EnqueueASDU()'],['../classlib60870_1_1_c_s104_1_1_server.html#aa6f1a77ab87c08ca663ab88dcf1b9dbe',1,'lib60870.CS104.Server.EnqueueASDU()']]], - ['enqueueuserdataclass1_1',['EnqueueUserDataClass1',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a5a8573dbafd2ce027d9d7603b3347211',1,'lib60870::CS101::CS101Slave']]], - ['enqueueuserdataclass2_2',['EnqueueUserDataClass2',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a605411588ecb89ab825520cac38d547e',1,'lib60870::CS101::CS101Slave']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/functions_4.js b/doxygen/doxydoc.NET/html/search/functions_4.js deleted file mode 100644 index 9661ebd..0000000 --- a/doxygen/doxydoc.NET/html/search/functions_4.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['fileready_0',['FileReady',['../classlib60870_1_1_c_s101_1_1_file_ready.html#a109625172b98152e626a426c260295e6',1,'lib60870::CS101::FileReady']]], - ['filereadyhandler_1',['FileReadyHandler',['../namespacelib60870_1_1_c_s101.html#a0c7346f0e183f14b92c4fc6c373678e9',1,'lib60870::CS101']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/functions_5.js b/doxygen/doxydoc.NET/html/search/functions_5.js deleted file mode 100644 index 43ccb3e..0000000 --- a/doxygen/doxydoc.NET/html/search/functions_5.js +++ /dev/null @@ -1,21 +0,0 @@ -var searchData= -[ - ['getapciparameters_0',['GetAPCIParameters',['../classlib60870_1_1_c_s104_1_1_server.html#a859b8ac2c4b9cd87efc490173c8cd38a',1,'lib60870::CS104::Server']]], - ['getapplicationlayerparameters_1',['GetApplicationLayerParameters',['../classlib60870_1_1_c_s101_1_1_master.html#ac8f077926245f7194b3aba089a7ce520',1,'lib60870.CS101.Master.GetApplicationLayerParameters()'],['../classlib60870_1_1_c_s104_1_1_client_connection.html#a92d801095c3038a96b26093e7d38628a',1,'lib60870.CS104.ClientConnection.GetApplicationLayerParameters()'],['../classlib60870_1_1_c_s104_1_1_server.html#a21f35d1f590dae3b557c413e2f05d01d',1,'lib60870.CS104.Server.GetApplicationLayerParameters()']]], - ['getavailablefiles_2',['GetAvailableFiles',['../classlib60870_1_1_c_s101_1_1_slave.html#a5e85ada660492fecd182e654a75c8b42',1,'lib60870::CS101::Slave']]], - ['getca_3',['GetCA',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a8bd0b5d9ca9019f7f8dab6c43a5d7945',1,'lib60870.CS101.IFileProvider.GetCA()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#a7f9d7004443cb8285f67ef8362544313',1,'lib60870.CS101.TransparentFile.GetCA()']]], - ['getdatetime_4',['GetDateTime',['../classlib60870_1_1_c_p32_time2a.html#a57711ec4af4479936d10b2bf6df355a4',1,'lib60870.CP32Time2a.GetDateTime()'],['../classlib60870_1_1_c_p56_time2a.html#a83f9707e94051e90f0ab9b2f5dc1b3df',1,'lib60870.CP56Time2a.GetDateTime()']]], - ['getdirectory_5',['GetDirectory',['../classlib60870_1_1_c_s104_1_1_connection.html#a131c3dd3059b67c6ec0b2351c5e1e50c',1,'lib60870::CS104::Connection']]], - ['getelement_6',['GetElement',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a3d57c6dab7100c5933373231c459d31f',1,'lib60870.CS101.ASDU.GetElement(int index, PrivateInformationObjectTypes privateObjectTypes)'],['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a752cdac37f9f37c859eb4de5bf01c746',1,'lib60870.CS101.ASDU.GetElement(int index, IPrivateIOFactory ioFactory)'],['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a163ff2a748b560ecd08692a00ce83d57',1,'lib60870.CS101.ASDU.GetElement(int index)']]], - ['getencodedsize_7',['GetEncodedSize',['../classlib60870_1_1_c_s101_1_1_information_object.html#a2e5cb4ff206963db465c10d06c6e1954',1,'lib60870.CS101.InformationObject.GetEncodedSize()'],['../interfacelib60870_1_1_c_s101_1_1_i_private_i_o_factory.html#a26a0623584b57db1a35b9e8fe1b7e02c',1,'lib60870.CS101.IPrivateIOFactory.GetEncodedSize()']]], - ['getfile_8',['GetFile',['../classlib60870_1_1_c_s101_1_1_master.html#a67284f6ec618c943766040e3877acc7b',1,'lib60870.CS101.Master.GetFile()'],['../classlib60870_1_1_c_s104_1_1_connection.html#adca074f2aa74aae897fbfc85a4bbe6d5',1,'lib60870.CS104.Connection.GetFile(int ca, int ioa, NameOfFile nof, IFileReceiver receiver)'],['../classlib60870_1_1_c_s104_1_1_connection.html#a25c9f162dfde01896bb30e8f61092183',1,'lib60870.CS104.Connection.GetFile(int ca, int ioa, NameOfFile nof, IFileReceiver receiver, int timeout)']]], - ['getfiles_9',['GetFiles',['../classlib60870_1_1_c_s101_1_1_files_available.html#ad07db9fbd1ca2f1643991d7b446bf7c4',1,'lib60870::CS101::FilesAvailable']]], - ['getfilesize_10',['GetFileSize',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a6b9b192c358b22d132893c90a636daf2',1,'lib60870.CS101.IFileProvider.GetFileSize()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#a7eaa164b404cd4f32302c7f044b774ab',1,'lib60870.CS101.TransparentFile.GetFileSize()']]], - ['getioa_11',['GetIOA',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a68c3470850586f634e731dd250c957da',1,'lib60870.CS101.IFileProvider.GetIOA()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#a955484a99eb32c9a8c37a76959add633',1,'lib60870.CS101.TransparentFile.GetIOA()']]], - ['getlibraryversionstring_12',['GetLibraryVersionString',['../classlib60870_1_1_library_common.html#a3de9d184ceeaeaa3ad95bdfea5f0d902',1,'lib60870::LibraryCommon']]], - ['getmilliseconds_13',['GetMilliseconds',['../classlib60870_1_1_c_p24_time2a.html#afa47b9c056d5787d0368779f462fd2ff',1,'lib60870::CP24Time2a']]], - ['getnameoffile_14',['GetNameOfFile',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a9aa9aeb003e1e5726a5b634cfa1c5548',1,'lib60870.CS101.IFileProvider.GetNameOfFile()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#a069c64d7b35226bb030fc5e0dfcbd5bd',1,'lib60870.CS101.TransparentFile.GetNameOfFile()']]], - ['getsectionsize_15',['GetSectionSize',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a953c9bc0b2dd47ba192649ce3b954318',1,'lib60870.CS101.IFileProvider.GetSectionSize()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#a4a53ae94f1bc4d70ebac30d1af9ba596',1,'lib60870.CS101.TransparentFile.GetSectionSize()']]], - ['getsegmentdata_16',['GetSegmentData',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#a238a851573b79de09af78b4f93deb7f2',1,'lib60870.CS101.IFileProvider.GetSegmentData()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#adefa9e2224dba9bb842481db21e94216',1,'lib60870.CS101.TransparentFile.GetSegmentData()']]], - ['getstatistics_17',['GetStatistics',['../classlib60870_1_1_c_s104_1_1_connection.html#a5867e9bda4cf3d6647ebf50603e1be17',1,'lib60870::CS104::Connection']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/functions_6.js b/doxygen/doxydoc.NET/html/search/functions_6.js deleted file mode 100644 index c4f9915..0000000 --- a/doxygen/doxydoc.NET/html/search/functions_6.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['interrogationhandler_0',['InterrogationHandler',['../namespacelib60870_1_1_c_s101.html#a94c2e7c6e902d29db88c7a1d512099ed',1,'lib60870::CS101']]], - ['isrunning_1',['IsRunning',['../classlib60870_1_1_c_s104_1_1_server.html#a8d16b6e5d54bee55912a00c0cb3b28fc',1,'lib60870::CS104::Server']]], - ['istransmitbufferfull_2',['IsTransmitBufferFull',['../classlib60870_1_1_c_s104_1_1_connection.html#a079f96f5d2be9416e9c0c4518542eb07',1,'lib60870::CS104::Connection']]], - ['isuserdataclass1queuefull_3',['IsUserDataClass1QueueFull',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a9903e812bc9779389eb09e855ae3dd74',1,'lib60870::CS101::CS101Slave']]], - ['isuserdataclass2queuefull_4',['IsUserDataClass2QueueFull',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a24cdca7a10754390b15ce735f848cdb3',1,'lib60870::CS101::CS101Slave']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/functions_7.js b/doxygen/doxydoc.NET/html/search/functions_7.js deleted file mode 100644 index d39551e..0000000 --- a/doxygen/doxydoc.NET/html/search/functions_7.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['linklayerstatechanged_0',['LinkLayerStateChanged',['../namespacelib60870_1_1linklayer.html#aeca494b2e7a508585564b223d2f7851b',1,'lib60870::linklayer']]], - ['localcertificateselectioncallback_1',['LocalCertificateSelectionCallback',['../classlib60870_1_1_c_s104_1_1_connection.html#ab773a1837cbbd532d5406f05b9d3cf3f',1,'lib60870::CS104::Connection']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/functions_8.js b/doxygen/doxydoc.NET/html/search/functions_8.js deleted file mode 100644 index b3bb742..0000000 --- a/doxygen/doxydoc.NET/html/search/functions_8.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['masterconnection_5fhasunconfirmedmessages_0',['MasterConnection_hasUnconfirmedMessages',['../classlib60870_1_1_c_s104_1_1_client_connection.html#a16acd0a66071c7d1f4d111fafd7a2421',1,'lib60870::CS104::ClientConnection']]], - ['measuredvaluescaled_1',['MeasuredValueScaled',['../classlib60870_1_1_c_s101_1_1_measured_value_scaled.html#a05819e48801faf682acea7f5c53d93e7',1,'lib60870::CS101::MeasuredValueScaled']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/functions_9.js b/doxygen/doxydoc.NET/html/search/functions_9.js deleted file mode 100644 index ae44ec0..0000000 --- a/doxygen/doxydoc.NET/html/search/functions_9.js +++ /dev/null @@ -1,10 +0,0 @@ -var searchData= -[ - ['rawmessagehandler_0',['RawMessageHandler',['../namespacelib60870.html#a059755b125d35287c474551f4ffc619f',1,'lib60870']]], - ['readhandler_1',['ReadHandler',['../namespacelib60870_1_1_c_s101.html#a9230fe256069619a54c2c428acc32e06',1,'lib60870::CS101']]], - ['receivemessageloop_2',['ReceiveMessageLoop',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a19871be23f60399362713e78b8c07404',1,'lib60870::CS101::CS101Slave']]], - ['redundancygroup_3',['RedundancyGroup',['../classlib60870_1_1_c_s104_1_1_redundancy_group.html#a3bfc0c71f3919a451288a9b2581e6560',1,'lib60870::CS104::RedundancyGroup']]], - ['removefile_4',['RemoveFile',['../classlib60870_1_1_c_s101_1_1_files_available.html#a894040bf5b71a47feaa4eab80cf7a0d9',1,'lib60870::CS101::FilesAvailable']]], - ['resetprocesshandler_5',['ResetProcessHandler',['../namespacelib60870_1_1_c_s101.html#ad784b6cb8b22c0417207232c8d98e2db',1,'lib60870::CS101']]], - ['run_6',['Run',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#a4f258e8494717432a01be4ee1fcb5063',1,'lib60870.CS101.CS101Master.Run()'],['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#adeb6feabfe4b01f17bc863ea0281d79c',1,'lib60870.CS101.CS101Slave.Run()']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/functions_a.js b/doxygen/doxydoc.NET/html/search/functions_a.js deleted file mode 100644 index 3bb6b25..0000000 --- a/doxygen/doxydoc.NET/html/search/functions_a.js +++ /dev/null @@ -1,44 +0,0 @@ -var searchData= -[ - ['sendact_5fcon_0',['SendACT_CON',['../classlib60870_1_1_c_s104_1_1_client_connection.html#a677c04ff5484b981e8464af8d9f86540',1,'lib60870::CS104::ClientConnection']]], - ['sendact_5fterm_1',['SendACT_TERM',['../classlib60870_1_1_c_s104_1_1_client_connection.html#aa5d85670797c2046051a4a10071fe611',1,'lib60870::CS104::ClientConnection']]], - ['sendasdu_2',['SendASDU',['../classlib60870_1_1_c_s101_1_1_master.html#a6917b74951e51d7e80bd0ae352bd6147',1,'lib60870.CS101.Master.SendASDU()'],['../classlib60870_1_1_c_s104_1_1_client_connection.html#a92362655a693e3081af86a00a24955ef',1,'lib60870.CS104.ClientConnection.SendASDU()'],['../classlib60870_1_1_c_s104_1_1_connection.html#ac8604cef7b2781cb63a16de0bff9a308',1,'lib60870.CS104.Connection.SendASDU()']]], - ['sendclocksynccommand_3',['SendClockSyncCommand',['../classlib60870_1_1_c_s101_1_1_master.html#a71ae908a23d89528f78f061fa466104f',1,'lib60870.CS101.Master.SendClockSyncCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#aa91efa113abc4e69578a487a2a934871',1,'lib60870.CS104.Connection.SendClockSyncCommand()']]], - ['sendcontrolcommand_4',['SendControlCommand',['../classlib60870_1_1_c_s101_1_1_master.html#a83a31edf0e9e4360e4dc613735f851d5',1,'lib60870.CS101.Master.SendControlCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a5f1458066ec9a11a12ff68c7416071fa',1,'lib60870.CS104.Connection.SendControlCommand()']]], - ['sendcounterinterrogationcommand_5',['SendCounterInterrogationCommand',['../classlib60870_1_1_c_s101_1_1_master.html#a6b9a6af0acad8fa03468630363eb99a8',1,'lib60870.CS101.Master.SendCounterInterrogationCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#ae8629df4fb0e9cf3868728e52ec995ca',1,'lib60870.CS104.Connection.SendCounterInterrogationCommand()']]], - ['senddelayacquisitioncommand_6',['SendDelayAcquisitionCommand',['../classlib60870_1_1_c_s101_1_1_master.html#afbc769788f9720e9a3d63268500b8710',1,'lib60870.CS101.Master.SendDelayAcquisitionCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#af178dab629740182d7c7e07eb32a4117',1,'lib60870.CS104.Connection.SendDelayAcquisitionCommand()']]], - ['sendfile_7',['SendFile',['../classlib60870_1_1_c_s101_1_1_master.html#ad988de86e0a0ed0d052dc599b3fc98f3',1,'lib60870.CS101.Master.SendFile()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a889e1aef3301cb272286a1279ae6caa3',1,'lib60870.CS104.Connection.SendFile()']]], - ['sendinterrogationcommand_8',['SendInterrogationCommand',['../classlib60870_1_1_c_s101_1_1_master.html#ab25cd6997967e5a60943f391c2b2ddc0',1,'lib60870.CS101.Master.SendInterrogationCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a25c57d614b315bad886edbaead69bd3d',1,'lib60870.CS104.Connection.SendInterrogationCommand()']]], - ['sendlinklayertestfunction_9',['SendLinkLayerTestFunction',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a1ee5095020096c7958e2230dbd273100',1,'lib60870::CS101::CS101Slave']]], - ['sendreadcommand_10',['SendReadCommand',['../classlib60870_1_1_c_s101_1_1_master.html#a52bcf5912b59e4ac44061730c3702eb4',1,'lib60870.CS101.Master.SendReadCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#aeaa8a8dbf8e2449d0222837b9d5ae3d8',1,'lib60870.CS104.Connection.SendReadCommand()']]], - ['sendresetprocesscommand_11',['SendResetProcessCommand',['../classlib60870_1_1_c_s101_1_1_master.html#a6440a2d388ca610f80190dda3c11b623',1,'lib60870.CS101.Master.SendResetProcessCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#ab615b3065cf5248d9b9951c4e178fa80',1,'lib60870.CS104.Connection.SendResetProcessCommand(CauseOfTransmission cot, int ca, byte qrp)']]], - ['sendstartdt_12',['SendStartDT',['../classlib60870_1_1_c_s104_1_1_connection.html#a57d40edfe14bfe66f832a7647e3173ae',1,'lib60870::CS104::Connection']]], - ['sendstartdt_5fcon_13',['SendStartDT_CON',['../classlib60870_1_1_c_s104_1_1_connection.html#a65d8586e819b9c537b2461611b0bb9ca',1,'lib60870::CS104::Connection']]], - ['sendstopdt_14',['SendStopDT',['../classlib60870_1_1_c_s104_1_1_connection.html#a2510773333d6aaea354c5730f2bc139f',1,'lib60870::CS104::Connection']]], - ['sendstopdt_5fcon_15',['SendStopDT_CON',['../classlib60870_1_1_c_s104_1_1_connection.html#a6723565d01d05539a320810217955743',1,'lib60870::CS104::Connection']]], - ['sendtestcommand_16',['SendTestCommand',['../classlib60870_1_1_c_s101_1_1_master.html#a77d37b1e27cdd4eec1a314f3e2a09432',1,'lib60870.CS101.Master.SendTestCommand()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a310efefcea197178942abe509b04f463',1,'lib60870.CS104.Connection.SendTestCommand()']]], - ['sendtestcommandwithcp56time2a_17',['SendTestCommandWithCP56Time2a',['../classlib60870_1_1_c_s101_1_1_master.html#a97c6f3b896c0588761bb1b113ef7f7be',1,'lib60870.CS101.Master.SendTestCommandWithCP56Time2a()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a3d38dafcc825eb9bba7258c2525a56ad',1,'lib60870.CS104.Connection.SendTestCommandWithCP56Time2a(int ca, ushort tsc, CP56Time2a time)']]], - ['sendtestfr_5fact_18',['SendTestFR_ACT',['../classlib60870_1_1_c_s104_1_1_connection.html#afe81514340488a718a49706233816052',1,'lib60870::CS104::Connection']]], - ['sendtestfr_5fcon_19',['SendTestFR_CON',['../classlib60870_1_1_c_s104_1_1_connection.html#a876db462369040f272cddd144833ab56',1,'lib60870::CS104::Connection']]], - ['server_20',['Server',['../classlib60870_1_1_c_s104_1_1_server.html#aae44fa0f507ea4b8d343686a9345e419',1,'lib60870.CS104.Server.Server()'],['../classlib60870_1_1_c_s104_1_1_server.html#a12b5bdf509e0b569295b8821c016770b',1,'lib60870.CS104.Server.Server(TlsSecurityInformation securityInfo)'],['../classlib60870_1_1_c_s104_1_1_server.html#a4b25619314b9e2586d21d83f3ed9fcd0',1,'lib60870.CS104.Server.Server(APCIParameters apciParameters, ApplicationLayerParameters alParameters)'],['../classlib60870_1_1_c_s104_1_1_server.html#a4a25393ccd928dc4abbb13c14e3579c2',1,'lib60870.CS104.Server.Server(APCIParameters apciParameters, ApplicationLayerParameters alParameters, TlsSecurityInformation securityInfo)']]], - ['setasduhandler_21',['SetASDUHandler',['../classlib60870_1_1_c_s101_1_1_slave.html#a5bde494544e568d0d9c25b43449eb8ee',1,'lib60870::CS101::Slave']]], - ['setasdureceivedhandler_22',['SetASDUReceivedHandler',['../classlib60870_1_1_c_s104_1_1_connection.html#a7fd6fb3ca802d91197f1927f2e4f8712',1,'lib60870::CS104::Connection']]], - ['setclocksynchronizationhandler_23',['SetClockSynchronizationHandler',['../classlib60870_1_1_c_s101_1_1_slave.html#a83b600bacb0829048c432686991db8a7',1,'lib60870::CS101::Slave']]], - ['setconnectioneventhandler_24',['SetConnectionEventHandler',['../classlib60870_1_1_c_s104_1_1_server.html#afa4ae496c2260bc6b501a60259c35282',1,'lib60870::CS104::Server']]], - ['setconnectionhandler_25',['SetConnectionHandler',['../classlib60870_1_1_c_s104_1_1_connection.html#afa545f647708d76bc23b3e5cbad1ac46',1,'lib60870::CS104::Connection']]], - ['setconnectionrequesthandler_26',['SetConnectionRequestHandler',['../classlib60870_1_1_c_s104_1_1_server.html#a8c3dbeea77158bb5014d9739bb8f1116',1,'lib60870::CS104::Server']]], - ['setconnecttimeout_27',['SetConnectTimeout',['../classlib60870_1_1_c_s104_1_1_connection.html#af5de8a91a2f77bfa69421b3e3da9276e',1,'lib60870::CS104::Connection']]], - ['setcounterinterrogationhandler_28',['SetCounterInterrogationHandler',['../classlib60870_1_1_c_s101_1_1_slave.html#ad6e8b2878a13fea3b23b0b41b4da2983',1,'lib60870::CS101::Slave']]], - ['setfilereadyhandler_29',['SetFileReadyHandler',['../classlib60870_1_1_c_s101_1_1_slave.html#a3d25c95061010fa26c02cca5de0ae3cd',1,'lib60870::CS101::Slave']]], - ['setinterrogationhandler_30',['SetInterrogationHandler',['../classlib60870_1_1_c_s101_1_1_slave.html#af5871de4b26756b7b6f88e7acdc96e84',1,'lib60870::CS101::Slave']]], - ['setlocaladdress_31',['SetLocalAddress',['../classlib60870_1_1_c_s104_1_1_server.html#af7db8efa36f1bfc559ac96308a907d07',1,'lib60870.CS104.Server.SetLocalAddress()'],['../classlib60870_1_1linklayer_1_1_tcp_server_virtual_serial_port.html#a52cf94c390fdb9de1da505a259dc85a1',1,'lib60870.linklayer.TcpServerVirtualSerialPort.SetLocalAddress()']]], - ['setlocalport_32',['SetLocalPort',['../classlib60870_1_1_c_s104_1_1_server.html#aa3ddaa0a4c43ca80f35f523d84347753',1,'lib60870::CS104::Server']]], - ['setreadhandler_33',['SetReadHandler',['../classlib60870_1_1_c_s101_1_1_slave.html#a7f0490bec09dbf3a8fb1e1e8e21503c0',1,'lib60870::CS101::Slave']]], - ['setreceivedrawmessagehandler_34',['SetReceivedRawMessageHandler',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a01bd8b909386de3b9426d5c953a716e3',1,'lib60870.CS101.CS101Slave.SetReceivedRawMessageHandler()'],['../classlib60870_1_1_c_s101_1_1_master.html#a43ddedf33710bf27df6f10265787d359',1,'lib60870.CS101.Master.SetReceivedRawMessageHandler()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a54fa6f1012457a6e0f492441cc4bfa23',1,'lib60870.CS104.Connection.SetReceivedRawMessageHandler()']]], - ['setsentrawmessagehandler_35',['SetSentRawMessageHandler',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a0fa4e121ca94fc5a017587c1382d7f42',1,'lib60870.CS101.CS101Slave.SetSentRawMessageHandler()'],['../classlib60870_1_1_c_s101_1_1_master.html#ac850d2199ac83075bfe52648eec57993',1,'lib60870.CS101.Master.SetSentRawMessageHandler()'],['../classlib60870_1_1_c_s104_1_1_connection.html#a787c8ff4943b9991328550f69807ef6e',1,'lib60870.CS104.Connection.SetSentRawMessageHandler()']]], - ['settimeouts_36',['SetTimeouts',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#a1a60eeb2565d2111ecea43db4e4b1909',1,'lib60870::CS101::CS101Master']]], - ['settlssecurity_37',['SetTlsSecurity',['../classlib60870_1_1_c_s104_1_1_connection.html#a33eae01473eb5dc6545a74601b3d9a85',1,'lib60870::CS104::Connection']]], - ['setuserdataqueuesizes_38',['SetUserDataQueueSizes',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a6c28db4c5b92dbc3b67e25d86c5a19df',1,'lib60870::CS101::CS101Slave']]], - ['start_39',['Start',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#a5bcaaddeb16ce3472d5567d430cf304d',1,'lib60870.CS101.CS101Master.Start()'],['../classlib60870_1_1_c_s104_1_1_server.html#af8d37c78f23fafbb74091b7d3d0ed684',1,'lib60870.CS104.Server.Start()'],['../classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html#a1417a91389e864dd32cff7e80def1021',1,'lib60870.linklayer.TcpClientVirtualSerialPort.Start()']]], - ['stop_40',['Stop',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#a4b4ca2b56ec115d9b5f1eba13ff5c22a',1,'lib60870.CS101.CS101Master.Stop()'],['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#a6502368270e7b7efa3a59778d58bda3a',1,'lib60870.CS101.CS101Slave.Stop()'],['../classlib60870_1_1_c_s104_1_1_server.html#a07fc33e78e4b8d156e1bbe08170c62cf',1,'lib60870.CS104.Server.Stop()'],['../classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html#aba1035cd8d8a91290dd7d19ec48bfb34',1,'lib60870.linklayer.TcpClientVirtualSerialPort.Stop()']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/functions_b.js b/doxygen/doxydoc.NET/html/search/functions_b.js deleted file mode 100644 index 7d95a96..0000000 --- a/doxygen/doxydoc.NET/html/search/functions_b.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['tcpclientvirtualserialport_0',['TcpClientVirtualSerialPort',['../classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html#a38baef0d15205486d0f5d07106473836',1,'lib60870::linklayer::TcpClientVirtualSerialPort']]], - ['tcpconnectioneventhandler_1',['TcpConnectionEventHandler',['../namespacelib60870_1_1linklayer.html#a4bb957c442dc029dac0241ceef925e65',1,'lib60870::linklayer']]], - ['transfercomplete_2',['TransferComplete',['../interfacelib60870_1_1_c_s101_1_1_i_file_provider.html#ada2d36e95fe8caf9a22d04fcd77b6a8f',1,'lib60870.CS101.IFileProvider.TransferComplete()'],['../classlib60870_1_1_c_s101_1_1_transparent_file.html#a533ea7bd0c80d98d5ea48748c14ee376',1,'lib60870.CS101.TransparentFile.TransferComplete()']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/functions_c.js b/doxygen/doxydoc.NET/html/search/functions_c.js deleted file mode 100644 index 1be07f4..0000000 --- a/doxygen/doxydoc.NET/html/search/functions_c.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['useslaveaddress_0',['UseSlaveAddress',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#a9923e8174758fdfa15198fcbde7502de',1,'lib60870::CS101::CS101Master']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/mag.svg b/doxygen/doxydoc.NET/html/search/mag.svg deleted file mode 100644 index ffb6cf0..0000000 --- a/doxygen/doxydoc.NET/html/search/mag.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - diff --git a/doxygen/doxydoc.NET/html/search/mag_d.svg b/doxygen/doxydoc.NET/html/search/mag_d.svg deleted file mode 100644 index 4122773..0000000 --- a/doxygen/doxydoc.NET/html/search/mag_d.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - diff --git a/doxygen/doxydoc.NET/html/search/mag_sel.svg b/doxygen/doxydoc.NET/html/search/mag_sel.svg deleted file mode 100644 index 553dba8..0000000 --- a/doxygen/doxydoc.NET/html/search/mag_sel.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - diff --git a/doxygen/doxydoc.NET/html/search/mag_seld.svg b/doxygen/doxydoc.NET/html/search/mag_seld.svg deleted file mode 100644 index c906f84..0000000 --- a/doxygen/doxydoc.NET/html/search/mag_seld.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - diff --git a/doxygen/doxydoc.NET/html/search/namespaces_0.js b/doxygen/doxydoc.NET/html/search/namespaces_0.js deleted file mode 100644 index 1b59335..0000000 --- a/doxygen/doxydoc.NET/html/search/namespaces_0.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['lib60870_0',['lib60870',['../namespacelib60870.html',1,'']]], - ['lib60870_3a_3acs101_1',['CS101',['../namespacelib60870_1_1_c_s101.html',1,'lib60870']]], - ['lib60870_3a_3acs104_2',['CS104',['../namespacelib60870_1_1_c_s104.html',1,'lib60870']]], - ['lib60870_3a_3alinklayer_3',['linklayer',['../namespacelib60870_1_1linklayer.html',1,'lib60870']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/pages_0.js b/doxygen/doxydoc.NET/html/search/pages_0.js deleted file mode 100644 index 0eff422..0000000 --- a/doxygen/doxydoc.NET/html/search/pages_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['0_0',['README lib60870.NET v2.3.0',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html',1,'']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/pages_1.js b/doxygen/doxydoc.NET/html/search/pages_1.js deleted file mode 100644 index a6774a2..0000000 --- a/doxygen/doxydoc.NET/html/search/pages_1.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['3_200_0',['README lib60870.NET v2.3.0',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html',1,'']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/pages_2.js b/doxygen/doxydoc.NET/html/search/pages_2.js deleted file mode 100644 index 80f0821..0000000 --- a/doxygen/doxydoc.NET/html/search/pages_2.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['lib60870_20net_20v2_203_200_0',['README lib60870.NET v2.3.0',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html',1,'']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/pages_3.js b/doxygen/doxydoc.NET/html/search/pages_3.js deleted file mode 100644 index 4357da0..0000000 --- a/doxygen/doxydoc.NET/html/search/pages_3.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['net_20v2_203_200_0',['README lib60870.NET v2.3.0',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html',1,'']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/pages_4.js b/doxygen/doxydoc.NET/html/search/pages_4.js deleted file mode 100644 index cce4970..0000000 --- a/doxygen/doxydoc.NET/html/search/pages_4.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['readme_20lib60870_20net_20v2_203_200_0',['README lib60870.NET v2.3.0',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html',1,'']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/pages_5.js b/doxygen/doxydoc.NET/html/search/pages_5.js deleted file mode 100644 index 2e7c1fa..0000000 --- a/doxygen/doxydoc.NET/html/search/pages_5.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['v2_203_200_0',['README lib60870.NET v2.3.0',['../md__c_1_2_users_2_ilyes_bekaddour_2_desktop_2_workspace_2lib60870_8net_2lib60870_2readme.html',1,'']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/properties_0.js b/doxygen/doxydoc.NET/html/search/properties_0.js deleted file mode 100644 index bc9f4cb..0000000 --- a/doxygen/doxydoc.NET/html/search/properties_0.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['ackqualifier_0',['AckQualifier',['../classlib60870_1_1_c_s101_1_1_file_a_c_k.html#a9f6b95cc90ebe3515dff6af81c294d81',1,'lib60870::CS101::FileACK']]], - ['addresslength_1',['AddressLength',['../classlib60870_1_1linklayer_1_1_link_layer_parameters.html#abfa30c4ae394e96224933817b768d248',1,'lib60870::linklayer::LinkLayerParameters']]], - ['adjusted_2',['Adjusted',['../classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#aacf2720e880dbb0f70ea212c59c8e31f',1,'lib60870::CS101::BinaryCounterReading']]], - ['allowonlyspecificcertificates_3',['AllowOnlySpecificCertificates',['../classlib60870_1_1_c_s104_1_1_tls_security_information.html#aecf70336635c0bfe0fe713a5e427fa3e',1,'lib60870::CS104::TlsSecurityInformation']]], - ['autostart_4',['Autostart',['../classlib60870_1_1_c_s104_1_1_connection.html#aa941946c92bfe52f71c137c3fbf6d601',1,'lib60870::CS104::Connection']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/properties_1.js b/doxygen/doxydoc.NET/html/search/properties_1.js deleted file mode 100644 index 8b42780..0000000 --- a/doxygen/doxydoc.NET/html/search/properties_1.js +++ /dev/null @@ -1,15 +0,0 @@ -var searchData= -[ - ['ca_0',['Ca',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a5d217b9cc0ecf22e127aa25c89e8a2f1',1,'lib60870::CS101::ASDU']]], - ['carry_1',['Carry',['../classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#a8d73e781be2f98f00d09f91e0c3d774a',1,'lib60870::CS101::BinaryCounterReading']]], - ['certificatevalidationcallback_2',['CertificateValidationCallback',['../classlib60870_1_1_c_s104_1_1_tls_security_information.html#ab90e1e052fa15e1b211109d30529b491',1,'lib60870::CS104::TlsSecurityInformation']]], - ['chainvalidation_3',['ChainValidation',['../classlib60870_1_1_c_s104_1_1_tls_security_information.html#a2b367122104e8ac1469d6240c427fe86',1,'lib60870::CS104::TlsSecurityInformation']]], - ['chs_4',['CHS',['../classlib60870_1_1_c_s101_1_1_file_last_segment_or_section.html#af2302361352eb1447b4bfb6541772c50',1,'lib60870::CS101::FileLastSegmentOrSection']]], - ['cl1_5',['CL1',['../classlib60870_1_1_c_s101_1_1_output_circuit_info.html#ac474a5e41cac7e82a2225cb27792fcf7',1,'lib60870::CS101::OutputCircuitInfo']]], - ['cl2_6',['CL2',['../classlib60870_1_1_c_s101_1_1_output_circuit_info.html#a6507ca6be64921d3931911033d496661',1,'lib60870::CS101::OutputCircuitInfo']]], - ['cl3_7',['CL3',['../classlib60870_1_1_c_s101_1_1_output_circuit_info.html#ad9d84ee2a4315546c531867e4d9a5e28',1,'lib60870::CS101::OutputCircuitInfo']]], - ['coi_8',['COI',['../classlib60870_1_1_c_s101_1_1_end_of_initialization.html#ad48e8ec133c8bf5ed7f389063492d67b',1,'lib60870::CS101::EndOfInitialization']]], - ['connected_9',['Connected',['../classlib60870_1_1linklayer_1_1_tcp_client_virtual_serial_port.html#a8e6479066b29f09067340b7fc1b29cbc',1,'lib60870::linklayer::TcpClientVirtualSerialPort']]], - ['connecttimeout_10',['ConnectTimeout',['../classlib60870_1_1_c_s104_1_1_connection.html#a5bc80935ee36a7bcca2c4807f0abeed4',1,'lib60870::CS104::Connection']]], - ['cot_11',['Cot',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a68dd2e6df66c5c4298a357ac5da8fed1',1,'lib60870::CS101::ASDU']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/properties_10.js b/doxygen/doxydoc.NET/html/search/properties_10.js deleted file mode 100644 index 01a289c..0000000 --- a/doxygen/doxydoc.NET/html/search/properties_10.js +++ /dev/null @@ -1,22 +0,0 @@ -var searchData= -[ - ['scq_0',['SCQ',['../classlib60870_1_1_c_s101_1_1_file_call_or_select.html#a6acae49243536a7db32643ffccdc17c8',1,'lib60870::CS101::FileCallOrSelect']]], - ['second_1',['Second',['../classlib60870_1_1_c_p24_time2a.html#a44e08d428c8cbb76a84836b2ed19ae60',1,'lib60870.CP24Time2a.Second'],['../classlib60870_1_1_c_p32_time2a.html#ae0c845c0ce9555c5ea2dd8514b6222dd',1,'lib60870.CP32Time2a.Second'],['../classlib60870_1_1_c_p56_time2a.html#a02627aa0a76a5e3bfd4007a07f042a2c',1,'lib60870.CP56Time2a.Second']]], - ['select_2',['Select',['../classlib60870_1_1_c_s101_1_1_single_command.html#a1829a95a868ed80cae41cc66f8d23867',1,'lib60870::CS101::SingleCommand']]], - ['sendsequencenumber_3',['SendSequenceNumber',['../classlib60870_1_1_c_s104_1_1_connection.html#a38bffb6d3d17033d40383529aa69c105',1,'lib60870::CS104::Connection']]], - ['sentmsgcounter_4',['SentMsgCounter',['../classlib60870_1_1_c_s104_1_1_connection_statistics.html#ad04c56b6a2a9520d5296c56d12f2b5b0',1,'lib60870::CS104::ConnectionStatistics']]], - ['sequencenumber_5',['SequenceNumber',['../classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#ae04563ca55ecc0df58e80263d50db184',1,'lib60870::CS101::BinaryCounterReading']]], - ['servermode_6',['ServerMode',['../classlib60870_1_1_c_s104_1_1_server.html#a9c05718964db1a69771955715585c4da',1,'lib60870::CS104::Server']]], - ['sie_7',['SIE',['../classlib60870_1_1_c_s101_1_1_start_event.html#a63a1bca793fe829680fc745c8b537b1d',1,'lib60870::CS101::StartEvent']]], - ['sl1_8',['SL1',['../classlib60870_1_1_c_s101_1_1_start_event.html#a53c47cb469138b00f2d266da9ee91338',1,'lib60870::CS101::StartEvent']]], - ['sl2_9',['SL2',['../classlib60870_1_1_c_s101_1_1_start_event.html#a43c8205b9e5b018a89c57658d2fc7443',1,'lib60870::CS101::StartEvent']]], - ['sl3_10',['SL3',['../classlib60870_1_1_c_s101_1_1_start_event.html#a686791b47a50ff83badd20384b00a604',1,'lib60870::CS101::StartEvent']]], - ['slaveaddress_11',['SlaveAddress',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#aa7d93ac85baacaeaa6c70abce6856f58',1,'lib60870::CS101::CS101Master']]], - ['sof_12',['SOF',['../classlib60870_1_1_c_s101_1_1_file_directory.html#af1f8d171f735aae0eed368015a3be40d',1,'lib60870::CS101::FileDirectory']]], - ['srd_13',['SRD',['../classlib60870_1_1_c_s101_1_1_start_event.html#a058cea08569048ffde04da4dab3630d7',1,'lib60870::CS101::StartEvent']]], - ['srq_14',['SRQ',['../classlib60870_1_1_c_s101_1_1_section_ready.html#a5bbd3b419683eaa394c20ca9e3f1ba34',1,'lib60870::CS101::SectionReady']]], - ['state_15',['State',['../classlib60870_1_1_c_s101_1_1_single_command.html#ae642167ac8c59c6a2f5552919c3606a4',1,'lib60870::CS101::SingleCommand']]], - ['substitued_16',['Substitued',['../classlib60870_1_1_c_p24_time2a.html#a4400a44009413f637412cb34d7d73820',1,'lib60870::CP24Time2a']]], - ['substituted_17',['Substituted',['../classlib60870_1_1_c_p32_time2a.html#ae4e8f2da41474e5fbeb67412cb1a1523',1,'lib60870.CP32Time2a.Substituted'],['../classlib60870_1_1_c_p56_time2a.html#a3b8f17e2e0ea8e6482dfae2fbea87173',1,'lib60870.CP56Time2a.Substituted']]], - ['supportssequence_18',['SupportsSequence',['../classlib60870_1_1_c_s101_1_1_information_object.html#a8e277f6a5d421d25ae9c9eb9b169887e',1,'lib60870::CS101::InformationObject']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/properties_11.js b/doxygen/doxydoc.NET/html/search/properties_11.js deleted file mode 100644 index 34a7ecd..0000000 --- a/doxygen/doxydoc.NET/html/search/properties_11.js +++ /dev/null @@ -1,15 +0,0 @@ -var searchData= -[ - ['t0_0',['T0',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#adb7f9816ddbbf8925f5372308efed78f',1,'lib60870::CS104::APCIParameters']]], - ['t1_1',['T1',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#a11f40dff24e0352eb76b4d456afe9e68',1,'lib60870::CS104::APCIParameters']]], - ['t2_2',['T2',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#a0320d85982ccb2814e8829c51d4eb7b8',1,'lib60870::CS104::APCIParameters']]], - ['t3_3',['T3',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#ad68a65bbce99a4a7533a8c1291a52e0a',1,'lib60870::CS104::APCIParameters']]], - ['time_4',['Time',['../classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html#abcedc8616644f69702da1eb4dddb1860',1,'lib60870::CS101::TestCommandWithCP56Time2a']]], - ['timeoutforack_5',['TimeoutForACK',['../classlib60870_1_1linklayer_1_1_link_layer_parameters.html#a2f97069460fa1a3873ca1cf91331d739',1,'lib60870::linklayer::LinkLayerParameters']]], - ['timeoutlinkstate_6',['TimeoutLinkState',['../classlib60870_1_1linklayer_1_1_link_layer_parameters.html#ac79c13d5078a838e029e78a588e261a1',1,'lib60870::linklayer::LinkLayerParameters']]], - ['timeoutrepeat_7',['TimeoutRepeat',['../classlib60870_1_1linklayer_1_1_link_layer_parameters.html#a8907a50f70413012cf82de440e2b5581',1,'lib60870::linklayer::LinkLayerParameters']]], - ['transient_8',['Transient',['../classlib60870_1_1_c_s101_1_1_step_position_information.html#aba392b47665d183b882892dc252f285f',1,'lib60870::CS101::StepPositionInformation']]], - ['tsc_9',['TSC',['../classlib60870_1_1_c_s101_1_1_test_command_with_c_p56_time2a.html#ae5a610ff07bf26fbc6eb1e54efbd99df',1,'lib60870::CS101::TestCommandWithCP56Time2a']]], - ['type_10',['Type',['../classlib60870_1_1_c_s101_1_1_information_object.html#af2eba7ad5825d5d34258ce9747a615be',1,'lib60870::CS101::InformationObject']]], - ['typeid_11',['TypeId',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#ab0c3a8cae06afc0eea93c454815feb23',1,'lib60870::CS101::ASDU']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/properties_12.js b/doxygen/doxydoc.NET/html/search/properties_12.js deleted file mode 100644 index f5d271e..0000000 --- a/doxygen/doxydoc.NET/html/search/properties_12.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['usesendmessagequeue_0',['UseSendMessageQueue',['../classlib60870_1_1_c_s104_1_1_connection.html#a452b4617dc369f3e9d6f509a0634fc21',1,'lib60870::CS104::Connection']]], - ['usesinglecharack_1',['UseSingleCharACK',['../classlib60870_1_1linklayer_1_1_link_layer_parameters.html#a35b88393725992cef49bbf6f7e196c5b',1,'lib60870::linklayer::LinkLayerParameters']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/properties_13.js b/doxygen/doxydoc.NET/html/search/properties_13.js deleted file mode 100644 index 78a5e60..0000000 --- a/doxygen/doxydoc.NET/html/search/properties_13.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['value_0',['Value',['../classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#a548b83c567fc345f85573f31d3a71f03',1,'lib60870.CS101.BinaryCounterReading.Value'],['../classlib60870_1_1_c_s101_1_1_step_position_information.html#a00370bb63d3ec53ded04f4d8108990cf',1,'lib60870.CS101.StepPositionInformation.Value']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/properties_14.js b/doxygen/doxydoc.NET/html/search/properties_14.js deleted file mode 100644 index ceac164..0000000 --- a/doxygen/doxydoc.NET/html/search/properties_14.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['w_0',['W',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#ac86b4a16c31fd7ad6af55e6c7b6f048b',1,'lib60870::CS104::APCIParameters']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/properties_15.js b/doxygen/doxydoc.NET/html/search/properties_15.js deleted file mode 100644 index 9eedd8c..0000000 --- a/doxygen/doxydoc.NET/html/search/properties_15.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['year_0',['Year',['../classlib60870_1_1_c_p56_time2a.html#acd2210101a5b5235b4779e3ecf00527e',1,'lib60870::CP56Time2a']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/properties_2.js b/doxygen/doxydoc.NET/html/search/properties_2.js deleted file mode 100644 index ab84257..0000000 --- a/doxygen/doxydoc.NET/html/search/properties_2.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['dayofmonth_0',['DayOfMonth',['../classlib60870_1_1_c_p56_time2a.html#a533808a9bd35fd250ff3197ce8b4e8fa',1,'lib60870::CP56Time2a']]], - ['dayofweek_1',['DayOfWeek',['../classlib60870_1_1_c_p56_time2a.html#afddcdbd7c4557c88032eb519a57b4019',1,'lib60870::CP56Time2a']]], - ['dir_2',['DIR',['../classlib60870_1_1_c_s101_1_1_c_s101_master.html#aceff4f3985519a296c989418c7ad71b0',1,'lib60870.CS101.CS101Master.DIR'],['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#ae1d00e6ee950d56d5487384070651148',1,'lib60870.CS101.CS101Slave.DIR']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/properties_3.js b/doxygen/doxydoc.NET/html/search/properties_3.js deleted file mode 100644 index 2af59bf..0000000 --- a/doxygen/doxydoc.NET/html/search/properties_3.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['enqueuemode_0',['EnqueueMode',['../classlib60870_1_1_c_s104_1_1_server.html#a102d175703f4f357e5749265352ce71e',1,'lib60870::CS104::Server']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/properties_4.js b/doxygen/doxydoc.NET/html/search/properties_4.js deleted file mode 100644 index 1545973..0000000 --- a/doxygen/doxydoc.NET/html/search/properties_4.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['filetimeout_0',['FileTimeout',['../classlib60870_1_1_c_s101_1_1_slave.html#a063b9d1a19a2960a91afc69204cc11f7',1,'lib60870::CS101::Slave']]], - ['frq_1',['FRQ',['../classlib60870_1_1_c_s101_1_1_file_ready.html#a68e7d332f311fb83d9bb617b6e54ec0a',1,'lib60870::CS101::FileReady']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/properties_5.js b/doxygen/doxydoc.NET/html/search/properties_5.js deleted file mode 100644 index b1ceec5..0000000 --- a/doxygen/doxydoc.NET/html/search/properties_5.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['gc_0',['GC',['../classlib60870_1_1_c_s101_1_1_output_circuit_info.html#a1eeab57adef2da4f97af4fc96b07ad6c',1,'lib60870::CS101::OutputCircuitInfo']]], - ['gs_1',['GS',['../classlib60870_1_1_c_s101_1_1_start_event.html#a6cf3d354c2df01eb808748353f743b33',1,'lib60870::CS101::StartEvent']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/properties_6.js b/doxygen/doxydoc.NET/html/search/properties_6.js deleted file mode 100644 index d6aecbc..0000000 --- a/doxygen/doxydoc.NET/html/search/properties_6.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['hour_0',['Hour',['../classlib60870_1_1_c_p32_time2a.html#a4cfa66063d1b214990d69515af388552',1,'lib60870.CP32Time2a.Hour'],['../classlib60870_1_1_c_p56_time2a.html#a34891c411294a0cb5bf2f1d4adb3286a',1,'lib60870.CP56Time2a.Hour']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/properties_7.js b/doxygen/doxydoc.NET/html/search/properties_7.js deleted file mode 100644 index e151091..0000000 --- a/doxygen/doxydoc.NET/html/search/properties_7.js +++ /dev/null @@ -1,10 +0,0 @@ -var searchData= -[ - ['invalid_0',['Invalid',['../classlib60870_1_1_c_p24_time2a.html#acb0606324a0b221df177d242cd97f7c7',1,'lib60870.CP24Time2a.Invalid'],['../classlib60870_1_1_c_p32_time2a.html#a9bc00071f0d79994977adcc9ea1564b4',1,'lib60870.CP32Time2a.Invalid'],['../classlib60870_1_1_c_p56_time2a.html#a7c00ef3b8b3f7fb1bb9a6cad0440f6dd',1,'lib60870.CP56Time2a.Invalid'],['../classlib60870_1_1_c_s101_1_1_binary_counter_reading.html#a9c84bd5840b810546affba3f452b11e0',1,'lib60870.CS101.BinaryCounterReading.Invalid']]], - ['isactive_1',['IsActive',['../classlib60870_1_1_c_s104_1_1_client_connection.html#afa8806c545bf905a3548afa9732de38b',1,'lib60870::CS104::ClientConnection']]], - ['iscatchall_2',['IsCatchAll',['../classlib60870_1_1_c_s104_1_1_redundancy_group.html#aa09df33fcd23dcf486800f45f3d41d32',1,'lib60870::CS104::RedundancyGroup']]], - ['isnegative_3',['IsNegative',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a808a4ea51526b2ecbe0d9e23df1a018b',1,'lib60870::CS101::ASDU']]], - ['isrunning_4',['IsRunning',['../classlib60870_1_1_c_s104_1_1_connection.html#a83f3dfb64fa61b1d3fef93e938c692a1',1,'lib60870::CS104::Connection']]], - ['issequence_5',['IsSequence',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a874af72bec9618876b47a8da155de96f',1,'lib60870::CS101::ASDU']]], - ['istest_6',['IsTest',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#ae315fe2504e41a213cd76330cb56cc24',1,'lib60870::CS101::ASDU']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/properties_8.js b/doxygen/doxydoc.NET/html/search/properties_8.js deleted file mode 100644 index bf97588..0000000 --- a/doxygen/doxydoc.NET/html/search/properties_8.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['k_0',['K',['../classlib60870_1_1_c_s104_1_1_a_p_c_i_parameters.html#a0e3fc557d1c66308e6e38383ec9a5287',1,'lib60870::CS104::APCIParameters']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/properties_9.js b/doxygen/doxydoc.NET/html/search/properties_9.js deleted file mode 100644 index f4ef325..0000000 --- a/doxygen/doxydoc.NET/html/search/properties_9.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['linklayeraddress_0',['LinkLayerAddress',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#aeb21ec9a8522c48ad37c263762d300a4',1,'lib60870::CS101::CS101Slave']]], - ['linklayeraddressotherstation_1',['LinkLayerAddressOtherStation',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#aa3c5ac017a1ea8fdbbb686c52076cc75',1,'lib60870::CS101::CS101Slave']]], - ['linklayermode_2',['LinkLayerMode',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#ad9d9bad745efb1fd3ce5bcbe894f6d97',1,'lib60870::CS101::CS101Slave']]], - ['localipaddress_3',['LocalIpAddress',['../classlib60870_1_1_c_s104_1_1_connection.html#abfa6d1581b6702a9f1dbdb96a79f5bc3',1,'lib60870::CS104::Connection']]], - ['localtcpport_4',['LocalTcpPort',['../classlib60870_1_1_c_s104_1_1_connection.html#a871e51aa4130ab9185014a4a845fdd2a',1,'lib60870::CS104::Connection']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/properties_a.js b/doxygen/doxydoc.NET/html/search/properties_a.js deleted file mode 100644 index 4209a12..0000000 --- a/doxygen/doxydoc.NET/html/search/properties_a.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['maxhighprioqueuesize_0',['MaxHighPrioQueueSize',['../classlib60870_1_1_c_s104_1_1_server.html#a408a31dd3cf6e781d7295804bd96d767',1,'lib60870::CS104::Server']]], - ['maxopenconnections_1',['MaxOpenConnections',['../classlib60870_1_1_c_s104_1_1_server.html#adcea16c6c2db799bc5b6750e82ca2235',1,'lib60870::CS104::Server']]], - ['maxqueuesize_2',['MaxQueueSize',['../classlib60870_1_1_c_s104_1_1_server.html#acef2c82d580d17114847df8409f6bf4f',1,'lib60870::CS104::Server']]], - ['millisecond_3',['Millisecond',['../classlib60870_1_1_c_p24_time2a.html#a54e60600dccb34252b428488223f419e',1,'lib60870.CP24Time2a.Millisecond'],['../classlib60870_1_1_c_p32_time2a.html#a144afbb4092fbe1a3196f30cba13fc37',1,'lib60870.CP32Time2a.Millisecond'],['../classlib60870_1_1_c_p56_time2a.html#a2e0c82ecba6b07880f9416101f004ecc',1,'lib60870.CP56Time2a.Millisecond']]], - ['minute_4',['Minute',['../classlib60870_1_1_c_p24_time2a.html#a1bdb66a13e77ea4ca5938c7609a38225',1,'lib60870.CP24Time2a.Minute'],['../classlib60870_1_1_c_p32_time2a.html#a723b8ffeb4915b7347aa97c65b2f4365',1,'lib60870.CP32Time2a.Minute'],['../classlib60870_1_1_c_p56_time2a.html#af5a5ead5f041e47e0f4e201acb707d13',1,'lib60870.CP56Time2a.Minute']]], - ['month_5',['Month',['../classlib60870_1_1_c_p56_time2a.html#aeda1719c2e81de05a616f166036ef1f7',1,'lib60870::CP56Time2a']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/properties_b.js b/doxygen/doxydoc.NET/html/search/properties_b.js deleted file mode 100644 index 73f7af5..0000000 --- a/doxygen/doxydoc.NET/html/search/properties_b.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['name_0',['Name',['../classlib60870_1_1_c_s104_1_1_redundancy_group.html#ab5d3a9a8d2fcca1e07fbb547cd072248',1,'lib60870::CS104::RedundancyGroup']]], - ['numberofelements_1',['NumberOfElements',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a8ab49764dd886c58be639d229e664af5',1,'lib60870::CS101::ASDU']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/properties_c.js b/doxygen/doxydoc.NET/html/search/properties_c.js deleted file mode 100644 index 2d1ad2c..0000000 --- a/doxygen/doxydoc.NET/html/search/properties_c.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['oa_0',['Oa',['../classlib60870_1_1_c_s101_1_1_a_s_d_u.html#a73566a1f53fc1c1492804c4bcf068438',1,'lib60870::CS101::ASDU']]], - ['openconnections_1',['OpenConnections',['../classlib60870_1_1_c_s104_1_1_server.html#a63dda97b27c78743dee7374d66cdda53',1,'lib60870::CS104::Server']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/properties_d.js b/doxygen/doxydoc.NET/html/search/properties_d.js deleted file mode 100644 index 0391ace..0000000 --- a/doxygen/doxydoc.NET/html/search/properties_d.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['parameters_0',['Parameters',['../classlib60870_1_1_c_s101_1_1_c_s101_slave.html#ab063f08cb01b7c3ca5bdc86cbafec7d2',1,'lib60870::CS101::CS101Slave']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/properties_e.js b/doxygen/doxydoc.NET/html/search/properties_e.js deleted file mode 100644 index 970012d..0000000 --- a/doxygen/doxydoc.NET/html/search/properties_e.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['qcc_0',['QCC',['../classlib60870_1_1_c_s101_1_1_counter_interrogation_command.html#a839093d6c7666896a4bcf2c9b079564e',1,'lib60870::CS101::CounterInterrogationCommand']]], - ['qpa_1',['QPA',['../classlib60870_1_1_c_s101_1_1_parameter_activation.html#ab541aa687b71edc3411f12acd9adb618',1,'lib60870::CS101::ParameterActivation']]], - ['qrp_2',['QRP',['../classlib60870_1_1_c_s101_1_1_reset_process_command.html#ab87ef8bc0fa796dd5544ef39df6db59a',1,'lib60870::CS101::ResetProcessCommand']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/properties_f.js b/doxygen/doxydoc.NET/html/search/properties_f.js deleted file mode 100644 index aa9ff1a..0000000 --- a/doxygen/doxydoc.NET/html/search/properties_f.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['rcvdmsgcounter_0',['RcvdMsgCounter',['../classlib60870_1_1_c_s104_1_1_connection_statistics.html#a763d4accdb60725988746edc43675f2e',1,'lib60870::CS104::ConnectionStatistics']]], - ['rcvdtestfractcounter_1',['RcvdTestFrActCounter',['../classlib60870_1_1_c_s104_1_1_connection_statistics.html#aba25451b06261758d07cc6d0f64292bd',1,'lib60870::CS104::ConnectionStatistics']]], - ['rcvdtestfrconcounter_2',['RcvdTestFrConCounter',['../classlib60870_1_1_c_s104_1_1_connection_statistics.html#a4aef0532af04bf8cc51ab76069845eb8',1,'lib60870::CS104::ConnectionStatistics']]], - ['receivesequencenumber_3',['ReceiveSequenceNumber',['../classlib60870_1_1_c_s104_1_1_connection.html#ab6a705b8f4d600160fa842031363e63e',1,'lib60870::CS104::Connection']]], - ['receivetimeout_4',['ReceiveTimeout',['../classlib60870_1_1_c_s104_1_1_connection.html#a3bf1bdcc082cd5347acb0fcb29078000',1,'lib60870.CS104.Connection.ReceiveTimeout'],['../classlib60870_1_1_c_s104_1_1_server.html#a5cbb4d451a08d3b381fce39b5bf4ed3e',1,'lib60870.CS104.Server.ReceiveTimeout']]], - ['remoteendpoint_5',['RemoteEndpoint',['../classlib60870_1_1_c_s104_1_1_client_connection.html#ad59a914894aa422d1bff8b601cc100f3',1,'lib60870::CS104::ClientConnection']]] -]; diff --git a/doxygen/doxydoc.NET/html/search/search.css b/doxygen/doxydoc.NET/html/search/search.css deleted file mode 100644 index 19f76f9..0000000 --- a/doxygen/doxydoc.NET/html/search/search.css +++ /dev/null @@ -1,291 +0,0 @@ -/*---------------- Search Box positioning */ - -#main-menu > li:last-child { - /* This
  • object is the parent of the search bar */ - display: flex; - justify-content: center; - align-items: center; - height: 36px; - margin-right: 1em; -} - -/*---------------- Search box styling */ - -.SRPage * { - font-weight: normal; - line-height: normal; -} - -dark-mode-toggle { - margin-left: 5px; - display: flex; - float: right; -} - -#MSearchBox { - display: inline-block; - white-space : nowrap; - background: var(--search-background-color); - border-radius: 0.65em; - box-shadow: var(--search-box-shadow); - z-index: 102; -} - -#MSearchBox .left { - display: inline-block; - vertical-align: middle; - height: 1.4em; -} - -#MSearchSelect { - display: inline-block; - vertical-align: middle; - width: 20px; - height: 19px; - background-image: var(--search-magnification-select-image); - margin: 0 0 0 0.3em; - padding: 0; -} - -#MSearchSelectExt { - display: inline-block; - vertical-align: middle; - width: 10px; - height: 19px; - background-image: var(--search-magnification-image); - margin: 0 0 0 0.5em; - padding: 0; -} - - -#MSearchField { - display: inline-block; - vertical-align: middle; - width: 7.5em; - height: 19px; - margin: 0 0.15em; - padding: 0; - line-height: 1em; - border:none; - color: var(--search-foreground-color); - outline: none; - font-family: var(--font-family-search); - -webkit-border-radius: 0px; - border-radius: 0px; - background: none; -} - -@media(hover: none) { - /* to avoid zooming on iOS */ - #MSearchField { - font-size: 16px; - } -} - -#MSearchBox .right { - display: inline-block; - vertical-align: middle; - width: 1.4em; - height: 1.4em; -} - -#MSearchClose { - display: none; - font-size: inherit; - background : none; - border: none; - margin: 0; - padding: 0; - outline: none; - -} - -#MSearchCloseImg { - padding: 0.3em; - margin: 0; -} - -.MSearchBoxActive #MSearchField { - color: var(--search-active-color); -} - - - -/*---------------- Search filter selection */ - -#MSearchSelectWindow { - display: none; - position: absolute; - left: 0; top: 0; - border: 1px solid var(--search-filter-border-color); - background-color: var(--search-filter-background-color); - z-index: 10001; - padding-top: 4px; - padding-bottom: 4px; - -moz-border-radius: 4px; - -webkit-border-top-left-radius: 4px; - -webkit-border-top-right-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -} - -.SelectItem { - font: 8pt var(--font-family-search); - padding-left: 2px; - padding-right: 12px; - border: 0px; -} - -span.SelectionMark { - margin-right: 4px; - font-family: var(--font-family-monospace); - outline-style: none; - text-decoration: none; -} - -a.SelectItem { - display: block; - outline-style: none; - color: var(--search-filter-foreground-color); - text-decoration: none; - padding-left: 6px; - padding-right: 12px; -} - -a.SelectItem:focus, -a.SelectItem:active { - color: var(--search-filter-foreground-color); - outline-style: none; - text-decoration: none; -} - -a.SelectItem:hover { - color: var(--search-filter-highlight-text-color); - background-color: var(--search-filter-highlight-bg-color); - outline-style: none; - text-decoration: none; - cursor: pointer; - display: block; -} - -/*---------------- Search results window */ - -iframe#MSearchResults { - /*width: 60ex;*/ - height: 15em; -} - -#MSearchResultsWindow { - display: none; - position: absolute; - left: 0; top: 0; - border: 1px solid var(--search-results-border-color); - background-color: var(--search-results-background-color); - z-index:10000; - width: 300px; - height: 400px; - overflow: auto; -} - -/* ----------------------------------- */ - - -#SRIndex { - clear:both; -} - -.SREntry { - font-size: 10pt; - padding-left: 1ex; -} - -.SRPage .SREntry { - font-size: 8pt; - padding: 1px 5px; -} - -div.SRPage { - margin: 5px 2px; - background-color: var(--search-results-background-color); -} - -.SRChildren { - padding-left: 3ex; padding-bottom: .5em -} - -.SRPage .SRChildren { - display: none; -} - -.SRSymbol { - font-weight: bold; - color: var(--search-results-foreground-color); - font-family: var(--font-family-search); - text-decoration: none; - outline: none; -} - -a.SRScope { - display: block; - color: var(--search-results-foreground-color); - font-family: var(--font-family-search); - font-size: 8pt; - text-decoration: none; - outline: none; -} - -a.SRSymbol:focus, a.SRSymbol:active, -a.SRScope:focus, a.SRScope:active { - text-decoration: underline; -} - -span.SRScope { - padding-left: 4px; - font-family: var(--font-family-search); -} - -.SRPage .SRStatus { - padding: 2px 5px; - font-size: 8pt; - font-style: italic; - font-family: var(--font-family-search); -} - -.SRResult { - display: none; -} - -div.searchresults { - margin-left: 10px; - margin-right: 10px; -} - -/*---------------- External search page results */ - -.pages b { - color: white; - padding: 5px 5px 3px 5px; - background-image: var(--nav-gradient-active-image-parent); - background-repeat: repeat-x; - text-shadow: 0 1px 1px #000000; -} - -.pages { - line-height: 17px; - margin-left: 4px; - text-decoration: none; -} - -.hl { - font-weight: bold; -} - -#searchresults { - margin-bottom: 20px; -} - -.searchpages { - margin-top: 10px; -} - diff --git a/doxygen/doxydoc.NET/html/search/search.js b/doxygen/doxydoc.NET/html/search/search.js deleted file mode 100644 index 666af01..0000000 --- a/doxygen/doxydoc.NET/html/search/search.js +++ /dev/null @@ -1,694 +0,0 @@ -/* - @licstart The following is the entire license notice for the JavaScript code in this file. - - The MIT License (MIT) - - Copyright (C) 1997-2020 by Dimitri van Heesch - - Permission is hereby granted, free of charge, to any person obtaining a copy of this software - and associated documentation files (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, publish, distribute, - sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all copies or - substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING - BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - @licend The above is the entire license notice for the JavaScript code in this file - */ -const SEARCH_COOKIE_NAME = ''+'search_grp'; - -const searchResults = new SearchResults(); - -/* A class handling everything associated with the search panel. - - Parameters: - name - The name of the global variable that will be - storing this instance. Is needed to be able to set timeouts. - resultPath - path to use for external files -*/ -function SearchBox(name, resultsPath, extension) { - if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); } - if (!extension || extension == "") { extension = ".html"; } - - function getXPos(item) { - let x = 0; - if (item.offsetWidth) { - while (item && item!=document.body) { - x += item.offsetLeft; - item = item.offsetParent; - } - } - return x; - } - - function getYPos(item) { - let y = 0; - if (item.offsetWidth) { - while (item && item!=document.body) { - y += item.offsetTop; - item = item.offsetParent; - } - } - return y; - } - - // ---------- Instance variables - this.name = name; - this.resultsPath = resultsPath; - this.keyTimeout = 0; - this.keyTimeoutLength = 500; - this.closeSelectionTimeout = 300; - this.lastSearchValue = ""; - this.lastResultsPage = ""; - this.hideTimeout = 0; - this.searchIndex = 0; - this.searchActive = false; - this.extension = extension; - - // ----------- DOM Elements - - this.DOMSearchField = () => document.getElementById("MSearchField"); - this.DOMSearchSelect = () => document.getElementById("MSearchSelect"); - this.DOMSearchSelectWindow = () => document.getElementById("MSearchSelectWindow"); - this.DOMPopupSearchResults = () => document.getElementById("MSearchResults"); - this.DOMPopupSearchResultsWindow = () => document.getElementById("MSearchResultsWindow"); - this.DOMSearchClose = () => document.getElementById("MSearchClose"); - this.DOMSearchBox = () => document.getElementById("MSearchBox"); - - // ------------ Event Handlers - - // Called when focus is added or removed from the search field. - this.OnSearchFieldFocus = function(isActive) { - this.Activate(isActive); - } - - this.OnSearchSelectShow = function() { - const searchSelectWindow = this.DOMSearchSelectWindow(); - const searchField = this.DOMSearchSelect(); - - const left = getXPos(searchField); - const top = getYPos(searchField) + searchField.offsetHeight; - - // show search selection popup - searchSelectWindow.style.display='block'; - searchSelectWindow.style.left = left + 'px'; - searchSelectWindow.style.top = top + 'px'; - - // stop selection hide timer - if (this.hideTimeout) { - clearTimeout(this.hideTimeout); - this.hideTimeout=0; - } - return false; // to avoid "image drag" default event - } - - this.OnSearchSelectHide = function() { - this.hideTimeout = setTimeout(this.CloseSelectionWindow.bind(this), - this.closeSelectionTimeout); - } - - // Called when the content of the search field is changed. - this.OnSearchFieldChange = function(evt) { - if (this.keyTimeout) { // kill running timer - clearTimeout(this.keyTimeout); - this.keyTimeout = 0; - } - - const e = evt ? evt : window.event; // for IE - if (e.keyCode==40 || e.keyCode==13) { - if (e.shiftKey==1) { - this.OnSearchSelectShow(); - const win=this.DOMSearchSelectWindow(); - for (let i=0;i do a search - this.Search(); - } - } - - this.OnSearchSelectKey = function(evt) { - const e = (evt) ? evt : window.event; // for IE - if (e.keyCode==40 && this.searchIndex0) { // Up - this.searchIndex--; - this.OnSelectItem(this.searchIndex); - } else if (e.keyCode==13 || e.keyCode==27) { - e.stopPropagation(); - this.OnSelectItem(this.searchIndex); - this.CloseSelectionWindow(); - this.DOMSearchField().focus(); - } - return false; - } - - // --------- Actions - - // Closes the results window. - this.CloseResultsWindow = function() { - this.DOMPopupSearchResultsWindow().style.display = 'none'; - this.DOMSearchClose().style.display = 'none'; - this.Activate(false); - } - - this.CloseSelectionWindow = function() { - this.DOMSearchSelectWindow().style.display = 'none'; - } - - // Performs a search. - this.Search = function() { - this.keyTimeout = 0; - - // strip leading whitespace - const searchValue = this.DOMSearchField().value.replace(/^ +/, ""); - - const code = searchValue.toLowerCase().charCodeAt(0); - let idxChar = searchValue.substr(0, 1).toLowerCase(); - if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) { // surrogate pair - idxChar = searchValue.substr(0, 2); - } - - let jsFile; - let idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); - if (idx!=-1) { - const hexCode=idx.toString(16); - jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; - } - - const loadJS = function(url, impl, loc) { - const scriptTag = document.createElement('script'); - scriptTag.src = url; - scriptTag.onload = impl; - scriptTag.onreadystatechange = impl; - loc.appendChild(scriptTag); - } - - const domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); - const domSearchBox = this.DOMSearchBox(); - const domPopupSearchResults = this.DOMPopupSearchResults(); - const domSearchClose = this.DOMSearchClose(); - const resultsPath = this.resultsPath; - - const handleResults = function() { - document.getElementById("Loading").style.display="none"; - if (typeof searchData !== 'undefined') { - createResults(resultsPath); - document.getElementById("NoMatches").style.display="none"; - } - - if (idx!=-1) { - searchResults.Search(searchValue); - } else { // no file with search results => force empty search results - searchResults.Search('===='); - } - - if (domPopupSearchResultsWindow.style.display!='block') { - domSearchClose.style.display = 'inline-block'; - let left = getXPos(domSearchBox) + 150; - let top = getYPos(domSearchBox) + 20; - domPopupSearchResultsWindow.style.display = 'block'; - left -= domPopupSearchResults.offsetWidth; - const maxWidth = document.body.clientWidth; - const maxHeight = document.body.clientHeight; - let width = 300; - if (left<10) left=10; - if (width+left+8>maxWidth) width=maxWidth-left-8; - let height = 400; - if (height+top+8>maxHeight) height=maxHeight-top-8; - domPopupSearchResultsWindow.style.top = top + 'px'; - domPopupSearchResultsWindow.style.left = left + 'px'; - domPopupSearchResultsWindow.style.width = width + 'px'; - domPopupSearchResultsWindow.style.height = height + 'px'; - } - } - - if (jsFile) { - loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); - } else { - handleResults(); - } - - this.lastSearchValue = searchValue; - } - - // -------- Activation Functions - - // Activates or deactivates the search panel, resetting things to - // their default values if necessary. - this.Activate = function(isActive) { - if (isActive || // open it - this.DOMPopupSearchResultsWindow().style.display == 'block' - ) { - this.DOMSearchBox().className = 'MSearchBoxActive'; - this.searchActive = true; - } else if (!isActive) { // directly remove the panel - this.DOMSearchBox().className = 'MSearchBoxInactive'; - this.searchActive = false; - this.lastSearchValue = '' - this.lastResultsPage = ''; - this.DOMSearchField().value = ''; - } - } -} - -// ----------------------------------------------------------------------- - -// The class that handles everything on the search results page. -function SearchResults() { - - function convertToId(search) { - let result = ''; - for (let i=0;i. - this.lastMatchCount = 0; - this.lastKey = 0; - this.repeatOn = false; - - // Toggles the visibility of the passed element ID. - this.FindChildElement = function(id) { - const parentElement = document.getElementById(id); - let element = parentElement.firstChild; - - while (element && element!=parentElement) { - if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') { - return element; - } - - if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) { - element = element.firstChild; - } else if (element.nextSibling) { - element = element.nextSibling; - } else { - do { - element = element.parentNode; - } - while (element && element!=parentElement && !element.nextSibling); - - if (element && element!=parentElement) { - element = element.nextSibling; - } - } - } - } - - this.Toggle = function(id) { - const element = this.FindChildElement(id); - if (element) { - if (element.style.display == 'block') { - element.style.display = 'none'; - } else { - element.style.display = 'block'; - } - } - } - - // Searches for the passed string. If there is no parameter, - // it takes it from the URL query. - // - // Always returns true, since other documents may try to call it - // and that may or may not be possible. - this.Search = function(search) { - if (!search) { // get search word from URL - search = window.location.search; - search = search.substring(1); // Remove the leading '?' - search = unescape(search); - } - - search = search.replace(/^ +/, ""); // strip leading spaces - search = search.replace(/ +$/, ""); // strip trailing spaces - search = search.toLowerCase(); - search = convertToId(search); - - const resultRows = document.getElementsByTagName("div"); - let matches = 0; - - let i = 0; - while (i < resultRows.length) { - const row = resultRows.item(i); - if (row.className == "SRResult") { - let rowMatchName = row.id.toLowerCase(); - rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' - - if (search.length<=rowMatchName.length && - rowMatchName.substr(0, search.length)==search) { - row.style.display = 'block'; - matches++; - } else { - row.style.display = 'none'; - } - } - i++; - } - document.getElementById("Searching").style.display='none'; - if (matches == 0) { // no results - document.getElementById("NoMatches").style.display='block'; - } else { // at least one result - document.getElementById("NoMatches").style.display='none'; - } - this.lastMatchCount = matches; - return true; - } - - // return the first item with index index or higher that is visible - this.NavNext = function(index) { - let focusItem; - for (;;) { - const focusName = 'Item'+index; - focusItem = document.getElementById(focusName); - if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { - break; - } else if (!focusItem) { // last element - break; - } - focusItem=null; - index++; - } - return focusItem; - } - - this.NavPrev = function(index) { - let focusItem; - for (;;) { - const focusName = 'Item'+index; - focusItem = document.getElementById(focusName); - if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { - break; - } else if (!focusItem) { // last element - break; - } - focusItem=null; - index--; - } - return focusItem; - } - - this.ProcessKeys = function(e) { - if (e.type == "keydown") { - this.repeatOn = false; - this.lastKey = e.keyCode; - } else if (e.type == "keypress") { - if (!this.repeatOn) { - if (this.lastKey) this.repeatOn = true; - return false; // ignore first keypress after keydown - } - } else if (e.type == "keyup") { - this.lastKey = 0; - this.repeatOn = false; - } - return this.lastKey!=0; - } - - this.Nav = function(evt,itemIndex) { - const e = (evt) ? evt : window.event; // for IE - if (e.keyCode==13) return true; - if (!this.ProcessKeys(e)) return false; - - if (this.lastKey==38) { // Up - const newIndex = itemIndex-1; - let focusItem = this.NavPrev(newIndex); - if (focusItem) { - let child = this.FindChildElement(focusItem.parentNode.parentNode.id); - if (child && child.style.display == 'block') { // children visible - let n=0; - let tmpElem; - for (;;) { // search for last child - tmpElem = document.getElementById('Item'+newIndex+'_c'+n); - if (tmpElem) { - focusItem = tmpElem; - } else { // found it! - break; - } - n++; - } - } - } - if (focusItem) { - focusItem.focus(); - } else { // return focus to search field - document.getElementById("MSearchField").focus(); - } - } else if (this.lastKey==40) { // Down - const newIndex = itemIndex+1; - let focusItem; - const item = document.getElementById('Item'+itemIndex); - const elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem && elem.style.display == 'block') { // children visible - focusItem = document.getElementById('Item'+itemIndex+'_c0'); - } - if (!focusItem) focusItem = this.NavNext(newIndex); - if (focusItem) focusItem.focus(); - } else if (this.lastKey==39) { // Right - const item = document.getElementById('Item'+itemIndex); - const elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem) elem.style.display = 'block'; - } else if (this.lastKey==37) { // Left - const item = document.getElementById('Item'+itemIndex); - const elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem) elem.style.display = 'none'; - } else if (this.lastKey==27) { // Escape - e.stopPropagation(); - searchBox.CloseResultsWindow(); - document.getElementById("MSearchField").focus(); - } else if (this.lastKey==13) { // Enter - return true; - } - return false; - } - - this.NavChild = function(evt,itemIndex,childIndex) { - const e = (evt) ? evt : window.event; // for IE - if (e.keyCode==13) return true; - if (!this.ProcessKeys(e)) return false; - - if (this.lastKey==38) { // Up - if (childIndex>0) { - const newIndex = childIndex-1; - document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); - } else { // already at first child, jump to parent - document.getElementById('Item'+itemIndex).focus(); - } - } else if (this.lastKey==40) { // Down - const newIndex = childIndex+1; - let elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); - if (!elem) { // last child, jump to parent next parent - elem = this.NavNext(itemIndex+1); - } - if (elem) { - elem.focus(); - } - } else if (this.lastKey==27) { // Escape - e.stopPropagation(); - searchBox.CloseResultsWindow(); - document.getElementById("MSearchField").focus(); - } else if (this.lastKey==13) { // Enter - return true; - } - return false; - } -} - -function createResults(resultsPath) { - - function setKeyActions(elem,action) { - elem.setAttribute('onkeydown',action); - elem.setAttribute('onkeypress',action); - elem.setAttribute('onkeyup',action); - } - - function setClassAttr(elem,attr) { - elem.setAttribute('class',attr); - elem.setAttribute('className',attr); - } - - const results = document.getElementById("SRResults"); - results.innerHTML = ''; - searchData.forEach((elem,index) => { - const id = elem[0]; - const srResult = document.createElement('div'); - srResult.setAttribute('id','SR_'+id); - setClassAttr(srResult,'SRResult'); - const srEntry = document.createElement('div'); - setClassAttr(srEntry,'SREntry'); - const srLink = document.createElement('a'); - srLink.setAttribute('id','Item'+index); - setKeyActions(srLink,'return searchResults.Nav(event,'+index+')'); - setClassAttr(srLink,'SRSymbol'); - srLink.innerHTML = elem[1][0]; - srEntry.appendChild(srLink); - if (elem[1].length==2) { // single result - srLink.setAttribute('href',resultsPath+elem[1][1][0]); - srLink.setAttribute('onclick','searchBox.CloseResultsWindow()'); - if (elem[1][1][1]) { - srLink.setAttribute('target','_parent'); - } else { - srLink.setAttribute('target','_blank'); - } - const srScope = document.createElement('span'); - setClassAttr(srScope,'SRScope'); - srScope.innerHTML = elem[1][1][2]; - srEntry.appendChild(srScope); - } else { // multiple results - srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")'); - const srChildren = document.createElement('div'); - setClassAttr(srChildren,'SRChildren'); - for (let c=0; c-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T diff --git a/doxygen/doxydoc.NET/html/splitbard.png b/doxygen/doxydoc.NET/html/splitbard.png deleted file mode 100644 index 8367416d757fd7b6dc4272b6432dc75a75abd068..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf@VhhFKy35^fiT zT~&lUj3=cDh^%3HDY9k5CEku}PHXNoNC(_$U3XPb&Q*ME25pT;2(*BOgAf<+R$lzakPG`kF31()Fx{L5Wrac|GQzjeE= zueY1`Ze{#x<8=S|`~MgGetGce)#vN&|J{Cd^tS%;tBYTo?+^d68<#n_Y_xx`J||4O V@QB{^CqU0Kc)I$ztaD0e0svEzbJzd? diff --git a/doxygen/doxydoc.NET/html/sync_off.png b/doxygen/doxydoc.NET/html/sync_off.png deleted file mode 100644 index 3b443fc62892114406e3d399421b2a881b897acc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* diff --git a/doxygen/doxydoc.NET/html/sync_on.png b/doxygen/doxydoc.NET/html/sync_on.png deleted file mode 100644 index e08320fb64e6fa33b573005ed6d8fe294e19db76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 diff --git a/doxygen/doxydoc.NET/html/tab_a.png b/doxygen/doxydoc.NET/html/tab_a.png deleted file mode 100644 index 3b725c41c5a527a3a3e40097077d0e206a681247..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 diff --git a/doxygen/doxydoc.NET/html/tab_ad.png b/doxygen/doxydoc.NET/html/tab_ad.png deleted file mode 100644 index e34850acfc24be58da6d2fd1ccc6b29cc84fe34d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QhuH;jv*C{Z|5d*H3V=pKi{In zd2jxLclDRPylmD}^l7{QOtL{vUjO{-WqItb5sQp2h-99b8^^Scr-=2mblCdZuUm?4 jzOJvgvt3{(cjKLW5(A@0qPS@<&}0TrS3j3^P6y&q2{!U5bk+Tso_B!YCpDh>v z{CM*1U8YvQRyBUHt^Ju0W_sq-?;9@_4equ-bavTs=gk796zopr0EBT&m;e9( diff --git a/doxygen/doxydoc.NET/html/tab_s.png b/doxygen/doxydoc.NET/html/tab_s.png deleted file mode 100644 index ab478c95b67371d700a20869f7de1ddd73522d50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QuUrLjv*C{Z|^p8HaRdjTwH7) zC?wLlL}}I{)n%R&r+1}IGmDnq;&J#%V6)9VsYhS`O^BVBQlxOUep0c$RENLq#g8A$ z)z7%K_bI&n@J+X_=x}fJoEKed-$<>=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ diff --git a/doxygen/doxydoc.NET/html/tab_sd.png b/doxygen/doxydoc.NET/html/tab_sd.png deleted file mode 100644 index 757a565ced4730f85c833fb2547d8e199ae68f19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!Qq7(&jv*C{Z|_!fH5o7*c=%9% zcILh!EA=pAQKdx-Cdiev=v{eg{8Ht<{e8_NAN~b=)%W>-WDCE0PyDHGemi$BoXwcK z{>e9^za6*c1ilttWw&V+U;WCPlV9{LdC~Ey%_H(qj`xgfES(4Yz5jSTZfCt`4E$0YRsR*S^mTCR^;V&sxC8{l_Cp7w8-YPgg&ebxsLQ00$vXK>z>% diff --git a/doxygen/doxydoc.NET/html/tabs.css b/doxygen/doxydoc.NET/html/tabs.css deleted file mode 100644 index fe4854a..0000000 --- a/doxygen/doxydoc.NET/html/tabs.css +++ /dev/null @@ -1 +0,0 @@ -.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} \ No newline at end of file From f70a20245b12323d2b5ab4a17f21d686f8822455 Mon Sep 17 00:00:00 2001 From: Maxson Ramon dos Anjos Medeiros Date: Fri, 21 Mar 2025 18:29:09 +0100 Subject: [PATCH 68/83] Add lock to increment port in each test case --- tests/Test.cs | 127 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 82 insertions(+), 45 deletions(-) diff --git a/tests/Test.cs b/tests/Test.cs index 59ec265..39a72d4 100644 --- a/tests/Test.cs +++ b/tests/Test.cs @@ -8,6 +8,7 @@ namespace tests { + class TestInteger32Object : InformationObject, IPrivateIOFactory { private int value = 0; @@ -84,14 +85,29 @@ public override void Encode(Frame frame, ApplicationLayerParameters parameters, } } - - [TestFixture()] public class Test { + private int port = 24000; + private static readonly object _lockObject = new object(); + + private int GetPort() + { + int newPort; + + lock (_lockObject) + { + port++; + newPort = port; + } + + return newPort; + } + [Test()] public void TestStatusAndStatusChangedDetection() { + StatusAndStatusChangeDetection scd = new StatusAndStatusChangeDetection(); Assert.AreEqual(false, scd.ST(0)); @@ -788,7 +804,8 @@ public void TestUnconfirmedStoppedState() server.ServerMode = ServerMode.SINGLE_REDUNDANCY_GROUP; - server.SetLocalPort(2404); + int port = GetPort(); + server.SetLocalPort(port); server.Start(); @@ -820,7 +837,7 @@ public void TestUnconfirmedStoppedState() Thread.Sleep(1000); // Ensure processing time - Connection connection = new Connection("127.0.0.1", 2404, apciParameters, parameters); + Connection connection = new Connection("127.0.0.1", port, apciParameters, parameters); connection.SetASDUReceivedHandler(EventQueue1_asduReceivedHandler, info); @@ -889,11 +906,12 @@ public void TestSendIMessageAfterStopDT() Server server = new Server(apciParameters, parameters); - server.SetLocalPort(2404); + int port = GetPort(); + server.SetLocalPort(port); server.Start(); - Connection connection = new Connection("127.0.0.1", 2404, apciParameters, parameters); + Connection connection = new Connection("127.0.0.1", port, apciParameters, parameters); ConnectionException se = null; @@ -1051,11 +1069,12 @@ public void TestCS104ConnectionUseAfterClose() server.ServerMode = ServerMode.SINGLE_REDUNDANCY_GROUP; - server.SetLocalPort(2404); + int port = GetPort(); + server.SetLocalPort(port); server.Start(); - Connection con = new Connection("127.0.0.1", 2404); + Connection con = new Connection("127.0.0.1", port); Assert.NotNull(con); @@ -1089,11 +1108,13 @@ public void TestCS104ConnectionUseAfterServerCloseConnection() server.ServerMode = ServerMode.SINGLE_REDUNDANCY_GROUP; - server.SetLocalPort(2404); + int port = GetPort(); + + server.SetLocalPort(port); server.Start(); - Connection con = new Connection("127.0.0.1", 2404); + Connection con = new Connection("127.0.0.1", port); Assert.NotNull(con); @@ -1798,12 +1819,12 @@ public void TestSendTestFR() clientApciParamters.T3 = 1; Server server = new Server(serverApciParamters, serverParameters); - - server.SetLocalPort(2404); + int port = GetPort(); + server.SetLocalPort(port); server.DebugOutput = true; server.Start(); - Connection connection = new Connection("127.0.0.1", 2404, clientApciParamters, clientParameters); + Connection connection = new Connection("127.0.0.1", port, clientApciParamters, clientParameters); connection.Connect(); @@ -1869,12 +1890,12 @@ public void TestSendTestFRTimeoutMaster() clientApciParamters.T3 = 1; Server server = new Server(serverApciParamters, serverParameters); - - server.SetLocalPort(2404); + int port = GetPort(); + server.SetLocalPort(port); server.Start(); - Connection connection = new Connection("127.0.0.1", 2404, clientApciParamters, clientParameters); + Connection connection = new Connection("127.0.0.1", port, clientApciParamters, clientParameters); connection.Connect(); @@ -1942,12 +1963,12 @@ public void TestSendTestFRTimeoutSlave() serverApciParamters.T3 = 1; Server server = new Server(serverApciParamters, serverParameters); - - server.SetLocalPort(2404); + int port = GetPort(); + server.SetLocalPort(port); server.Start(); - Connection connection = new Connection("127.0.0.1", 2404, clientApciParamters, clientParameters); + Connection connection = new Connection("127.0.0.1", port, clientApciParamters, clientParameters); connection.DebugOutput = true; connection.SetReceivedRawMessageHandler(testSendTestFRTimeoutSlaveRawMessageHandler, null); @@ -1993,7 +2014,9 @@ public void TestSendTestFRTimeoutSlave() public void TestEncodeDecodeSetpointCommandNormalized() { Server server = new Server(); - server.SetLocalPort(2404); + int port = GetPort(); + + server.SetLocalPort(port); float recvValue = 0f; float sendValue = 1.0f; @@ -2014,7 +2037,7 @@ public void TestEncodeDecodeSetpointCommandNormalized() }, null); server.Start(); - Connection connection = new Connection("127.0.0.1", 2404); + Connection connection = new Connection("127.0.0.1", port); connection.Connect(); ASDU newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.ACTIVATION, false, false, 0, 1, false); @@ -2035,7 +2058,9 @@ public void TestEncodeDecodeSetpointCommandNormalized() public void TestEncodeDecodePrivateInformationObject() { Server server = new Server(); - server.SetLocalPort(2404); + int port = GetPort(); + + server.SetLocalPort(port); server.DebugOutput = true; @@ -2063,7 +2088,7 @@ public void TestEncodeDecodePrivateInformationObject() server.Start(); - Connection connection = new Connection("127.0.0.1", 2404); + Connection connection = new Connection("127.0.0.1", port); connection.Connect(); ASDU newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.ACTIVATION, false, false, 0, 1, false); @@ -2266,7 +2291,9 @@ public void TestSinglePointInformationClientServer() newAsdu.AddInformationObject(spi); Server server = new Server(); - server.SetLocalPort(2404); + int port = GetPort(); + + server.SetLocalPort(port); bool hasReceived = false; @@ -2287,7 +2314,7 @@ public void TestSinglePointInformationClientServer() server.Start(); - Connection connection = new Connection("127.0.0.1", 2404); + Connection connection = new Connection("127.0.0.1", port); connection.Connect(); connection.SendASDU(newAsdu); @@ -2969,7 +2996,9 @@ public void SegmentReceived(byte sectionName, int offset, int size, byte[] data) public void TestFileUploadSingleSection() { Server server = new Server(); - server.SetLocalPort(2404); + int port = GetPort(); + + server.SetLocalPort(port); server.Start(); SimpleFile file = new SimpleFile(1, 30000, NameOfFile.TRANSPARENT_FILE); @@ -2985,7 +3014,7 @@ public void TestFileUploadSingleSection() Thread.Sleep(2000); - Connection con = new Connection("127.0.0.1", 2404); + Connection con = new Connection("127.0.0.1", port); con.Connect(); Thread.Sleep(2000); @@ -3024,7 +3053,9 @@ public void TestFileUploadSingleSection() public void TestFileUploadMultipleSections() { Server server = new Server(); - server.SetLocalPort(2404); + int port = GetPort(); + + server.SetLocalPort(port); server.Start(); SimpleFile file = new SimpleFile(1, 30000, NameOfFile.TRANSPARENT_FILE); @@ -3044,7 +3075,7 @@ public void TestFileUploadMultipleSections() server.GetAvailableFiles().AddFile(file); - Connection con = new Connection("127.0.0.1", 2404); + Connection con = new Connection("127.0.0.1", port); con.Connect(); @@ -3071,7 +3102,8 @@ public void TestFileUploadMultipleSections() public void TestFileUploadMultipleSectionsFreeFileName() { Server server = new Server(); - server.SetLocalPort(2404); + int port = GetPort(); + server.SetLocalPort(port); server.Start(); SimpleFile file = new SimpleFile(1, 30000, (NameOfFile)12); @@ -3091,7 +3123,7 @@ public void TestFileUploadMultipleSectionsFreeFileName() server.GetAvailableFiles().AddFile(file); - Connection con = new Connection("127.0.0.1", 2404); + Connection con = new Connection("127.0.0.1", port); con.Connect(); @@ -3118,7 +3150,8 @@ public void TestFileUploadMultipleSectionsFreeFileName() public void TestFileUploadMultipleSegments() { Server server = new Server(); - server.SetLocalPort(2404); + int port = GetPort(); + server.SetLocalPort(port); server.Start(); SimpleFile file = new SimpleFile(1, 30000, NameOfFile.TRANSPARENT_FILE); @@ -3132,7 +3165,7 @@ public void TestFileUploadMultipleSegments() server.GetAvailableFiles().AddFile(file); - Connection con = new Connection("127.0.0.1", 2404); + Connection con = new Connection("127.0.0.1", port); con.Connect(); @@ -3162,7 +3195,8 @@ public void TestFileUploadMultipleSegments() public void TestFileDownloadSingleSection() { Server server = new Server(); - server.SetLocalPort(2404); + int port = GetPort(); + server.SetLocalPort(port); server.DebugOutput = true; Receiver receiver = new Receiver(); @@ -3184,7 +3218,7 @@ public void TestFileDownloadSingleSection() file.AddSection(fileData); server.GetAvailableFiles().AddFile(file); - Connection con = new Connection("127.0.0.1", 2404); + Connection con = new Connection("127.0.0.1", port); con.Connect(); Thread.Sleep(2000); @@ -3219,7 +3253,8 @@ public void TestFileDownloadSingleSection() public void TestFileDownloadMultipleSegments() { Server server = new Server(); - server.SetLocalPort(2404); + int port = GetPort(); + server.SetLocalPort(port); Receiver receiver = new Receiver(); @@ -3243,7 +3278,7 @@ public void TestFileDownloadMultipleSegments() server.GetAvailableFiles().AddFile(file); - Connection con = new Connection("127.0.0.1", 2404); + Connection con = new Connection("127.0.0.1", port); con.Connect(); Thread.Sleep(2000); @@ -3279,7 +3314,8 @@ public void TestFileDownloadMultipleSegments() public void TestFileDownloadMultipleSegmentsMultipleSections() { Server server = new Server(); - server.SetLocalPort(2404); + int port = GetPort(); + server.SetLocalPort(port); Receiver receiver = new Receiver(); server.SetFileReadyHandler(delegate (object parameter, int ca, int ioa, NameOfFile nof, int lengthOfFile) @@ -3306,7 +3342,7 @@ public void TestFileDownloadMultipleSegmentsMultipleSections() server.GetAvailableFiles().AddFile(file); - Connection con = new Connection("127.0.0.1", 2404); + Connection con = new Connection("127.0.0.1", port); con.Connect(); Thread.Sleep(2000); @@ -3332,7 +3368,8 @@ public void TestFileDownloadMultipleSegmentsMultipleSections() public void TestFileDownloadSlaveRejectsFile() { Server server = new Server(); - server.SetLocalPort(2404); + int port = GetPort(); + server.SetLocalPort(port); Receiver receiver = new Receiver(); @@ -3354,7 +3391,7 @@ public void TestFileDownloadSlaveRejectsFile() server.GetAvailableFiles().AddFile(file); - Connection con = new Connection("127.0.0.1", 2404); + Connection con = new Connection("127.0.0.1", port); con.Connect(); Thread.Sleep(2000); @@ -3473,7 +3510,7 @@ public void TestSingleRedundancyGroup() server.MaxOpenConnections = 6; server.EnqueueMode = EnqueueMode.REMOVE_OLDEST; - + server.SetLocalPort(GetPort()); server.Start(); int waitTime = 1000; @@ -3531,6 +3568,7 @@ public void TestSingleRedundancyGroup() public void TestMultipleRedundancyGroup() { bool running = true; + int port = GetPort(); Console.CancelKeyPress += delegate (object sender, ConsoleCancelEventArgs e) { @@ -3559,6 +3597,7 @@ public void TestMultipleRedundancyGroup() server.AddRedundancyGroup(redGroup); server.EnqueueMode = EnqueueMode.REMOVE_OLDEST; + server.SetLocalPort(port); server.Start(); @@ -3704,9 +3743,7 @@ public void TestSingleEventType() [Test()] public void TestScaledNormalizedConversion() { - const float SCALED_VALUE_MAX = 32767; - const float SCALED_VALUE_MIN = -32768; - const float NORMALIZED_VALUE_MAX = 32767.0f/32768.0f; + const float NORMALIZED_VALUE_MAX = 32767.0f / 32768.0f; Assert.AreEqual(32767, new ScaledValue().ConvertNormalizedValueToScaled(NORMALIZED_VALUE_MAX)); From 63e8ea98b3e2eb61965ea574698f4064d2f4e679 Mon Sep 17 00:00:00 2001 From: Maxson Ramon dos Anjos Medeiros Date: Fri, 21 Mar 2025 18:31:05 +0100 Subject: [PATCH 69/83] Remove frameowrk lib version; ->framework version not needed as the standard2.0 is compatible --- framework/lib60870/lib60870.csproj | 96 ------------------------------ 1 file changed, 96 deletions(-) delete mode 100644 framework/lib60870/lib60870.csproj diff --git a/framework/lib60870/lib60870.csproj b/framework/lib60870/lib60870.csproj deleted file mode 100644 index 2581e9b..0000000 --- a/framework/lib60870/lib60870.csproj +++ /dev/null @@ -1,96 +0,0 @@ - - - Library - Michael Zillgith - MZ Automation - lib60870 - 2.3.0 - lib60870 - lib60870 - 2.3.0 - net472 - false - icon.png - - lib60870.NET library for IEC 60870-5 based protocols in C# - The current implementation contains code for the IEC 60870-5-101/104 protocols only. - - readme.md - nupkg - true - GPL-3.0-only - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From cf9a0b5d1833a346113807ddfddb0cf09057533f Mon Sep 17 00:00:00 2001 From: Maxson Ramon dos Anjos Medeiros Date: Mon, 24 Mar 2025 17:14:18 +0100 Subject: [PATCH 70/83] Add release script --- release_script.sh | 91 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 release_script.sh diff --git a/release_script.sh b/release_script.sh new file mode 100644 index 0000000..e3f69bc --- /dev/null +++ b/release_script.sh @@ -0,0 +1,91 @@ +#!/bin/bash + +#########Clean directory######################### +clean_build_directories() +{ + echo "Removing ./vs, bin/, obj/ folders, any .git directories or files, and doxydoc.NET folder..." + find "$FOLDER_NAME" -type d \( -name "vs" -o -name "bin" -o -name "obj" -o -name "doxydoc.NET" -o -name ".git" \) -exec rm -rf {} + + find "$FOLDER_NAME" -type f -name ".git" -exec rm -f {} + + echo "Cleanup completed!" +} + +#########Prepare release############################# +# Function to prepare folder +prepare_folder() { + #Create doxigen + rm -rf doxydoc.NET + #doxygen doxygen/Doxyfile + + #Create user guide + asciidoctor user_guide_dotnet.adoc +} + +##########Create release folder##################### +create_release_folder() +{ + # Print the value + echo "Creating folder: $FOLDER_NAME" + + # Create the folder + mkdir -p "$FOLDER_NAME" + + echo "Folder '$FOLDER_NAME' created successfully!" + + cp -rf .net8 $FOLDER_NAME + cp -rf examples $FOLDER_NAME + cp -rf lib60870 $FOLDER_NAME + cp -rf tests $FOLDER_NAME + cp -rf CHANGELOG $FOLDER_NAME + cp -rf COPYING $FOLDER_NAME + cp -rf lib60870.NET.sln $FOLDER_NAME + cp -rf README.md $FOLDER_NAME + cp -rf user_guide_dotnet.adoc $FOLDER_NAME + cp -rf doxygen $FOLDER_NAME +} + +################ Function to create a tar.gz archive############################ +compress_to_tar() { + ARCHIVE_NAME="$FOLDER_NAME.tar.gz" + echo "Creating archive: $ARCHIVE_NAME" + tar -czf "$ARCHIVE_NAME" -C "$(dirname "$FOLDER_NAME")" "$(basename "$FOLDER_NAME")" + echo "Archive '$ARCHIVE_NAME' created successfully!" +} + +# Wait for user input if arguments are missing +while [ -z "$1" ]; do + read -p "Enter version: " VERSION_NAME_INPUT + set -- "$VERSION_NAME_INPUT" "$2" +done + +while [ -z "$2" ]; do + read -p "Enter option (prepare/release/all): " OPTION_INPUT + set -- "$1" "$OPTION_INPUT" +done + +# Store arguments +PREFIX="../lib60870.NET-" +FOLDER_NAME="${PREFIX}${1}" +OPTION="$2" + +# Execute option case +case "$OPTION" in + prepare) + prepare_folder + ;; + release) + create_release_folder + ;; + all) + prepare_folder + create_release_folder + clean_build_directories + compress_to_tar + ;; + *) + echo "Invalid option. Use 'prepare', 'release', or 'delete'." + exit 1 + ;; +esac + + +##################################################### From 6a0c9ee3238758ec7b79358b5a0490e37b517707 Mon Sep 17 00:00:00 2001 From: Maxson Ramon dos Anjos Medeiros Date: Mon, 24 Mar 2025 17:21:03 +0100 Subject: [PATCH 71/83] Format all -cs files --- release_script.sh | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/release_script.sh b/release_script.sh index e3f69bc..1df8f49 100644 --- a/release_script.sh +++ b/release_script.sh @@ -1,5 +1,12 @@ #!/bin/bash +###### Function to replace tabs with spaces in all .cs files################ +format_cs_files() { + echo "Formatting .cs files: Replacing tabs with spaces..." + find . -type f -name "*.cs" -exec sed -i 's/\t/ /g' {} + + echo "Formatting completed!" +} + #########Clean directory######################### clean_build_directories() { @@ -58,7 +65,7 @@ while [ -z "$1" ]; do done while [ -z "$2" ]; do - read -p "Enter option (prepare/release/all): " OPTION_INPUT + read -p "Enter option (prepare/release/formatFiles/all): " OPTION_INPUT set -- "$1" "$OPTION_INPUT" done @@ -75,7 +82,11 @@ case "$OPTION" in release) create_release_folder ;; +formatFiles) + format_cs_files + ;; all) + format_cs_files prepare_folder create_release_folder clean_build_directories From 03c21aa7d24ba6cd1bb2b520cc8bff466fdb0568 Mon Sep 17 00:00:00 2001 From: Maxson Ramon dos Anjos Medeiros Date: Mon, 24 Mar 2025 17:27:06 +0100 Subject: [PATCH 72/83] Formating all .cs files removing tabs --- examples/cs101-master-tcp/Program.cs | 126 ++++---- examples/cs101-master-unbalanced/Program.cs | 270 ++++++++-------- examples/cs101-slave-balanced/Program.cs | 188 +++++------ examples/cs101-slave-tcp/Program.cs | 184 +++++------ examples/cs101-slave-unbalanced/Program.cs | 198 ++++++------ examples/cs104-client1/Program.cs | 256 +++++++-------- examples/cs104-client2/Program.cs | 222 ++++++------- examples/cs104-client3/Program.cs | 196 +++++------ examples/cs104-multi-client-server/Program.cs | 220 ++++++------- examples/cs104-server-file/Program.cs | 208 ++++++------ examples/cs104-server/Program.cs | 208 ++++++------ examples/cs104-server2/Program.cs | 130 ++++---- examples/cs104-server3/Program.cs | 304 +++++++++--------- examples/cs104-tls-client/Program.cs | 244 +++++++------- examples/cs104-tls-server/Program.cs | 222 ++++++------- lib60870/CS101/CS101Slave.cs | 12 +- lib60870/CS101/FileServices.cs | 2 +- lib60870/CS101/Master.cs | 2 +- lib60870/CS101/Slave.cs | 14 +- lib60870/LibraryCommon.cs | 2 +- lib60870/LinkLayer/LinkLayer.cs | 2 +- .../LinkLayer/PrimaryLinkLayerUnbalanced.cs | 4 +- .../LinkLayer/TcpClientVirtualSerialPort.cs | 4 +- .../LinkLayer/TcpServerVirtualSerialPort.cs | 4 +- release_script.sh | 10 +- tests/Test.cs | 4 +- 26 files changed, 1618 insertions(+), 1618 deletions(-) diff --git a/examples/cs101-master-tcp/Program.cs b/examples/cs101-master-tcp/Program.cs index c6b5040..c4dcd8f 100644 --- a/examples/cs101-master-tcp/Program.cs +++ b/examples/cs101-master-tcp/Program.cs @@ -8,91 +8,91 @@ namespace cs101_master_tcp { - class MainClass - { + class MainClass + { - private static bool rcvdRawMessageHandler (object parameter, byte[] message, int messageSize) - { - Console.WriteLine ("RECV " + BitConverter.ToString (message, 0, messageSize)); + private static bool rcvdRawMessageHandler (object parameter, byte[] message, int messageSize) + { + Console.WriteLine ("RECV " + BitConverter.ToString (message, 0, messageSize)); - return true; - } + return true; + } - private static void linkLayerStateChanged (object parameter, int address, lib60870.linklayer.LinkLayerState newState) - { - Console.WriteLine ("LL state event: " + newState.ToString ()); - } + private static void linkLayerStateChanged (object parameter, int address, lib60870.linklayer.LinkLayerState newState) + { + Console.WriteLine ("LL state event: " + newState.ToString ()); + } - private static bool asduReceivedHandler(object parameter, int address, ASDU asdu) - { - Console.WriteLine (asdu.ToString ()); + private static bool asduReceivedHandler(object parameter, int address, ASDU asdu) + { + Console.WriteLine (asdu.ToString ()); - return true; - } + return true; + } - public static void Main (string[] args) - { - bool running = true; + public static void Main (string[] args) + { + bool running = true; - // use Ctrl-C to stop the programm - Console.CancelKeyPress += delegate(object? sender, ConsoleCancelEventArgs e) { - e.Cancel = true; - running = false; - }; + // use Ctrl-C to stop the programm + Console.CancelKeyPress += delegate(object? sender, ConsoleCancelEventArgs e) { + e.Cancel = true; + running = false; + }; - string hostname = "127.0.0.1"; - int tcpPort = 2404; + string hostname = "127.0.0.1"; + int tcpPort = 2404; - if (args.Length > 0) - hostname = args [0]; + if (args.Length > 0) + hostname = args [0]; - if (args.Length > 1) - int.TryParse (args [1], out tcpPort); + if (args.Length > 1) + int.TryParse (args [1], out tcpPort); - // Setup virtual serial port - TcpClientVirtualSerialPort port = new TcpClientVirtualSerialPort(hostname, tcpPort); - port.DebugOutput = false; - port.Start (); + // Setup virtual serial port + TcpClientVirtualSerialPort port = new TcpClientVirtualSerialPort(hostname, tcpPort); + port.DebugOutput = false; + port.Start (); - // Setup balanced CS101 master - LinkLayerParameters llParameters = new LinkLayerParameters(); - llParameters.AddressLength = 1; - llParameters.UseSingleCharACK = true; + // Setup balanced CS101 master + LinkLayerParameters llParameters = new LinkLayerParameters(); + llParameters.AddressLength = 1; + llParameters.UseSingleCharACK = true; - CS101Master master = new CS101Master (port, LinkLayerMode.BALANCED, llParameters); - master.DebugOutput = false; - master.OwnAddress = 1; + CS101Master master = new CS101Master (port, LinkLayerMode.BALANCED, llParameters); + master.DebugOutput = false; + master.OwnAddress = 1; master.SlaveAddress = 3; - master.SetASDUReceivedHandler (asduReceivedHandler, null); - master.SetLinkLayerStateChangedHandler (linkLayerStateChanged, null); - master.SetReceivedRawMessageHandler (rcvdRawMessageHandler, null); + master.SetASDUReceivedHandler (asduReceivedHandler, null); + master.SetLinkLayerStateChangedHandler (linkLayerStateChanged, null); + master.SetReceivedRawMessageHandler (rcvdRawMessageHandler, null); - long lastTimestamp = SystemUtils.currentTimeMillis (); + long lastTimestamp = SystemUtils.currentTimeMillis (); - // This will start a separate thread! - // alternativley you can you master.Run() inside the loop - master.Start (); + // This will start a separate thread! + // alternativley you can you master.Run() inside the loop + master.Start (); - while (running) { + while (running) { - if ((SystemUtils.currentTimeMillis() - lastTimestamp) >= 5000) { + if ((SystemUtils.currentTimeMillis() - lastTimestamp) >= 5000) { - lastTimestamp = SystemUtils.currentTimeMillis (); + lastTimestamp = SystemUtils.currentTimeMillis (); - if (master.GetLinkLayerState () == lib60870.linklayer.LinkLayerState.AVAILABLE) { - master.SendInterrogationCommand (CauseOfTransmission.ACTIVATION, 1, 20); - } else { - Console.WriteLine ("Link layer: " + master.GetLinkLayerState ().ToString ()); - } - } + if (master.GetLinkLayerState () == lib60870.linklayer.LinkLayerState.AVAILABLE) { + master.SendInterrogationCommand (CauseOfTransmission.ACTIVATION, 1, 20); + } else { + Console.WriteLine ("Link layer: " + master.GetLinkLayerState ().ToString ()); + } + } - Thread.Sleep (100); - } + Thread.Sleep (100); + } - master.Stop (); + master.Stop (); - port.Stop (); - } - } + port.Stop (); + } + } } diff --git a/examples/cs101-master-unbalanced/Program.cs b/examples/cs101-master-unbalanced/Program.cs index 9bd932d..80dcba9 100644 --- a/examples/cs101-master-unbalanced/Program.cs +++ b/examples/cs101-master-unbalanced/Program.cs @@ -8,185 +8,185 @@ namespace cs101_master_unbalanced { - class MainClass - { - private static bool asduReceivedHandler(object parameter, int slaveAddress, ASDU asdu) - { - Console.WriteLine ("Slave: {0} - {1}", slaveAddress, asdu.ToString ()); + class MainClass + { + private static bool asduReceivedHandler(object parameter, int slaveAddress, ASDU asdu) + { + Console.WriteLine ("Slave: {0} - {1}", slaveAddress, asdu.ToString ()); - if (asdu.TypeId == TypeID.M_SP_NA_1) { + if (asdu.TypeId == TypeID.M_SP_NA_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { + for (int i = 0; i < asdu.NumberOfElements; i++) { - var val = (SinglePointInformation)asdu.GetElement (i); + var val = (SinglePointInformation)asdu.GetElement (i); - Console.WriteLine (" IOA: " + val.ObjectAddress + " SP value: " + val.Value); - Console.WriteLine (" " + val.Quality.ToString ()); - } - } - else if (asdu.TypeId == TypeID.M_ME_TE_1) { + Console.WriteLine (" IOA: " + val.ObjectAddress + " SP value: " + val.Value); + Console.WriteLine (" " + val.Quality.ToString ()); + } + } + else if (asdu.TypeId == TypeID.M_ME_TE_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { + for (int i = 0; i < asdu.NumberOfElements; i++) { - var msv = (MeasuredValueScaledWithCP56Time2a)asdu.GetElement (i); + var msv = (MeasuredValueScaledWithCP56Time2a)asdu.GetElement (i); - Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.ScaledValue); - Console.WriteLine (" " + msv.Quality.ToString ()); - Console.WriteLine (" " + msv.Timestamp.ToString ()); - } + Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.ScaledValue); + Console.WriteLine (" " + msv.Quality.ToString ()); + Console.WriteLine (" " + msv.Timestamp.ToString ()); + } - } else if (asdu.TypeId == TypeID.M_ME_TF_1) { + } else if (asdu.TypeId == TypeID.M_ME_TF_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { - var mfv = (MeasuredValueShortWithCP56Time2a)asdu.GetElement (i); + for (int i = 0; i < asdu.NumberOfElements; i++) { + var mfv = (MeasuredValueShortWithCP56Time2a)asdu.GetElement (i); - Console.WriteLine (" IOA: " + mfv.ObjectAddress + " float value: " + mfv.Value); - Console.WriteLine (" " + mfv.Quality.ToString ()); - Console.WriteLine (" " + mfv.Timestamp.ToString ()); - Console.WriteLine (" " + mfv.Timestamp.GetDateTime ().ToString ()); - } - } else if (asdu.TypeId == TypeID.M_SP_TB_1) { + Console.WriteLine (" IOA: " + mfv.ObjectAddress + " float value: " + mfv.Value); + Console.WriteLine (" " + mfv.Quality.ToString ()); + Console.WriteLine (" " + mfv.Timestamp.ToString ()); + Console.WriteLine (" " + mfv.Timestamp.GetDateTime ().ToString ()); + } + } else if (asdu.TypeId == TypeID.M_SP_TB_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { + for (int i = 0; i < asdu.NumberOfElements; i++) { - var val = (SinglePointWithCP56Time2a)asdu.GetElement (i); + var val = (SinglePointWithCP56Time2a)asdu.GetElement (i); - Console.WriteLine (" IOA: " + val.ObjectAddress + " SP value: " + val.Value); - Console.WriteLine (" " + val.Quality.ToString ()); - Console.WriteLine (" " + val.Timestamp.ToString ()); - } - } else if (asdu.TypeId == TypeID.M_ME_NC_1) { + Console.WriteLine (" IOA: " + val.ObjectAddress + " SP value: " + val.Value); + Console.WriteLine (" " + val.Quality.ToString ()); + Console.WriteLine (" " + val.Timestamp.ToString ()); + } + } else if (asdu.TypeId == TypeID.M_ME_NC_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { - var mfv = (MeasuredValueShort)asdu.GetElement (i); + for (int i = 0; i < asdu.NumberOfElements; i++) { + var mfv = (MeasuredValueShort)asdu.GetElement (i); - Console.WriteLine (" IOA: " + mfv.ObjectAddress + " float value: " + mfv.Value); - Console.WriteLine (" " + mfv.Quality.ToString ()); - } - } else if (asdu.TypeId == TypeID.M_ME_NB_1) { + Console.WriteLine (" IOA: " + mfv.ObjectAddress + " float value: " + mfv.Value); + Console.WriteLine (" " + mfv.Quality.ToString ()); + } + } else if (asdu.TypeId == TypeID.M_ME_NB_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { + for (int i = 0; i < asdu.NumberOfElements; i++) { - var msv = (MeasuredValueScaled)asdu.GetElement (i); + var msv = (MeasuredValueScaled)asdu.GetElement (i); - Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.ScaledValue); - Console.WriteLine (" " + msv.Quality.ToString ()); - } + Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.ScaledValue); + Console.WriteLine (" " + msv.Quality.ToString ()); + } - } + } - return true; - } + return true; + } - private static void linkLayerStateChanged (object parameter, int address, lib60870.linklayer.LinkLayerState newState) - { - Console.WriteLine ("LL state event {0} for slave {1}", newState.ToString (), address); - } + private static void linkLayerStateChanged (object parameter, int address, lib60870.linklayer.LinkLayerState newState) + { + Console.WriteLine ("LL state event {0} for slave {1}", newState.ToString (), address); + } - public class Receiver : IFileReceiver - { - public void Finished(FileErrorCode result) - { - Console.WriteLine ("File download finished - code: " + result.ToString ()); - } - - public void SegmentReceived(byte sectionName, int offset, int size, byte[] data) - { - Console.WriteLine ("File segment - sectionName: {0} offset: {1} size: {2}", sectionName, offset, size); - } - } + public class Receiver : IFileReceiver + { + public void Finished(FileErrorCode result) + { + Console.WriteLine ("File download finished - code: " + result.ToString ()); + } + + public void SegmentReceived(byte sectionName, int offset, int size, byte[] data) + { + Console.WriteLine ("File segment - sectionName: {0} offset: {1} size: {2}", sectionName, offset, size); + } + } - public static void Main (string[] args) - { - bool running = true; + public static void Main (string[] args) + { + bool running = true; - // use Ctrl-C to stop the programm - Console.CancelKeyPress += delegate(object? sender, ConsoleCancelEventArgs e) { - e.Cancel = true; - running = false; - }; + // use Ctrl-C to stop the programm + Console.CancelKeyPress += delegate(object? sender, ConsoleCancelEventArgs e) { + e.Cancel = true; + running = false; + }; - string portName = "COM1"; + string portName = "COM1"; - if (args.Length > 0) - portName = args [0]; + if (args.Length > 0) + portName = args [0]; - SerialPort port = new SerialPort (); + SerialPort port = new SerialPort (); - port.PortName = portName; - port.BaudRate = 9600; - port.Parity = Parity.Even; - port.Handshake = Handshake.None; - port.Open (); - port.DiscardInBuffer (); + port.PortName = portName; + port.BaudRate = 9600; + port.Parity = Parity.Even; + port.Handshake = Handshake.None; + port.Open (); + port.DiscardInBuffer (); - /* set link layer address length */ - LinkLayerParameters llParameters = new LinkLayerParameters (); - llParameters.AddressLength = 1; + /* set link layer address length */ + LinkLayerParameters llParameters = new LinkLayerParameters (); + llParameters.AddressLength = 1; - /* unbalanced mode allows multiple slaves on a single serial line */ - CS101Master master = new CS101Master(port, LinkLayerMode.UNBALANCED, llParameters); - master.DebugOutput = false; - master.SetASDUReceivedHandler (asduReceivedHandler, null); + /* unbalanced mode allows multiple slaves on a single serial line */ + CS101Master master = new CS101Master(port, LinkLayerMode.UNBALANCED, llParameters); + master.DebugOutput = false; + master.SetASDUReceivedHandler (asduReceivedHandler, null); - master.SetLinkLayerStateChangedHandler (linkLayerStateChanged, null); + master.SetLinkLayerStateChangedHandler (linkLayerStateChanged, null); - master.AddSlave (1); - master.AddSlave (2); - master.AddSlave (3); + master.AddSlave (1); + master.AddSlave (2); + master.AddSlave (3); - long lastTimestamp = SystemUtils.currentTimeMillis (); + long lastTimestamp = SystemUtils.currentTimeMillis (); - master.SlaveAddress = 1; - //master.GetFile (1, 30000, NameOfFile.TRANSPARENT_FILE, new Receiver ()); + master.SlaveAddress = 1; + //master.GetFile (1, 30000, NameOfFile.TRANSPARENT_FILE, new Receiver ()); - while (running) { + while (running) { - master.PollSingleSlave(1); + master.PollSingleSlave(1); - master.Run (); + master.Run (); - master.PollSingleSlave(2); + master.PollSingleSlave(2); - master.Run (); + master.Run (); - master.PollSingleSlave(3); + master.PollSingleSlave(3); - master.Run (); + master.Run (); - if ((SystemUtils.currentTimeMillis() - lastTimestamp) >= 20000) { + if ((SystemUtils.currentTimeMillis() - lastTimestamp) >= 20000) { - lastTimestamp = SystemUtils.currentTimeMillis (); + lastTimestamp = SystemUtils.currentTimeMillis (); - try { - master.SlaveAddress = 1; - master.SendInterrogationCommand (CauseOfTransmission.ACTIVATION, 1, 20); - } - catch (LinkLayerBusyException) { - Console.WriteLine ("Slave 1: Link layer busy or not ready"); - } + try { + master.SlaveAddress = 1; + master.SendInterrogationCommand (CauseOfTransmission.ACTIVATION, 1, 20); + } + catch (LinkLayerBusyException) { + Console.WriteLine ("Slave 1: Link layer busy or not ready"); + } - try { - master.SlaveAddress = 2; - master.SendInterrogationCommand (CauseOfTransmission.ACTIVATION, 2, 20); - } - catch (LinkLayerBusyException) { - Console.WriteLine ("Slave 2: Link layer busy or not ready"); - } - - try { - master.SlaveAddress = 3; - master.SendInterrogationCommand (CauseOfTransmission.ACTIVATION, 3, 20); - } - catch (LinkLayerBusyException) { - Console.WriteLine ("Slave 2: Link layer busy or not ready"); - } - } - - } - - port.Close (); - } - } + try { + master.SlaveAddress = 2; + master.SendInterrogationCommand (CauseOfTransmission.ACTIVATION, 2, 20); + } + catch (LinkLayerBusyException) { + Console.WriteLine ("Slave 2: Link layer busy or not ready"); + } + + try { + master.SlaveAddress = 3; + master.SendInterrogationCommand (CauseOfTransmission.ACTIVATION, 3, 20); + } + catch (LinkLayerBusyException) { + Console.WriteLine ("Slave 2: Link layer busy or not ready"); + } + } + + } + + port.Close (); + } + } } diff --git a/examples/cs101-slave-balanced/Program.cs b/examples/cs101-slave-balanced/Program.cs index 21160f4..6b4d995 100644 --- a/examples/cs101-slave-balanced/Program.cs +++ b/examples/cs101-slave-balanced/Program.cs @@ -8,144 +8,144 @@ namespace cs101_slave_balanced { - public class CS101TestSlave { + public class CS101TestSlave { - private static bool myInterrogationHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qoi) - { - Console.WriteLine("Interrogation for group " + qoi); + private static bool myInterrogationHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qoi) + { + Console.WriteLine("Interrogation for group " + qoi); - connection.SendACT_CON (asdu, false); + connection.SendACT_CON (asdu, false); - // send information objects - ASDU newAsdu = new ASDU(connection.GetApplicationLayerParameters(), CauseOfTransmission.INTERROGATED_BY_STATION, - false, false, 2, 1, false); + // send information objects + ASDU newAsdu = new ASDU(connection.GetApplicationLayerParameters(), CauseOfTransmission.INTERROGATED_BY_STATION, + false, false, 2, 1, false); - newAsdu.AddInformationObject (new MeasuredValueScaled (100, -1, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (100, -1, new QualityDescriptor ())); - newAsdu.AddInformationObject (new MeasuredValueScaled (101, 23, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (101, 23, new QualityDescriptor ())); - newAsdu.AddInformationObject (new MeasuredValueScaled (102, 2300, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (102, 2300, new QualityDescriptor ())); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - // send sequence of information objects - newAsdu = new ASDU (connection.GetApplicationLayerParameters(), CauseOfTransmission.INTERROGATED_BY_STATION, - false, false, 2, 1, true); + // send sequence of information objects + newAsdu = new ASDU (connection.GetApplicationLayerParameters(), CauseOfTransmission.INTERROGATED_BY_STATION, + false, false, 2, 1, true); - newAsdu.AddInformationObject (new SinglePointInformation (200, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (201, false, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (202, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (203, false, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (204, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (205, false, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (206, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (207, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (200, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (201, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (202, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (203, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (204, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (205, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (206, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (207, false, new QualityDescriptor ())); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - connection.SendACT_TERM (asdu); + connection.SendACT_TERM (asdu); - return true; - } + return true; + } - public static void Main (string[] args) - { - bool running = true; + public static void Main (string[] args) + { + bool running = true; - // use Ctrl-C to stop the programm - Console.CancelKeyPress += delegate(object? sender, ConsoleCancelEventArgs e) { - e.Cancel = true; - running = false; - }; + // use Ctrl-C to stop the programm + Console.CancelKeyPress += delegate(object? sender, ConsoleCancelEventArgs e) { + e.Cancel = true; + running = false; + }; - string portName = "COM2"; // e.g. "COM3" on windows + string portName = "COM2"; // e.g. "COM3" on windows - if (args.Length > 0) - portName = args [0]; + if (args.Length > 0) + portName = args [0]; - SerialPort port = new SerialPort (); + SerialPort port = new SerialPort (); - port.PortName = portName; - port.BaudRate = 9600; - port.Parity = Parity.Even; - port.Handshake = Handshake.None; - port.Open (); + port.PortName = portName; + port.BaudRate = 9600; + port.Parity = Parity.Even; + port.Handshake = Handshake.None; + port.Open (); - LinkLayerParameters llParameters = new LinkLayerParameters (); - llParameters.AddressLength = 1; - llParameters.TimeoutForACK = 500; - llParameters.UseSingleCharACK = false; + LinkLayerParameters llParameters = new LinkLayerParameters (); + llParameters.AddressLength = 1; + llParameters.TimeoutForACK = 500; + llParameters.UseSingleCharACK = false; - CS101Slave slave = new CS101Slave (port, llParameters); - slave.DebugOutput = true; - slave.LinkLayerAddress = 2; - slave.LinkLayerAddressOtherStation = 1; + CS101Slave slave = new CS101Slave (port, llParameters); + slave.DebugOutput = true; + slave.LinkLayerAddress = 2; + slave.LinkLayerAddressOtherStation = 1; - slave.LinkLayerMode = lib60870.linklayer.LinkLayerMode.BALANCED; + slave.LinkLayerMode = lib60870.linklayer.LinkLayerMode.BALANCED; - slave.SetInterrogationHandler (myInterrogationHandler, null); + slave.SetInterrogationHandler (myInterrogationHandler, null); - slave.SetUserDataQueueSizes (50, 20); + slave.SetUserDataQueueSizes (50, 20); - ASDU asdu = new ASDU (slave.Parameters, CauseOfTransmission.SPONTANEOUS, false, false, 0, 1, false); - asdu.AddInformationObject (new StepPositionInformation (301, 1, false, new QualityDescriptor())); - slave.EnqueueUserDataClass1 (asdu); + ASDU asdu = new ASDU (slave.Parameters, CauseOfTransmission.SPONTANEOUS, false, false, 0, 1, false); + asdu.AddInformationObject (new StepPositionInformation (301, 1, false, new QualityDescriptor())); + slave.EnqueueUserDataClass1 (asdu); - long lastTimestamp = SystemUtils.currentTimeMillis (); - Int16 measuredValue = 0; + long lastTimestamp = SystemUtils.currentTimeMillis (); + Int16 measuredValue = 0; - TransparentFile file = new TransparentFile (1, 30000, NameOfFile.TRANSPARENT_FILE); + TransparentFile file = new TransparentFile (1, 30000, NameOfFile.TRANSPARENT_FILE); - byte[] fileData = new byte[1025]; + byte[] fileData = new byte[1025]; - for (int i = 0; i < 1025; i++) - fileData [i] = (byte)(i + 1); + for (int i = 0; i < 1025; i++) + fileData [i] = (byte)(i + 1); - file.AddSection (fileData); + file.AddSection (fileData); - slave.GetAvailableFiles().AddFile (file); + slave.GetAvailableFiles().AddFile (file); - while (running) { + while (running) { - slave.Run (); // call the protocol stack + slave.Run (); // call the protocol stack - if ((SystemUtils.currentTimeMillis() - lastTimestamp) >= 5000) { + if ((SystemUtils.currentTimeMillis() - lastTimestamp) >= 5000) { - lastTimestamp = SystemUtils.currentTimeMillis (); + lastTimestamp = SystemUtils.currentTimeMillis (); - ASDU newAsdu = new ASDU (slave.Parameters, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); - newAsdu.AddInformationObject (new MeasuredValueScaled (110, measuredValue, new QualityDescriptor ())); - slave.EnqueueUserDataClass2 (newAsdu); + ASDU newAsdu = new ASDU (slave.Parameters, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + newAsdu.AddInformationObject (new MeasuredValueScaled (110, measuredValue, new QualityDescriptor ())); + slave.EnqueueUserDataClass2 (newAsdu); - measuredValue++; - } + measuredValue++; + } - if (Console.KeyAvailable) { + if (Console.KeyAvailable) { - ConsoleKeyInfo keyInfo = Console.ReadKey (); + ConsoleKeyInfo keyInfo = Console.ReadKey (); - if (keyInfo.KeyChar == 't') { - slave.SendLinkLayerTestFunction (); - } - else { - Console.WriteLine ("Send spontaneous message"); + if (keyInfo.KeyChar == 't') { + slave.SendLinkLayerTestFunction (); + } + else { + Console.WriteLine ("Send spontaneous message"); - bool value = false; + bool value = false; - if (keyInfo.KeyChar == 's') { - value = true; - } + if (keyInfo.KeyChar == 's') { + value = true; + } - ASDU newAsdu = new ASDU (slave.Parameters, CauseOfTransmission.SPONTANEOUS, false, false, 0, 1, false); - newAsdu.AddInformationObject (new SinglePointInformation (100, value, new QualityDescriptor ())); + ASDU newAsdu = new ASDU (slave.Parameters, CauseOfTransmission.SPONTANEOUS, false, false, 0, 1, false); + newAsdu.AddInformationObject (new SinglePointInformation (100, value, new QualityDescriptor ())); - slave.EnqueueUserDataClass1 (newAsdu); - } - } + slave.EnqueueUserDataClass1 (newAsdu); + } + } Thread.Sleep(1); - } + } - } - } + } + } } diff --git a/examples/cs101-slave-tcp/Program.cs b/examples/cs101-slave-tcp/Program.cs index fc09484..9df01fe 100644 --- a/examples/cs101-slave-tcp/Program.cs +++ b/examples/cs101-slave-tcp/Program.cs @@ -8,139 +8,139 @@ namespace cs101_slave_tcp { - public class CS101TestSlave - { + public class CS101TestSlave + { - private static bool myInterrogationHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qoi) - { - Console.WriteLine("Interrogation for group " + qoi); + private static bool myInterrogationHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qoi) + { + Console.WriteLine("Interrogation for group " + qoi); - connection.SendACT_CON (asdu, false); + connection.SendACT_CON (asdu, false); - // send information objects - ASDU newAsdu = new ASDU(connection.GetApplicationLayerParameters(), CauseOfTransmission.INTERROGATED_BY_STATION, - false, false, 2, 1, false); + // send information objects + ASDU newAsdu = new ASDU(connection.GetApplicationLayerParameters(), CauseOfTransmission.INTERROGATED_BY_STATION, + false, false, 2, 1, false); - newAsdu.AddInformationObject (new MeasuredValueScaled (100, -1, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (100, -1, new QualityDescriptor ())); - newAsdu.AddInformationObject (new MeasuredValueScaled (101, 23, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (101, 23, new QualityDescriptor ())); - newAsdu.AddInformationObject (new MeasuredValueScaled (102, 2300, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (102, 2300, new QualityDescriptor ())); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - // send sequence of information objects - newAsdu = new ASDU (connection.GetApplicationLayerParameters(), CauseOfTransmission.INTERROGATED_BY_STATION, - false, false, 2, 1, true); + // send sequence of information objects + newAsdu = new ASDU (connection.GetApplicationLayerParameters(), CauseOfTransmission.INTERROGATED_BY_STATION, + false, false, 2, 1, true); - newAsdu.AddInformationObject (new SinglePointInformation (200, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (201, false, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (202, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (203, false, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (204, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (205, false, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (206, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (207, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (200, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (201, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (202, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (203, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (204, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (205, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (206, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (207, false, new QualityDescriptor ())); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - connection.SendACT_TERM (asdu); + connection.SendACT_TERM (asdu); - return true; - } + return true; + } - public static void Main (string[] args) - { - bool running = true; + public static void Main (string[] args) + { + bool running = true; - // use Ctrl-C to stop the programm - Console.CancelKeyPress += delegate(object? sender, ConsoleCancelEventArgs e) { - e.Cancel = true; - running = false; - }; - - LinkLayerParameters llParameters = new LinkLayerParameters (); - llParameters.AddressLength = 1; - llParameters.TimeoutForACK = 500; - llParameters.UseSingleCharACK = true; + // use Ctrl-C to stop the programm + Console.CancelKeyPress += delegate(object? sender, ConsoleCancelEventArgs e) { + e.Cancel = true; + running = false; + }; + + LinkLayerParameters llParameters = new LinkLayerParameters (); + llParameters.AddressLength = 1; + llParameters.TimeoutForACK = 500; + llParameters.UseSingleCharACK = true; - TcpServerVirtualSerialPort port = new TcpServerVirtualSerialPort (); - //TcpClientVirtualSerialPort port = new TcpClientVirtualSerialPort("192.168.2.9", 2404); + TcpServerVirtualSerialPort port = new TcpServerVirtualSerialPort (); + //TcpClientVirtualSerialPort port = new TcpClientVirtualSerialPort("192.168.2.9", 2404); - port.DebugOutput = true; - port.Start (); + port.DebugOutput = true; + port.Start (); - CS101Slave slave = new CS101Slave (port, llParameters); - slave.DebugOutput = true; - slave.LinkLayerAddress = 3; - slave.LinkLayerAddressOtherStation = 1; + CS101Slave slave = new CS101Slave (port, llParameters); + slave.DebugOutput = true; + slave.LinkLayerAddress = 3; + slave.LinkLayerAddressOtherStation = 1; - slave.LinkLayerMode = lib60870.linklayer.LinkLayerMode.BALANCED; + slave.LinkLayerMode = lib60870.linklayer.LinkLayerMode.BALANCED; - slave.SetInterrogationHandler (myInterrogationHandler, null); + slave.SetInterrogationHandler (myInterrogationHandler, null); - slave.SetUserDataQueueSizes (50, 20); + slave.SetUserDataQueueSizes (50, 20); - ASDU asdu = new ASDU (slave.Parameters, CauseOfTransmission.SPONTANEOUS, false, false, 0, 1, false); - asdu.AddInformationObject (new StepPositionInformation (301, 1, false, new QualityDescriptor())); - slave.EnqueueUserDataClass1 (asdu); + ASDU asdu = new ASDU (slave.Parameters, CauseOfTransmission.SPONTANEOUS, false, false, 0, 1, false); + asdu.AddInformationObject (new StepPositionInformation (301, 1, false, new QualityDescriptor())); + slave.EnqueueUserDataClass1 (asdu); - long lastTimestamp = SystemUtils.currentTimeMillis (); - Int16 measuredValue = 0; + long lastTimestamp = SystemUtils.currentTimeMillis (); + Int16 measuredValue = 0; - TransparentFile file = new TransparentFile (1, 30000, NameOfFile.TRANSPARENT_FILE); + TransparentFile file = new TransparentFile (1, 30000, NameOfFile.TRANSPARENT_FILE); - byte[] fileData = new byte[1025]; + byte[] fileData = new byte[1025]; - for (int i = 0; i < 1025; i++) - fileData [i] = (byte)(i + 1); + for (int i = 0; i < 1025; i++) + fileData [i] = (byte)(i + 1); - file.AddSection (fileData); + file.AddSection (fileData); - slave.GetAvailableFiles().AddFile (file); + slave.GetAvailableFiles().AddFile (file); - while (running) { + while (running) { - slave.Run (); // call the protocol stack + slave.Run (); // call the protocol stack - if ((SystemUtils.currentTimeMillis() - lastTimestamp) >= 5000) { + if ((SystemUtils.currentTimeMillis() - lastTimestamp) >= 5000) { - lastTimestamp = SystemUtils.currentTimeMillis (); + lastTimestamp = SystemUtils.currentTimeMillis (); - ASDU newAsdu = new ASDU (slave.Parameters, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); - newAsdu.AddInformationObject (new MeasuredValueScaled (110, measuredValue, new QualityDescriptor ())); - slave.EnqueueUserDataClass2 (newAsdu); + ASDU newAsdu = new ASDU (slave.Parameters, CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + newAsdu.AddInformationObject (new MeasuredValueScaled (110, measuredValue, new QualityDescriptor ())); + slave.EnqueueUserDataClass2 (newAsdu); - measuredValue++; - } + measuredValue++; + } - if (Console.KeyAvailable) { + if (Console.KeyAvailable) { - ConsoleKeyInfo keyInfo = Console.ReadKey (); + ConsoleKeyInfo keyInfo = Console.ReadKey (); - if (keyInfo.KeyChar == 't') { - slave.SendLinkLayerTestFunction (); - } - else { - Console.WriteLine ("Send spontaneous message"); + if (keyInfo.KeyChar == 't') { + slave.SendLinkLayerTestFunction (); + } + else { + Console.WriteLine ("Send spontaneous message"); - bool value = false; + bool value = false; - if (keyInfo.KeyChar == 's') { - value = true; - } + if (keyInfo.KeyChar == 's') { + value = true; + } - ASDU newAsdu = new ASDU (slave.Parameters, CauseOfTransmission.SPONTANEOUS, false, false, 0, 1, false); - newAsdu.AddInformationObject (new SinglePointInformation (100, value, new QualityDescriptor ())); + ASDU newAsdu = new ASDU (slave.Parameters, CauseOfTransmission.SPONTANEOUS, false, false, 0, 1, false); + newAsdu.AddInformationObject (new SinglePointInformation (100, value, new QualityDescriptor ())); - slave.EnqueueUserDataClass1 (newAsdu); - } - } + slave.EnqueueUserDataClass1 (newAsdu); + } + } Thread.Sleep(1); - } + } - port.Stop (); - } - } + port.Stop (); + } + } } diff --git a/examples/cs101-slave-unbalanced/Program.cs b/examples/cs101-slave-unbalanced/Program.cs index fa21dea..22ac900 100644 --- a/examples/cs101-slave-unbalanced/Program.cs +++ b/examples/cs101-slave-unbalanced/Program.cs @@ -7,151 +7,151 @@ namespace cs101_slave_unbalanced { - public class CS101TestSlave { + public class CS101TestSlave { - private static int slaveAddress = 1; + private static int slaveAddress = 1; - private static bool myInterrogationHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qoi) - { - - if (asdu.Ca == slaveAddress) { + private static bool myInterrogationHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qoi) + { + + if (asdu.Ca == slaveAddress) { - Console.WriteLine("Interrogation for group " + qoi); + Console.WriteLine("Interrogation for group " + qoi); - connection.SendACT_CON (asdu, false); + connection.SendACT_CON (asdu, false); - // send information objects - ASDU newAsdu = new ASDU (connection.GetApplicationLayerParameters (), CauseOfTransmission.INTERROGATED_BY_STATION, - false, false, 2, slaveAddress, false); + // send information objects + ASDU newAsdu = new ASDU (connection.GetApplicationLayerParameters (), CauseOfTransmission.INTERROGATED_BY_STATION, + false, false, 2, slaveAddress, false); - newAsdu.AddInformationObject (new MeasuredValueScaled (100, -1, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (100, -1, new QualityDescriptor ())); - newAsdu.AddInformationObject (new MeasuredValueScaled (101, 23, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (101, 23, new QualityDescriptor ())); - newAsdu.AddInformationObject (new MeasuredValueScaled (102, 2300, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (102, 2300, new QualityDescriptor ())); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - // send sequence of information objects - newAsdu = new ASDU (connection.GetApplicationLayerParameters (), CauseOfTransmission.INTERROGATED_BY_STATION, - false, false, 2, slaveAddress, true); + // send sequence of information objects + newAsdu = new ASDU (connection.GetApplicationLayerParameters (), CauseOfTransmission.INTERROGATED_BY_STATION, + false, false, 2, slaveAddress, true); - newAsdu.AddInformationObject (new SinglePointInformation (200, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (201, false, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (202, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (203, false, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (204, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (205, false, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (206, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (207, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (200, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (201, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (202, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (203, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (204, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (205, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (206, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (207, false, new QualityDescriptor ())); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - connection.SendACT_TERM (asdu); + connection.SendACT_TERM (asdu); - } + } - return true; - } + return true; + } - public static void Main (string[] args) - { - bool running = true; + public static void Main (string[] args) + { + bool running = true; - // use Ctrl-C to stop the programm - Console.CancelKeyPress += delegate(object? sender, ConsoleCancelEventArgs e) { - e.Cancel = true; - running = false; - }; + // use Ctrl-C to stop the programm + Console.CancelKeyPress += delegate(object? sender, ConsoleCancelEventArgs e) { + e.Cancel = true; + running = false; + }; - string portName = "COM2"; + string portName = "COM2"; - if (args.Length > 0) - portName = args [0]; + if (args.Length > 0) + portName = args [0]; - if (args.Length > 1) - int.TryParse (args [1], out slaveAddress); + if (args.Length > 1) + int.TryParse (args [1], out slaveAddress); - SerialPort port = new SerialPort (); + SerialPort port = new SerialPort (); - port.PortName = portName; - port.BaudRate = 9600; - port.Parity = Parity.Even; - port.Handshake = Handshake.None; - port.Open (); + port.PortName = portName; + port.BaudRate = 9600; + port.Parity = Parity.Even; + port.Handshake = Handshake.None; + port.Open (); - LinkLayerParameters llParameters = new LinkLayerParameters (); - llParameters.AddressLength = 1; - llParameters.UseSingleCharACK = true; + LinkLayerParameters llParameters = new LinkLayerParameters (); + llParameters.AddressLength = 1; + llParameters.UseSingleCharACK = true; - CS101Slave slave = new CS101Slave (port, llParameters); - slave.DebugOutput = true; - slave.LinkLayerAddress = slaveAddress; + CS101Slave slave = new CS101Slave (port, llParameters); + slave.DebugOutput = true; + slave.LinkLayerAddress = slaveAddress; - // for using the slave in balanced mode simple change the mode here: - slave.LinkLayerMode = lib60870.linklayer.LinkLayerMode.UNBALANCED; + // for using the slave in balanced mode simple change the mode here: + slave.LinkLayerMode = lib60870.linklayer.LinkLayerMode.UNBALANCED; - slave.SetInterrogationHandler (myInterrogationHandler, null); + slave.SetInterrogationHandler (myInterrogationHandler, null); - slave.SetUserDataQueueSizes (50, 20); + slave.SetUserDataQueueSizes (50, 20); - ASDU asdu = new ASDU (slave.Parameters, CauseOfTransmission.SPONTANEOUS, false, false, 0, 1, false); - asdu.AddInformationObject (new StepPositionInformation (301, 1, false, new QualityDescriptor())); - slave.EnqueueUserDataClass1 (asdu); + ASDU asdu = new ASDU (slave.Parameters, CauseOfTransmission.SPONTANEOUS, false, false, 0, 1, false); + asdu.AddInformationObject (new StepPositionInformation (301, 1, false, new QualityDescriptor())); + slave.EnqueueUserDataClass1 (asdu); - long lastTimestamp = SystemUtils.currentTimeMillis (); - Int16 measuredValue = 0; + long lastTimestamp = SystemUtils.currentTimeMillis (); + Int16 measuredValue = 0; - TransparentFile file = new TransparentFile (1, 30000, NameOfFile.TRANSPARENT_FILE); + TransparentFile file = new TransparentFile (1, 30000, NameOfFile.TRANSPARENT_FILE); - byte[] fileData = new byte[1025]; + byte[] fileData = new byte[1025]; - for (int i = 0; i < 1025; i++) - fileData [i] = (byte)(i + 1); + for (int i = 0; i < 1025; i++) + fileData [i] = (byte)(i + 1); - file.AddSection (fileData); + file.AddSection (fileData); - slave.GetAvailableFiles().AddFile (file); + slave.GetAvailableFiles().AddFile (file); - while (running) { + while (running) { - slave.Run (); // call the protocol stack + slave.Run (); // call the protocol stack - if ((SystemUtils.currentTimeMillis() - lastTimestamp) >= 5000) { + if ((SystemUtils.currentTimeMillis() - lastTimestamp) >= 5000) { - lastTimestamp = SystemUtils.currentTimeMillis (); + lastTimestamp = SystemUtils.currentTimeMillis (); - ASDU newAsdu = new ASDU (slave.Parameters, CauseOfTransmission.PERIODIC, false, false, 0, slaveAddress, false); - newAsdu.AddInformationObject (new MeasuredValueScaled (110, measuredValue, new QualityDescriptor ())); - slave.EnqueueUserDataClass2 (newAsdu); + ASDU newAsdu = new ASDU (slave.Parameters, CauseOfTransmission.PERIODIC, false, false, 0, slaveAddress, false); + newAsdu.AddInformationObject (new MeasuredValueScaled (110, measuredValue, new QualityDescriptor ())); + slave.EnqueueUserDataClass2 (newAsdu); - measuredValue++; - } + measuredValue++; + } - if (Console.KeyAvailable) { + if (Console.KeyAvailable) { - ConsoleKeyInfo keyInfo = Console.ReadKey (); + ConsoleKeyInfo keyInfo = Console.ReadKey (); - if (keyInfo.KeyChar == 't') { - slave.SendLinkLayerTestFunction (); - } - else { - Console.WriteLine ("Send spontaneous message"); + if (keyInfo.KeyChar == 't') { + slave.SendLinkLayerTestFunction (); + } + else { + Console.WriteLine ("Send spontaneous message"); - bool value = false; + bool value = false; - if (keyInfo.KeyChar == 's') { - value = true; - } + if (keyInfo.KeyChar == 's') { + value = true; + } - ASDU newAsdu = new ASDU (slave.Parameters, CauseOfTransmission.SPONTANEOUS, false, false, 0, slaveAddress, false); - newAsdu.AddInformationObject (new SinglePointInformation (100, value, new QualityDescriptor ())); + ASDU newAsdu = new ASDU (slave.Parameters, CauseOfTransmission.SPONTANEOUS, false, false, 0, slaveAddress, false); + newAsdu.AddInformationObject (new SinglePointInformation (100, value, new QualityDescriptor ())); - slave.EnqueueUserDataClass1 (newAsdu); - } - } - } + slave.EnqueueUserDataClass1 (newAsdu); + } + } + } - } - } + } + } } diff --git a/examples/cs104-client1/Program.cs b/examples/cs104-client1/Program.cs index 417c742..048944d 100644 --- a/examples/cs104-client1/Program.cs +++ b/examples/cs104-client1/Program.cs @@ -7,193 +7,193 @@ namespace cs104_client1 { - class MainClass - { + class MainClass + { - private static void ConnectionHandler (object parameter, ConnectionEvent connectionEvent) - { - switch (connectionEvent) { - case ConnectionEvent.OPENED: - Console.WriteLine ("Connected"); - break; - case ConnectionEvent.CLOSED: - Console.WriteLine ("Connection closed"); - break; - case ConnectionEvent.STARTDT_CON_RECEIVED: - Console.WriteLine ("STARTDT CON received"); - break; - case ConnectionEvent.STOPDT_CON_RECEIVED: - Console.WriteLine ("STOPDT CON received"); - break; - } - } + private static void ConnectionHandler (object parameter, ConnectionEvent connectionEvent) + { + switch (connectionEvent) { + case ConnectionEvent.OPENED: + Console.WriteLine ("Connected"); + break; + case ConnectionEvent.CLOSED: + Console.WriteLine ("Connection closed"); + break; + case ConnectionEvent.STARTDT_CON_RECEIVED: + Console.WriteLine ("STARTDT CON received"); + break; + case ConnectionEvent.STOPDT_CON_RECEIVED: + Console.WriteLine ("STOPDT CON received"); + break; + } + } - private static bool asduReceivedHandler(object parameter, ASDU asdu) - { - Console.WriteLine (asdu.ToString ()); + private static bool asduReceivedHandler(object parameter, ASDU asdu) + { + Console.WriteLine (asdu.ToString ()); - if (asdu.TypeId == TypeID.M_SP_NA_1) { + if (asdu.TypeId == TypeID.M_SP_NA_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { + for (int i = 0; i < asdu.NumberOfElements; i++) { - var val = (SinglePointInformation)asdu.GetElement (i); + var val = (SinglePointInformation)asdu.GetElement (i); - Console.WriteLine (" IOA: " + val.ObjectAddress + " SP value: " + val.Value); - Console.WriteLine (" " + val.Quality.ToString ()); - } - } else if (asdu.TypeId == TypeID.M_ME_TE_1) { - - for (int i = 0; i < asdu.NumberOfElements; i++) { + Console.WriteLine (" IOA: " + val.ObjectAddress + " SP value: " + val.Value); + Console.WriteLine (" " + val.Quality.ToString ()); + } + } else if (asdu.TypeId == TypeID.M_ME_TE_1) { + + for (int i = 0; i < asdu.NumberOfElements; i++) { - var msv = (MeasuredValueScaledWithCP56Time2a)asdu.GetElement (i); + var msv = (MeasuredValueScaledWithCP56Time2a)asdu.GetElement (i); - Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.ScaledValue); - Console.WriteLine (" " + msv.Quality.ToString ()); - Console.WriteLine (" " + msv.Timestamp.ToString ()); - } + Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.ScaledValue); + Console.WriteLine (" " + msv.Quality.ToString ()); + Console.WriteLine (" " + msv.Timestamp.ToString ()); + } - } else if (asdu.TypeId == TypeID.M_ME_TF_1) { + } else if (asdu.TypeId == TypeID.M_ME_TF_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { - var mfv = (MeasuredValueShortWithCP56Time2a)asdu.GetElement (i); + for (int i = 0; i < asdu.NumberOfElements; i++) { + var mfv = (MeasuredValueShortWithCP56Time2a)asdu.GetElement (i); - Console.WriteLine (" IOA: " + mfv.ObjectAddress + " float value: " + mfv.Value); - Console.WriteLine (" " + mfv.Quality.ToString ()); - Console.WriteLine (" " + mfv.Timestamp.ToString ()); - Console.WriteLine (" " + mfv.Timestamp.GetDateTime ().ToString ()); - } - } else if (asdu.TypeId == TypeID.M_SP_TB_1) { + Console.WriteLine (" IOA: " + mfv.ObjectAddress + " float value: " + mfv.Value); + Console.WriteLine (" " + mfv.Quality.ToString ()); + Console.WriteLine (" " + mfv.Timestamp.ToString ()); + Console.WriteLine (" " + mfv.Timestamp.GetDateTime ().ToString ()); + } + } else if (asdu.TypeId == TypeID.M_SP_TB_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { + for (int i = 0; i < asdu.NumberOfElements; i++) { - var val = (SinglePointWithCP56Time2a)asdu.GetElement (i); + var val = (SinglePointWithCP56Time2a)asdu.GetElement (i); - Console.WriteLine (" IOA: " + val.ObjectAddress + " SP value: " + val.Value); - Console.WriteLine (" " + val.Quality.ToString ()); - Console.WriteLine (" " + val.Timestamp.ToString ()); - } - } else if (asdu.TypeId == TypeID.M_ME_NC_1) { + Console.WriteLine (" IOA: " + val.ObjectAddress + " SP value: " + val.Value); + Console.WriteLine (" " + val.Quality.ToString ()); + Console.WriteLine (" " + val.Timestamp.ToString ()); + } + } else if (asdu.TypeId == TypeID.M_ME_NC_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { - var mfv = (MeasuredValueShort)asdu.GetElement (i); + for (int i = 0; i < asdu.NumberOfElements; i++) { + var mfv = (MeasuredValueShort)asdu.GetElement (i); - Console.WriteLine (" IOA: " + mfv.ObjectAddress + " float value: " + mfv.Value); - Console.WriteLine (" " + mfv.Quality.ToString ()); - } - } else if (asdu.TypeId == TypeID.M_ME_NB_1) { + Console.WriteLine (" IOA: " + mfv.ObjectAddress + " float value: " + mfv.Value); + Console.WriteLine (" " + mfv.Quality.ToString ()); + } + } else if (asdu.TypeId == TypeID.M_ME_NB_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { + for (int i = 0; i < asdu.NumberOfElements; i++) { - var msv = (MeasuredValueScaled)asdu.GetElement (i); + var msv = (MeasuredValueScaled)asdu.GetElement (i); - Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.ScaledValue); - Console.WriteLine (" " + msv.Quality.ToString ()); - } + Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.ScaledValue); + Console.WriteLine (" " + msv.Quality.ToString ()); + } - } else if (asdu.TypeId == TypeID.M_ME_ND_1) { + } else if (asdu.TypeId == TypeID.M_ME_ND_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { + for (int i = 0; i < asdu.NumberOfElements; i++) { - var msv = (MeasuredValueNormalizedWithoutQuality)asdu.GetElement (i); + var msv = (MeasuredValueNormalizedWithoutQuality)asdu.GetElement (i); - Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.NormalizedValue); - } + Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.NormalizedValue); + } - } else if (asdu.TypeId == TypeID.C_IC_NA_1) { - if (asdu.Cot == CauseOfTransmission.ACTIVATION_CON) - Console.WriteLine ((asdu.IsNegative ? "Negative" : "Positive") + "confirmation for interrogation command"); - else if (asdu.Cot == CauseOfTransmission.ACTIVATION_TERMINATION) - Console.WriteLine ("Interrogation command terminated"); - } else if (asdu.TypeId == TypeID.F_DR_TA_1) { - Console.WriteLine ("Received file directory:\n------------------------"); - int ca = asdu.Ca; + } else if (asdu.TypeId == TypeID.C_IC_NA_1) { + if (asdu.Cot == CauseOfTransmission.ACTIVATION_CON) + Console.WriteLine ((asdu.IsNegative ? "Negative" : "Positive") + "confirmation for interrogation command"); + else if (asdu.Cot == CauseOfTransmission.ACTIVATION_TERMINATION) + Console.WriteLine ("Interrogation command terminated"); + } else if (asdu.TypeId == TypeID.F_DR_TA_1) { + Console.WriteLine ("Received file directory:\n------------------------"); + int ca = asdu.Ca; - for (int i = 0; i < asdu.NumberOfElements; i++) { - FileDirectory fd = (FileDirectory)asdu.GetElement (i); + for (int i = 0; i < asdu.NumberOfElements; i++) { + FileDirectory fd = (FileDirectory)asdu.GetElement (i); - Console.Write (fd.FOR ? "DIR: " : "FILE: "); + Console.Write (fd.FOR ? "DIR: " : "FILE: "); - Console.WriteLine ("CA: {0} IOA: {1} Type: {2}", ca, fd.ObjectAddress, fd.NOF.ToString ()); - } + Console.WriteLine ("CA: {0} IOA: {1} Type: {2}", ca, fd.ObjectAddress, fd.NOF.ToString ()); + } - } - else { - Console.WriteLine ("Unknown message type!"); - } + } + else { + Console.WriteLine ("Unknown message type!"); + } - return true; - } + return true; + } - public class Receiver : IFileReceiver - { - public void Finished(FileErrorCode result) - { - Console.WriteLine ("File download finished - code: " + result.ToString ()); - } + public class Receiver : IFileReceiver + { + public void Finished(FileErrorCode result) + { + Console.WriteLine ("File download finished - code: " + result.ToString ()); + } - public void SegmentReceived(byte sectionName, int offset, int size, byte[] data) - { - Console.WriteLine ("File segment - sectionName: {0} offset: {1} size: {2}", sectionName, offset, size); - } - } + public void SegmentReceived(byte sectionName, int offset, int size, byte[] data) + { + Console.WriteLine ("File segment - sectionName: {0} offset: {1} size: {2}", sectionName, offset, size); + } + } - public static void Main (string[] args) - { - Console.WriteLine ("Using lib60870.NET version " + LibraryCommon.GetLibraryVersionString ()); + public static void Main (string[] args) + { + Console.WriteLine ("Using lib60870.NET version " + LibraryCommon.GetLibraryVersionString ()); - Connection con = new Connection ("127.0.0.1"); + Connection con = new Connection ("127.0.0.1"); - //con.LocalIpAddress = "192.168.2.244"; - //con.LocalTcpPort = 22222; + //con.LocalIpAddress = "192.168.2.244"; + //con.LocalTcpPort = 22222; - con.DebugOutput = false; + con.DebugOutput = false; - con.SetASDUReceivedHandler (asduReceivedHandler, null); - con.SetConnectionHandler (ConnectionHandler, null); + con.SetASDUReceivedHandler (asduReceivedHandler, null); + con.SetConnectionHandler (ConnectionHandler, null); con.Connect (); - con.GetDirectory (1); + con.GetDirectory (1); - con.GetFile (1, 30000, NameOfFile.TRANSPARENT_FILE, new Receiver ()); + con.GetFile (1, 30000, NameOfFile.TRANSPARENT_FILE, new Receiver ()); Thread.Sleep (5000); - con.SendTestCommand (1); + con.SendTestCommand (1); - con.SendInterrogationCommand (CauseOfTransmission.ACTIVATION, 1, QualifierOfInterrogation.STATION); + con.SendInterrogationCommand (CauseOfTransmission.ACTIVATION, 1, QualifierOfInterrogation.STATION); - Thread.Sleep (5000); + Thread.Sleep (5000); - con.SendControlCommand (CauseOfTransmission.ACTIVATION, 1, new SingleCommand (5000, true, false, 0)); + con.SendControlCommand (CauseOfTransmission.ACTIVATION, 1, new SingleCommand (5000, true, false, 0)); - con.SendControlCommand (CauseOfTransmission.ACTIVATION, 1, new DoubleCommand (5001, DoubleCommand.ON, false, 0)); + con.SendControlCommand (CauseOfTransmission.ACTIVATION, 1, new DoubleCommand (5001, DoubleCommand.ON, false, 0)); - con.SendControlCommand (CauseOfTransmission.ACTIVATION, 1, new StepCommand (5002, StepCommandValue.HIGHER, false, 0)); + con.SendControlCommand (CauseOfTransmission.ACTIVATION, 1, new StepCommand (5002, StepCommandValue.HIGHER, false, 0)); - con.SendControlCommand (CauseOfTransmission.ACTIVATION, 1, - new SingleCommandWithCP56Time2a (5000, false, false, 0, new CP56Time2a (DateTime.Now))); + con.SendControlCommand (CauseOfTransmission.ACTIVATION, 1, + new SingleCommandWithCP56Time2a (5000, false, false, 0, new CP56Time2a (DateTime.Now))); - /* Synchronize clock of the controlled station */ - con.SendClockSyncCommand (1 /* CA */, new CP56Time2a (DateTime.Now)); + /* Synchronize clock of the controlled station */ + con.SendClockSyncCommand (1 /* CA */, new CP56Time2a (DateTime.Now)); - Console.WriteLine ("CLOSE"); + Console.WriteLine ("CLOSE"); - con.Close (); + con.Close (); - Console.WriteLine ("RECONNECT"); + Console.WriteLine ("RECONNECT"); - con.Connect (); + con.Connect (); - Thread.Sleep (5000); + Thread.Sleep (5000); Console.WriteLine ("CLOSE 2"); con.Close (); - Console.WriteLine("Press any key to terminate..."); - Console.ReadKey(); - } - } + Console.WriteLine("Press any key to terminate..."); + Console.ReadKey(); + } + } } diff --git a/examples/cs104-client2/Program.cs b/examples/cs104-client2/Program.cs index 668477e..0d1fa88 100644 --- a/examples/cs104-client2/Program.cs +++ b/examples/cs104-client2/Program.cs @@ -7,153 +7,153 @@ namespace cs104_client2 { - class MainClass - { - static int interrogationTerminationReceived = 0; - static int interrogationConfirmationReceived = 0; - - private static void ConnectionHandler (object parameter, ConnectionEvent connectionEvent) - { - switch (connectionEvent) { - case ConnectionEvent.OPENED: - Console.WriteLine ("Connected"); - break; - case ConnectionEvent.CLOSED: - Console.WriteLine ("Connection closed"); - break; - case ConnectionEvent.STARTDT_CON_RECEIVED: - Console.WriteLine ("STARTDT CON received"); - break; - case ConnectionEvent.STOPDT_CON_RECEIVED: - Console.WriteLine ("STOPDT CON received"); - break; - } - } + class MainClass + { + static int interrogationTerminationReceived = 0; + static int interrogationConfirmationReceived = 0; + + private static void ConnectionHandler (object parameter, ConnectionEvent connectionEvent) + { + switch (connectionEvent) { + case ConnectionEvent.OPENED: + Console.WriteLine ("Connected"); + break; + case ConnectionEvent.CLOSED: + Console.WriteLine ("Connection closed"); + break; + case ConnectionEvent.STARTDT_CON_RECEIVED: + Console.WriteLine ("STARTDT CON received"); + break; + case ConnectionEvent.STOPDT_CON_RECEIVED: + Console.WriteLine ("STOPDT CON received"); + break; + } + } - private static bool asduReceivedHandler(object parameter, ASDU asdu) - { - Console.WriteLine (asdu.ToString ()); + private static bool asduReceivedHandler(object parameter, ASDU asdu) + { + Console.WriteLine (asdu.ToString ()); - if (asdu.TypeId == TypeID.M_SP_NA_1) { + if (asdu.TypeId == TypeID.M_SP_NA_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { + for (int i = 0; i < asdu.NumberOfElements; i++) { - var val = (SinglePointInformation)asdu.GetElement (i); + var val = (SinglePointInformation)asdu.GetElement (i); - Console.WriteLine (" IOA: " + val.ObjectAddress + " SP value: " + val.Value); - Console.WriteLine (" " + val.Quality.ToString ()); - } - } else if (asdu.TypeId == TypeID.M_ME_TE_1) { + Console.WriteLine (" IOA: " + val.ObjectAddress + " SP value: " + val.Value); + Console.WriteLine (" " + val.Quality.ToString ()); + } + } else if (asdu.TypeId == TypeID.M_ME_TE_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { + for (int i = 0; i < asdu.NumberOfElements; i++) { - var msv = (MeasuredValueScaledWithCP56Time2a)asdu.GetElement (i); + var msv = (MeasuredValueScaledWithCP56Time2a)asdu.GetElement (i); - Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.ScaledValue); - Console.WriteLine (" " + msv.Quality.ToString ()); - Console.WriteLine (" " + msv.Timestamp.ToString ()); - } + Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.ScaledValue); + Console.WriteLine (" " + msv.Quality.ToString ()); + Console.WriteLine (" " + msv.Timestamp.ToString ()); + } - } else if (asdu.TypeId == TypeID.M_ME_TF_1) { + } else if (asdu.TypeId == TypeID.M_ME_TF_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { - var mfv = (MeasuredValueShortWithCP56Time2a)asdu.GetElement (i); + for (int i = 0; i < asdu.NumberOfElements; i++) { + var mfv = (MeasuredValueShortWithCP56Time2a)asdu.GetElement (i); - Console.WriteLine (" IOA: " + mfv.ObjectAddress + " float value: " + mfv.Value); - Console.WriteLine (" " + mfv.Quality.ToString ()); - Console.WriteLine (" " + mfv.Timestamp.ToString ()); - Console.WriteLine (" " + mfv.Timestamp.GetDateTime ().ToString ()); - } - } else if (asdu.TypeId == TypeID.M_SP_TB_1) { + Console.WriteLine (" IOA: " + mfv.ObjectAddress + " float value: " + mfv.Value); + Console.WriteLine (" " + mfv.Quality.ToString ()); + Console.WriteLine (" " + mfv.Timestamp.ToString ()); + Console.WriteLine (" " + mfv.Timestamp.GetDateTime ().ToString ()); + } + } else if (asdu.TypeId == TypeID.M_SP_TB_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { + for (int i = 0; i < asdu.NumberOfElements; i++) { - var val = (SinglePointWithCP56Time2a)asdu.GetElement (i); + var val = (SinglePointWithCP56Time2a)asdu.GetElement (i); - Console.WriteLine (" IOA: " + val.ObjectAddress + " SP value: " + val.Value); - Console.WriteLine (" " + val.Quality.ToString ()); - Console.WriteLine (" " + val.Timestamp.ToString ()); - } - } else if (asdu.TypeId == TypeID.M_ME_NC_1) { + Console.WriteLine (" IOA: " + val.ObjectAddress + " SP value: " + val.Value); + Console.WriteLine (" " + val.Quality.ToString ()); + Console.WriteLine (" " + val.Timestamp.ToString ()); + } + } else if (asdu.TypeId == TypeID.M_ME_NC_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { - var mfv = (MeasuredValueShort)asdu.GetElement (i); + for (int i = 0; i < asdu.NumberOfElements; i++) { + var mfv = (MeasuredValueShort)asdu.GetElement (i); - Console.WriteLine (" IOA: " + mfv.ObjectAddress + " float value: " + mfv.Value); - Console.WriteLine (" " + mfv.Quality.ToString ()); - } - } else if (asdu.TypeId == TypeID.M_ME_NB_1) { + Console.WriteLine (" IOA: " + mfv.ObjectAddress + " float value: " + mfv.Value); + Console.WriteLine (" " + mfv.Quality.ToString ()); + } + } else if (asdu.TypeId == TypeID.M_ME_NB_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { + for (int i = 0; i < asdu.NumberOfElements; i++) { - var msv = (MeasuredValueScaled)asdu.GetElement (i); + var msv = (MeasuredValueScaled)asdu.GetElement (i); - Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.ScaledValue); - Console.WriteLine (" " + msv.Quality.ToString ()); - } + Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.ScaledValue); + Console.WriteLine (" " + msv.Quality.ToString ()); + } - } else if (asdu.TypeId == TypeID.M_ME_ND_1) { + } else if (asdu.TypeId == TypeID.M_ME_ND_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { + for (int i = 0; i < asdu.NumberOfElements; i++) { - var msv = (MeasuredValueNormalizedWithoutQuality)asdu.GetElement (i); + var msv = (MeasuredValueNormalizedWithoutQuality)asdu.GetElement (i); - Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.NormalizedValue); - } + Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.NormalizedValue); + } - } else if (asdu.TypeId == TypeID.C_IC_NA_1) { - if (asdu.Cot == CauseOfTransmission.ACTIVATION_CON) { - Console.WriteLine ((asdu.IsNegative ? "Negative" : "Positive") + "confirmation for interrogation command"); - interrogationConfirmationReceived++; - } else if (asdu.Cot == CauseOfTransmission.ACTIVATION_TERMINATION) { - Console.WriteLine ("Interrogation command terminated"); - interrogationTerminationReceived++; - } - } - else { - Console.WriteLine ("Unknown message type!"); - } + } else if (asdu.TypeId == TypeID.C_IC_NA_1) { + if (asdu.Cot == CauseOfTransmission.ACTIVATION_CON) { + Console.WriteLine ((asdu.IsNegative ? "Negative" : "Positive") + "confirmation for interrogation command"); + interrogationConfirmationReceived++; + } else if (asdu.Cot == CauseOfTransmission.ACTIVATION_TERMINATION) { + Console.WriteLine ("Interrogation command terminated"); + interrogationTerminationReceived++; + } + } + else { + Console.WriteLine ("Unknown message type!"); + } - Console.WriteLine ("interrogationConfirmationReceived: " + interrogationConfirmationReceived); - Console.WriteLine ("interrogationTerminationReceived: " + interrogationTerminationReceived); + Console.WriteLine ("interrogationConfirmationReceived: " + interrogationConfirmationReceived); + Console.WriteLine ("interrogationTerminationReceived: " + interrogationTerminationReceived); - return true; - } + return true; + } - public static void Main (string[] args) - { - Console.WriteLine ("Using lib60870.NET version " + LibraryCommon.GetLibraryVersionString ()); + public static void Main (string[] args) + { + Console.WriteLine ("Using lib60870.NET version " + LibraryCommon.GetLibraryVersionString ()); - Connection con = new Connection ("127.0.0.1"); + Connection con = new Connection ("127.0.0.1"); - con.DebugOutput = true; - con.UseSendMessageQueue = false; + con.DebugOutput = true; + con.UseSendMessageQueue = false; - con.SetASDUReceivedHandler (asduReceivedHandler, null); - con.SetConnectionHandler (ConnectionHandler, null); + con.SetASDUReceivedHandler (asduReceivedHandler, null); + con.SetConnectionHandler (ConnectionHandler, null); - con.Connect (); + con.Connect (); - int loopRuns = 6000; + int loopRuns = 6000; - for (int i = 0; i < loopRuns; i++) { - Console.WriteLine ("Send GI " + i); + for (int i = 0; i < loopRuns; i++) { + Console.WriteLine ("Send GI " + i); - if (con.IsTransmitBufferFull()) { - while (con.IsTransmitBufferFull() && (con.IsRunning == true)) - Thread.Sleep (50); - - } - con.SendInterrogationCommand (CauseOfTransmission.ACTIVATION, 1, QualifierOfInterrogation.STATION); - } + if (con.IsTransmitBufferFull()) { + while (con.IsTransmitBufferFull() && (con.IsRunning == true)) + Thread.Sleep (50); + + } + con.SendInterrogationCommand (CauseOfTransmission.ACTIVATION, 1, QualifierOfInterrogation.STATION); + } - while (interrogationTerminationReceived < loopRuns) - Thread.Sleep (100); + while (interrogationTerminationReceived < loopRuns) + Thread.Sleep (100); - Console.WriteLine ("interrogationTerminationReceived: " + interrogationTerminationReceived); + Console.WriteLine ("interrogationTerminationReceived: " + interrogationTerminationReceived); - con.Close (); + con.Close (); - } - } + } + } } diff --git a/examples/cs104-client3/Program.cs b/examples/cs104-client3/Program.cs index 0bdff0a..aa982af 100644 --- a/examples/cs104-client3/Program.cs +++ b/examples/cs104-client3/Program.cs @@ -7,137 +7,137 @@ namespace cs104_client3 { - class MainClass - { + class MainClass + { - private static void ConnectionHandler (object parameter, ConnectionEvent connectionEvent) - { - switch (connectionEvent) { - case ConnectionEvent.OPENED: - Console.WriteLine ("Connected"); - break; - case ConnectionEvent.CLOSED: - Console.WriteLine ("Connection closed"); - break; - case ConnectionEvent.STARTDT_CON_RECEIVED: - Console.WriteLine ("STARTDT CON received"); - break; - case ConnectionEvent.STOPDT_CON_RECEIVED: - Console.WriteLine ("STOPDT CON received"); - break; - } - } + private static void ConnectionHandler (object parameter, ConnectionEvent connectionEvent) + { + switch (connectionEvent) { + case ConnectionEvent.OPENED: + Console.WriteLine ("Connected"); + break; + case ConnectionEvent.CLOSED: + Console.WriteLine ("Connection closed"); + break; + case ConnectionEvent.STARTDT_CON_RECEIVED: + Console.WriteLine ("STARTDT CON received"); + break; + case ConnectionEvent.STOPDT_CON_RECEIVED: + Console.WriteLine ("STOPDT CON received"); + break; + } + } - private static bool asduReceivedHandler(object parameter, ASDU asdu) - { - Console.WriteLine (asdu.ToString ()); + private static bool asduReceivedHandler(object parameter, ASDU asdu) + { + Console.WriteLine (asdu.ToString ()); - if (asdu.TypeId == TypeID.M_SP_NA_1) { + if (asdu.TypeId == TypeID.M_SP_NA_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { + for (int i = 0; i < asdu.NumberOfElements; i++) { - var val = (SinglePointInformation)asdu.GetElement (i); + var val = (SinglePointInformation)asdu.GetElement (i); - Console.WriteLine (" IOA: " + val.ObjectAddress + " SP value: " + val.Value); - Console.WriteLine (" " + val.Quality.ToString ()); - } - } else if (asdu.TypeId == TypeID.M_ME_TE_1) { + Console.WriteLine (" IOA: " + val.ObjectAddress + " SP value: " + val.Value); + Console.WriteLine (" " + val.Quality.ToString ()); + } + } else if (asdu.TypeId == TypeID.M_ME_TE_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { + for (int i = 0; i < asdu.NumberOfElements; i++) { - var msv = (MeasuredValueScaledWithCP56Time2a)asdu.GetElement (i); + var msv = (MeasuredValueScaledWithCP56Time2a)asdu.GetElement (i); - Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.ScaledValue); - Console.WriteLine (" " + msv.Quality.ToString ()); - Console.WriteLine (" " + msv.Timestamp.ToString ()); - } + Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.ScaledValue); + Console.WriteLine (" " + msv.Quality.ToString ()); + Console.WriteLine (" " + msv.Timestamp.ToString ()); + } - } else if (asdu.TypeId == TypeID.M_ME_TF_1) { + } else if (asdu.TypeId == TypeID.M_ME_TF_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { - var mfv = (MeasuredValueShortWithCP56Time2a)asdu.GetElement (i); + for (int i = 0; i < asdu.NumberOfElements; i++) { + var mfv = (MeasuredValueShortWithCP56Time2a)asdu.GetElement (i); - Console.WriteLine (" IOA: " + mfv.ObjectAddress + " float value: " + mfv.Value); - Console.WriteLine (" " + mfv.Quality.ToString ()); - Console.WriteLine (" " + mfv.Timestamp.ToString ()); - Console.WriteLine (" " + mfv.Timestamp.GetDateTime ().ToString ()); - } - } else if (asdu.TypeId == TypeID.M_SP_TB_1) { + Console.WriteLine (" IOA: " + mfv.ObjectAddress + " float value: " + mfv.Value); + Console.WriteLine (" " + mfv.Quality.ToString ()); + Console.WriteLine (" " + mfv.Timestamp.ToString ()); + Console.WriteLine (" " + mfv.Timestamp.GetDateTime ().ToString ()); + } + } else if (asdu.TypeId == TypeID.M_SP_TB_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { + for (int i = 0; i < asdu.NumberOfElements; i++) { - var val = (SinglePointWithCP56Time2a)asdu.GetElement (i); + var val = (SinglePointWithCP56Time2a)asdu.GetElement (i); - Console.WriteLine (" IOA: " + val.ObjectAddress + " SP value: " + val.Value); - Console.WriteLine (" " + val.Quality.ToString ()); - Console.WriteLine (" " + val.Timestamp.ToString ()); - } - } else if (asdu.TypeId == TypeID.M_ME_NC_1) { + Console.WriteLine (" IOA: " + val.ObjectAddress + " SP value: " + val.Value); + Console.WriteLine (" " + val.Quality.ToString ()); + Console.WriteLine (" " + val.Timestamp.ToString ()); + } + } else if (asdu.TypeId == TypeID.M_ME_NC_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { - var mfv = (MeasuredValueShort)asdu.GetElement (i); + for (int i = 0; i < asdu.NumberOfElements; i++) { + var mfv = (MeasuredValueShort)asdu.GetElement (i); - Console.WriteLine (" IOA: " + mfv.ObjectAddress + " float value: " + mfv.Value); - Console.WriteLine (" " + mfv.Quality.ToString ()); - } - } else if (asdu.TypeId == TypeID.M_ME_NB_1) { + Console.WriteLine (" IOA: " + mfv.ObjectAddress + " float value: " + mfv.Value); + Console.WriteLine (" " + mfv.Quality.ToString ()); + } + } else if (asdu.TypeId == TypeID.M_ME_NB_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { + for (int i = 0; i < asdu.NumberOfElements; i++) { - var msv = (MeasuredValueScaled)asdu.GetElement (i); + var msv = (MeasuredValueScaled)asdu.GetElement (i); - Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.ScaledValue); - Console.WriteLine (" " + msv.Quality.ToString ()); - } + Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.ScaledValue); + Console.WriteLine (" " + msv.Quality.ToString ()); + } - } else if (asdu.TypeId == TypeID.M_ME_ND_1) { + } else if (asdu.TypeId == TypeID.M_ME_ND_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { + for (int i = 0; i < asdu.NumberOfElements; i++) { - var msv = (MeasuredValueNormalizedWithoutQuality)asdu.GetElement (i); + var msv = (MeasuredValueNormalizedWithoutQuality)asdu.GetElement (i); - Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.NormalizedValue); - } + Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.NormalizedValue); + } - } else if (asdu.TypeId == TypeID.C_IC_NA_1) { - if (asdu.Cot == CauseOfTransmission.ACTIVATION_CON) - Console.WriteLine ((asdu.IsNegative ? "Negative" : "Positive") + "confirmation for interrogation command"); - else if (asdu.Cot == CauseOfTransmission.ACTIVATION_TERMINATION) - Console.WriteLine ("Interrogation command terminated"); - } - else { - Console.WriteLine ("Unknown message type!"); - } + } else if (asdu.TypeId == TypeID.C_IC_NA_1) { + if (asdu.Cot == CauseOfTransmission.ACTIVATION_CON) + Console.WriteLine ((asdu.IsNegative ? "Negative" : "Positive") + "confirmation for interrogation command"); + else if (asdu.Cot == CauseOfTransmission.ACTIVATION_TERMINATION) + Console.WriteLine ("Interrogation command terminated"); + } + else { + Console.WriteLine ("Unknown message type!"); + } - return true; - } + return true; + } - public static void Main (string[] args) - { - Console.WriteLine ("Using lib60870.NET version " + LibraryCommon.GetLibraryVersionString ()); + public static void Main (string[] args) + { + Console.WriteLine ("Using lib60870.NET version " + LibraryCommon.GetLibraryVersionString ()); - //Connection con = new Connection ("10.0.4.6"); - Connection con = new Connection ("127.0.0.1"); + //Connection con = new Connection ("10.0.4.6"); + Connection con = new Connection ("127.0.0.1"); - con.DebugOutput = true; + con.DebugOutput = true; - con.SetASDUReceivedHandler (asduReceivedHandler, null); - con.SetConnectionHandler (ConnectionHandler, null); + con.SetASDUReceivedHandler (asduReceivedHandler, null); + con.SetConnectionHandler (ConnectionHandler, null); - bool running = true; + bool running = true; - Console.CancelKeyPress += delegate(object? sender, ConsoleCancelEventArgs e) { - e.Cancel = true; - running = false; - }; + Console.CancelKeyPress += delegate(object? sender, ConsoleCancelEventArgs e) { + e.Cancel = true; + running = false; + }; - con.Connect (); + con.Connect (); - while (running) { - Thread.Sleep(100); - } + while (running) { + Thread.Sleep(100); + } - con.Close (); - } - } + con.Close (); + } + } } diff --git a/examples/cs104-multi-client-server/Program.cs b/examples/cs104-multi-client-server/Program.cs index 531affe..95062d7 100644 --- a/examples/cs104-multi-client-server/Program.cs +++ b/examples/cs104-multi-client-server/Program.cs @@ -10,164 +10,164 @@ namespace cs104_multi_client_server { - class MainClass - { - private static bool connectionRequestHandler(object parameter, IPAddress ipAddress) - { - Console.WriteLine ("New connection request from IP " + ipAddress.ToString ()); + class MainClass + { + private static bool connectionRequestHandler(object parameter, IPAddress ipAddress) + { + Console.WriteLine ("New connection request from IP " + ipAddress.ToString ()); - // Allow only known IP addresses! - // You can implement your allowed client whitelist here - if (ipAddress.ToString ().Equals ("127.0.0.1")) - return true; - else if (ipAddress.ToString ().Equals ("192.168.178.70")) - return true; - else if (ipAddress.ToString ().Equals ("192.168.2.9")) - return true; - else - return false; - } + // Allow only known IP addresses! + // You can implement your allowed client whitelist here + if (ipAddress.ToString ().Equals ("127.0.0.1")) + return true; + else if (ipAddress.ToString ().Equals ("192.168.178.70")) + return true; + else if (ipAddress.ToString ().Equals ("192.168.2.9")) + return true; + else + return false; + } - private static void connectionEventHandler(object parameter, ClientConnection connection, ClientConnectionEvent conEvent) - { - Console.WriteLine ("Connection {0}:{1} - {2}", connection.RemoteEndpoint.Address.ToString (), - connection.RemoteEndpoint.Port, conEvent.ToString ()); - } + private static void connectionEventHandler(object parameter, ClientConnection connection, ClientConnectionEvent conEvent) + { + Console.WriteLine ("Connection {0}:{1} - {2}", connection.RemoteEndpoint.Address.ToString (), + connection.RemoteEndpoint.Port, conEvent.ToString ()); + } - private static bool interrogationHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qoi) - { - Console.WriteLine ("Interrogation for group " + qoi); + private static bool interrogationHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qoi) + { + Console.WriteLine ("Interrogation for group " + qoi); - ApplicationLayerParameters cp = connection.GetApplicationLayerParameters (); + ApplicationLayerParameters cp = connection.GetApplicationLayerParameters (); - connection.SendACT_CON (asdu, false); + connection.SendACT_CON (asdu, false); - // send information objects - ASDU newAsdu = new ASDU(cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, false); + // send information objects + ASDU newAsdu = new ASDU(cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, false); - newAsdu.AddInformationObject (new MeasuredValueScaled (100, -1, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (100, -1, new QualityDescriptor ())); - newAsdu.AddInformationObject (new MeasuredValueScaled (101, 23, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (101, 23, new QualityDescriptor ())); - newAsdu.AddInformationObject (new MeasuredValueScaled (102, 2300, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (102, 2300, new QualityDescriptor ())); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 3, 1, false); + newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 3, 1, false); - newAsdu.AddInformationObject(new MeasuredValueScaledWithCP56Time2a(103, 3456, new QualityDescriptor (), new CP56Time2a(DateTime.Now))); + newAsdu.AddInformationObject(new MeasuredValueScaledWithCP56Time2a(103, 3456, new QualityDescriptor (), new CP56Time2a(DateTime.Now))); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, false); + newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, false); - newAsdu.AddInformationObject (new SinglePointWithCP56Time2a (104, true, new QualityDescriptor (), new CP56Time2a (DateTime.Now))); + newAsdu.AddInformationObject (new SinglePointWithCP56Time2a (104, true, new QualityDescriptor (), new CP56Time2a (DateTime.Now))); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - // send sequence of information objects - newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, true); + // send sequence of information objects + newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, true); - newAsdu.AddInformationObject (new SinglePointInformation (200, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (201, false, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (202, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (203, false, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (204, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (205, false, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (206, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (207, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (200, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (201, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (202, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (203, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (204, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (205, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (206, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (207, false, new QualityDescriptor ())); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, true); + newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, true); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (300, -1.0f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (301, -0.5f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (302, -0.1f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (303, .0f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (304, 0.1f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (305, 0.2f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (306, 0.5f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (307, 0.7f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (308, 0.99f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (309, 1f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (300, -1.0f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (301, -0.5f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (302, -0.1f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (303, .0f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (304, 0.1f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (305, 0.2f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (306, 0.5f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (307, 0.7f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (308, 0.99f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (309, 1f)); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - connection.SendACT_TERM (asdu); + connection.SendACT_TERM (asdu); - return true; - } + return true; + } - private static bool asduHandler(object parameter, IMasterConnection connection, ASDU asdu) - { + private static bool asduHandler(object parameter, IMasterConnection connection, ASDU asdu) + { - if (asdu.TypeId == TypeID.C_SC_NA_1) { - Console.WriteLine ("Single command"); + if (asdu.TypeId == TypeID.C_SC_NA_1) { + Console.WriteLine ("Single command"); - SingleCommand sc = (SingleCommand)asdu.GetElement (0); + SingleCommand sc = (SingleCommand)asdu.GetElement (0); - Console.WriteLine (sc.ToString ()); - } - else if (asdu.TypeId == TypeID.C_CS_NA_1){ + Console.WriteLine (sc.ToString ()); + } + else if (asdu.TypeId == TypeID.C_CS_NA_1){ - ClockSynchronizationCommand qsc = (ClockSynchronizationCommand)asdu.GetElement (0); + ClockSynchronizationCommand qsc = (ClockSynchronizationCommand)asdu.GetElement (0); - Console.WriteLine ("Received clock sync command with time " + qsc.NewTime.ToString()); - } + Console.WriteLine ("Received clock sync command with time " + qsc.NewTime.ToString()); + } - return true; - } + return true; + } - public static void Main (string[] args) - { - bool running = true; + public static void Main (string[] args) + { + bool running = true; - Console.CancelKeyPress += delegate(object? sender, ConsoleCancelEventArgs e) { - e.Cancel = true; - running = false; - }; + Console.CancelKeyPress += delegate(object? sender, ConsoleCancelEventArgs e) { + e.Cancel = true; + running = false; + }; - Server server = new Server (); + Server server = new Server (); - server.SetLocalAddress ("0.0.0.0"); + server.SetLocalAddress ("0.0.0.0"); - server.ServerMode = ServerMode.CONNECTION_IS_REDUNDANCY_GROUP; - server.MaxQueueSize = 10; - server.MaxOpenConnections = 2; + server.ServerMode = ServerMode.CONNECTION_IS_REDUNDANCY_GROUP; + server.MaxQueueSize = 10; + server.MaxOpenConnections = 2; - server.SetConnectionRequestHandler (connectionRequestHandler, null); + server.SetConnectionRequestHandler (connectionRequestHandler, null); - server.SetConnectionEventHandler (connectionEventHandler, null); + server.SetConnectionEventHandler (connectionEventHandler, null); - server.SetInterrogationHandler (interrogationHandler, null); + server.SetInterrogationHandler (interrogationHandler, null); - server.SetASDUHandler (asduHandler, null); + server.SetASDUHandler (asduHandler, null); - server.Start (); + server.Start (); - int waitTime = 1000; + int waitTime = 1000; - while (running) { - Thread.Sleep(100); + while (running) { + Thread.Sleep(100); - if (waitTime > 0) - waitTime -= 100; - else { + if (waitTime > 0) + waitTime -= 100; + else { - ASDU newAsdu = new ASDU (server.GetApplicationLayerParameters(), CauseOfTransmission.PERIODIC, false, false, 2, 1, false); + ASDU newAsdu = new ASDU (server.GetApplicationLayerParameters(), CauseOfTransmission.PERIODIC, false, false, 2, 1, false); - newAsdu.AddInformationObject (new MeasuredValueScaled (110, -1, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (110, -1, new QualityDescriptor ())); - server.EnqueueASDU (newAsdu); + server.EnqueueASDU (newAsdu); - waitTime = 1000; - } - } + waitTime = 1000; + } + } - Console.WriteLine ("Stop server"); - server.Stop (); - } - } + Console.WriteLine ("Stop server"); + server.Stop (); + } + } } diff --git a/examples/cs104-server-file/Program.cs b/examples/cs104-server-file/Program.cs index f5f5e62..54291a2 100644 --- a/examples/cs104-server-file/Program.cs +++ b/examples/cs104-server-file/Program.cs @@ -11,18 +11,18 @@ namespace cs104_server_file /// /// Extend TransparentFile or implement IFileProvider to allow file downloads to the master /// - public class SimpleFile : TransparentFile - { - public SimpleFile (int ca, int ioa, NameOfFile nof) - : base (ca, ioa, nof) - { - } - - public override void TransferComplete (bool success) - { - Console.WriteLine ("Transfer complete: " + success.ToString()); - } - } + public class SimpleFile : TransparentFile + { + public SimpleFile (int ca, int ioa, NameOfFile nof) + : base (ca, ioa, nof) + { + } + + public override void TransferComplete (bool success) + { + Console.WriteLine ("Transfer complete: " + success.ToString()); + } + } /// /// Implement IFileReceiver to allow file uploads from the master @@ -61,74 +61,74 @@ public void SegmentReceived (byte sectionName, int offset, int size, byte [] dat } class MainClass - { - private static bool interrogationHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qoi) - { - Console.WriteLine ("Interrogation for group " + qoi); + { + private static bool interrogationHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qoi) + { + Console.WriteLine ("Interrogation for group " + qoi); - ApplicationLayerParameters cp = connection.GetApplicationLayerParameters (); + ApplicationLayerParameters cp = connection.GetApplicationLayerParameters (); - connection.SendACT_CON (asdu, false); + connection.SendACT_CON (asdu, false); - // send information objects - ASDU newAsdu = new ASDU(cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, false); + // send information objects + ASDU newAsdu = new ASDU(cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, false); - newAsdu.AddInformationObject (new MeasuredValueScaled (100, -1, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (100, -1, new QualityDescriptor ())); - newAsdu.AddInformationObject (new MeasuredValueScaled (101, 23, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (101, 23, new QualityDescriptor ())); - newAsdu.AddInformationObject (new MeasuredValueScaled (102, 2300, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (102, 2300, new QualityDescriptor ())); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 3, 1, false); + newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 3, 1, false); - newAsdu.AddInformationObject(new MeasuredValueScaledWithCP56Time2a(103, 3456, new QualityDescriptor (), new CP56Time2a(DateTime.Now))); + newAsdu.AddInformationObject(new MeasuredValueScaledWithCP56Time2a(103, 3456, new QualityDescriptor (), new CP56Time2a(DateTime.Now))); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, false); + newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, false); - newAsdu.AddInformationObject (new SinglePointWithCP56Time2a (104, true, new QualityDescriptor (), new CP56Time2a (DateTime.Now))); + newAsdu.AddInformationObject (new SinglePointWithCP56Time2a (104, true, new QualityDescriptor (), new CP56Time2a (DateTime.Now))); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - // send sequence of information objects - newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, true); + // send sequence of information objects + newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, true); - newAsdu.AddInformationObject (new SinglePointInformation (200, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (201, false, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (202, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (203, false, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (204, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (205, false, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (206, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (207, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (200, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (201, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (202, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (203, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (204, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (205, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (206, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (207, false, new QualityDescriptor ())); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, true); + newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, true); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (300, -1.0f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (301, -0.5f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (302, -0.1f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (303, .0f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (304, 0.1f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (305, 0.2f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (306, 0.5f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (307, 0.7f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (308, 0.99f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (309, 1f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (300, -1.0f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (301, -0.5f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (302, -0.1f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (303, .0f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (304, 0.1f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (305, 0.2f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (306, 0.5f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (307, 0.7f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (308, 0.99f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (309, 1f)); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - connection.SendACT_TERM (asdu); + connection.SendACT_TERM (asdu); - return true; - } + return true; + } - private static bool asduHandler(object parameter, IMasterConnection connection, ASDU asdu) - { + private static bool asduHandler(object parameter, IMasterConnection connection, ASDU asdu) + { if (asdu.TypeId == TypeID.C_SC_NA_1) { SingleCommand sc = (SingleCommand)asdu.GetElement (0); @@ -147,48 +147,48 @@ private static bool asduHandler(object parameter, IMasterConnection connection, } - if (asdu.TypeId == TypeID.C_SC_NA_1) { - Console.WriteLine ("Single command"); + if (asdu.TypeId == TypeID.C_SC_NA_1) { + Console.WriteLine ("Single command"); - SingleCommand sc = (SingleCommand)asdu.GetElement (0); + SingleCommand sc = (SingleCommand)asdu.GetElement (0); - Console.WriteLine (sc.ToString ()); - } else if (asdu.TypeId == TypeID.M_EI_NA_1) { - Console.WriteLine ("End of initialization received"); - } - else if (asdu.TypeId == TypeID.F_DR_TA_1) { - - Console.WriteLine ("Received file directory"); - } - else if (asdu.TypeId == TypeID.C_CS_NA_1){ - + Console.WriteLine (sc.ToString ()); + } else if (asdu.TypeId == TypeID.M_EI_NA_1) { + Console.WriteLine ("End of initialization received"); + } + else if (asdu.TypeId == TypeID.F_DR_TA_1) { + + Console.WriteLine ("Received file directory"); + } + else if (asdu.TypeId == TypeID.C_CS_NA_1){ + - ClockSynchronizationCommand qsc = (ClockSynchronizationCommand)asdu.GetElement (0); + ClockSynchronizationCommand qsc = (ClockSynchronizationCommand)asdu.GetElement (0); - Console.WriteLine ("Received clock sync command with time " + qsc.NewTime.ToString()); - } + Console.WriteLine ("Received clock sync command with time " + qsc.NewTime.ToString()); + } - return true; - } + return true; + } - public static void Main (string[] args) - { - bool running = true; + public static void Main (string[] args) + { + bool running = true; - Console.CancelKeyPress += delegate(object? sender, ConsoleCancelEventArgs e) { - e.Cancel = true; - running = false; - }; + Console.CancelKeyPress += delegate(object? sender, ConsoleCancelEventArgs e) { + e.Cancel = true; + running = false; + }; - Server server = new Server (); + Server server = new Server (); - server.DebugOutput = true; + server.DebugOutput = true; - server.MaxQueueSize = 10; + server.MaxQueueSize = 10; - server.SetInterrogationHandler (interrogationHandler, null); + server.SetInterrogationHandler (interrogationHandler, null); - server.SetASDUHandler (asduHandler, null); + server.SetASDUHandler (asduHandler, null); // Install a handler to allow file downloads (will be called when the master sends a file ready ASDU to anounce a file transfer) server.SetFileReadyHandler (delegate (object parameter, int ca, int ioa, NameOfFile nof, int lengthOfFile) { @@ -213,32 +213,32 @@ public static void Main (string[] args) server.Start (); - SimpleFile file = new SimpleFile (1, 30000, NameOfFile.TRANSPARENT_FILE); + SimpleFile file = new SimpleFile (1, 30000, NameOfFile.TRANSPARENT_FILE); - byte[] fileData = new byte[1025]; + byte[] fileData = new byte[1025]; - for (int i = 0; i < 1025; i++) - fileData [i] = (byte)(i + 1); + for (int i = 0; i < 1025; i++) + fileData [i] = (byte)(i + 1); - file.AddSection (fileData); + file.AddSection (fileData); - SimpleFile file2 = new SimpleFile (1, 30001, NameOfFile.TRANSPARENT_FILE); - file2.AddSection (fileData); + SimpleFile file2 = new SimpleFile (1, 30001, NameOfFile.TRANSPARENT_FILE); + file2.AddSection (fileData); - server.GetAvailableFiles().AddFile (file); - server.GetAvailableFiles().AddFile (file2); + server.GetAvailableFiles().AddFile (file); + server.GetAvailableFiles().AddFile (file2); ASDU newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.INITIALIZED, false, false, 0, 1, false); EndOfInitialization eoi = new EndOfInitialization(0); newAsdu.AddInformationObject(eoi); server.EnqueueASDU(newAsdu); - while (running) { - Thread.Sleep(100); - } + while (running) { + Thread.Sleep(100); + } - Console.WriteLine ("Stop server"); - server.Stop (); - } - } + Console.WriteLine ("Stop server"); + server.Stop (); + } + } } diff --git a/examples/cs104-server/Program.cs b/examples/cs104-server/Program.cs index f9ae06c..253ebfd 100644 --- a/examples/cs104-server/Program.cs +++ b/examples/cs104-server/Program.cs @@ -8,117 +8,117 @@ namespace cs104_server { class MainClass - { - private static bool interrogationHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qoi) - { - Console.WriteLine ("Interrogation for group " + qoi); + { + private static bool interrogationHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qoi) + { + Console.WriteLine ("Interrogation for group " + qoi); - ApplicationLayerParameters cp = connection.GetApplicationLayerParameters (); + ApplicationLayerParameters cp = connection.GetApplicationLayerParameters (); byte oa = asdu.Oa; - connection.SendACT_CON (asdu, false); + connection.SendACT_CON (asdu, false); - // send information objects - ASDU newAsdu = new ASDU(cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, oa, 1, false); + // send information objects + ASDU newAsdu = new ASDU(cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, oa, 1, false); - newAsdu.AddInformationObject (new MeasuredValueScaled (100, -1, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (100, -1, new QualityDescriptor ())); - newAsdu.AddInformationObject (new MeasuredValueScaled (101, 23, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (101, 23, new QualityDescriptor ())); - newAsdu.AddInformationObject (new MeasuredValueScaled (102, 2300, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (102, 2300, new QualityDescriptor ())); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, oa, 1, false); + newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, oa, 1, false); - newAsdu.AddInformationObject(new MeasuredValueScaledWithCP56Time2a(103, 3456, new QualityDescriptor (), new CP56Time2a(DateTime.Now))); + newAsdu.AddInformationObject(new MeasuredValueScaledWithCP56Time2a(103, 3456, new QualityDescriptor (), new CP56Time2a(DateTime.Now))); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, oa, 1, false); + newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, oa, 1, false); - newAsdu.AddInformationObject (new SinglePointWithCP56Time2a (104, true, new QualityDescriptor (), new CP56Time2a (DateTime.Now))); + newAsdu.AddInformationObject (new SinglePointWithCP56Time2a (104, true, new QualityDescriptor (), new CP56Time2a (DateTime.Now))); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - // send sequence of information objects - newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, oa, 1, true); + // send sequence of information objects + newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, oa, 1, true); - newAsdu.AddInformationObject (new SinglePointInformation (200, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (201, false, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (202, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (203, false, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (204, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (205, false, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (206, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (207, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (200, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (201, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (202, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (203, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (204, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (205, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (206, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (207, false, new QualityDescriptor ())); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, oa, 1, true); + newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, oa, 1, true); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (300, -1.0f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (301, -0.5f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (302, -0.1f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (303, .0f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (304, 0.1f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (305, 0.2f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (306, 0.5f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (307, 0.7f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (308, 0.99f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (309, 1f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (300, -1.0f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (301, -0.5f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (302, -0.1f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (303, .0f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (304, 0.1f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (305, 0.2f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (306, 0.5f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (307, 0.7f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (308, 0.99f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (309, 1f)); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - connection.SendACT_TERM (asdu); + connection.SendACT_TERM (asdu); - return true; - } + return true; + } - private static bool asduHandler(object parameter, IMasterConnection connection, ASDU asdu) - { - Console.WriteLine("ASDU received:" + asdu.ToString()); + private static bool asduHandler(object parameter, IMasterConnection connection, ASDU asdu) + { + Console.WriteLine("ASDU received:" + asdu.ToString()); - if (asdu.TypeId == TypeID.C_SC_NA_1) - { - Console.WriteLine ("Single command"); + if (asdu.TypeId == TypeID.C_SC_NA_1) + { + Console.WriteLine ("Single command"); - SingleCommand sc = (SingleCommand)asdu.GetElement (0); + SingleCommand sc = (SingleCommand)asdu.GetElement (0); - if (sc.Select) - { - Console.WriteLine(" received select"); - } - else - { - Console.WriteLine(" received execute"); - } + if (sc.Select) + { + Console.WriteLine(" received select"); + } + else + { + Console.WriteLine(" received execute"); + } - Console.WriteLine (sc.ToString ()); + Console.WriteLine (sc.ToString ()); connection.SendACT_CON(asdu, false); - } - else if (asdu.TypeId == TypeID.C_CS_NA_1) - { - ClockSynchronizationCommand qsc = (ClockSynchronizationCommand)asdu.GetElement (0); + } + else if (asdu.TypeId == TypeID.C_CS_NA_1) + { + ClockSynchronizationCommand qsc = (ClockSynchronizationCommand)asdu.GetElement (0); - Console.WriteLine ("Received clock sync command with time " + qsc.NewTime.ToString()); + Console.WriteLine ("Received clock sync command with time " + qsc.NewTime.ToString()); connection.SendACT_CON(asdu, false); } - return true; - } + return true; + } - public static void Main (string[] args) - { - bool running = true; + public static void Main (string[] args) + { + bool running = true; - Console.CancelKeyPress += delegate(object? sender, ConsoleCancelEventArgs e) { - e.Cancel = true; - running = false; - }; + Console.CancelKeyPress += delegate(object? sender, ConsoleCancelEventArgs e) { + e.Cancel = true; + running = false; + }; // specify application layer parameters (CS 101 and CS 104) var alParams = new ApplicationLayerParameters(); @@ -137,52 +137,52 @@ public static void Main (string[] args) Server server = new Server (apciParameters, alParams); - server.DebugOutput = true; + server.DebugOutput = true; - server.MaxQueueSize = 10; + server.MaxQueueSize = 10; server.EnqueueMode = EnqueueMode.REMOVE_OLDEST; - server.SetInterrogationHandler (interrogationHandler, null); + server.SetInterrogationHandler (interrogationHandler, null); - server.SetASDUHandler (asduHandler, null); + server.SetASDUHandler (asduHandler, null); - server.Start (); + server.Start (); ASDU newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.INITIALIZED, false, false, 0, 1, false); EndOfInitialization eoi = new EndOfInitialization(0); newAsdu.AddInformationObject(eoi); server.EnqueueASDU(newAsdu); - int waitTime = 1000; + int waitTime = 1000; - while (running && server.IsRunning()) - { - Thread.Sleep(100); + while (running && server.IsRunning()) + { + Thread.Sleep(100); - if (waitTime > 0) - waitTime -= 100; - else { + if (waitTime > 0) + waitTime -= 100; + else { - newAsdu = new ASDU (server.GetApplicationLayerParameters(), CauseOfTransmission.PERIODIC, false, false, 0, 1, false); + newAsdu = new ASDU (server.GetApplicationLayerParameters(), CauseOfTransmission.PERIODIC, false, false, 0, 1, false); - newAsdu.AddInformationObject (new MeasuredValueScaled (110, -1, new QualityDescriptor ())); - - server.EnqueueASDU (newAsdu); + newAsdu.AddInformationObject (new MeasuredValueScaled (110, -1, new QualityDescriptor ())); + + server.EnqueueASDU (newAsdu); - waitTime = 30000; - } - } + waitTime = 30000; + } + } - if (server.IsRunning()) - { - Console.WriteLine("Stop server"); - server.Stop(); - } - else - { - Console.WriteLine("Server stopped"); - } + if (server.IsRunning()) + { + Console.WriteLine("Stop server"); + server.Stop(); + } + else + { + Console.WriteLine("Server stopped"); + } - } - } + } + } } diff --git a/examples/cs104-server2/Program.cs b/examples/cs104-server2/Program.cs index 7b1e552..7625d16 100644 --- a/examples/cs104-server2/Program.cs +++ b/examples/cs104-server2/Program.cs @@ -10,93 +10,93 @@ namespace cs104_server2 { - /// - /// This example shows how to handle a large number of information objects - /// - class MainClass - { - static SinglePointInformation[] spiObjects = new SinglePointInformation[400]; - static StepPositionWithCP56Time2a[] stepPositionObjects = new StepPositionWithCP56Time2a[100]; + /// + /// This example shows how to handle a large number of information objects + /// + class MainClass + { + static SinglePointInformation[] spiObjects = new SinglePointInformation[400]; + static StepPositionWithCP56Time2a[] stepPositionObjects = new StepPositionWithCP56Time2a[100]; - public static void Main (string[] args) - { - /* Initialize data objects */ - for (int i = 0; i < 400; i++) - spiObjects [i] = new SinglePointInformation (1000 + i, true, new QualityDescriptor ()); + public static void Main (string[] args) + { + /* Initialize data objects */ + for (int i = 0; i < 400; i++) + spiObjects [i] = new SinglePointInformation (1000 + i, true, new QualityDescriptor ()); - for (int i = 0; i < 100; i++) - stepPositionObjects [i] = new StepPositionWithCP56Time2a (10000 + i, 0, false, - new QualityDescriptor (), new CP56Time2a ()); + for (int i = 0; i < 100; i++) + stepPositionObjects [i] = new StepPositionWithCP56Time2a (10000 + i, 0, false, + new QualityDescriptor (), new CP56Time2a ()); - bool running = true; + bool running = true; - Console.CancelKeyPress += delegate(object? sender, ConsoleCancelEventArgs e) { - e.Cancel = true; - running = false; - }; + Console.CancelKeyPress += delegate(object? sender, ConsoleCancelEventArgs e) { + e.Cancel = true; + running = false; + }; - Server server = new Server (); + Server server = new Server (); - server.DebugOutput = false; - server.MaxQueueSize = 100; + server.DebugOutput = false; + server.MaxQueueSize = 100; - server.Start (); + server.Start (); - int waitTime = 2000; + int waitTime = 2000; - while (running) { - Thread.Sleep(100); + while (running) { + Thread.Sleep(100); - if (waitTime > 0) - waitTime -= 100; - else { + if (waitTime > 0) + waitTime -= 100; + else { - ASDU? newAsdu = null; + ASDU? newAsdu = null; - /* send SPI objects */ - for (int i = 0; i < 400; i++) { - spiObjects [i].Value = !(spiObjects [i].Value); + /* send SPI objects */ + for (int i = 0; i < 400; i++) { + spiObjects [i].Value = !(spiObjects [i].Value); - if (newAsdu == null) - newAsdu = new ASDU (server.GetApplicationLayerParameters(), CauseOfTransmission.PERIODIC, false, false, 1, 1, false); + if (newAsdu == null) + newAsdu = new ASDU (server.GetApplicationLayerParameters(), CauseOfTransmission.PERIODIC, false, false, 1, 1, false); - if (newAsdu.AddInformationObject (spiObjects [i]) == false) { - server.EnqueueASDU (newAsdu); - newAsdu = null; - i--; - } - } + if (newAsdu.AddInformationObject (spiObjects [i]) == false) { + server.EnqueueASDU (newAsdu); + newAsdu = null; + i--; + } + } - if (newAsdu != null) - server.EnqueueASDU (newAsdu); + if (newAsdu != null) + server.EnqueueASDU (newAsdu); - /* send step position objects */ - newAsdu = null; + /* send step position objects */ + newAsdu = null; - for (int i = 0; i < 100; i++) { + for (int i = 0; i < 100; i++) { - stepPositionObjects [i].Value = (stepPositionObjects [i].Value + 1) % 63; + stepPositionObjects [i].Value = (stepPositionObjects [i].Value + 1) % 63; - if (newAsdu == null) - newAsdu = new ASDU (server.GetApplicationLayerParameters (), CauseOfTransmission.PERIODIC, false, false, 1, 1, false); + if (newAsdu == null) + newAsdu = new ASDU (server.GetApplicationLayerParameters (), CauseOfTransmission.PERIODIC, false, false, 1, 1, false); - if (newAsdu.AddInformationObject (stepPositionObjects [i]) == false) { - server.EnqueueASDU (newAsdu); - newAsdu = null; - i--; - } - } + if (newAsdu.AddInformationObject (stepPositionObjects [i]) == false) { + server.EnqueueASDU (newAsdu); + newAsdu = null; + i--; + } + } - if (newAsdu != null) - server.EnqueueASDU (newAsdu); + if (newAsdu != null) + server.EnqueueASDU (newAsdu); - waitTime = 1000; - } - } + waitTime = 1000; + } + } - Console.WriteLine ("Stop server"); - server.Stop (); - } - } + Console.WriteLine ("Stop server"); + server.Stop (); + } + } } diff --git a/examples/cs104-server3/Program.cs b/examples/cs104-server3/Program.cs index 4b34fc8..6d625ef 100644 --- a/examples/cs104-server3/Program.cs +++ b/examples/cs104-server3/Program.cs @@ -12,216 +12,216 @@ namespace cs104_server3 { - class Integer32Object : InformationObject, IPrivateIOFactory - { - private int value = 0; + class Integer32Object : InformationObject, IPrivateIOFactory + { + private int value = 0; - public Integer32Object () - : base (0) - { - } + public Integer32Object () + : base (0) + { + } - public Integer32Object(int ioa, int value) - :base (ioa) - { - this.value = value; - } + public Integer32Object(int ioa, int value) + :base (ioa) + { + this.value = value; + } - public int Value { - get { - return this.value; - } - set { - this.value = value; - } - } - - private Integer32Object (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) - :base(parameters, msg, startIndex, isSequence) - { - if (!isSequence) - startIndex += parameters.SizeOfIOA; /* skip IOA */ + public int Value { + get { + return this.value; + } + set { + this.value = value; + } + } + + private Integer32Object (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) + :base(parameters, msg, startIndex, isSequence) + { + if (!isSequence) + startIndex += parameters.SizeOfIOA; /* skip IOA */ - value = msg [startIndex++]; - value += ((int)msg [startIndex++] * 0x100); - value += ((int)msg [startIndex++] * 0x10000); - value += ((int)msg [startIndex++] * 0x1000000); - } + value = msg [startIndex++]; + value += ((int)msg [startIndex++] * 0x100); + value += ((int)msg [startIndex++] * 0x10000); + value += ((int)msg [startIndex++] * 0x1000000); + } - public override bool SupportsSequence { - get { - return true; - } - } + public override bool SupportsSequence { + get { + return true; + } + } - public override TypeID Type { - get { - return (TypeID)41; - } - } + public override TypeID Type { + get { + return (TypeID)41; + } + } - InformationObject IPrivateIOFactory.Decode (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) - { - return new Integer32Object (parameters, msg, startIndex, isSequence); - } + InformationObject IPrivateIOFactory.Decode (ApplicationLayerParameters parameters, byte[] msg, int startIndex, bool isSequence) + { + return new Integer32Object (parameters, msg, startIndex, isSequence); + } - public override int GetEncodedSize() - { - return 4; - } + public override int GetEncodedSize() + { + return 4; + } - public override void Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) { - base.Encode(frame, parameters, isSequence); + public override void Encode(Frame frame, ApplicationLayerParameters parameters, bool isSequence) { + base.Encode(frame, parameters, isSequence); - frame.SetNextByte((byte) (value % 0x100)); - frame.SetNextByte((byte) ((value / 0x100) % 0x100)); - frame.SetNextByte((byte) ((value / 0x10000) % 0x100)); - frame.SetNextByte((byte) (value / 0x1000000)); - } - } + frame.SetNextByte((byte) (value % 0x100)); + frame.SetNextByte((byte) ((value / 0x100) % 0x100)); + frame.SetNextByte((byte) ((value / 0x10000) % 0x100)); + frame.SetNextByte((byte) (value / 0x1000000)); + } + } - class MainClass - { - private static bool interrogationHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qoi) - { - Console.WriteLine ("Interrogation for group " + qoi); + class MainClass + { + private static bool interrogationHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qoi) + { + Console.WriteLine ("Interrogation for group " + qoi); - ApplicationLayerParameters cp = connection.GetApplicationLayerParameters (); + ApplicationLayerParameters cp = connection.GetApplicationLayerParameters (); - connection.SendACT_CON (asdu, false); + connection.SendACT_CON (asdu, false); - // send information objects - ASDU newAsdu = new ASDU(cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, false); + // send information objects + ASDU newAsdu = new ASDU(cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, false); - newAsdu.AddInformationObject (new MeasuredValueScaled (100, -1, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (100, -1, new QualityDescriptor ())); - newAsdu.AddInformationObject (new MeasuredValueScaled (101, 23, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (101, 23, new QualityDescriptor ())); - newAsdu.AddInformationObject (new MeasuredValueScaled (102, 2300, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (102, 2300, new QualityDescriptor ())); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 3, 1, false); + newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 3, 1, false); - newAsdu.AddInformationObject(new MeasuredValueScaledWithCP56Time2a(103, 3456, new QualityDescriptor (), new CP56Time2a(DateTime.Now))); + newAsdu.AddInformationObject(new MeasuredValueScaledWithCP56Time2a(103, 3456, new QualityDescriptor (), new CP56Time2a(DateTime.Now))); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, false); + newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, false); - newAsdu.AddInformationObject (new SinglePointWithCP56Time2a (104, true, new QualityDescriptor (), new CP56Time2a (DateTime.Now))); + newAsdu.AddInformationObject (new SinglePointWithCP56Time2a (104, true, new QualityDescriptor (), new CP56Time2a (DateTime.Now))); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - // send sequence of information objects - newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, true); + // send sequence of information objects + newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, true); - newAsdu.AddInformationObject (new SinglePointInformation (200, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (201, false, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (202, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (203, false, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (204, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (205, false, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (206, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (207, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (200, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (201, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (202, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (203, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (204, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (205, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (206, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (207, false, new QualityDescriptor ())); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, true); + newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, true); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (300, -1.0f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (301, -0.5f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (302, -0.1f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (303, .0f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (304, 0.1f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (305, 0.2f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (306, 0.5f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (307, 0.7f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (308, 0.99f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (309, 1f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (300, -1.0f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (301, -0.5f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (302, -0.1f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (303, .0f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (304, 0.1f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (305, 0.2f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (306, 0.5f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (307, 0.7f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (308, 0.99f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (309, 1f)); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, false); + newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, false); - newAsdu.AddInformationObject (new Integer32Object (400, 1023)); - newAsdu.AddInformationObject (new Integer32Object (402, 1024)); + newAsdu.AddInformationObject (new Integer32Object (400, 1023)); + newAsdu.AddInformationObject (new Integer32Object (402, 1024)); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - connection.SendACT_TERM (asdu); + connection.SendACT_TERM (asdu); - return true; - } + return true; + } - private static bool asduHandler(object parameter, IMasterConnection connection, ASDU asdu) - { + private static bool asduHandler(object parameter, IMasterConnection connection, ASDU asdu) + { - if (asdu.TypeId == TypeID.C_SC_NA_1) { - Console.WriteLine ("Single command"); + if (asdu.TypeId == TypeID.C_SC_NA_1) { + Console.WriteLine ("Single command"); - SingleCommand sc = (SingleCommand)asdu.GetElement (0); + SingleCommand sc = (SingleCommand)asdu.GetElement (0); - Console.WriteLine (sc.ToString ()); - } - else if (asdu.TypeId == TypeID.C_CS_NA_1){ + Console.WriteLine (sc.ToString ()); + } + else if (asdu.TypeId == TypeID.C_CS_NA_1){ - ClockSynchronizationCommand qsc = (ClockSynchronizationCommand)asdu.GetElement (0); + ClockSynchronizationCommand qsc = (ClockSynchronizationCommand)asdu.GetElement (0); - Console.WriteLine ("Received clock sync command with time " + qsc.NewTime.ToString()); - } + Console.WriteLine ("Received clock sync command with time " + qsc.NewTime.ToString()); + } - return true; - } + return true; + } - public static void Main (string[] args) - { - bool running = true; + public static void Main (string[] args) + { + bool running = true; - Console.CancelKeyPress += delegate(object? sender, ConsoleCancelEventArgs e) { - e.Cancel = true; - running = false; - }; + Console.CancelKeyPress += delegate(object? sender, ConsoleCancelEventArgs e) { + e.Cancel = true; + running = false; + }; - Server server = new Server (); + Server server = new Server (); - server.DebugOutput = true; + server.DebugOutput = true; - server.MaxQueueSize = 10; + server.MaxQueueSize = 10; - server.SetInterrogationHandler (interrogationHandler, null); + server.SetInterrogationHandler (interrogationHandler, null); - server.SetASDUHandler (asduHandler, null); + server.SetASDUHandler (asduHandler, null); - server.Start (); + server.Start (); - ASDU newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.INITIALIZED, false, false, 0, 1, false); - EndOfInitialization eoi = new EndOfInitialization(0); - newAsdu.AddInformationObject(eoi); - server.EnqueueASDU(newAsdu); + ASDU newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.INITIALIZED, false, false, 0, 1, false); + EndOfInitialization eoi = new EndOfInitialization(0); + newAsdu.AddInformationObject(eoi); + server.EnqueueASDU(newAsdu); - int waitTime = 1000; + int waitTime = 1000; - while (running) { - Thread.Sleep(100); + while (running) { + Thread.Sleep(100); - if (waitTime > 0) - waitTime -= 100; - else { + if (waitTime > 0) + waitTime -= 100; + else { - newAsdu = new ASDU (server.GetApplicationLayerParameters(), CauseOfTransmission.PERIODIC, false, false, 2, 1, false); + newAsdu = new ASDU (server.GetApplicationLayerParameters(), CauseOfTransmission.PERIODIC, false, false, 2, 1, false); - newAsdu.AddInformationObject (new MeasuredValueScaled (110, -1, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (110, -1, new QualityDescriptor ())); - server.EnqueueASDU (newAsdu); + server.EnqueueASDU (newAsdu); - waitTime = 5000; - } - } + waitTime = 5000; + } + } - Console.WriteLine ("Stop server"); - server.Stop (); - } - } + Console.WriteLine ("Stop server"); + server.Stop (); + } + } } diff --git a/examples/cs104-tls-client/Program.cs b/examples/cs104-tls-client/Program.cs index 738efb4..130be13 100644 --- a/examples/cs104-tls-client/Program.cs +++ b/examples/cs104-tls-client/Program.cs @@ -10,113 +10,113 @@ namespace cs104_tls_client { - class MainClass - { - - private static void ConnectionHandler (object parameter, ConnectionEvent connectionEvent) - { - switch (connectionEvent) { - case ConnectionEvent.OPENED: - Console.WriteLine ("Connected"); - break; - case ConnectionEvent.CLOSED: - Console.WriteLine ("Connection closed"); - break; - case ConnectionEvent.STARTDT_CON_RECEIVED: - Console.WriteLine ("STARTDT CON received"); - break; - case ConnectionEvent.STOPDT_CON_RECEIVED: - Console.WriteLine ("STOPDT CON received"); - break; - } - } + class MainClass + { + + private static void ConnectionHandler (object parameter, ConnectionEvent connectionEvent) + { + switch (connectionEvent) { + case ConnectionEvent.OPENED: + Console.WriteLine ("Connected"); + break; + case ConnectionEvent.CLOSED: + Console.WriteLine ("Connection closed"); + break; + case ConnectionEvent.STARTDT_CON_RECEIVED: + Console.WriteLine ("STARTDT CON received"); + break; + case ConnectionEvent.STOPDT_CON_RECEIVED: + Console.WriteLine ("STOPDT CON received"); + break; + } + } - private static bool asduReceivedHandler(object parameter, ASDU asdu) - { - Console.WriteLine (asdu.ToString ()); + private static bool asduReceivedHandler(object parameter, ASDU asdu) + { + Console.WriteLine (asdu.ToString ()); - if (asdu.TypeId == TypeID.M_SP_NA_1) { + if (asdu.TypeId == TypeID.M_SP_NA_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { + for (int i = 0; i < asdu.NumberOfElements; i++) { - var val = (SinglePointInformation)asdu.GetElement (i); + var val = (SinglePointInformation)asdu.GetElement (i); - Console.WriteLine (" IOA: " + val.ObjectAddress + " SP value: " + val.Value); - Console.WriteLine (" " + val.Quality.ToString ()); - } - } else if (asdu.TypeId == TypeID.M_ME_TE_1) { + Console.WriteLine (" IOA: " + val.ObjectAddress + " SP value: " + val.Value); + Console.WriteLine (" " + val.Quality.ToString ()); + } + } else if (asdu.TypeId == TypeID.M_ME_TE_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { + for (int i = 0; i < asdu.NumberOfElements; i++) { - var msv = (MeasuredValueScaledWithCP56Time2a)asdu.GetElement (i); + var msv = (MeasuredValueScaledWithCP56Time2a)asdu.GetElement (i); - Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.ScaledValue); - Console.WriteLine (" " + msv.Quality.ToString ()); - Console.WriteLine (" " + msv.Timestamp.ToString ()); - } + Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.ScaledValue); + Console.WriteLine (" " + msv.Quality.ToString ()); + Console.WriteLine (" " + msv.Timestamp.ToString ()); + } - } else if (asdu.TypeId == TypeID.M_ME_TF_1) { + } else if (asdu.TypeId == TypeID.M_ME_TF_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { - var mfv = (MeasuredValueShortWithCP56Time2a)asdu.GetElement (i); + for (int i = 0; i < asdu.NumberOfElements; i++) { + var mfv = (MeasuredValueShortWithCP56Time2a)asdu.GetElement (i); - Console.WriteLine (" IOA: " + mfv.ObjectAddress + " float value: " + mfv.Value); - Console.WriteLine (" " + mfv.Quality.ToString ()); - Console.WriteLine (" " + mfv.Timestamp.ToString ()); - Console.WriteLine (" " + mfv.Timestamp.GetDateTime ().ToString ()); - } - } else if (asdu.TypeId == TypeID.M_SP_TB_1) { + Console.WriteLine (" IOA: " + mfv.ObjectAddress + " float value: " + mfv.Value); + Console.WriteLine (" " + mfv.Quality.ToString ()); + Console.WriteLine (" " + mfv.Timestamp.ToString ()); + Console.WriteLine (" " + mfv.Timestamp.GetDateTime ().ToString ()); + } + } else if (asdu.TypeId == TypeID.M_SP_TB_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { + for (int i = 0; i < asdu.NumberOfElements; i++) { - var val = (SinglePointWithCP56Time2a)asdu.GetElement (i); + var val = (SinglePointWithCP56Time2a)asdu.GetElement (i); - Console.WriteLine (" IOA: " + val.ObjectAddress + " SP value: " + val.Value); - Console.WriteLine (" " + val.Quality.ToString ()); - Console.WriteLine (" " + val.Timestamp.ToString ()); - } - } else if (asdu.TypeId == TypeID.M_ME_NC_1) { + Console.WriteLine (" IOA: " + val.ObjectAddress + " SP value: " + val.Value); + Console.WriteLine (" " + val.Quality.ToString ()); + Console.WriteLine (" " + val.Timestamp.ToString ()); + } + } else if (asdu.TypeId == TypeID.M_ME_NC_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { - var mfv = (MeasuredValueShort)asdu.GetElement (i); + for (int i = 0; i < asdu.NumberOfElements; i++) { + var mfv = (MeasuredValueShort)asdu.GetElement (i); - Console.WriteLine (" IOA: " + mfv.ObjectAddress + " float value: " + mfv.Value); - Console.WriteLine (" " + mfv.Quality.ToString ()); - } - } else if (asdu.TypeId == TypeID.M_ME_NB_1) { + Console.WriteLine (" IOA: " + mfv.ObjectAddress + " float value: " + mfv.Value); + Console.WriteLine (" " + mfv.Quality.ToString ()); + } + } else if (asdu.TypeId == TypeID.M_ME_NB_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { + for (int i = 0; i < asdu.NumberOfElements; i++) { - var msv = (MeasuredValueScaled)asdu.GetElement (i); + var msv = (MeasuredValueScaled)asdu.GetElement (i); - Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.ScaledValue); - Console.WriteLine (" " + msv.Quality.ToString ()); - } + Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.ScaledValue); + Console.WriteLine (" " + msv.Quality.ToString ()); + } - } else if (asdu.TypeId == TypeID.M_ME_ND_1) { + } else if (asdu.TypeId == TypeID.M_ME_ND_1) { - for (int i = 0; i < asdu.NumberOfElements; i++) { + for (int i = 0; i < asdu.NumberOfElements; i++) { - var msv = (MeasuredValueNormalizedWithoutQuality)asdu.GetElement (i); + var msv = (MeasuredValueNormalizedWithoutQuality)asdu.GetElement (i); - Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.NormalizedValue); - } + Console.WriteLine (" IOA: " + msv.ObjectAddress + " scaled value: " + msv.NormalizedValue); + } - } else if (asdu.TypeId == TypeID.C_IC_NA_1) { - if (asdu.Cot == CauseOfTransmission.ACTIVATION_CON) - Console.WriteLine ((asdu.IsNegative ? "Negative" : "Positive") + "confirmation for interrogation command"); - else if (asdu.Cot == CauseOfTransmission.ACTIVATION_TERMINATION) - Console.WriteLine ("Interrogation command terminated"); - } - else { - Console.WriteLine ("Unknown message type!"); - } + } else if (asdu.TypeId == TypeID.C_IC_NA_1) { + if (asdu.Cot == CauseOfTransmission.ACTIVATION_CON) + Console.WriteLine ((asdu.IsNegative ? "Negative" : "Positive") + "confirmation for interrogation command"); + else if (asdu.Cot == CauseOfTransmission.ACTIVATION_TERMINATION) + Console.WriteLine ("Interrogation command terminated"); + } + else { + Console.WriteLine ("Unknown message type!"); + } - return true; - } + return true; + } - public static void Main (string[] args) - { + public static void Main (string[] args) + { string hostname = "127.0.0.1"; if (args.Length > 0) @@ -128,74 +128,74 @@ public static void Main (string[] args) Console.WriteLine ("Using lib60870.NET version " + LibraryCommon.GetLibraryVersionString ()); - // Own certificate has to be a pfx file that contains the private key - X509Certificate2 ownCertificate = new X509Certificate2 ("client1.pfx"); + // Own certificate has to be a pfx file that contains the private key + X509Certificate2 ownCertificate = new X509Certificate2 ("client1.pfx"); - // Create a new security information object to configure TLS - TlsSecurityInformation secInfo = new TlsSecurityInformation (null, ownCertificate); + // Create a new security information object to configure TLS + TlsSecurityInformation secInfo = new TlsSecurityInformation (null, ownCertificate); - // Add allowed server certificates - not required when AllowOnlySpecificCertificates == false - secInfo.AddAllowedCertificate (new X509Certificate2 ("server.cer")); + // Add allowed server certificates - not required when AllowOnlySpecificCertificates == false + secInfo.AddAllowedCertificate (new X509Certificate2 ("server.cer")); - // Add a CA certificate to check the certificate provided by the server - not required when ChainValidation == false - secInfo.AddCA (new X509Certificate2 ("root.cer")); + // Add a CA certificate to check the certificate provided by the server - not required when ChainValidation == false + secInfo.AddCA (new X509Certificate2 ("root.cer")); - // Check if the certificate is signed by a provided CA - secInfo.ChainValidation = false; + // Check if the certificate is signed by a provided CA + secInfo.ChainValidation = false; - secInfo.TlsVersion = SslProtocols.Tls13; + secInfo.TlsVersion = SslProtocols.Tls13; - // Check that the shown server certificate is in the list of allowed certificates - secInfo.AllowOnlySpecificCertificates = true; + // Check that the shown server certificate is in the list of allowed certificates + secInfo.AllowOnlySpecificCertificates = true; - Connection con = new Connection (hostname, 19998); + Connection con = new Connection (hostname, 19998); // Set security information object, this will force the connection using TLS (using TCP port 19998) con.SetTlsSecurity (secInfo); - con.DebugOutput = true; - - con.SetASDUReceivedHandler (asduReceivedHandler, null); - con.SetConnectionHandler (ConnectionHandler, null); + con.DebugOutput = true; + + con.SetASDUReceivedHandler (asduReceivedHandler, null); + con.SetConnectionHandler (ConnectionHandler, null); - con.Connect (); + con.Connect (); - Thread.Sleep (5000); + Thread.Sleep (5000); - con.SendTestCommand (1); + con.SendTestCommand (1); - con.SendInterrogationCommand (CauseOfTransmission.ACTIVATION, 1, QualifierOfInterrogation.STATION); + con.SendInterrogationCommand (CauseOfTransmission.ACTIVATION, 1, QualifierOfInterrogation.STATION); - Thread.Sleep (5000); + Thread.Sleep (5000); - con.SendControlCommand (CauseOfTransmission.ACTIVATION, 1, new SingleCommand (5000, true, false, 0)); + con.SendControlCommand (CauseOfTransmission.ACTIVATION, 1, new SingleCommand (5000, true, false, 0)); - con.SendControlCommand (CauseOfTransmission.ACTIVATION, 1, new DoubleCommand (5001, DoubleCommand.ON, false, 0)); + con.SendControlCommand (CauseOfTransmission.ACTIVATION, 1, new DoubleCommand (5001, DoubleCommand.ON, false, 0)); - con.SendControlCommand (CauseOfTransmission.ACTIVATION, 1, new StepCommand (5002, StepCommandValue.HIGHER, false, 0)); + con.SendControlCommand (CauseOfTransmission.ACTIVATION, 1, new StepCommand (5002, StepCommandValue.HIGHER, false, 0)); - con.SendControlCommand (CauseOfTransmission.ACTIVATION, 1, - new SingleCommandWithCP56Time2a (5000, false, false, 0, new CP56Time2a (DateTime.Now))); + con.SendControlCommand (CauseOfTransmission.ACTIVATION, 1, + new SingleCommandWithCP56Time2a (5000, false, false, 0, new CP56Time2a (DateTime.Now))); - /* Synchronize clock of the controlled station */ - con.SendClockSyncCommand (1 /* CA */, new CP56Time2a (DateTime.Now)); + /* Synchronize clock of the controlled station */ + con.SendClockSyncCommand (1 /* CA */, new CP56Time2a (DateTime.Now)); - Console.WriteLine ("CLOSE"); + Console.WriteLine ("CLOSE"); - con.Close (); + con.Close (); - Console.WriteLine ("RECONNECT"); + Console.WriteLine ("RECONNECT"); - con.Connect (); + con.Connect (); - Thread.Sleep (5000); + Thread.Sleep (5000); - Console.WriteLine ("CLOSE 2"); + Console.WriteLine ("CLOSE 2"); - con.Close (); + con.Close (); - Console.WriteLine("Press any key to terminate..."); - Console.ReadKey(); - } - } + Console.WriteLine("Press any key to terminate..."); + Console.ReadKey(); + } + } } diff --git a/examples/cs104-tls-server/Program.cs b/examples/cs104-tls-server/Program.cs index 3bace7c..55d8866 100644 --- a/examples/cs104-tls-server/Program.cs +++ b/examples/cs104-tls-server/Program.cs @@ -8,170 +8,170 @@ namespace cs104_tls_server { class MainClass - { + { - private static bool interrogationHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qoi) - { - Console.WriteLine ("Interrogation for group " + qoi); + private static bool interrogationHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qoi) + { + Console.WriteLine ("Interrogation for group " + qoi); - ApplicationLayerParameters cp = connection.GetApplicationLayerParameters (); + ApplicationLayerParameters cp = connection.GetApplicationLayerParameters (); - try { + try { - connection.SendACT_CON (asdu, false); + connection.SendACT_CON (asdu, false); - // send information objects - ASDU newAsdu = new ASDU(cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, false); + // send information objects + ASDU newAsdu = new ASDU(cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, false); - newAsdu.AddInformationObject (new MeasuredValueScaled (100, -1, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (100, -1, new QualityDescriptor ())); - newAsdu.AddInformationObject (new MeasuredValueScaled (101, 23, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (101, 23, new QualityDescriptor ())); - newAsdu.AddInformationObject (new MeasuredValueScaled (102, 2300, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (102, 2300, new QualityDescriptor ())); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 3, 1, false); + newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 3, 1, false); - newAsdu.AddInformationObject(new MeasuredValueScaledWithCP56Time2a(103, 3456, new QualityDescriptor (), new CP56Time2a(DateTime.Now))); + newAsdu.AddInformationObject(new MeasuredValueScaledWithCP56Time2a(103, 3456, new QualityDescriptor (), new CP56Time2a(DateTime.Now))); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, false); + newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, false); - newAsdu.AddInformationObject (new SinglePointWithCP56Time2a (104, true, new QualityDescriptor (), new CP56Time2a (DateTime.Now))); + newAsdu.AddInformationObject (new SinglePointWithCP56Time2a (104, true, new QualityDescriptor (), new CP56Time2a (DateTime.Now))); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - // send sequence of information objects - newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, true); + // send sequence of information objects + newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, true); - newAsdu.AddInformationObject (new SinglePointInformation (200, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (201, false, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (202, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (203, false, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (204, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (205, false, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (206, true, new QualityDescriptor ())); - newAsdu.AddInformationObject (new SinglePointInformation (207, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (200, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (201, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (202, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (203, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (204, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (205, false, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (206, true, new QualityDescriptor ())); + newAsdu.AddInformationObject (new SinglePointInformation (207, false, new QualityDescriptor ())); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, true); + newAsdu = new ASDU (cp, CauseOfTransmission.INTERROGATED_BY_STATION, false, false, 2, 1, true); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (300, -1.0f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (301, -0.5f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (302, -0.1f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (303, .0f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (304, 0.1f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (305, 0.2f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (306, 0.5f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (307, 0.7f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (308, 0.99f)); - newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (309, 1f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (300, -1.0f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (301, -0.5f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (302, -0.1f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (303, .0f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (304, 0.1f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (305, 0.2f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (306, 0.5f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (307, 0.7f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (308, 0.99f)); + newAsdu.AddInformationObject (new MeasuredValueNormalizedWithoutQuality (309, 1f)); - connection.SendASDU (newAsdu); + connection.SendASDU (newAsdu); - connection.SendACT_TERM (asdu); - } - catch (ConnectionException) { - Console.WriteLine ("Client exception closed unexpectedly"); - } + connection.SendACT_TERM (asdu); + } + catch (ConnectionException) { + Console.WriteLine ("Client exception closed unexpectedly"); + } - return true; - } + return true; + } - private static bool asduHandler(object parameter, IMasterConnection connection, ASDU asdu) - { + private static bool asduHandler(object parameter, IMasterConnection connection, ASDU asdu) + { - if (asdu.TypeId == TypeID.C_SC_NA_1) { - Console.WriteLine ("Single command"); + if (asdu.TypeId == TypeID.C_SC_NA_1) { + Console.WriteLine ("Single command"); - SingleCommand sc = (SingleCommand)asdu.GetElement (0); + SingleCommand sc = (SingleCommand)asdu.GetElement (0); - Console.WriteLine (sc.ToString ()); - } - else if (asdu.TypeId == TypeID.C_CS_NA_1){ + Console.WriteLine (sc.ToString ()); + } + else if (asdu.TypeId == TypeID.C_CS_NA_1){ - ClockSynchronizationCommand qsc = (ClockSynchronizationCommand)asdu.GetElement (0); + ClockSynchronizationCommand qsc = (ClockSynchronizationCommand)asdu.GetElement (0); - Console.WriteLine ("Received clock sync command with time " + qsc.NewTime.ToString()); - } + Console.WriteLine ("Received clock sync command with time " + qsc.NewTime.ToString()); + } - return true; - } + return true; + } - public static void Main (string[] args) - { - bool running = true; + public static void Main (string[] args) + { + bool running = true; - Console.CancelKeyPress += delegate(object? sender, ConsoleCancelEventArgs e) { - e.Cancel = true; - running = false; - }; - - // Own certificate has to be a pfx file that contains the private key - X509Certificate2 ownCertificate = new X509Certificate2 ("server.pfx"); + Console.CancelKeyPress += delegate(object? sender, ConsoleCancelEventArgs e) { + e.Cancel = true; + running = false; + }; + + // Own certificate has to be a pfx file that contains the private key + X509Certificate2 ownCertificate = new X509Certificate2 ("server.pfx"); - // Create a new security information object to configure TLS - TlsSecurityInformation secInfo = new TlsSecurityInformation (ownCertificate); + // Create a new security information object to configure TLS + TlsSecurityInformation secInfo = new TlsSecurityInformation (ownCertificate); - // Add allowed client certificates - not required when AllowOnlySpecificCertificates == false - secInfo.AddAllowedCertificate (new X509Certificate2 ("client1.cer")); - //secInfo.AddAllowedCertificate (new X509Certificate2 ("client_CA1_2.pem")); + // Add allowed client certificates - not required when AllowOnlySpecificCertificates == false + secInfo.AddAllowedCertificate (new X509Certificate2 ("client1.cer")); + //secInfo.AddAllowedCertificate (new X509Certificate2 ("client_CA1_2.pem")); - // Add a CA certificate to check the certificate provided by the server - not required when ChainValidation == false - secInfo.AddCA (new X509Certificate2 ("root.cer")); + // Add a CA certificate to check the certificate provided by the server - not required when ChainValidation == false + secInfo.AddCA (new X509Certificate2 ("root.cer")); - // Check if the certificate is signed by a provided CA - secInfo.ChainValidation = true; + // Check if the certificate is signed by a provided CA + secInfo.ChainValidation = true; - // Allow only TLS versions 1.2 and 1.3 - secInfo.TlsVersion = SslProtocols.Tls12 | SslProtocols.Tls13; + // Allow only TLS versions 1.2 and 1.3 + secInfo.TlsVersion = SslProtocols.Tls12 | SslProtocols.Tls13; // Check that the shown client certificate is in the list of allowed certificates - secInfo.AllowOnlySpecificCertificates = false; + secInfo.AllowOnlySpecificCertificates = false; - // Use constructor with security information object, this will force the connection using TLS (using TCP port 19998) - Server server = new Server (secInfo); + // Use constructor with security information object, this will force the connection using TLS (using TCP port 19998) + Server server = new Server (secInfo); - server.DebugOutput = true; + server.DebugOutput = true; - server.MaxQueueSize = 10; + server.MaxQueueSize = 10; - server.SetInterrogationHandler (interrogationHandler, null); + server.SetInterrogationHandler (interrogationHandler, null); - server.SetASDUHandler (asduHandler, null); + server.SetASDUHandler (asduHandler, null); - server.Start (); + server.Start (); - ASDU newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.INITIALIZED, false, false, 0, 1, false); - EndOfInitialization eoi = new EndOfInitialization(0); - newAsdu.AddInformationObject(eoi); - server.EnqueueASDU(newAsdu); + ASDU newAsdu = new ASDU(server.GetApplicationLayerParameters(), CauseOfTransmission.INITIALIZED, false, false, 0, 1, false); + EndOfInitialization eoi = new EndOfInitialization(0); + newAsdu.AddInformationObject(eoi); + server.EnqueueASDU(newAsdu); - int waitTime = 1000; + int waitTime = 1000; - while (running) { - Thread.Sleep(100); + while (running) { + Thread.Sleep(100); - if (waitTime > 0) - waitTime -= 100; - else { + if (waitTime > 0) + waitTime -= 100; + else { - newAsdu = new ASDU (server.GetApplicationLayerParameters(), CauseOfTransmission.PERIODIC, false, false, 2, 1, false); + newAsdu = new ASDU (server.GetApplicationLayerParameters(), CauseOfTransmission.PERIODIC, false, false, 2, 1, false); - newAsdu.AddInformationObject (new MeasuredValueScaled (110, -1, new QualityDescriptor ())); + newAsdu.AddInformationObject (new MeasuredValueScaled (110, -1, new QualityDescriptor ())); - server.EnqueueASDU (newAsdu); + server.EnqueueASDU (newAsdu); - waitTime = 1000; - } - } + waitTime = 1000; + } + } - Console.WriteLine ("Stop server"); - server.Stop ();; - } - } + Console.WriteLine ("Stop server"); + server.Stop ();; + } + } } diff --git a/lib60870/CS101/CS101Slave.cs b/lib60870/CS101/CS101Slave.cs index daa0be1..016c5bb 100644 --- a/lib60870/CS101/CS101Slave.cs +++ b/lib60870/CS101/CS101Slave.cs @@ -48,8 +48,8 @@ private void DebugLog(string msg) } /******************************************** - * IASDUSender - ********************************************/ + * IASDUSender + ********************************************/ void IMasterConnection.SendASDU(ASDU asdu) { @@ -78,8 +78,8 @@ ApplicationLayerParameters IMasterConnection.GetApplicationLayerParameters() } /******************************************** - * ISecondaryApplicationLayer - ********************************************/ + * ISecondaryApplicationLayer + ********************************************/ bool ISecondaryApplicationLayer.IsClass1DataAvailable() { @@ -119,8 +119,8 @@ void ISecondaryApplicationLayer.ResetCUReceived(bool onlyFcb) } /******************************************** - * END ISecondaryApplicationLayer - ********************************************/ + * END ISecondaryApplicationLayer + ********************************************/ private LinkLayer linkLayer = null; diff --git a/lib60870/CS101/FileServices.cs b/lib60870/CS101/FileServices.cs index afa2a9d..68615ea 100644 --- a/lib60870/CS101/FileServices.cs +++ b/lib60870/CS101/FileServices.cs @@ -105,7 +105,7 @@ public interface IFileProvider /// /// File ready handler. Will be called by the FileServer when a master sends a FILE READY (file download announcement) message to the slave. /// - public delegate IFileReceiver FileReadyHandler(object parameter, int ca, int ioa, NameOfFile nof, int lengthOfFile); + public delegate IFileReceiver FileReadyHandler(object parameter, int ca, int ioa, NameOfFile nof, int lengthOfFile); /// /// Simple implementation of IFileProvider that can be used to provide transparent files. Derived classed should override the diff --git a/lib60870/CS101/Master.cs b/lib60870/CS101/Master.cs index 395b857..48413b9 100644 --- a/lib60870/CS101/Master.cs +++ b/lib60870/CS101/Master.cs @@ -26,7 +26,7 @@ namespace lib60870.CS101 /// /// Handler that is called when a new ASDU is received /// - public delegate bool ASDUReceivedHandler(object parameter, int slaveAddress, ASDU asdu); + public delegate bool ASDUReceivedHandler(object parameter, int slaveAddress, ASDU asdu); /// /// Common interface for CS104 and CS101 balanced and unbalanced master diff --git a/lib60870/CS101/Slave.cs b/lib60870/CS101/Slave.cs index 38ccc12..661a791 100644 --- a/lib60870/CS101/Slave.cs +++ b/lib60870/CS101/Slave.cs @@ -58,38 +58,38 @@ public interface IMasterConnection /// /// Handler for interrogation command (C_IC_NA_1 - 100). /// - public delegate bool InterrogationHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qoi); + public delegate bool InterrogationHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qoi); /// /// Handler for counter interrogation command (C_CI_NA_1 - 101). /// - public delegate bool CounterInterrogationHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qoi); + public delegate bool CounterInterrogationHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qoi); /// /// Handler for read command (C_RD_NA_1 - 102) /// - public delegate bool ReadHandler(object parameter, IMasterConnection connection, ASDU asdu, int ioa); + public delegate bool ReadHandler(object parameter, IMasterConnection connection, ASDU asdu, int ioa); /// /// Handler for clock synchronization command (C_CS_NA_1 - 103) /// - public delegate bool ClockSynchronizationHandler(object parameter, IMasterConnection connection, ASDU asdu, CP56Time2a newTime); + public delegate bool ClockSynchronizationHandler(object parameter, IMasterConnection connection, ASDU asdu, CP56Time2a newTime); /// /// Handler for reset process command (C_RP_NA_1 - 105) /// - public delegate bool ResetProcessHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qrp); + public delegate bool ResetProcessHandler(object parameter, IMasterConnection connection, ASDU asdu, byte qrp); /// /// Handler for delay acquisition command (C_CD_NA:1 - 106) /// - public delegate bool DelayAcquisitionHandler(object parameter, IMasterConnection connection, ASDU asdu, CP16Time2a delayTime); + public delegate bool DelayAcquisitionHandler(object parameter, IMasterConnection connection, ASDU asdu, CP16Time2a delayTime); /// /// Handler for ASDUs that are not handled by other handlers (default handler) /// - public delegate bool ASDUHandler(object parameter, IMasterConnection connection, ASDU asdu); + public delegate bool ASDUHandler(object parameter, IMasterConnection connection, ASDU asdu); public abstract class Slave { diff --git a/lib60870/LibraryCommon.cs b/lib60870/LibraryCommon.cs index e5cdc43..5e46201 100644 --- a/lib60870/LibraryCommon.cs +++ b/lib60870/LibraryCommon.cs @@ -56,6 +56,6 @@ public static string GetLibraryVersionString() /// Raw message handler. Can be used to access the raw message. /// Returns true when message should be handled by the protocol stack, false, otherwise. /// - public delegate bool RawMessageHandler(object parameter, byte[] message, int messageSize); + public delegate bool RawMessageHandler(object parameter, byte[] message, int messageSize); } diff --git a/lib60870/LinkLayer/LinkLayer.cs b/lib60870/LinkLayer/LinkLayer.cs index 072b1fe..fee6109 100644 --- a/lib60870/LinkLayer/LinkLayer.cs +++ b/lib60870/LinkLayer/LinkLayer.cs @@ -29,7 +29,7 @@ namespace lib60870.linklayer /// Will be called by the stack when the state of a link layer connection changes /// /// Address of the slave (only used for unbalanced master mode) - public delegate void LinkLayerStateChanged(object parameter, int address, LinkLayerState newState); + public delegate void LinkLayerStateChanged(object parameter, int address, LinkLayerState newState); public enum LinkLayerState { diff --git a/lib60870/LinkLayer/PrimaryLinkLayerUnbalanced.cs b/lib60870/LinkLayer/PrimaryLinkLayerUnbalanced.cs index 870be94..deb3d47 100644 --- a/lib60870/LinkLayer/PrimaryLinkLayerUnbalanced.cs +++ b/lib60870/LinkLayer/PrimaryLinkLayerUnbalanced.cs @@ -597,8 +597,8 @@ public void RunStateMachine() } /******************************** - * IPrimaryLinkLayerUnbalanced - ********************************/ + * IPrimaryLinkLayerUnbalanced + ********************************/ public void ResetCU(int slaveAddress) diff --git a/lib60870/LinkLayer/TcpClientVirtualSerialPort.cs b/lib60870/LinkLayer/TcpClientVirtualSerialPort.cs index 39aca19..de237eb 100644 --- a/lib60870/LinkLayer/TcpClientVirtualSerialPort.cs +++ b/lib60870/LinkLayer/TcpClientVirtualSerialPort.cs @@ -266,8 +266,8 @@ public void Stop() /************************* - * Stream implementation - */ + * Stream implementation + */ public override int Read(byte[] buffer, int offset, int count) { diff --git a/lib60870/LinkLayer/TcpServerVirtualSerialPort.cs b/lib60870/LinkLayer/TcpServerVirtualSerialPort.cs index 638452f..e589bbc 100644 --- a/lib60870/LinkLayer/TcpServerVirtualSerialPort.cs +++ b/lib60870/LinkLayer/TcpServerVirtualSerialPort.cs @@ -203,8 +203,8 @@ public void Stop() /************************* - * Stream implementation - */ + * Stream implementation + */ public override int Read(byte[] buffer, int offset, int count) { diff --git a/release_script.sh b/release_script.sh index 1df8f49..eb70f92 100644 --- a/release_script.sh +++ b/release_script.sh @@ -65,7 +65,7 @@ while [ -z "$1" ]; do done while [ -z "$2" ]; do - read -p "Enter option (prepare/release/formatFiles/all): " OPTION_INPUT + read -p "Enter option ([0]prepare/[1]release/[2]formatFiles/[3]all): " OPTION_INPUT set -- "$1" "$OPTION_INPUT" done @@ -76,16 +76,16 @@ OPTION="$2" # Execute option case case "$OPTION" in - prepare) + 0) prepare_folder ;; - release) + 1) create_release_folder ;; -formatFiles) +2) format_cs_files ;; - all) + 3) format_cs_files prepare_folder create_release_folder diff --git a/tests/Test.cs b/tests/Test.cs index 39a72d4..5a548de 100644 --- a/tests/Test.cs +++ b/tests/Test.cs @@ -2004,9 +2004,9 @@ public void TestSendTestFRTimeoutSlave() connection.Close(); server.Stop(); - // Assert.AreEqual (5, connection.GetStatistics ().RcvdMsgCounter); /* STARTDT_CON + ASDU + TESTFR_CON */ + // Assert.AreEqual (5, connection.GetStatistics ().RcvdMsgCounter); /* STARTDT_CON + ASDU + TESTFR_CON */ - // Assert.AreEqual (0, connection.GetStatistics ().RcvdTestFrConCounter); + // Assert.AreEqual (0, connection.GetStatistics ().RcvdTestFrConCounter); } From a277f07f38e3eb7b33f8126667807f98db0d1712 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Tue, 25 Mar 2025 07:48:28 +0000 Subject: [PATCH 73/83] - fixed two test cases to run on Linux --- tests/Test.cs | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/tests/Test.cs b/tests/Test.cs index 5a548de..d6db77a 100644 --- a/tests/Test.cs +++ b/tests/Test.cs @@ -4,6 +4,7 @@ using NUnit.Framework; using System; using System.Net.Sockets; +using System.Runtime.InteropServices; using System.Threading; namespace tests @@ -183,8 +184,6 @@ public void TestBCR() Assert.AreEqual(true, bcr.Adjusted); Assert.AreEqual(0, bcr.SequenceNumber); Assert.AreEqual(0, bcr.Value); - - } [Test()] @@ -264,7 +263,6 @@ public void TestClockSynchronizationCommand() Assert.AreEqual(time.Minute, csc.NewTime.Minute); Assert.AreEqual(time.Second, csc.NewTime.Second); Assert.AreEqual(time.Millisecond, csc.NewTime.Millisecond); - } [Test()] @@ -343,7 +341,6 @@ public void TestEventOfProtectionEquipmentWithTime() Assert.AreEqual(45, e.Timestamp.Minute); Assert.AreEqual(23, e.Timestamp.Second); Assert.AreEqual(538, e.Timestamp.Millisecond); - } [Test()] @@ -382,10 +379,8 @@ public void TestCounterInterrogationCommand() Assert.AreEqual(101, cic.ObjectAddress); Assert.AreEqual(24, cic.QCC); - } - [Test()] public void TestSetpointCommandShort() { @@ -406,7 +401,6 @@ public void TestSetpointCommandShort() Assert.AreEqual(102, sc.ObjectAddress); Assert.AreEqual(-1.0f, sc.Value, 0.001f); Assert.AreEqual(true, sc.QOS.Select); - } [Test()] @@ -451,7 +445,6 @@ public void TestSetpointCommandShortWithCP56Time2a() Assert.AreEqual(time.Minute, sc.Timestamp.Minute); Assert.AreEqual(time.Second, sc.Timestamp.Second); Assert.AreEqual(time.Millisecond, sc.Timestamp.Millisecond); - } [Test()] @@ -479,7 +472,6 @@ public void TestSetpointCommandScaled() [Test()] public void TestSetpointCommandScaledWithCP56Time2a() { - DateTime dateTime = DateTime.UtcNow; CP56Time2a time = new CP56Time2a(dateTime); @@ -584,8 +576,6 @@ public void TestSetpointCommandNormalizedWithCP56Time2a() Assert.AreEqual(time.Millisecond, sc.Timestamp.Millisecond); } - - [Test()] public void TestStepPositionInformation() { @@ -731,7 +721,16 @@ public void TestConnectWhileAlreadyConnected() Assert.IsNotNull(se); Assert.AreEqual(se.Message, "already connected"); - Assert.AreEqual(10056, ((SocketException)se.InnerException).ErrorCode); + + if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + Assert.AreEqual(106, ((SocketException)se.InnerException).ErrorCode); + } + + if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + Assert.AreEqual(10056, ((SocketException)se.InnerException).ErrorCode); + } connection.Close(); @@ -765,8 +764,6 @@ private static bool EventQueue1_asduReceivedHandler(object param, ASDU asdu) return true; } - - [Test()] public void TestAddUntilOverflow() { @@ -940,7 +937,17 @@ public void TestSendIMessageAfterStopDT() Assert.IsNotNull(se); Assert.AreEqual(se.Message, "not connected"); - Assert.AreEqual(10057, ((SocketException)se.InnerException).ErrorCode); + + + if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + Assert.AreEqual(107, ((SocketException)se.InnerException).ErrorCode); + } + + if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + Assert.AreEqual(10057, ((SocketException)se.InnerException).ErrorCode); + } server.Stop(); } From 40e9e274a19479b04f6863bdaf948db0dfc4c82b Mon Sep 17 00:00:00 2001 From: Maxson Ramon dos Anjos Medeiros Date: Tue, 25 Mar 2025 12:03:46 +0100 Subject: [PATCH 74/83] update examples and tests to .net8 --- .../cs101-master-balanced.csproj | 7 ++----- examples/cs101-master-tcp/cs101-master-tcp.csproj | 7 ++----- .../cs101-master-unbalanced.csproj | 7 ++----- .../cs101-slave-balanced.csproj | 7 ++----- examples/cs101-slave-tcp/cs101-slave-tcp.csproj | 7 ++----- .../cs101-slave-unbalanced.csproj | 7 ++----- .../cs104-client-file-upload.csproj | 7 ++----- examples/cs104-client1/cs104-client1.csproj | 7 ++----- examples/cs104-client2/cs104-client2.csproj | 7 ++----- examples/cs104-client3/cs104-client3.csproj | 7 ++----- .../cs104-multi-client-server.csproj | 7 ++----- .../cs104-redundancy-server.csproj | 7 ++----- examples/cs104-server-file/cs104-server-file.csproj | 7 ++----- examples/cs104-server/cs104-server.csproj | 7 ++----- examples/cs104-server2/cs104-server2.csproj | 7 ++----- examples/cs104-server3/cs104-server3.csproj | 7 ++----- examples/cs104-tls-client/cs104-tls-client.csproj | 6 +----- examples/cs104-tls-server/cs104-tls-server.csproj | 7 +------ tests/lib60870-tests.csproj | 13 ++++--------- 19 files changed, 38 insertions(+), 100 deletions(-) diff --git a/examples/cs101-master-balanced/cs101-master-balanced.csproj b/examples/cs101-master-balanced/cs101-master-balanced.csproj index e803db1..3f52daa 100644 --- a/examples/cs101-master-balanced/cs101-master-balanced.csproj +++ b/examples/cs101-master-balanced/cs101-master-balanced.csproj @@ -1,15 +1,12 @@ - - Exe - net6.0 + net8.0 cs101_master_balanced enable enable - - + \ No newline at end of file diff --git a/examples/cs101-master-tcp/cs101-master-tcp.csproj b/examples/cs101-master-tcp/cs101-master-tcp.csproj index 1fe5948..90960a1 100644 --- a/examples/cs101-master-tcp/cs101-master-tcp.csproj +++ b/examples/cs101-master-tcp/cs101-master-tcp.csproj @@ -1,15 +1,12 @@ - - Exe - net6.0 + net8.0 cs101_master_tcp enable enable - - + \ No newline at end of file diff --git a/examples/cs101-master-unbalanced/cs101-master-unbalanced.csproj b/examples/cs101-master-unbalanced/cs101-master-unbalanced.csproj index 1b1f522..a3aed90 100644 --- a/examples/cs101-master-unbalanced/cs101-master-unbalanced.csproj +++ b/examples/cs101-master-unbalanced/cs101-master-unbalanced.csproj @@ -1,15 +1,12 @@ - - Exe - net6.0 + net8.0 cs101_master_unbalanced enable enable - - + \ No newline at end of file diff --git a/examples/cs101-slave-balanced/cs101-slave-balanced.csproj b/examples/cs101-slave-balanced/cs101-slave-balanced.csproj index 4db8969..d7c0dc9 100644 --- a/examples/cs101-slave-balanced/cs101-slave-balanced.csproj +++ b/examples/cs101-slave-balanced/cs101-slave-balanced.csproj @@ -1,15 +1,12 @@ - - Exe - net6.0 + net8.0 cs101_slave_balanced enable enable - - + \ No newline at end of file diff --git a/examples/cs101-slave-tcp/cs101-slave-tcp.csproj b/examples/cs101-slave-tcp/cs101-slave-tcp.csproj index 246fa55..be725d7 100644 --- a/examples/cs101-slave-tcp/cs101-slave-tcp.csproj +++ b/examples/cs101-slave-tcp/cs101-slave-tcp.csproj @@ -1,15 +1,12 @@ - - Exe - net6.0 + net8.0 cs101_slave_tcp enable enable - - + \ No newline at end of file diff --git a/examples/cs101-slave-unbalanced/cs101-slave-unbalanced.csproj b/examples/cs101-slave-unbalanced/cs101-slave-unbalanced.csproj index 7e6f4e1..f861909 100644 --- a/examples/cs101-slave-unbalanced/cs101-slave-unbalanced.csproj +++ b/examples/cs101-slave-unbalanced/cs101-slave-unbalanced.csproj @@ -1,15 +1,12 @@ - - Exe - net6.0 + net8.0 cs101_slave_unbalanced enable enable - - + \ No newline at end of file diff --git a/examples/cs104-client-file-upload/cs104-client-file-upload.csproj b/examples/cs104-client-file-upload/cs104-client-file-upload.csproj index 66a9aa5..a2bd290 100644 --- a/examples/cs104-client-file-upload/cs104-client-file-upload.csproj +++ b/examples/cs104-client-file-upload/cs104-client-file-upload.csproj @@ -1,15 +1,12 @@ - - Exe - net6.0 + net8.0 cs104_client_file_upload enable enable - - + \ No newline at end of file diff --git a/examples/cs104-client1/cs104-client1.csproj b/examples/cs104-client1/cs104-client1.csproj index c63b8d8..20aa81d 100644 --- a/examples/cs104-client1/cs104-client1.csproj +++ b/examples/cs104-client1/cs104-client1.csproj @@ -1,15 +1,12 @@ - - Exe - net6.0 + net8.0 cs104_client1 enable enable - - + \ No newline at end of file diff --git a/examples/cs104-client2/cs104-client2.csproj b/examples/cs104-client2/cs104-client2.csproj index 9d7bbad..aad543e 100644 --- a/examples/cs104-client2/cs104-client2.csproj +++ b/examples/cs104-client2/cs104-client2.csproj @@ -1,15 +1,12 @@ - - Exe - net6.0 + net8.0 cs104_client2 enable enable - - + \ No newline at end of file diff --git a/examples/cs104-client3/cs104-client3.csproj b/examples/cs104-client3/cs104-client3.csproj index 3360564..92825d7 100644 --- a/examples/cs104-client3/cs104-client3.csproj +++ b/examples/cs104-client3/cs104-client3.csproj @@ -1,15 +1,12 @@ - - Exe - net6.0 + net8.0 cs104_client3 enable enable - - + \ No newline at end of file diff --git a/examples/cs104-multi-client-server/cs104-multi-client-server.csproj b/examples/cs104-multi-client-server/cs104-multi-client-server.csproj index e786d7d..11f0256 100644 --- a/examples/cs104-multi-client-server/cs104-multi-client-server.csproj +++ b/examples/cs104-multi-client-server/cs104-multi-client-server.csproj @@ -1,15 +1,12 @@ - - Exe - net6.0 + net8.0 cs104_multi_client_server enable enable - - + \ No newline at end of file diff --git a/examples/cs104-redundancy-server/cs104-redundancy-server.csproj b/examples/cs104-redundancy-server/cs104-redundancy-server.csproj index b241e02..ad92115 100644 --- a/examples/cs104-redundancy-server/cs104-redundancy-server.csproj +++ b/examples/cs104-redundancy-server/cs104-redundancy-server.csproj @@ -1,15 +1,12 @@ - - Exe - net6.0 + net8.0 cs104_redundancy_server enable enable - - + \ No newline at end of file diff --git a/examples/cs104-server-file/cs104-server-file.csproj b/examples/cs104-server-file/cs104-server-file.csproj index 379f08f..e010798 100644 --- a/examples/cs104-server-file/cs104-server-file.csproj +++ b/examples/cs104-server-file/cs104-server-file.csproj @@ -1,15 +1,12 @@ - - Exe - net6.0 + net8.0 cs104_server_file enable enable - - + \ No newline at end of file diff --git a/examples/cs104-server/cs104-server.csproj b/examples/cs104-server/cs104-server.csproj index f9fe7e6..159488d 100644 --- a/examples/cs104-server/cs104-server.csproj +++ b/examples/cs104-server/cs104-server.csproj @@ -1,15 +1,12 @@ - - Exe - net6.0 + net8.0 cs104_server enable enable - - + \ No newline at end of file diff --git a/examples/cs104-server2/cs104-server2.csproj b/examples/cs104-server2/cs104-server2.csproj index 999b443..3710de0 100644 --- a/examples/cs104-server2/cs104-server2.csproj +++ b/examples/cs104-server2/cs104-server2.csproj @@ -1,15 +1,12 @@ - - Exe - net6.0 + net8.0 cs104_server2 enable enable - - + \ No newline at end of file diff --git a/examples/cs104-server3/cs104-server3.csproj b/examples/cs104-server3/cs104-server3.csproj index 4af9ea8..53e0415 100644 --- a/examples/cs104-server3/cs104-server3.csproj +++ b/examples/cs104-server3/cs104-server3.csproj @@ -1,15 +1,12 @@ - - Exe - net6.0 + net8.0 cs104_server3 enable enable - - + \ No newline at end of file diff --git a/examples/cs104-tls-client/cs104-tls-client.csproj b/examples/cs104-tls-client/cs104-tls-client.csproj index 6e8af5a..d6cebd7 100644 --- a/examples/cs104-tls-client/cs104-tls-client.csproj +++ b/examples/cs104-tls-client/cs104-tls-client.csproj @@ -1,9 +1,7 @@  - - PreserveNewest @@ -15,13 +13,11 @@ PreserveNewest - Exe - net6.0 + net8.0 cs104_tls_client enable enable - \ No newline at end of file diff --git a/examples/cs104-tls-server/cs104-tls-server.csproj b/examples/cs104-tls-server/cs104-tls-server.csproj index a6eeb5b..002bc14 100644 --- a/examples/cs104-tls-server/cs104-tls-server.csproj +++ b/examples/cs104-tls-server/cs104-tls-server.csproj @@ -1,13 +1,10 @@  - - - PreserveNewest @@ -19,13 +16,11 @@ PreserveNewest - Exe - net6.0 + net8.0 cs104_tls_server enable enable - \ No newline at end of file diff --git a/tests/lib60870-tests.csproj b/tests/lib60870-tests.csproj index db77a46..4523f63 100644 --- a/tests/lib60870-tests.csproj +++ b/tests/lib60870-tests.csproj @@ -1,21 +1,16 @@ - - net6.0 + net8.0 enable - false - - - - + + - - + \ No newline at end of file From 35a0a8f5d1189331fa0b824612f7185480d1cd8a Mon Sep 17 00:00:00 2001 From: Maxson Ramon dos Anjos Medeiros Date: Tue, 25 Mar 2025 12:17:16 +0100 Subject: [PATCH 75/83] FIx port problem on test tests.Test.TestConnectSameConnectionMultipleTimesServerDisconnects --- tests/Test.cs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/tests/Test.cs b/tests/Test.cs index d6db77a..a6efc0f 100644 --- a/tests/Test.cs +++ b/tests/Test.cs @@ -689,11 +689,13 @@ public void TestConnectWhileAlreadyConnected() Server server = new Server(apciParameters, parameters); - server.SetLocalPort(20213); + int port = GetPort(); + + server.SetLocalPort(port); server.Start(); - Connection connection = new Connection("127.0.0.1", 20213, apciParameters, parameters); + Connection connection = new Connection("127.0.0.1", port, apciParameters, parameters); ConnectionException se = null; @@ -961,11 +963,11 @@ public void TestConnectSameConnectionMultipleTimes() Server server = new Server(apciParameters, parameters); - server.SetLocalPort(20213); + server.SetLocalPort(port); server.Start(); - Connection connection = new Connection("127.0.0.1", 20213, apciParameters, parameters); + Connection connection = new Connection("127.0.0.1", port, apciParameters, parameters); SocketException se = null; @@ -1011,11 +1013,11 @@ public void TestConnectSameConnectionMultipleTimesServerDisconnects() server.DebugOutput = true; - server.SetLocalPort(20213); + server.SetLocalPort(port); server.Start(); - Connection connection = new Connection("127.0.0.1", 20213, apciParameters, parameters); + Connection connection = new Connection("127.0.0.1", port, apciParameters, parameters); connection.DebugOutput = true; From 4ad2923db5c780d669766a1fcdf42e477f093fec Mon Sep 17 00:00:00 2001 From: Maxson Date: Tue, 25 Mar 2025 13:01:48 +0100 Subject: [PATCH 76/83] fix tests - if (enqueuedMessage == server.MaxQueueSize) --- tests/Test.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/Test.cs b/tests/Test.cs index a6efc0f..60f4c21 100644 --- a/tests/Test.cs +++ b/tests/Test.cs @@ -962,7 +962,7 @@ public void TestConnectSameConnectionMultipleTimes() APCIParameters apciParameters = new APCIParameters(); Server server = new Server(apciParameters, parameters); - + int port = GetPort(); server.SetLocalPort(port); server.Start(); @@ -1012,7 +1012,7 @@ public void TestConnectSameConnectionMultipleTimesServerDisconnects() Server server = new Server(apciParameters, parameters); server.DebugOutput = true; - + int port = GetPort(); server.SetLocalPort(port); server.Start(); @@ -1027,6 +1027,8 @@ public void TestConnectSameConnectionMultipleTimesServerDisconnects() connection.Connect(); + Thread.Sleep(1000); + server.Stop(); Thread.Sleep(1000); @@ -3548,7 +3550,7 @@ public void TestSingleRedundancyGroup() Console.WriteLine($"Number of queue entries: {numberOfQueueEntries}"); waitTime = 1000; - if (enqueuedMessage == server.MaxQueueSize) + if (enqueuedMessage >= server.MaxQueueSize) Assert.AreEqual(server.MaxQueueSize, numberOfQueueEntries); else Assert.AreEqual(enqueuedMessage, numberOfQueueEntries); @@ -3634,7 +3636,7 @@ public void TestMultipleRedundancyGroup() int numberOfQueueEntries = server.GetNumberOfQueueEntries(redGroup); Console.WriteLine($"Number of queue entries: {numberOfQueueEntries}"); waitTime = 1000; - if (enqueuedMessage == server.MaxQueueSize) + if (enqueuedMessage >= server.MaxQueueSize) Assert.AreEqual(server.MaxQueueSize, numberOfQueueEntries); else Assert.AreEqual(enqueuedMessage, numberOfQueueEntries); From e513d70465f1619aea64e94b7d76144b27d76e57 Mon Sep 17 00:00:00 2001 From: Juergen Wieferink Date: Tue, 25 Mar 2025 17:50:22 +0100 Subject: [PATCH 77/83] Add ServerStateEvent --- lib60870/CS104/Server.cs | 73 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 69 insertions(+), 4 deletions(-) diff --git a/lib60870/CS104/Server.cs b/lib60870/CS104/Server.cs index 3cbde47..c3df074 100644 --- a/lib60870/CS104/Server.cs +++ b/lib60870/CS104/Server.cs @@ -28,6 +28,43 @@ namespace lib60870.CS104 { + /// + /// Server events concerning listening + /// + public class ServerStateEvent { + + private bool nowListening; + private bool fatal; + private Exception occurredException; + /// + /// Either true (by Start()) or false (by Stop() or exception) + /// + public bool NowListening + { + get { return nowListening; } + } + /// + /// Is it a fatal exception (while listening) or not (no exception or while closing) + /// + public bool Fatal + { + get { return fatal; } + } + /// + /// Either null (by Start() and Stop() or caught exception) + /// + public Exception OccurredException + { + get { return occurredException; } + } + internal ServerStateEvent(bool nowListening, bool fatal, Exception occurredException) + { + this.nowListening = nowListening; + this.fatal = fatal; + this.occurredException = occurredException; + } + } + public delegate void ServerStateEventHandler(object parameter, ServerStateEvent stateEvent); /// /// Connection request handler is called when a client tries to connect to the server. @@ -467,6 +504,19 @@ public void AddRedundancyGroup(RedundancyGroup redundancyGroup) redGroups.Add(redundancyGroup); } + public ServerStateEventHandler serverStateEventHandler = null; + public object serverStateEventHandlerParameter = null; + /// + /// Sets a callback handler for server state changes. + /// + /// Handler. + /// Parameter. + public void SetServerStateEventHandler(ServerStateEventHandler handler, object parameter) + { + this.serverStateEventHandler = handler; + this.serverStateEventHandlerParameter = parameter; + } + public ConnectionRequestHandler connectionRequestHandler = null; public object connectionRequestHandlerParameter = null; @@ -584,6 +634,7 @@ public int GetNumberOfQueueEntries(RedundancyGroup redundancyGroup = null) private void ServerAcceptThread() { running = true; + CallServerStateEventHandler(new ServerStateEvent(true, false, null)); DebugLog("Waiting for connections..."); @@ -675,8 +726,13 @@ private void ServerAcceptThread() } catch (Exception e) { - running = false; - DebugLog("Exception: " + e.ToString()); + DebugLog("Exception: " + e.Message); + bool socketExceptionDuringShutdown = !running && (e is SocketException); + if (!socketExceptionDuringShutdown) + { + running = false; + CallServerStateEventHandler(new ServerStateEvent(false, true, e)); + } } } @@ -767,6 +823,7 @@ public void Start() public void Stop() { running = false; + CallServerStateEventHandler(new ServerStateEvent(false, false, null)); try { @@ -774,9 +831,10 @@ public void Stop() { listeningSocket.Shutdown(SocketShutdown.Both); } - catch (SocketException ex) + catch (SocketException ex) // seems to be side effect of Shutdown(). No idea how to avoid it. { - DebugLog("SocketException: " + ex.Message); + DebugLog("SocketException: " + ex.Message + " with code " + ex.ErrorCode); + // CallServerStateEventHandler(new ServerStateEvent(false, false, ex)); } listeningSocket.Close(); @@ -790,6 +848,7 @@ public void Stop() catch (Exception e) { DebugLog("Exception: " + e.Message); + CallServerStateEventHandler(new ServerStateEvent(false, false, e)); } } @@ -835,6 +894,12 @@ public void EnqueueASDU(ASDU asdu) } } + internal void CallServerStateEventHandler(ServerStateEvent e) + { + if (serverStateEventHandler != null) + serverStateEventHandler(serverStateEventHandlerParameter, e); + } + internal void CallConnectionEventHandler(ClientConnection connection, ClientConnectionEvent e) { if (connection.State == MasterConnectionState.M_CON_STATE_STARTED) From 1cfe1bbab2e8d4b75d044a6cefff0b4a3c281509 Mon Sep 17 00:00:00 2001 From: Juergen Wieferink Date: Tue, 25 Mar 2025 17:56:22 +0100 Subject: [PATCH 78/83] Make connections and their queues accessible. --- lib60870/CS104/ClientConnection.cs | 2 +- lib60870/CS104/Server.cs | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib60870/CS104/ClientConnection.cs b/lib60870/CS104/ClientConnection.cs index 3966887..b05070c 100644 --- a/lib60870/CS104/ClientConnection.cs +++ b/lib60870/CS104/ClientConnection.cs @@ -134,7 +134,7 @@ private struct SentASDU /// /// The ASDU queue containing low-priority ASDUs. /// - internal ASDUQueue GetASDUQueue() + public ASDUQueue GetASDUQueue() { return lowPrioQueue; } diff --git a/lib60870/CS104/Server.cs b/lib60870/CS104/Server.cs index c3df074..18a10d2 100644 --- a/lib60870/CS104/Server.cs +++ b/lib60870/CS104/Server.cs @@ -894,6 +894,11 @@ public void EnqueueASDU(ASDU asdu) } } + public IEnumerable GetAllOpenConnections() + { + return allOpenConnections; + } + internal void CallServerStateEventHandler(ServerStateEvent e) { if (serverStateEventHandler != null) From f13774c6ac8d797931c3ec6917432b815513c658 Mon Sep 17 00:00:00 2001 From: Juergen Wieferink Date: Tue, 25 Mar 2025 18:02:29 +0100 Subject: [PATCH 79/83] Remove condition on CallConnectionEventHandler() --- lib60870/CS104/Server.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib60870/CS104/Server.cs b/lib60870/CS104/Server.cs index 18a10d2..f77c4f5 100644 --- a/lib60870/CS104/Server.cs +++ b/lib60870/CS104/Server.cs @@ -907,11 +907,11 @@ internal void CallServerStateEventHandler(ServerStateEvent e) internal void CallConnectionEventHandler(ClientConnection connection, ClientConnectionEvent e) { - if (connection.State == MasterConnectionState.M_CON_STATE_STARTED) - { + // if (connection.State == MasterConnectionState.M_CON_STATE_STARTED) + // { if (connectionEventHandler != null) connectionEventHandler(connectionEventHandlerParameter, connection, e); - } + // } } internal void Activated(ClientConnection activeConnection) From 5dc3c0f75e16181b039b5383151e61c4b4365e4d Mon Sep 17 00:00:00 2001 From: Juergen Wieferink Date: Wed, 23 Apr 2025 09:36:01 +0200 Subject: [PATCH 80/83] Allow to send S Message for faster acknowledgement. --- lib60870/CS104/Connection.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib60870/CS104/Connection.cs b/lib60870/CS104/Connection.cs index 18cbe14..78d26ec 100644 --- a/lib60870/CS104/Connection.cs +++ b/lib60870/CS104/Connection.cs @@ -424,7 +424,7 @@ public ApplicationLayerParameters Parameters /// Sends an S-Message to the remote device. /// This message contains a sequence number and is used for communication control. /// - private void SendSMessage() + public void SendSMessage() { byte[] msg = new byte[6]; From a3be03cb2a2df895c26e6a74ae8fa1fd66905524 Mon Sep 17 00:00:00 2001 From: Juergen Wieferink Date: Wed, 18 Jun 2025 08:02:57 +0200 Subject: [PATCH 81/83] #36: Confirmations in highPrioQueue could act on lowPrioQueue --- lib60870/CS104/ClientConnection.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib60870/CS104/ClientConnection.cs b/lib60870/CS104/ClientConnection.cs index b05070c..b8f2b9e 100644 --- a/lib60870/CS104/ClientConnection.cs +++ b/lib60870/CS104/ClientConnection.cs @@ -676,7 +676,7 @@ private bool sendNextHighPriorityASDU() } sentASDUs[currentIndex].entryTime = timestamp; - sentASDUs[currentIndex].queueIndex = index; + sentASDUs[currentIndex].queueIndex = -1; // highPrioQueue does not need confirmation sentASDUs[currentIndex].seqNo = SendIMessage(asdu); sentASDUs[currentIndex].sentTime = SystemUtils.currentTimeMillis(); From 2e4f22d40f294077c4cbb03d54683611723465aa Mon Sep 17 00:00:00 2001 From: Juergen Wieferink Date: Wed, 18 Jun 2025 08:13:47 +0200 Subject: [PATCH 82/83] #35/KRITISAPP-2405: Repeated ASDUs on long interrogation --- lib60870/ASDUQueue.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/lib60870/ASDUQueue.cs b/lib60870/ASDUQueue.cs index 0641ab1..a38fb83 100644 --- a/lib60870/ASDUQueue.cs +++ b/lib60870/ASDUQueue.cs @@ -279,6 +279,7 @@ internal BufferFrame GetNextHighPriorityWaitingASDU(out long timestamp, out int NumberOfAsduInQueue--; int currentIndex = oldestQueueEntry; + oldestQueueEntry = (oldestQueueEntry + 1) % maxQueueSize; BufferFrame bufferFrame = enqueuedASDUs[currentIndex].asdu; From 5df633162c47266a3c7866d5b722c0a4ce45b9ed Mon Sep 17 00:00:00 2001 From: Juergen Wieferink Date: Tue, 9 Sep 2025 07:51:28 +0200 Subject: [PATCH 83/83] Make race condition somewhat less likely. --- lib60870/CS104/Server.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib60870/CS104/Server.cs b/lib60870/CS104/Server.cs index f77c4f5..fd563df 100644 --- a/lib60870/CS104/Server.cs +++ b/lib60870/CS104/Server.cs @@ -896,7 +896,7 @@ public void EnqueueASDU(ASDU asdu) public IEnumerable GetAllOpenConnections() { - return allOpenConnections; + return allOpenConnections.ToArray(); } internal void CallServerStateEventHandler(ServerStateEvent e)
  • ^Lpc-&?6D;@(k>wmJSDRcig=cwZ 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