#define LOOPBACK
#define LOCAL
using System;
using static MAXT.MXFoundation.mxf;
using System.Runtime.InteropServices;
using System.Text;
namespace ar429_example
{
class ar429_buffer_threshold
{
private const int BUFFER_SIZE = 1 * 1024 * 1024;
private const int TXALMOSTFULL = 7;
private const int TXALMOSTEMPTY = 3;
private const int RXALMOSTFULL = 5;
private const int RXALMOSTEMPTY = 2;
private const int TX_MSG_LABEL = 5;
private const int TX_MSG_SDI = 0;
private static UInt64 data = 0;
private static UInt32 TXAsyncEvents = 0;
static void Main(string[] args)
{
UInt32 rc;
UInt64 server;
UInt64 device = 0;
UInt64 module = 0;
var rxChannel = new UInt64[1];
var txChannel = new UInt64[1];
UInt64 asyncEvent = 0;
UInt64 rxBuffer = 0;
var txBuffer = new UInt64[1];
UInt64 schedule = 0;
UInt64 msgSched;
UInt64 count;
UInt64 type = 0;
UInt64 options = 0;
IntPtr hostBuffer = IntPtr.Zero;
MXF_ASYNCEVENT_HANDLER _asyncEventHandler = asyncEventHandler;
#if (LOCAL)
#else
rc =
mxfServerConnect(
"192.168.0.1",
"admin",
"admin", Convert.ToUInt64(
false), out server);
#endif
if (rc != MAXT_SUCCESS)
{
Console.Write("Failed to connect; rc=0x{0:x8}", rc);
Console.Write("\nPress a key to terminate\n");
Console.Read();
return;
}
Console.Write("\nStarting\n");
if (rc == MAXT_SUCCESS)
rc =
mxfChannelAllGet(server, MXF_CLASS_A429, MXF_SCLASS_RX_CHANNEL, MXF_MODULE_ALL, 1, out count, rxChannel);
if ((rc == MAXT_SUCCESS) && (count != 0))
rc =
mxfChannelAllGet(server, MXF_CLASS_A429, MXF_SCLASS_TX_CHANNEL, MXF_MODULE_ALL, 1, out count, txChannel);
if ((rc == MAXT_SUCCESS) && (count == 0))
rc = MAXT_ERROR_NOT_FOUND;
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
{
if (type == MXF_MODULE_A429E)
{
if (rc == MAXT_SUCCESS)
}
else
{
if (rc == MAXT_SUCCESS)
}
}
if ((rc == MAXT_SUCCESS) && (type == MXF_MODULE_FLEX429))
{
if((rc == MAXT_SUCCESS) && ((options & VMXF_A429_MODULE_OPTIONS_BIDIRECTIONAL) == VMXF_A429_MODULE_OPTIONS_BIDIRECTIONAL))
}
#if (LOOPBACK)
if (rc == MAXT_SUCCESS)
#endif
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
{
try
{
hostBuffer = Marshal.AllocHGlobal(BUFFER_SIZE);
}
catch (OutOfMemoryException)
{
rc = MAXT_ERROR_MEM;
}
}
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
{
RXasyncEventInfo[0].condID = MXF_ASYNCEVENT_COND_RXACQ_BUFFER_THRESHOLD;
RXasyncEventInfo[0].condition.rxAcqBufferThreshold.buffer = rxBuffer;
RXasyncEventInfo[0].condition.rxAcqBufferThreshold.almostFull = RXALMOSTFULL;
RXasyncEventInfo[0].condition.rxAcqBufferThreshold.almostEmpty = RXALMOSTEMPTY;
}
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
Console.Write("Acquisition started\n\r");
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
{
TXasyncEventInfo[0].condID = MXF_ASYNCEVENT_COND_TXPERIODIC_UPDATEMSG_BUFFER_THRESHOLD;
TXasyncEventInfo[0].condition.txPeriodicUpdateMsgBufferThreshold.channel = txChannel[0];
TXasyncEventInfo[0].condition.txPeriodicUpdateMsgBufferThreshold.almostFull = TXALMOSTFULL;
TXasyncEventInfo[0].condition.txPeriodicUpdateMsgBufferThreshold.almostEmpty = TXALMOSTEMPTY;
}
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
{
Console.Write("Running periodic transmission...\n\r");
}
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc != MAXT_SUCCESS)
{
StringBuilder buffer = new StringBuilder(256);
{
buffer.Clear();
buffer.Append(string.Format("ERROR # 0x{0:x8}", rc));
}
Console.Write(buffer + "\n\r");
}
if (rxBuffer != 0)
if (txBuffer[0] != 0)
if (hostBuffer != IntPtr.Zero)
Marshal.FreeHGlobal(hostBuffer);
Console.Write("\nPress enter to terminate\n");
Console.Read();
return;
}
private static UInt32 asyncEventHandler(UInt64 asyncEvent, IntPtr context)
{
UInt64 maxCount = 64, pendingCount;
UInt32 rc;
for (UInt64 i = 0; (rc == MAXT_SUCCESS) && (i < pendingCount); i++)
{
switch (pendingList[i].condID)
{
case MXF_ASYNCEVENT_COND_TXPERIODIC_UPDATEMSG_BUFFER_THRESHOLD:
rc = updateMsgs(pendingList[i].condition.txPeriodicUpdateMsgBufferThreshold.buffer, context);
break;
case MXF_ASYNCEVENT_COND_RXACQ_BUFFER_THRESHOLD:
rc = readAcquisition(pendingList[i].condition.rxAcqBufferThreshold.buffer, context);
break;
default:
Console.Write("Unknown condID {0})", pendingList[i].condID);
break;
}
}
return rc;
}
private static UInt32 updateMsgs(UInt64 buffer, IntPtr hostBuffer)
{
UInt32 rc = 0;
UInt32 i;
IntPtr recPtr = hostBuffer;
UInt64 label, sdi, ssm, parity;
for (i = 0; (rc == MAXT_SUCCESS) && (i < TXALMOSTFULL); i++)
{
rec.
control = (i != 0) ? 0 : MXF_A429_TX_REC_CTRL_PARITY_ERROR;
label = TX_MSG_LABEL;
sdi = TX_MSG_SDI;
data++;
ssm = 0;
parity = VMXF_A429_PARITY_ODD;
if (rc == MAXT_SUCCESS)
{
Marshal.StructureToPtr(rec, recPtr, false);
}
}
if (rc == MAXT_SUCCESS)
if (rc != MAXT_SUCCESS)
Console.Write("\nPeriodic Update failed; rc=0x{0:x8}\n", rc);
else
Console.Write("\nAsync Event {0} - Writing {1} records\n", ++TXAsyncEvents, i);
return rc;
}
private static UInt32 readAcquisition(UInt64 buffer, IntPtr hostBuffer)
{
IntPtr recPtr = hostBuffer;
UInt64 status, msgsCount, bytesCount;
UInt64 label, sdi, data, ssm, parity;
UInt64 j;
UInt32 rc;
rc =
mxfA429RxAcqRead(buffer, 0, BUFFER_SIZE, out status, out msgsCount, out bytesCount, hostBuffer);
if (rc == MAXT_SUCCESS)
{
Console.Write("Read {0} messages\n\r", msgsCount);
for (j = 0; (rc == MAXT_SUCCESS) && (j < msgsCount); j++)
{
if (rc == MAXT_SUCCESS)
{
Console.Write(
"{0:D2}: Timetag {1}", j, rec.
timeTag);
Console.Write(
" - Control : {0} ", (rec.
control == MXF_A429_RX_REC_CTRL_PARITY_ERROR) ?
"PARITY ERROR" :
"NO ERROR");
Console.Write("- ARINC word=[{0},{1},{2:x5},{3},{4}]\n", Convert.ToString((int)label, 8).PadLeft(3, '0'), sdi, data, ssm, (parity == VMXF_A429_PARITY_ODD) ? "ODD" : "EVEN");
}
}
}
if (rc != MAXT_SUCCESS)
Console.Write("Acquisition read failed; rc=0x{0:x8}\n", rc);
return rc;
}
}
}