1362 lines
57 KiB
C#
1362 lines
57 KiB
C#
// **********************************************************************************************************
|
|
// coe.cs
|
|
// 6/1/2022
|
|
// NGI - Next Generation Interceptor
|
|
//
|
|
// Contract No. HQ0856-21-C-0003/1022000209
|
|
//
|
|
// THIS DOCUMENT DOES NOT CONTAIN TECHNOLOGY OR TECHNICAL DATA CONTROLLED UNDER EITHER THE U.S.
|
|
// INTERNATIONAL TRAFFIC IN ARMS REGULATIONS OR THE U.S. EXPORT ADMINISTRATION REGULATIONS.
|
|
//
|
|
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION PROPRIETARY TO RAYTHEON
|
|
// COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT.
|
|
// DISCLOSURE TO UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO RAYTHEON
|
|
// COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS CONTENTS SHALL BE FURNISHED OR DISCLOSED
|
|
// TO OR COPIED OR USED BY PERSONS OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF
|
|
// RAYTHEON COMPANY.
|
|
//
|
|
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
|
//
|
|
// DESTRUCTION NOTICE: FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN DOD 5220.22-M,
|
|
// NATIONAL INDUSTRIAL SECURITY PROGRAM OPERATING MANUAL, FEBRUARY 2006,
|
|
// INCORPORATING CHANGE 1, MARCH 28, 2013, CHAPTER 5, SECTION 7, OR DODM 5200.01-VOLUME 3,
|
|
// DOD INFORMATION SECURITY PROGRAM: PROTECTION OF CLASSIFIED INFORMATION, ENCLOSURE 3,
|
|
// SECTION 17. FOR CONTROLLED UNCLASSIFIED INFORMATION FOLLOW THE PROCEDURES IN DODM 5200.01-VOLUME 4,
|
|
// INFORMATION SECURITY PROGRAM: CONTROLLED UNCLASSIFIED INFORMATION.
|
|
//
|
|
// CONTROLLED BY: MISSILE DEFENSE AGENCY
|
|
// CONTROLLED BY: GROUND-BASED MIDCOURSE DEFENSE PROGRAM OFFICE
|
|
// CUI CATEGORY: CTI
|
|
// DISTRIBUTION/DISSEMINATION CONTROL: F
|
|
// POC: Alex Kravchenko (1118268)
|
|
// **********************************************************************************************************
|
|
//\\<Unclassified>
|
|
//----------------------------------------------------------------------------//
|
|
// UNCLASSIFIED //
|
|
//----------------------------------------------------------------------------//
|
|
//\\<\Unclassified>
|
|
|
|
//\\<UnlimitedRights>
|
|
//----------------------------------------------------------------------------//
|
|
// Copyright %(copyright)s Raytheon Company. //
|
|
// This software was developed pursuant to Contract Number %(contractNumber)s //
|
|
// with the U.S. government. The U.S. government's rights in and to this //
|
|
// copyrighted software are as specified in DFARS 252.227-7014 which was made //
|
|
// part of the above contract. //
|
|
//----------------------------------------------------------------------------//
|
|
//\\<\UnlimitedRights>
|
|
|
|
//\\<EximUndetermined>
|
|
//----------------------------------------------------------------------------//
|
|
// WARNING - This document contains technical data and / or technology whose //
|
|
// export or disclosure to Non-U.S. Persons, wherever located, is restricted //
|
|
// by the International Traffic in Arms Regulations (ITAR) (22 C.F.R. //
|
|
// Section 120-130) or the Export Administration Regulations (EAR) (15 C.F.R. //
|
|
// Section 730-774). This document CANNOT be exported (e.g., provided to a //
|
|
// supplier outside of the United States) or disclosed to a Non-U.S. Person, //
|
|
// wherever located, until a final jurisdiction and classification //
|
|
// determination has been completed and approved by Raytheon, and any //
|
|
// required U.S. Government approvals have been obtained. Violations are //
|
|
// subject to severe criminal penalties. //
|
|
//----------------------------------------------------------------------------//
|
|
//\\<\EximUndetermined>
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Linq;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
using NLog;
|
|
|
|
namespace Raytheon.Common.Coe
|
|
{
|
|
public class coe
|
|
{
|
|
public const string coeDLL = "coeWindows-shared.dll";
|
|
|
|
private IntPtr router { get; set; }
|
|
public IntPtr Router => router;
|
|
public IntPtr Database { get; set; }
|
|
public IntPtr Protocol { get; set; }
|
|
public bool IsConnected { get; set; }
|
|
|
|
public string ProtocolName { get; set; }
|
|
public string ProtocolCmitName { get; set; }
|
|
|
|
public coeEndpoint _realTimeCtrlEndpoint = null;
|
|
|
|
public const int OE_TRUE = 1;
|
|
public const int OE_FALSE = 0;
|
|
|
|
public const int OE_Do_Not_Wait = 0;
|
|
public const int OE_Wait_Forever = -1;
|
|
|
|
internal static coeDataInterchangePackets _dataInterchangePackets = new coeDataInterchangePackets();
|
|
|
|
public enum Status : int
|
|
{
|
|
ERROR = -1,
|
|
SUCCESS = 0,
|
|
FAILED_INSUFFICIENT_RESOURCES = 1,
|
|
FAILED_INTERNAL_ERROR = 2,
|
|
FAILED_INVALID_ADDRESS = 3,
|
|
FAILED_INVALID_NAME = 4,
|
|
FAILED_INVALID_PARAMETER = 5,
|
|
FAILED_MESSAGE_NOT_AVAILABLE = 6,
|
|
FAILED_MESSAGE_NOT_RETURNABLE = 7,
|
|
FAILED_MESSAGE_TOO_LARGE = 8,
|
|
FAILED_NAME_NOT_FOUND = 9,
|
|
FAILED_OBJECT_DELETED = 10,
|
|
FAILED_OBJECT_NOT_FOUND = 11,
|
|
FAILED_OBJECT_ALREADY_EXISTS = 12,
|
|
FAILED_REQUEST_DENIED = 13,
|
|
FAILED_TIMEOUT = 14,
|
|
FAILED_INVALID_ASYNCH_ID = 15,
|
|
FAILED_OPERATION_IN_PROGRESS = 16,
|
|
FAILED_INVALID_ASSOCIATION = 17,
|
|
FAILED_INVALID_HOST_FOR_CREATION = 18,
|
|
FAILED_INVALID_SCOPE = 19,
|
|
FAILED_INVALID_TRIGGER = 20,
|
|
FAILED_LOG_OVERFLOW = 21,
|
|
FAILED_INVALID_INDEX = 22,
|
|
FAILED_INVALID_CLOCK_SOURCE = 23,
|
|
FAILED_INVALID_CONVERSION = 24,
|
|
FAILED_INVALID_DATE = 25,
|
|
FAILED_INVALID_MONOTONIC = 26,
|
|
FAILED_INCOMPATIBLE_FORMAT = 27,
|
|
FAILED_TIMER_NOT_SET = 28,
|
|
FAILED_OBJECT_NOT_TRACEABLE = 29,
|
|
FAILED_FILE_ALREADY_EXISTS = 30,
|
|
FAILED_FILE_DOES_NOT_EXIST = 31,
|
|
FAILED_FILE_OPEN = 32,
|
|
FAILED_INVALID_HANDLE = 33,
|
|
FAILED_INVALID_MODE = 34,
|
|
FAILED_INVALID_OPTIONS = 35,
|
|
FAILED_INVALID_PATH = 36,
|
|
FAILED_NOT_IMPLEMENTED = 55,
|
|
FAILED_NOT_ENABLED = 56,
|
|
FAILED_NOT_SUPPORTED = 57,
|
|
FAILED_NOT_ENCRYPTED = 58,
|
|
FAILED_VERIFY_ERROR = 59,
|
|
FAILED_MESSAGE_IS_SIGNED = 60,
|
|
FAILED_MESSAGE_IS_ENCRYPTED = 61,
|
|
FAILED_PROTOCOL_OPERATION_PENDING = 62,
|
|
FAILED_PROTOCOL_NO_MESSAGE_AVAILABLE = 63,
|
|
FAILED_PROTOCOL_BUSY = 64
|
|
};
|
|
|
|
public enum ScopeType
|
|
{
|
|
OE_Local = 0,
|
|
OE_Shared = 1,
|
|
OE_Networked = 2
|
|
};
|
|
|
|
public enum DatabaseRegistrationType
|
|
{
|
|
REFERENCE_DATABASE_TRANSMIT_ALL = 0,
|
|
REFERENCE_DATABASE_LOCAL_REGISTRATIONS = 1,
|
|
REFERENCE_DATABASE_REMOTE_REGISTRATIONS = 2,
|
|
};
|
|
|
|
|
|
|
|
public enum MessageTypes : byte
|
|
{
|
|
PING = 0,
|
|
PING_RESPONSE = 1,
|
|
REGISTRATION_QUERY = 2,
|
|
REGISTRATION_RESPONSE = 3,
|
|
REGISTRATION_MESSAGE = 4,
|
|
DISCONNECT_MESSAGE = 5,
|
|
BINDING_MESSAGE = 6,
|
|
LABELED_MESSAGE = 8,
|
|
};
|
|
|
|
public enum RegistrationType : byte
|
|
{
|
|
NONE = 0,
|
|
REGISTRATION = 1,
|
|
DEREGISTRATION = 2,
|
|
};
|
|
|
|
enum ELEMENT_TYPE
|
|
{
|
|
TYPE_CHAR = 0,
|
|
TYPE_SHORT,
|
|
TYPE_INT,
|
|
TYPE_LONG,
|
|
TYPE_LONG_LONG,
|
|
TYPE_FLOAT,
|
|
TYPE_DOUBLE,
|
|
TYPE_STR,
|
|
TYPE_NULL_STR
|
|
};
|
|
|
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
|
public delegate void RealTimeDisplayCallback(string value);
|
|
|
|
|
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
|
public delegate IntPtr CallBackDelegate(uint Label);
|
|
|
|
#region DLLImports
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "coe_version_Get_Version")]
|
|
private static extern IntPtr coe_version_Get_Version();
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "OE_Initialization_Configure")]
|
|
private static extern Status OE_Initialization_Configure(uint stacksize,
|
|
int priority,
|
|
int affinity,
|
|
uint systemClockPeriod);
|
|
|
|
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "OE_Memory_Tracker_Configure")]
|
|
public static extern Status OE_Memory_Tracker_Configure();
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "OE_Memory_Tracker_Disable")]
|
|
public static extern Status OE_Memory_Tracker_Disable();
|
|
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "OE_Memory_Tracker_Display_Usage")]
|
|
public static extern void OE_Memory_Tracker_Display_Usage();
|
|
|
|
|
|
|
|
[DllImport(coe.coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "OE_Router_Database_Query_Open")]
|
|
private static extern uint OE_Router_Database_Query_Open(IntPtr db,
|
|
IntPtr query_data,
|
|
uint queryType,
|
|
ref IntPtr handle);
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
public struct Destination
|
|
{
|
|
public uint type;
|
|
public IntPtr destination;
|
|
public uint label;
|
|
public uint domain;
|
|
public uint mediaAddress;
|
|
public uint flags;
|
|
};
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "OE_Router_Database_Query_Next")]
|
|
private static extern IntPtr OE_Router_Database_Query_Next(IntPtr handle);
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "OE_Router_Database_Query_Close")]
|
|
private static extern uint OE_Router_Database_Query_Close(IntPtr handle);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "initialize_coe_router")]
|
|
private static extern IntPtr initialize_coe_router();
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "shutdown_coe_router")]
|
|
private static extern Status shutdown_coe_router(IntPtr router);
|
|
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
public unsafe struct PARSE_DATA_SECTION
|
|
{
|
|
public char* section_name;
|
|
public uint list_count;
|
|
public uint* list;
|
|
public uint* next;
|
|
};
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "add_config_item")]
|
|
public static extern int add_config_item(IntPtr sect_list,
|
|
string section_name,
|
|
string element_name,
|
|
string element_value);
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "get_element")]
|
|
private static extern int get_element(IntPtr sect_list, string section, string element, ELEMENT_TYPE dt, IntPtr data, int param);
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "delete_config_database")]
|
|
public static extern int delete_config_database(IntPtr sect_list);
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "configure_router_params")]
|
|
private static extern Status configure_router_params(IntPtr sect_list);
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "configure_database_params")]
|
|
private static extern Status configure_database_params(IntPtr sect_list);
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "configure_tcp_media_binding_params")]
|
|
private static extern Status configure_tcp_media_binding_params(IntPtr sect_list);
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "tcp_media_binding_configure_default")]
|
|
//[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "tcp_media_binding_configure")]
|
|
private static extern IntPtr tcp_media_binding_configure(IntPtr router);
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "tcp_media_binding_shutdown")]
|
|
private static extern Status tcp_media_binding_shutdown();
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "configure_udp_buffer_pools_params")]
|
|
private static extern Status configure_udp_buffer_pools_params(IntPtr sect_list);
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "configure_udp_router_protocol_params")]
|
|
private static extern Status configure_udp_router_protocol_params(IntPtr sect_list);
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "configure_udp_simple_registration_protocol_params")]
|
|
private static extern Status configure_udp_simple_registration_protocol_params(IntPtr sect_list);
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "configure_udp_media_binding_params")]
|
|
private static extern Status configure_udp_media_binding_params(IntPtr sect_list);
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "udp_media_binding_configure")]
|
|
private static extern IntPtr udp_media_binding_configure(IntPtr router);
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "udp_media_binding_shutdown")]
|
|
private static extern Status udp_media_binding_shutdown();
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "configure_serial_media_binding_params")]
|
|
private static extern Status configure_serial_media_binding_params(IntPtr sect_list);
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "serial_media_binding_configure")]
|
|
private static extern IntPtr serial_media_binding_configure(IntPtr router);
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "serial_media_binding_shutdown")]
|
|
private static extern Status serial_media_binding_shutdown();
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "OE_Router_Register_Protocol")]
|
|
private static extern Status OE_Router_Register_Protocol(IntPtr router, IntPtr protocol, uint flags);
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "OE_Router_Deregister_Protocol")]
|
|
private static extern Status OE_Router_Deregister_Protocol(IntPtr router, IntPtr protocol);
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "OE_Initialization_Shutdown")]
|
|
private static extern Status OE_Initialization_Shutdown();
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "OE_Initialization_Create_Database")]
|
|
private static extern uint OE_Initialization_Create_Database(uint stackID,
|
|
DatabaseRegistrationType registrationType,
|
|
uint numberOfInitialDatabaseObjects,
|
|
uint numberOfIncrementalDatabaseObjects,
|
|
uint numberOfInitialQueries,
|
|
uint numberOfIncrementalQueries,
|
|
int doAllLabelsRegistration);
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "OE_Initialization_Create_Buffers")]
|
|
private static extern uint OE_Initialization_Create_Buffers(uint stackID,
|
|
uint buffersInitialCount_1,
|
|
uint buffersSize_1,
|
|
uint buffersInitialCount_2,
|
|
uint buffersSize_2,
|
|
uint buffersInitialCount_3,
|
|
uint buffersSize_3,
|
|
uint buffersInitialCount_4,
|
|
uint buffersSize_4);
|
|
|
|
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "OE_Initialization_UDP_Stack")]
|
|
private static extern uint OE_Initialization_UDP_Stack(uint numberOfInitialDatabaseObjects,
|
|
uint numberOfIncrementalDatabaseObjects,
|
|
int doAllLabelsRegistration,
|
|
uint routerID,
|
|
uint port,
|
|
byte[] serverAddress,
|
|
uint maximumPacketSize,
|
|
uint registrationPacketSize,
|
|
uint buffersInitialCount_1,
|
|
uint buffersSize_1,
|
|
uint buffersInitialCount_2,
|
|
uint buffersSize_2,
|
|
uint buffersInitialCount_3,
|
|
uint buffersSize_3,
|
|
uint buffersInitialCount_4,
|
|
uint buffersSize_4,
|
|
uint UDPreceiveBufferSize);
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "OE_Initialization_Get_Router")]
|
|
internal static extern IntPtr OE_Initialization_Get_Router(uint stackID);
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "OE_Initialization_Get_Database")]
|
|
internal static extern IntPtr OE_Initialization_Get_Database(uint stackID);
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "get_coe_router_database")]
|
|
internal static extern IntPtr get_coe_router_database(IntPtr router);
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "OE_Initialization_Get_Protocol")]
|
|
internal static extern IntPtr OE_Initialization_Get_Protocol(uint stackID);
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "OE_Initialization_Get_Media_Binding")]
|
|
internal static extern IntPtr OE_Initialization_Get_Media_Binding(uint stackID);
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "OE_Router_Protocol_Extended_Routine")]
|
|
private static extern Status OE_Router_Protocol_Extended_Routine(IntPtr oeObject,
|
|
uint routineIdentifier,
|
|
IntPtr routineParameters);
|
|
|
|
[DllImport("kernel32.dll", CallingConvention = CallingConvention.Winapi, EntryPoint = "GetModuleHandle")]
|
|
private static extern IntPtr GetModuleHandle(byte[] dllName);
|
|
|
|
[DllImport("kernel32.dll", CallingConvention = CallingConvention.Winapi, EntryPoint = "GetProcAddress")]
|
|
private static extern IntPtr GetProcAddress(IntPtr handle,
|
|
byte[] routineName);
|
|
|
|
[DllImport("kernel32.dll", CallingConvention = CallingConvention.Winapi, EntryPoint = "ZeroMemory")]
|
|
private static extern IntPtr ZeroMemory(IntPtr buffer, int length);
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "OE_Set_Timestamp_Function")]
|
|
private static extern void OE_Set_Timestamp_Function(IntPtr routine);
|
|
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "OE_Enable_Logger")]
|
|
public static extern Status OE_Enable_Logger();
|
|
|
|
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "OE_Set_Log_Level")]
|
|
public static extern void OE_Set_Log_Level(int Level);
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "OE_Get_Log_Level")]
|
|
public static extern int OE_Get_Log_Level();
|
|
|
|
|
|
[DllImport(coeDLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = "OE_Set_Log_Callback")]
|
|
public static extern Status OE_Set_Log_Callback(
|
|
[MarshalAs(UnmanagedType.FunctionPtr)]
|
|
RealTimeDisplayCallback callbackPointer
|
|
);
|
|
|
|
|
|
[DllImport("kernel32", CharSet = CharSet.None, ExactSpelling = false, SetLastError = true)]
|
|
private static extern bool FreeLibrary(IntPtr hModule);
|
|
|
|
public static void UnloadImportedDll(string dllName)
|
|
{
|
|
foreach (ProcessModule module in Process.GetCurrentProcess().Modules)
|
|
{
|
|
if (module.FileName.EndsWith(dllName))
|
|
{
|
|
coe.FreeLibrary(module.BaseAddress);
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion DLLImports
|
|
|
|
public static string GetVersion()
|
|
{
|
|
string versionString = Marshal.PtrToStringAnsi(coe_version_Get_Version());
|
|
return versionString;
|
|
}
|
|
|
|
public static Status Configure(uint clockPeriod)
|
|
{
|
|
return OE_Initialization_Configure(4096, 0, 0, clockPeriod);
|
|
}
|
|
|
|
public static void Destroy()
|
|
{
|
|
|
|
try
|
|
{
|
|
OE_Initialization_Shutdown();
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
|
|
public static Status CreateDatabase(uint stackID,
|
|
DatabaseRegistrationType registrationType,
|
|
uint numberOfInitialDatabaseObjects,
|
|
uint numberOfIncrementalDatabaseObjects,
|
|
uint numberOfInitialQueries,
|
|
uint numberOfIncrementalQueries,
|
|
bool doAllLabelsRegistration)
|
|
{
|
|
return (Status)OE_Initialization_Create_Database(stackID, registrationType, numberOfInitialDatabaseObjects, numberOfIncrementalDatabaseObjects,
|
|
numberOfInitialQueries, numberOfIncrementalQueries, doAllLabelsRegistration == true ? 1 : 0);
|
|
}
|
|
|
|
public static Status CreateBuffers(uint stackID,
|
|
uint buffersInitialCount_1,
|
|
uint buffersSize_1,
|
|
uint buffersInitialCount_2,
|
|
uint buffersSize_2,
|
|
uint buffersInitialCount_3,
|
|
uint buffersSize_3,
|
|
uint buffersInitialCount_4,
|
|
uint buffersSize_4)
|
|
{
|
|
return (Status)OE_Initialization_Create_Buffers(stackID, buffersInitialCount_1, buffersSize_1, buffersInitialCount_2, buffersSize_2,
|
|
buffersInitialCount_3, buffersSize_3, buffersInitialCount_4, buffersSize_4);
|
|
}
|
|
|
|
|
|
|
|
public static Status CreateUdpStack(uint numberOfInitialDatabaseObjects,
|
|
uint numberOfIncrementalDatabaseObjects,
|
|
bool doAllLabelsRegistration,
|
|
uint routerID,
|
|
uint port,
|
|
string serverAddress,
|
|
uint maximumPacketSize,
|
|
uint registrationPacketSize,
|
|
uint buffersInitialCount_1,
|
|
uint buffersSize_1,
|
|
uint buffersInitialCount_2,
|
|
uint buffersSize_2,
|
|
uint buffersInitialCount_3,
|
|
uint buffersSize_3,
|
|
uint buffersInitialCount_4,
|
|
uint buffersSize_4,
|
|
uint UDPreceiveBufferSize)
|
|
{
|
|
byte[] serverString = Encoding.ASCII.GetBytes(serverAddress + 'x');
|
|
serverString[serverString.Length - 1] = 0;
|
|
return (Status)OE_Initialization_UDP_Stack(numberOfInitialDatabaseObjects,
|
|
numberOfIncrementalDatabaseObjects,
|
|
doAllLabelsRegistration == true ? 1 : 0,
|
|
routerID,
|
|
port,
|
|
serverString,
|
|
maximumPacketSize,
|
|
registrationPacketSize,
|
|
buffersInitialCount_1,
|
|
buffersSize_1,
|
|
buffersInitialCount_2,
|
|
buffersSize_2,
|
|
buffersInitialCount_3,
|
|
buffersSize_3,
|
|
buffersInitialCount_4,
|
|
buffersSize_4,
|
|
UDPreceiveBufferSize);
|
|
}
|
|
|
|
public static uint OE_Router_Database_Query_Open_(IntPtr db,
|
|
IntPtr query_data,
|
|
uint queryType,
|
|
ref IntPtr handle)
|
|
{
|
|
return OE_Router_Database_Query_Open(db, query_data, queryType, ref handle);
|
|
}
|
|
|
|
public static IntPtr OE_Router_Database_Query_Next_(IntPtr handle)
|
|
{
|
|
return OE_Router_Database_Query_Next(handle);
|
|
}
|
|
|
|
|
|
public static uint OE_Router_Database_Query_Close_(IntPtr handle)
|
|
{
|
|
return OE_Router_Database_Query_Close(handle);
|
|
}
|
|
|
|
|
|
|
|
public void SetConnected(bool state)
|
|
{
|
|
IsConnected = state;
|
|
}
|
|
|
|
public Status tcp_media_binding_configure(uint port, //port
|
|
char[] serverAddress, //serverAddress
|
|
uint maximumPacketSize, //maximumPacketSize
|
|
uint UDPtransmitBufferSize,//UDPtransmitBufferSize
|
|
uint UDPreceiveBufferSize, //UDPreceiveBufferSize
|
|
uint TCPtransmitBufferSize,//TCPtransmitBufferSize
|
|
uint TCPreceiveBufferSize, //TCPreceiveBufferSize
|
|
uint TCPoptionFlags, //TCPoptionFlags
|
|
Dictionary<string, List<KeyValuePair<string, string>>> options
|
|
)
|
|
{
|
|
IntPtr plist = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(PARSE_DATA_SECTION)));
|
|
uint tmp = 32;
|
|
|
|
if (Configure(10000) != Status.SUCCESS)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
ZeroMemory(plist, Marshal.SizeOf(typeof(PARSE_DATA_SECTION)));
|
|
|
|
foreach (KeyValuePair<string, List<KeyValuePair<string, string>>> s in options)
|
|
{
|
|
foreach (KeyValuePair<string, string> v in s.Value)
|
|
{
|
|
add_config_item(plist, s.Key, v.Key, v.Value);
|
|
}
|
|
}
|
|
|
|
if (configure_router_params(plist) != Status.SUCCESS)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
if (configure_database_params(plist) != Status.SUCCESS)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
router = initialize_coe_router();
|
|
if (router == (IntPtr)Status.ERROR)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
Database = get_coe_router_database(router);
|
|
if (Database == (IntPtr)Status.ERROR)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
add_config_item(plist, "TCP_MEDIA_BINDING_CONFIG", "LOCAL_PORT", port.ToString());
|
|
add_config_item(plist, "TCP_MEDIA_BINDING_CONFIG", "NUM_PORTS", tmp.ToString());
|
|
add_config_item(plist, "TCP_MEDIA_BINDING_CONFIG", "NUM_DYNAMIC_NODES", tmp.ToString());
|
|
add_config_item(plist, "TCP_MEDIA_BINDING_CONFIG", "SERVER_ADDRESS", new string(serverAddress));
|
|
|
|
tmp = 0;
|
|
add_config_item(plist, "TCP_MEDIA_BINDING_CONFIG", "UDP_TX_BUFFER_SIZE", tmp.ToString());
|
|
add_config_item(plist, "TCP_MEDIA_BINDING_CONFIG", "UDP_RX_BUFFER_SIZE", UDPreceiveBufferSize.ToString());
|
|
add_config_item(plist, "TCP_MEDIA_BINDING_CONFIG", "TCP_TX_BUFFER_SIZE", TCPtransmitBufferSize.ToString());
|
|
add_config_item(plist, "TCP_MEDIA_BINDING_CONFIG", "TCP_RX_BUFFER_SIZE", TCPreceiveBufferSize.ToString());
|
|
add_config_item(plist, "TCP_MEDIA_BINDING_CONFIG", "PACKET_SIZE", maximumPacketSize.ToString());
|
|
|
|
tmp = 1;
|
|
add_config_item(plist, "TCP_MEDIA_BINDING_CONFIG", "TCP_SELECT_VALUE", tmp.ToString());
|
|
|
|
tmp = 1;
|
|
add_config_item(plist, "TCP_MEDIA_BINDING_CONFIG", "DISABLE_NAG_DELAY", tmp.ToString());
|
|
|
|
tmp = 1000;
|
|
add_config_item(plist, "TCP_MEDIA_BINDING_CONFIG", "TIMER_RATE", tmp.ToString());
|
|
|
|
tmp = 1;
|
|
add_config_item(plist, "TCP_MEDIA_BINDING_CONFIG", "CONNECT_KA_RATE", tmp.ToString());
|
|
|
|
tmp = 1;
|
|
add_config_item(plist, "TCP_MEDIA_BINDING_CONFIG", "", tmp.ToString());
|
|
|
|
tmp = 1;
|
|
add_config_item(plist, "TCP_MEDIA_BINDING_CONFIG", "RECV_KA_RATE", tmp.ToString());
|
|
|
|
tmp = 4096;
|
|
add_config_item(plist, "TCP_MEDIA_BINDING_CONFIG", "RECV_THREAD_STACK_SIZE", tmp.ToString());
|
|
|
|
tmp = 0; /*port_THREAD_MIDDLE_PRIORITY*/
|
|
add_config_item(plist, "TCP_MEDIA_BINDING_CONFIG", "RECV_THREAD_PRIORITY", tmp.ToString());
|
|
|
|
tmp = 0; /*OE_THREAD_NO_AFFINITY*/
|
|
add_config_item(plist, "TCP_MEDIA_BINDING_CONFIG", "RECV_THREAD_AFFINITY", tmp.ToString());
|
|
|
|
if (configure_tcp_media_binding_params(plist) != Status.SUCCESS)
|
|
{
|
|
delete_config_database(plist);
|
|
Marshal.FreeHGlobal(plist);
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
delete_config_database(plist);
|
|
Marshal.FreeHGlobal(plist);
|
|
Protocol = tcp_media_binding_configure(router);
|
|
if (Protocol == (IntPtr)Status.ERROR) // protocol API error returns -1
|
|
{
|
|
// if media binding start up fails, media binding shutdown is done
|
|
// inside coe framework
|
|
|
|
if (shutdown_coe_router(router) != Status.SUCCESS)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
if (OE_Initialization_Shutdown() != Status.SUCCESS)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
ProtocolName = "REMOTE";
|
|
ProtocolCmitName = "" + new string(serverAddress) + ": " + port.ToString();
|
|
|
|
if (OE_Router_Register_Protocol(router, Protocol, 0x02) != Status.SUCCESS)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
return Status.SUCCESS;
|
|
}
|
|
|
|
public Status tcp_media_binding_configure(Dictionary<string, List<KeyValuePair<string, string>>> options, ILogger logger = null)
|
|
{
|
|
IntPtr plist = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(PARSE_DATA_SECTION)));
|
|
|
|
Status status;
|
|
|
|
if ((status = Configure(10000)) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"Unable to run OE_Initialization_Configure, status {status}");
|
|
return status;
|
|
}
|
|
|
|
ZeroMemory(plist, Marshal.SizeOf(typeof(PARSE_DATA_SECTION)));
|
|
|
|
foreach (KeyValuePair<string, List<KeyValuePair<string, string>>> s in options)
|
|
{
|
|
foreach (KeyValuePair<string, string> v in s.Value)
|
|
{
|
|
add_config_item(plist, s.Key, v.Key, v.Value);
|
|
}
|
|
}
|
|
|
|
if ((status = configure_router_params(plist)) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"Unable to configure router params, status {status}");
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
if ((status = configure_database_params(plist)) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"Unable to configure database params, status {status}");
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
router = initialize_coe_router();
|
|
if (router == (IntPtr)Status.ERROR)
|
|
{
|
|
logger?.Error("Unable to initialize coe router");
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
Database = get_coe_router_database(router);
|
|
if (Database == (IntPtr)Status.ERROR)
|
|
{
|
|
logger?.Error("Unable to get coe router database");
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
if ((status = configure_tcp_media_binding_params(plist)) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"Unable to configure TCP media binding params, status {status}");
|
|
|
|
delete_config_database(plist);
|
|
Marshal.FreeHGlobal(plist);
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
try
|
|
{
|
|
delete_config_database(plist);
|
|
Marshal.FreeHGlobal(plist);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
logger?.Error(ex, $"Unable delete_config_database and FreeHGlobal");
|
|
}
|
|
|
|
Protocol = tcp_media_binding_configure(router);
|
|
if (Protocol == (IntPtr)Status.ERROR) // protocol API error returns -1
|
|
{
|
|
logger?.Error("Unable to configure TCP media binding");
|
|
|
|
// if media binding start up fails, media binding shutdown is done
|
|
// inside coe framework
|
|
if ((status = shutdown_coe_router(router)) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"Unable shutdown coe router, status {status}");
|
|
}
|
|
|
|
if ((status = OE_Initialization_Shutdown()) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"OE_Initialization_Shutdown error, status {status}");
|
|
}
|
|
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
var tcpParams = options["TCP_MEDIA_BINDING_CONFIG"];
|
|
var serverAddress = tcpParams.FirstOrDefault(l => l.Key == "SERVER_ADDRESS").Value;
|
|
var port = tcpParams.FirstOrDefault(l => l.Key == "LOCAL_PORT").Value;
|
|
|
|
ProtocolName = "REMOTE";
|
|
ProtocolCmitName = $"{serverAddress}: {port}";
|
|
|
|
if ((status = OE_Router_Register_Protocol(router, Protocol, 0x02)) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"Unable to register TCP router protocol, status {status}");
|
|
|
|
// if media binding start up fails, media binding shutdown is done
|
|
// inside coe framework
|
|
if ((status = shutdown_coe_router(router)) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"Unable shutdown coe router, status {status}");
|
|
}
|
|
|
|
if ((status = OE_Initialization_Shutdown()) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"OE_Initialization_Shutdown error, status {status}");
|
|
}
|
|
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
return Status.SUCCESS;
|
|
}
|
|
|
|
public Status TCP_media_binding_shutdown(ILogger logger = null)
|
|
{
|
|
Status status;
|
|
if ((status = OE_Router_Deregister_Protocol(router, Protocol)) != Status.SUCCESS)
|
|
logger?.Error($"TCP OE_Router_Deregister_Protocol error, status {status}");
|
|
|
|
if ((status = tcp_media_binding_shutdown()) != Status.SUCCESS)
|
|
logger?.Error($"TCP tcp_media_binding_shutdown error, status {status}");
|
|
|
|
if ((status = shutdown_coe_router(router)) != Status.SUCCESS)
|
|
logger?.Error($"TCP shutdown_coe_router error, status {status}");
|
|
|
|
if ((status = OE_Initialization_Shutdown()) != Status.SUCCESS)
|
|
logger?.Error($"TCP OE_Initialization_Shutdown error, status {status}");
|
|
|
|
return status;
|
|
}
|
|
|
|
|
|
public Status udp_media_binding_configure(Dictionary<string, List<KeyValuePair<string, string>>> options, ILogger logger = null)
|
|
{
|
|
IntPtr plist = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(PARSE_DATA_SECTION)));
|
|
|
|
Status status;
|
|
|
|
if ((status = Configure(10000)) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"Unable to run OE_Initialization_Configure, status {status}");
|
|
return status;
|
|
}
|
|
|
|
ZeroMemory(plist, Marshal.SizeOf(typeof(PARSE_DATA_SECTION)));
|
|
|
|
foreach (KeyValuePair<string, List<KeyValuePair<string, string>>> s in options)
|
|
{
|
|
foreach (KeyValuePair<string, string> v in s.Value)
|
|
{
|
|
add_config_item(plist, s.Key, v.Key, v.Value);
|
|
}
|
|
}
|
|
|
|
if ((status = configure_router_params(plist)) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"Unable to configure router params, status {status}");
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
if ((status = configure_database_params(plist)) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"Unable to configure database params, status {status}");
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
router = initialize_coe_router();
|
|
if (router == (IntPtr)Status.ERROR)
|
|
{
|
|
logger?.Error("Unable to initialize coe router");
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
Database = get_coe_router_database(router);
|
|
if (Database == (IntPtr)Status.ERROR)
|
|
{
|
|
logger?.Error("Unable to get coe router database");
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
if ((status = configure_udp_buffer_pools_params(plist)) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"Unable to configure udp buffer pools params, status {status}");
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
if ((status = configure_udp_router_protocol_params(plist)) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"Unable to configure udp router protocol params, status {status}");
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
if ((status = configure_udp_simple_registration_protocol_params(plist)) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"Unable to configure udp simple registration protocol params, status {status}");
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
if ((status = configure_udp_media_binding_params(plist)) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"Unable to configure UDP media binding params, status {status}");
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
try
|
|
{
|
|
delete_config_database(plist);
|
|
Marshal.FreeHGlobal(plist);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
logger?.Error(ex, $"Unable delete_config_database and FreeHGlobal");
|
|
}
|
|
|
|
Protocol = udp_media_binding_configure(router);
|
|
if (Protocol == (IntPtr)Status.ERROR) // protocol API error returns -1
|
|
{
|
|
logger?.Error("Unable to configure UDP media binding");
|
|
|
|
// if media binding start up fails, media binding shutdown is done
|
|
// inside coe framework
|
|
if ((status = shutdown_coe_router(router)) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"Unable shutdown coe router, status {status}");
|
|
}
|
|
|
|
if ((status = OE_Initialization_Shutdown()) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"OE_Initialization_Shutdown error, status {status}");
|
|
}
|
|
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
var udpParams = options["UDP_MEDIA_BINDING_CONFIG"];
|
|
var remote_address = udpParams.FirstOrDefault(l => l.Key == "REMOTE_IP_ADDRESS").Value;
|
|
var r_send_port = udpParams.FirstOrDefault(l => l.Key == "REMOTE_SEND_PORT").Value;
|
|
var r_recv_port = udpParams.FirstOrDefault(l => l.Key == "REMOTE_RECV_PORT").Value;
|
|
var local_address = udpParams.FirstOrDefault(l => l.Key == "LOCAL_IP_ADDRESS").Value;
|
|
var l_send_port = udpParams.FirstOrDefault(l => l.Key == "LOCAL_SEND_PORT").Value;
|
|
var l_recv_port = udpParams.FirstOrDefault(l => l.Key == "LOCAL_RECV_PORT").Value;
|
|
|
|
ProtocolName = $"{remote_address}:{r_send_port}:{r_recv_port}";
|
|
ProtocolCmitName = $"{local_address}:{l_send_port}:{l_recv_port}";
|
|
|
|
if ((status = OE_Router_Register_Protocol(router, Protocol, 0)) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"Unable to register UDP router protocol, status {status}");
|
|
|
|
// if media binding start up fails, media binding shutdown is done
|
|
// inside coe framework
|
|
if ((status = shutdown_coe_router(router)) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"Unable shutdown coe router, status {status}");
|
|
}
|
|
|
|
if ((status = OE_Initialization_Shutdown()) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"OE_Initialization_Shutdown error, status {status}");
|
|
}
|
|
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
return Status.SUCCESS;
|
|
}
|
|
|
|
public Status udp_media_binding_configure(
|
|
char[] local_address,
|
|
char[] remote_address,
|
|
uint l_send_port,
|
|
uint l_recv_port,
|
|
uint r_send_port,
|
|
uint r_recv_port,
|
|
uint recv_timeout,
|
|
Dictionary<string, List<KeyValuePair<string, string>>> options)
|
|
{
|
|
IntPtr plist = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(PARSE_DATA_SECTION)));
|
|
|
|
if (Configure(10000) != Status.SUCCESS)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
ZeroMemory(plist, Marshal.SizeOf(typeof(PARSE_DATA_SECTION)));
|
|
|
|
foreach (KeyValuePair<string, List<KeyValuePair<string, string>>> s in options)
|
|
{
|
|
foreach (KeyValuePair<string, string> v in s.Value)
|
|
{
|
|
add_config_item(plist, s.Key, v.Key, v.Value);
|
|
}
|
|
}
|
|
|
|
if (configure_router_params(plist) != Status.SUCCESS)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
if (configure_database_params(plist) != Status.SUCCESS)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
router = initialize_coe_router();
|
|
if (router == (IntPtr)Status.ERROR)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
Database = get_coe_router_database(router);
|
|
if (Database == (IntPtr)Status.ERROR)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
add_config_item(plist, "UDP_MEDIA_BINDING_CONFIG", "LOCAL_IP_ADDRESS", new string(local_address));
|
|
add_config_item(plist, "UDP_MEDIA_BINDING_CONFIG", "REMOTE_IP_ADDRESS", new string(remote_address));
|
|
add_config_item(plist, "UDP_MEDIA_BINDING_CONFIG", "LOCAL_SEND_PORT", l_send_port.ToString());
|
|
add_config_item(plist, "UDP_MEDIA_BINDING_CONFIG", "LOCAL_RECV_PORT", l_recv_port.ToString());
|
|
add_config_item(plist, "UDP_MEDIA_BINDING_CONFIG", "REMOTE_SEND_PORT", r_send_port.ToString());
|
|
add_config_item(plist, "UDP_MEDIA_BINDING_CONFIG", "REMOTE_RECV_PORT", r_recv_port.ToString());
|
|
add_config_item(plist, "UDP_MEDIA_BINDING_CONFIG", "RECV_TIMEOUT", recv_timeout.ToString());
|
|
|
|
configure_udp_buffer_pools_params(plist);
|
|
|
|
if (configure_udp_router_protocol_params(plist) != Status.SUCCESS)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
if (configure_udp_simple_registration_protocol_params(plist) != Status.SUCCESS)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
if (configure_udp_media_binding_params(plist) != Status.SUCCESS)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
delete_config_database(plist);
|
|
Marshal.FreeHGlobal(plist);
|
|
Protocol = udp_media_binding_configure(router);
|
|
if (Protocol == (IntPtr)Status.ERROR) // protocol API error returns -1
|
|
{
|
|
// if media binding start up fails, media binding shutdown is done
|
|
// inside coe framework
|
|
|
|
if (shutdown_coe_router(router) != Status.SUCCESS)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
if (OE_Initialization_Shutdown() != Status.SUCCESS)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
ProtocolName = "" + new string(remote_address) + ": " + r_send_port.ToString() + ":" + r_recv_port.ToString();
|
|
ProtocolCmitName = "" + new string(local_address) + ": " + l_send_port.ToString() + ":" + l_recv_port.ToString();
|
|
|
|
if (OE_Router_Register_Protocol(router, Protocol, 0) != Status.SUCCESS)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
return Status.SUCCESS;
|
|
}
|
|
|
|
public Status UDP_media_binding_shutdown(ILogger logger = null)
|
|
{
|
|
Status status;
|
|
|
|
if ((status = OE_Router_Deregister_Protocol(router, Protocol)) != Status.SUCCESS)
|
|
logger?.Error($"UDP OE_Router_Deregister_Protocol error, status {status}");
|
|
|
|
if ((status = udp_media_binding_shutdown()) != Status.SUCCESS)
|
|
logger?.Error($"UDP udp_media_binding_shutdown error, status {status}");
|
|
|
|
if ((status = shutdown_coe_router(router)) != Status.SUCCESS)
|
|
logger?.Error($"UDP shutdown_coe_router error, status {status}");
|
|
|
|
if ((status = OE_Initialization_Shutdown()) != Status.SUCCESS)
|
|
logger?.Error($"UDP OE_Initialization_Shutdown error, status {status}");
|
|
|
|
return Status.SUCCESS;
|
|
}
|
|
|
|
public Status serial_media_binding_configure(Dictionary<string, List<KeyValuePair<string, string>>> options, ILogger logger = null)
|
|
{
|
|
IntPtr plist = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(PARSE_DATA_SECTION)));
|
|
|
|
Status status;
|
|
|
|
if ((status = Configure(10000)) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"Unable to run OE_Initialization_Configure, status {status}");
|
|
return status;
|
|
}
|
|
|
|
ZeroMemory(plist, Marshal.SizeOf(typeof(PARSE_DATA_SECTION)));
|
|
|
|
foreach (KeyValuePair<string, List<KeyValuePair<string, string>>> s in options)
|
|
{
|
|
foreach (KeyValuePair<string, string> v in s.Value)
|
|
{
|
|
add_config_item(plist, s.Key, v.Key, v.Value);
|
|
}
|
|
}
|
|
|
|
if ((status = configure_router_params(plist)) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"Unable to configure router params, status {status}");
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
if ((status = configure_database_params(plist)) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"Unable to configure database params, status {status}");
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
router = initialize_coe_router();
|
|
if (router == (IntPtr)Status.ERROR)
|
|
{
|
|
logger?.Error("Unable to initialize coe router");
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
Database = get_coe_router_database(router);
|
|
if (Database == (IntPtr)Status.ERROR)
|
|
{
|
|
logger?.Error("Unable to get coe router database");
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
if ((status = configure_serial_media_binding_params(plist)) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"Unable to configure serial media binding params, status {status}");
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
try
|
|
{
|
|
delete_config_database(plist);
|
|
Marshal.FreeHGlobal(plist);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
logger?.Error(ex, $"Unable delete_config_database and FreeHGlobal");
|
|
}
|
|
|
|
Protocol = serial_media_binding_configure(router);
|
|
if (Protocol == (IntPtr)Status.ERROR)
|
|
{
|
|
logger?.Error("Unable to configure serial media binding");
|
|
|
|
// if media binding start up fails, media binding shutdown is done
|
|
// inside coe framework
|
|
if ((status = shutdown_coe_router(router)) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"Unable shutdown coe router, status {status}");
|
|
}
|
|
|
|
if ((status = OE_Initialization_Shutdown()) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"OE_Initialization_Shutdown error, status {status}");
|
|
}
|
|
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
var serialParams = options["SERIAL_MEDIA_BINDING_CONFIG"];
|
|
var port = serialParams.FirstOrDefault(l => l.Key == "DEVICE_NAME").Value;
|
|
|
|
ProtocolName = "REMOTE";
|
|
ProtocolCmitName = $"CMIT: {port}";
|
|
|
|
if ((status = OE_Router_Register_Protocol(router, Protocol, 0)) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"Unable to register router protocol, status {status}");
|
|
|
|
// if media binding start up fails, media binding shutdown is done
|
|
// inside coe framework
|
|
if ((status = shutdown_coe_router(router)) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"Unable shutdown coe router, status {status}");
|
|
}
|
|
|
|
if ((status = OE_Initialization_Shutdown()) != Status.SUCCESS)
|
|
{
|
|
logger?.Error($"OE_Initialization_Shutdown error, status {status}");
|
|
}
|
|
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
return Status.SUCCESS;
|
|
}
|
|
|
|
public Status serial_media_binding_configure(char[] port,
|
|
uint baudrate,
|
|
uint databits,
|
|
uint stopbits,
|
|
uint parity,
|
|
uint flowcontrol,
|
|
uint recv_timeout,
|
|
Dictionary<string, List<KeyValuePair<string, string>>> options)
|
|
{
|
|
IntPtr plist = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(PARSE_DATA_SECTION)));
|
|
|
|
if (Configure(10000) != Status.SUCCESS)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
ZeroMemory(plist, Marshal.SizeOf(typeof(PARSE_DATA_SECTION)));
|
|
|
|
foreach (KeyValuePair<string, List<KeyValuePair<string, string>>> s in options)
|
|
{
|
|
foreach (KeyValuePair<string, string> v in s.Value)
|
|
{
|
|
add_config_item(plist, s.Key, v.Key, v.Value);
|
|
}
|
|
}
|
|
|
|
if (configure_router_params(plist) != Status.SUCCESS)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
if (configure_database_params(plist) != Status.SUCCESS)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
router = initialize_coe_router();
|
|
if (router == (IntPtr)Status.ERROR)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
Database = get_coe_router_database(router);
|
|
if (Database == (IntPtr)Status.ERROR)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
add_config_item(plist, "SERIAL_MEDIA_BINDING_CONFIG", "DEVICE_NAME", port.ToString());
|
|
add_config_item(plist, "SERIAL_MEDIA_BINDING_CONFIG", "BAUD_RATE", baudrate.ToString());
|
|
add_config_item(plist, "SERIAL_MEDIA_BINDING_CONFIG", "DATA_BITS", databits.ToString());
|
|
add_config_item(plist, "SERIAL_MEDIA_BINDING_CONFIG", "STOP_BITS", stopbits.ToString());
|
|
add_config_item(plist, "SERIAL_MEDIA_BINDING_CONFIG", "PARITY", parity.ToString());
|
|
add_config_item(plist, "SERIAL_MEDIA_BINDING_CONFIG", "FLOW_CONTROL", flowcontrol.ToString());
|
|
add_config_item(plist, "SERIAL_MEDIA_BINDING_CONFIG", "RECV_PROCESSING_DELAY", recv_timeout.ToString());
|
|
|
|
if (configure_serial_media_binding_params(plist) != Status.SUCCESS)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
delete_config_database(plist);
|
|
Marshal.FreeHGlobal(plist);
|
|
Protocol = serial_media_binding_configure(router);
|
|
if (Protocol == (IntPtr)Status.ERROR)
|
|
{
|
|
// if media binding start up fails, media binding shutdown is done
|
|
// inside coe framework
|
|
|
|
if (shutdown_coe_router(router) != Status.SUCCESS)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
if (OE_Initialization_Shutdown() != Status.SUCCESS)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
}
|
|
|
|
ProtocolName = "REMOTE";
|
|
ProtocolCmitName = "CMIT: " + new string(port);
|
|
|
|
if (OE_Router_Register_Protocol(router, Protocol, 0) != Status.SUCCESS)
|
|
return Status.FAILED_INTERNAL_ERROR;
|
|
|
|
return Status.SUCCESS;
|
|
}
|
|
|
|
public Status SERIAL_media_binding_shutdown(ILogger logger = null)
|
|
{
|
|
Status status;
|
|
if ((status = OE_Router_Deregister_Protocol(router, Protocol)) != Status.SUCCESS)
|
|
logger?.Error($"Serial OE_Router_Deregister_Protocol error, status {status}");
|
|
|
|
if ((status = serial_media_binding_shutdown()) != Status.SUCCESS)
|
|
logger?.Error($"Serial serial_media_binding_shutdown error, status {status}");
|
|
|
|
if ((status = shutdown_coe_router(router)) != Status.SUCCESS)
|
|
logger?.Error($"Serial shutdown_coe_router error, status {status}");
|
|
|
|
if ((status = OE_Initialization_Shutdown()) != Status.SUCCESS)
|
|
logger?.Error($"Serial OE_Initialization_Shutdown error, status {status}");
|
|
|
|
return status;
|
|
}
|
|
|
|
struct AddressParametersStructure
|
|
{
|
|
internal uint mediaAddress;
|
|
internal IntPtr bufferAddress;
|
|
internal uint bufferSize;
|
|
}
|
|
|
|
public static string DiagnosticMediaAddressToString(uint stackID,
|
|
uint mediaAddress)
|
|
{
|
|
if (mediaAddress == 0xFFFFFFFF)
|
|
{
|
|
string IPString = "ALL";
|
|
return IPString;
|
|
}
|
|
else
|
|
{
|
|
IntPtr bufferPointer = Marshal.AllocHGlobal(32);
|
|
AddressParametersStructure parameters;
|
|
parameters.mediaAddress = mediaAddress;
|
|
parameters.bufferSize = 32;
|
|
parameters.bufferAddress = bufferPointer;
|
|
IntPtr parametersPointer = Marshal.AllocHGlobal(Marshal.SizeOf(parameters));
|
|
|
|
Marshal.StructureToPtr(parameters, parametersPointer, false);
|
|
OE_Router_Protocol_Extended_Routine(OE_Initialization_Get_Media_Binding(stackID), 0, parametersPointer);
|
|
string IPstring = Marshal.PtrToStringAnsi(bufferPointer);
|
|
|
|
Marshal.FreeHGlobal(parametersPointer);
|
|
Marshal.FreeHGlobal(bufferPointer);
|
|
return IPstring;
|
|
}
|
|
}
|
|
struct ConnectionsParametersStructure
|
|
{
|
|
internal int numberOfBuffers;
|
|
internal IntPtr bufferAddress;
|
|
internal int bufferSize;
|
|
}
|
|
|
|
public static int DiagnosticConnections(uint stackID,
|
|
string[] results)
|
|
{
|
|
IntPtr bufferPointer = Marshal.AllocHGlobal(results.Length * 32);
|
|
ConnectionsParametersStructure parameters;
|
|
parameters.numberOfBuffers = results.Length;
|
|
parameters.bufferSize = 32;
|
|
parameters.bufferAddress = bufferPointer;
|
|
IntPtr parametersPointer = Marshal.AllocHGlobal(Marshal.SizeOf(parameters));
|
|
|
|
Marshal.StructureToPtr(parameters, parametersPointer, false);
|
|
IntPtr mediaBinding = OE_Initialization_Get_Media_Binding(stackID);
|
|
OE_Router_Protocol_Extended_Routine(mediaBinding, 1, parametersPointer);
|
|
ConnectionsParametersStructure returnValues;
|
|
returnValues = (ConnectionsParametersStructure)Marshal.PtrToStructure(parametersPointer, typeof(ConnectionsParametersStructure));
|
|
for (int index = 0; index < returnValues.numberOfBuffers; index++)
|
|
{
|
|
results[index] = Marshal.PtrToStringAnsi(new IntPtr((bufferPointer.ToInt64() + (index * 32))));
|
|
}
|
|
|
|
Marshal.FreeHGlobal(parametersPointer);
|
|
Marshal.FreeHGlobal(bufferPointer);
|
|
return returnValues.numberOfBuffers;
|
|
}
|
|
//
|
|
//
|
|
//
|
|
// Time Tagging
|
|
//
|
|
//
|
|
//
|
|
public enum TimeTaggingType { NONE, SYSTEM_TIMER_NANOSECONDS, SYSTEM_TIMER_FRACTIONS, LPT };
|
|
public static void setTimeTagging(TimeTaggingType tagType)
|
|
{
|
|
IntPtr routineAddress = IntPtr.Zero;
|
|
byte[] coeDllName = Encoding.ASCII.GetBytes(coeDLL + 'x');
|
|
coeDllName[coeDllName.Length - 1] = 0;
|
|
IntPtr dllHandle = GetModuleHandle(coeDllName);
|
|
switch (tagType)
|
|
{
|
|
case TimeTaggingType.NONE:
|
|
break;
|
|
case TimeTaggingType.SYSTEM_TIMER_NANOSECONDS:
|
|
{
|
|
byte[] coeRoutineName = Encoding.ASCII.GetBytes("OE_Clock_Handler_Get_System_Time" + 'x');
|
|
coeRoutineName[coeRoutineName.Length - 1] = 0;
|
|
routineAddress = GetProcAddress(dllHandle, coeRoutineName);
|
|
}
|
|
break;
|
|
case TimeTaggingType.SYSTEM_TIMER_FRACTIONS:
|
|
{
|
|
byte[] coeRoutineName = Encoding.ASCII.GetBytes("OE_Clock_Handler_Get_System_Time_With_Fractions" + 'x');
|
|
coeRoutineName[coeRoutineName.Length - 1] = 0;
|
|
routineAddress = GetProcAddress(dllHandle, coeRoutineName);
|
|
}
|
|
break;
|
|
case TimeTaggingType.LPT:
|
|
{
|
|
byte[] coeRoutineName = Encoding.ASCII.GetBytes("Precision_Time_Get_COE_MsgHdr_Timestamp" + 'x');
|
|
coeRoutineName[coeRoutineName.Length - 1] = 0;
|
|
routineAddress = GetProcAddress(dllHandle, coeRoutineName);
|
|
}
|
|
break;
|
|
}
|
|
OE_Set_Timestamp_Function(routineAddress);
|
|
}
|
|
}
|
|
}
|