using System;
using static MAXT.MXFoundation.mxf;
using System.Runtime.InteropServices;
using System.Text;
namespace ar429_example
{
class ar429_rx_acquisition_trigger
{
const int BUFFER_SIZE = 1 * 1024 * 1024;
const int LABEL = 7;
const int SDI = 0;
static void Main(string[] args)
{
UInt32 rc;
UInt64 server;
UInt64 device = 0;
var module = new UInt64[1];
UInt64 count = 0;
UInt64 rxChannel = 0, txChannel = 0;
UInt64 rxBuffer = 0;
UInt64 txBuffer = 0;
IntPtr rec429 = IntPtr.Zero;
UInt64 dev, mod, port;
UInt64 condList = 0;
#if LOCAL
#else
#endif
if (rc != MAXT_SUCCESS)
{
Console.Write("Failed to connect; rc=0x{0:x8}", rc);
Console.Write("\nPress a key to terminate\n");
Console.ReadKey();
return;
}
Console.Write("\nStarting\n");
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
rc =
mxfChannelGet(server, MXF_CLASS_A429, MXF_SCLASS_RX_CHANNEL, MXF_MODULE_A429_EH, 0, out rxChannel);
if (rc == MAXT_SUCCESS)
rc =
mxfChannelGet(server, MXF_CLASS_A429, MXF_SCLASS_TX_CHANNEL, MXF_MODULE_A429_EH, 0, out txChannel);
if (rc == MAXT_SUCCESS && count == 0)
rc = MAXT_ERROR_NOT_FOUND;
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
{
if (rc == MAXT_SUCCESS)
Console.Write("Acquisition Channel (RX) location={0}.{1}.{2}\n", dev, mod, port);
}
if (rc == MAXT_SUCCESS)
{
if (rc == MAXT_SUCCESS)
Console.Write("Transmitter Channel (TX) location={0}.{1}.{2}\n", dev, mod, port);
}
#if LOOPBACK
if (rc == MAXT_SUCCESS)
#endif
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
{
try
{
rec429 = Marshal.AllocHGlobal(BUFFER_SIZE);
}
catch (OutOfMemoryException)
{
rc = MAXT_ERROR_MEM;
}
}
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
{
condParam.
mask = 0x000007ff;
condParam.
data = (1 << 10) | (SDI << 8) | LABEL;
condParam.
options = MXF_RXACQ_TRIG_COND_RDATA_OPTIONS_EQUAL;
}
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
{
if (rc == MAXT_SUCCESS)
Console.Write("\nAcquisition started\n\r");
}
if (rc == MAXT_SUCCESS)
rc = TX429PeriodicScheduling(txChannel, txBuffer, rec429);
if (rc == MAXT_SUCCESS)
rc = RX429ReadAcquisitionData(rxBuffer, rec429);
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
{
if (rc == MAXT_SUCCESS)
Console.Write("\nAcquisition stopped\n\r");
}
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");
}
Console.Write("\nTerminating\n");
if (txBuffer > 0)
if (rxBuffer > 0)
if (rec429 != IntPtr.Zero)
Marshal.FreeHGlobal(rec429);
Console.Write("\nPress enter to terminate\n");
Console.ReadKey();
return;
}
private static UInt32 TX429PeriodicScheduling(UInt64 txChannel, UInt64 txBuffer, IntPtr recPtr)
{
UInt64 schedule;
UInt64 msg = 0;
UInt64 data = 0, ssm = 1, parity = VMXF_A429_PARITY_ODD;
UInt32 rc;
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
{
rec429.timeTag = 0;
rec429.control = 0;
rec429.repeatCount = 1;
rec429.reserved = 0;
Marshal.StructureToPtr(rec429, recPtr, false);
if (rc == MAXT_SUCCESS)
}
if (rc == MAXT_SUCCESS)
{
Console.Write("Running periodic transmission, please wait...\n\r");
}
if (rc == MAXT_SUCCESS)
{
rec429.control = 0;
data = 1;
Marshal.StructureToPtr(rec429, recPtr, true);
if (rc == MAXT_SUCCESS)
}
if (rc == MAXT_SUCCESS)
{
}
if (rc == MAXT_SUCCESS)
Console.Write("\n\rTransmission stopped\n\r");
return rc;
}
private static UInt32 RX429ReadAcquisitionData(UInt64 rxBuffer, IntPtr rec429)
{
IntPtr recPtr = IntPtr.Zero;
UInt64 status, msgsCount, bytesCount, pendingBytes, freeBytes;
UInt64 label, sdi, data, ssm, parity;
UInt64 j, trigTime = 0;
UInt32 rc;
UInt64 usec;
var offset = TimeZoneInfo.Local.GetUtcOffset(DateTime.UtcNow);
var time = new DateTime(1970, 1, 1).AddTicks(offset.Ticks);
if (rc == MAXT_SUCCESS)
{
if ((status & MXF_RXACQ_STATUS_TRIG_OCCURRED) > 0)
{
if (rc == MAXT_SUCCESS)
{
time = time.AddMilliseconds(trigTime / 1000);
usec = trigTime % 1000;
Console.WriteLine("Event triggered at {0}:{1:000}", time.ToString("yyyy-MM-dd HH:mm:ss:fff"), usec);
}
}
else
Console.Write("Trigger not fired\n");
}
recPtr = rec429;
rc =
mxfA429RxAcqRead(rxBuffer, 0, BUFFER_SIZE, out status, out msgsCount, out bytesCount, rec429);
for (j = 0; j < msgsCount && rc == MAXT_SUCCESS; j++)
{
Console.Write("{0:00}: Timetag {1} - ARINC word=[{2},{3},{4:X5},{5},{6:000}] {7}\n",
j, rec.
timeTag, parity, ssm, data, sdi, label, trigTime == rec.
timeTag ?
"*" :
"");
}
return rc;
}
}
}