#define LOOPBACK
using System;
using static MAXT.MXFoundation.mxf;
using System.Runtime.InteropServices;
using System.Text;
namespace multi_example
{
class write_read_async
{
const int MAX_TX_RECORDS_TO_TRANSMIT = 8;
const int MAX_TX_SUBFRAMES_TO_TRANSMIT = 4;
public struct ASYNC_CALLBACK_INFO
{
public UInt64 server;
public IntPtr HostBufferHDLC;
public IntPtr HostBufferA717;
public UInt64 protocol;
public UInt32 processed;
public UInt32 rc;
}
static void Main(string[] args)
{
UInt32 rc;
UInt64 server = 0;
UInt64 rxChannelHDLC = 0;
UInt64 rxChannelA717 = 0;
UInt64 txChannelHDLC = 0;
UInt64 txChannelA717 = 0;
UInt64 rxBufferHDLC = 0;
UInt64 txBufferHDLC = 0;
UInt64 rxBufferA717 = 0;
UInt64 txBufferA717 = 0;
recHDLC.
data =
new UInt16[2048];
recA717.
data =
new UInt16[8192];
IntPtr recPtr = IntPtr.Zero;
UInt64 txBufferSize = 0;
UInt64 rxBufferSize = 0;
IntPtr rxHostBufferHDLC = IntPtr.Zero;
IntPtr txHostBufferHDLC = IntPtr.Zero;
IntPtr rxHostBufferA717 = IntPtr.Zero;
IntPtr txHostBufferA717 = IntPtr.Zero;
UInt64 rxAcqStatus = 0;
UInt64 msgCount = 0;
UInt64 byteCount = 0;
UInt64 data, word, subframeSize;
UInt64 freebytes;
ASYNC_CALLBACK_INFO asyncInfoHDLC = new ASYNC_CALLBACK_INFO();
asyncInfoHDLC.HostBufferA717 = IntPtr.Zero;
asyncInfoHDLC.HostBufferHDLC = IntPtr.Zero;
asyncInfoHDLC.processed = 0;
asyncInfoHDLC.protocol = 0;
asyncInfoHDLC.rc = 0;
asyncInfoHDLC.server = 0;
ASYNC_CALLBACK_INFO asyncInfoA717 = new ASYNC_CALLBACK_INFO();
asyncInfoA717.HostBufferA717 = IntPtr.Zero;
asyncInfoA717.HostBufferHDLC = IntPtr.Zero;
asyncInfoA717.processed = 0;
asyncInfoA717.protocol = 0;
asyncInfoA717.rc = 0;
asyncInfoA717.server = 0;
IntPtr asyncInfoHDLCPtr = IntPtr.Zero;
IntPtr asyncInfo717Ptr = IntPtr.Zero;
#if LOCAL
#else
#endif
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
{
Console.Write("Starting ...\n");
}
if (rc == MAXT_SUCCESS)
rc =
mxfChannelGet(server, MXF_CLASS_HDLC, MXF_SCLASS_RX_CHANNEL, MXF_MODULE_MULTI_EH, 0, out rxChannelHDLC);
if (rc == MAXT_SUCCESS)
rc =
mxfChannelGet(server, MXF_CLASS_HDLC, MXF_SCLASS_TX_CHANNEL, MXF_MODULE_MULTI_EH, 0, out txChannelHDLC);
if (rc == MAXT_SUCCESS)
rc =
mxfChannelGet(server, MXF_CLASS_A717, MXF_SCLASS_RX_CHANNEL, MXF_MODULE_MULTI_EH, 0, out rxChannelA717);
if (rc == MAXT_SUCCESS)
rc =
mxfChannelGet(server, MXF_CLASS_A717, MXF_SCLASS_TX_CHANNEL, MXF_MODULE_MULTI_EH, 0, out txChannelA717);
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
subframeSize = 128;
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
rc =
mxfAttributeUint64Set(rxChannelA717, KMXF_A717_BIT_ENCODING, VMXF_A717_BIT_ENCODING_HARVARDBIPHASE);
if (rc == MAXT_SUCCESS)
rc =
mxfAttributeUint64Set(txChannelA717, KMXF_A717_BIT_ENCODING, VMXF_A717_BIT_ENCODING_HARVARDBIPHASE);
if (rc == MAXT_SUCCESS)
rc =
mxfAttributeUint64Set(rxChannelA717, KMXF_A717_ELECTRICAL_SELECTION, VMXF_A717_ELECTRICAL_SELECT_DEFAULT);
if (rc == MAXT_SUCCESS)
rc =
mxfAttributeUint64Set(txChannelA717, KMXF_A717_ELECTRICAL_SELECTION, VMXF_A717_ELECTRICAL_SELECT_DEFAULT);
# if LOOPBACK
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
#endif
if (rc == MAXT_SUCCESS)
{
txBufferSize = 40 * 1024;
if (rc == MAXT_SUCCESS)
{
try
{
txHostBufferHDLC = Marshal.AllocHGlobal((int)txBufferSize);
}
catch (OutOfMemoryException)
{
rc = MAXT_ERROR_MEM;
}
}
}
if (rc == MAXT_SUCCESS)
{
rxBufferSize = 40 * 1024;
if (rc == MAXT_SUCCESS)
{
try
{
rxHostBufferHDLC = Marshal.AllocHGlobal((int)rxBufferSize);
}
catch (OutOfMemoryException)
{
rc = MAXT_ERROR_MEM;
}
}
}
try
{
asyncInfoHDLCPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(ASYNC_CALLBACK_INFO)));
asyncInfo717Ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(ASYNC_CALLBACK_INFO)));
}
catch (OutOfMemoryException)
{
rc = MAXT_ERROR_MEM;
}
asyncInfoHDLC.HostBufferHDLC = rxHostBufferHDLC;
asyncInfoHDLC.protocol = 0;
asyncInfoHDLC.processed = 0;
asyncInfoHDLC.rc = 0;
if (rc == MAXT_SUCCESS)
{
txBufferSize = 2*MAX_TX_SUBFRAMES_TO_TRANSMIT * (UInt64)Marshal.SizeOf(typeof(
MXF_A717_DATAREC));
if (rc == MAXT_SUCCESS)
{
try
{
txHostBufferA717 = Marshal.AllocHGlobal((int)txBufferSize);
}
catch (OutOfMemoryException)
{
rc = MAXT_ERROR_MEM;
}
}
}
if (rc == MAXT_SUCCESS)
{
rxBufferSize = 2*MAX_TX_SUBFRAMES_TO_TRANSMIT * (UInt64)Marshal.SizeOf(typeof(
MXF_A717_DATAREC));
if (rc == MAXT_SUCCESS)
{
try
{
rxHostBufferA717 = Marshal.AllocHGlobal((int)rxBufferSize);
}
catch (OutOfMemoryException)
{
rc = MAXT_ERROR_MEM;
}
}
}
asyncInfoA717.HostBufferA717 = rxHostBufferA717;
asyncInfoA717.protocol = 1;
asyncInfoA717.processed = 0;
asyncInfoA717.rc = 0;
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
{
recPtr = txHostBufferHDLC;
for (data = 0; data < MAX_TX_RECORDS_TO_TRANSMIT; data++)
{
for (word = 0; word < recHDLC.
dataSize / 2; word++)
{
recHDLC.
data[word] = (UInt16)(0x0101 * data);
}
Marshal.StructureToPtr(recHDLC, recPtr, true);
}
}
Marshal.StructureToPtr(asyncInfoHDLC, asyncInfoHDLCPtr, true);
if (rc == MAXT_SUCCESS)
rc =
mxfTxAperiodicWriteAsync(txBufferHDLC, MXF_TXAPERIODIC_FLAG_DEFAULT, 0, MAX_TX_RECORDS_TO_TRANSMIT, txHostBufferHDLC, writeCompletion, asyncInfoHDLCPtr);
if (rc == MAXT_SUCCESS)
{
recPtr = txHostBufferA717;
for (data = 0; data < MAX_TX_SUBFRAMES_TO_TRANSMIT; data++)
{
recA717.
dataSize = 2 * (UInt32)subframeSize;
for (word = 0; word < subframeSize; word++)
{
if (word == 0)
{
switch (data % 4)
{
case 0:
recA717.
data[word] = 0x247;
break;
case 1:
recA717.
data[word] = 0x5B8;
break;
case 2:
recA717.
data[word] = 0xA47;
break;
case 3:
recA717.
data[word] = 0xDB8;
break;
default:
break;
}
}
else
recA717.
data[word] = (UInt16)(0x11 * word);
}
Marshal.StructureToPtr(recA717, recPtr, true);
}
}
Marshal.StructureToPtr(asyncInfoA717, asyncInfo717Ptr, true);
if (rc == MAXT_SUCCESS)
rc =
mxfTxAperiodicWriteAsync(txBufferA717, MXF_TXAPERIODIC_FLAG_DEFAULT, 0, MAX_TX_SUBFRAMES_TO_TRANSMIT, txHostBufferA717, writeCompletion, asyncInfo717Ptr);
if (rc == MAXT_SUCCESS)
{
do
{
asyncInfoHDLC = (ASYNC_CALLBACK_INFO)Marshal.PtrToStructure(asyncInfoHDLCPtr, typeof(ASYNC_CALLBACK_INFO));
asyncInfoA717 = (ASYNC_CALLBACK_INFO)Marshal.PtrToStructure(asyncInfo717Ptr, typeof(ASYNC_CALLBACK_INFO));
} while (asyncInfoHDLC.processed == 0 || asyncInfoA717.processed == 0);
if (asyncInfoHDLC.rc > 0)
rc = asyncInfoHDLC.rc;
else if (asyncInfoA717.rc > 0)
rc = asyncInfoA717.rc;
if (rc == MAXT_SUCCESS)
{
UInt64 msgCountA717 = 0;
do
{
if (rc == MAXT_SUCCESS)
} while (rc == MAXT_SUCCESS && ((msgCount != MAX_TX_RECORDS_TO_TRANSMIT) || (msgCountA717 != MAX_TX_SUBFRAMES_TO_TRANSMIT)));
}
}
if (rc == MAXT_SUCCESS)
{
Console.Write("Receiving ...\n\n");
asyncInfoHDLC = (ASYNC_CALLBACK_INFO)Marshal.PtrToStructure(asyncInfoHDLCPtr, typeof(ASYNC_CALLBACK_INFO));
asyncInfoHDLC.processed = 0;
Marshal.StructureToPtr(asyncInfoHDLC, asyncInfoHDLCPtr, false);
rc =
mxfRxAcqReadAsync(rxBufferHDLC, 0, 40 * 1024, asyncInfoHDLC.HostBufferHDLC, readCompletion, asyncInfoHDLCPtr);
if (rc == MAXT_SUCCESS)
{
asyncInfoA717 = (ASYNC_CALLBACK_INFO)Marshal.PtrToStructure(asyncInfo717Ptr, typeof(ASYNC_CALLBACK_INFO));
asyncInfoA717.processed = 0;
Marshal.StructureToPtr(asyncInfoA717, asyncInfo717Ptr, false);
rc =
mxfRxAcqReadAsync(rxBufferA717, 0, 2 * MAX_TX_SUBFRAMES_TO_TRANSMIT * (UInt64)Marshal.SizeOf(typeof(
MXF_A717_DATAREC)), asyncInfoA717.HostBufferA717, readCompletion, asyncInfo717Ptr);
}
}
if (rc == MAXT_SUCCESS)
{
do
{
asyncInfoHDLC = (ASYNC_CALLBACK_INFO)Marshal.PtrToStructure(asyncInfoHDLCPtr, typeof(ASYNC_CALLBACK_INFO));
asyncInfoA717 = (ASYNC_CALLBACK_INFO)Marshal.PtrToStructure(asyncInfo717Ptr, typeof(ASYNC_CALLBACK_INFO));
} while (asyncInfoHDLC.processed == 0 || asyncInfoA717.processed == 0);
}
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (txHostBufferHDLC != IntPtr.Zero)
Marshal.FreeHGlobal(txHostBufferHDLC);
if (txHostBufferA717 != IntPtr.Zero)
Marshal.FreeHGlobal(txHostBufferA717);
if (rxHostBufferHDLC != IntPtr.Zero)
Marshal.FreeHGlobal(rxHostBufferHDLC);
if (rxHostBufferA717 != IntPtr.Zero)
Marshal.FreeHGlobal(rxHostBufferA717);
if (asyncInfo717Ptr != IntPtr.Zero)
Marshal.FreeHGlobal(asyncInfo717Ptr);
if (asyncInfoHDLCPtr != IntPtr.Zero)
Marshal.FreeHGlobal(asyncInfoHDLCPtr);
if (rc != MAXT_SUCCESS)
{
StringBuilder errorString = new StringBuilder(256);
Console.Write(errorString + "\n");
}
Console.Write("Terminating ...\n");
Console.Write("\nPress a key to terminate\n");
Console.ReadKey();
return;
}
public static UInt32 initHandler(UInt64 server, UInt64 deviceIndex, UInt64 moduleIndex, UInt64 channelIndex, UInt64 attrib, ref UInt64 value)
{
UInt64 device = 0;
UInt32 rc = 0;
UInt64 i = 0;
Int64 modulePosition = 999;
if (rc == MAXT_SUCCESS)
for (i = 0; i < info.moduleCount && rc == MAXT_SUCCESS; i++)
{
if (info.modules[i].type == MXF_MODULE_MULTI_EH)
{
modulePosition = info.modules[i].position;
break;
}
}
if (attrib == KMXF_CHANNEL_CLASS)
{
if ((deviceIndex == 0) && (moduleIndex == (UInt64)modulePosition) && ((channelIndex == 0) || (channelIndex == 8)))
{
value = MXF_CLASS_HDLC;
return Convert.ToUInt32(true);
}
else if ((deviceIndex == 0) && (moduleIndex == (UInt64)modulePosition) && ((channelIndex == 4) || (channelIndex == 12)))
{
value = MXF_CLASS_CLOCK;
return Convert.ToUInt32(true);
}
if ((deviceIndex == 0) && (moduleIndex == (UInt64)modulePosition) && ((channelIndex == 1) || (channelIndex == 9)))
{
value = MXF_CLASS_A717;
return Convert.ToUInt32(true);
}
}
return Convert.ToUInt32(false);
}
public static void writeCompletion(UInt64 bufferHandle, UInt32 result, IntPtr context, UInt64[] output)
{
ASYNC_CALLBACK_INFO info = new ASYNC_CALLBACK_INFO();
info = (ASYNC_CALLBACK_INFO)Marshal.PtrToStructure(context, typeof(ASYNC_CALLBACK_INFO));
if (result == 0)
{
if (info.protocol == 0)
{
Console.Write("{0} HDLC records have been successfully transmitted.\n\n", output[0]);
}
else
{
Console.Write("{0} ARINC 717 records have been successfully transmitted.\n\n", output[0]);
}
}
else
{
StringBuilder errorString = new StringBuilder(256);
Console.Write(errorString + " ERROR # 0x{1:X}", result.ToString());
Console.Write(errorString + "\n\r");
}
info.rc = result;
info.processed = 1;
Marshal.StructureToPtr(info, context, true);
}
public static void readCompletion(UInt64 bufferHandle, UInt32 result, IntPtr context, UInt64[] output)
{
ASYNC_CALLBACK_INFO info = new ASYNC_CALLBACK_INFO();
info = (ASYNC_CALLBACK_INFO)Marshal.PtrToStructure(context, typeof(ASYNC_CALLBACK_INFO));
if (result == 0)
{
if (info.protocol == 0)
{
Console.Write("HDLC string received count = {0} \n", output[1]);
DisplayDataArrayHDLC(output[1], info.HostBufferHDLC);
Console.Write("\n");
}
else
{
Console.Write("ARINC 717 string received count = {0} \n", output[1]);
DisplayDataArrayA717(output[1], info.HostBufferA717);
Console.Write("\n");
}
info.rc = result;
info.processed = 1;
Marshal.StructureToPtr(info, context, true);
}
else
{
StringBuilder errorString = new StringBuilder(256);
Console.Write(errorString + " ERROR # 0x{1:X}", result.ToString());
Console.Write(errorString + "\n\r");
}
}
public static void DisplayDataArrayHDLC(UInt64 recNum, IntPtr recPtr)
{
UInt64 iRec,
iData;
IntPtr tempPtr = recPtr;
Console.Write("\n");
for (iRec = 0; iRec < recNum; iRec++)
{
for (iData = 0; iData < rec.
dataSize / 2; iData++)
{
Console.Write(
"{0:x4} ", rec.
data[iData]);
if (((iData + 1) % 8)== 0 && (iData + 1 < rec.
dataSize / 2))
Console.Write("\n ");
}
Console.Write("\n");
}
}
public static void DisplayDataArrayA717(UInt64 recNum, IntPtr recPtr)
{
UInt64 iRec,
iData;
IntPtr tempPtr = recPtr;
Console.Write("\n");
for (iRec = 0; iRec < recNum; iRec++)
{
for (iData = 0; iData < (rec.
dataSize) / 2; iData++)
{
Console.Write(
"{0:x3}", rec.
data[iData]);
if ((((iData + 1) % 16) == 0) && (iData + 1 < rec.
dataSize))
Console.Write("\n ");
}
Console.Write("\n");
}
}
}
}