using System;
using static MAXT.MXFoundation.mxf;
using System.Runtime.InteropServices;
using System.Text;
namespace ar429_example
{
class ar429_aperiodic
{
const int BUFFER_SIZE = 4096;
const int MAX_TX_RECORDS_TO_TRANSMIT = 8;
static void Main(string[] args)
{
UInt32 rc;
UInt64 server;
UInt64 device = 0;
var module = new UInt64[1];
UInt64 count = 0;
var rxChannel = new UInt64[1];
var txChannel = new UInt64[1];
UInt64 rxBuffer = 0;
UInt64 txBuffer = 0;
IntPtr rec429 = IntPtr.Zero;
UInt64 dev, mod, port;
#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_ERROR_ANOTHER_PROCESS_RUNNING)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if ((rc == MAXT_SUCCESS) && (count != 0))
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)
{
if (rc == MAXT_SUCCESS)
Console.Write("\nAcquisition started\n\r");
}
if (rc == MAXT_SUCCESS)
{
rc = TX429StartAperiodicTransmissionDefault(txBuffer, rec429);
if (rc == MAXT_SUCCESS)
rc = RX429ReadAcquisitionData(rxBuffer, rec429);
if (rc == MAXT_SUCCESS)
rc = TX429StartAperiodicTransmissionAbsolute(device, txBuffer, rec429);
if (rc == MAXT_SUCCESS)
rc = RX429ReadAcquisitionData(rxBuffer, rec429);
if (rc == MAXT_SUCCESS)
rc = TX429StartAperiodicTransmissionRecordAbsolute(device, txBuffer, rec429);
if (rc == MAXT_SUCCESS)
rc = RX429ReadAcquisitionData(rxBuffer, rec429);
if (rc == MAXT_SUCCESS)
rc = TX429StartAperiodicTransmissionRecordRelative(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)
{
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 (rxBuffer != 0)
if (txBuffer != 0)
if (rec429 != IntPtr.Zero)
Marshal.FreeHGlobal(rec429);
Console.Write("\nPress enter to terminate\n");
Console.ReadKey();
return;
}
private static UInt32 RX429ReadAcquisitionData(UInt64 rxBuffer, IntPtr rec429)
{
IntPtr recPtr = rec429;
UInt64 status, msgsCount, bytesCount;
UInt64 label, sdi, data, ssm, parity;
UInt64 j;
UInt32 rc;
rc =
mxfA429RxAcqRead(rxBuffer, 0, BUFFER_SIZE, out status, out msgsCount, out bytesCount, rec429);
for (j = 0; j < msgsCount && rc == MAXT_SUCCESS; j++)
{
if (rc == MAXT_SUCCESS)
{
Console.Write("{0:00}: Timetag {1} - ARINC word=[{2:000},{3},{4:x5},{5},{6} ]\n",
j, rxRec429.timeTag, label, sdi, data, ssm, parity == VMXF_A429_PARITY_ODD ? "ODD" : "EVEN");
}
}
return rc;
}
private static UInt32 TX429WaitQueueEmpty(UInt64 txBuffer)
{
UInt64 msgCount, usedBytes, freeBytes;
UInt32 rc;
do
{
if (rc != MAXT_SUCCESS)
return rc;
} while (msgCount != 0);
return MAXT_SUCCESS;
}
private static UInt32 TX429StartAperiodicTransmissionDefault(UInt64 txBuffer, IntPtr rec429)
{
IntPtr recPtr;
UInt64 label, sdi, data, ssm, parity;
UInt32 record;
UInt64 delay100ms = 100000;
UInt32 rc;
Console.Write("\nAperiodic transmission (Relative Start Time-Default)\n");
recPtr = rec429;
for (record = 0; record < MAX_TX_RECORDS_TO_TRANSMIT; record++)
{
txRec429.timeTag = 0;
txRec429.control = 0;
txRec429.repeatCount = 1;
txRec429.reserved = 0;
label = 005;
sdi = 1;
data = record * 8;
ssm = 0;
parity = VMXF_A429_PARITY_ODD;
Marshal.StructureToPtr(txRec429, recPtr, false);
}
rc =
mxfA429TxAperiodicWrite(txBuffer, MXF_TXAPERIODIC_FLAG_DEFAULT, delay100ms, MAX_TX_RECORDS_TO_TRANSMIT, rec429);
if (rc == MAXT_SUCCESS)
rc = TX429WaitQueueEmpty(txBuffer);
return rc;
}
private static UInt32 TX429StartAperiodicTransmissionAbsolute(UInt64 device, UInt64 txBuffer, IntPtr rec429)
{
IntPtr recPtr = IntPtr.Zero;
UInt64 label, sdi, data, ssm, parity;
UInt32 record, rc;
UInt32 delay100ms = 100000;
UInt64 currentTime;
if (rc != MAXT_SUCCESS)
return rc;
Console.Write("\nAperiodic transmission (Absolute)\n");
recPtr = rec429;
for (record = 0; record < MAX_TX_RECORDS_TO_TRANSMIT; record++)
{
rec.timeTag = 0;
rec.control = 0;
rec.repeatCount = 1;
rec.reserved = 0;
label = 6;
sdi = 2;
data = record * 16;
ssm = 0;
parity = VMXF_A429_PARITY_ODD;
Marshal.StructureToPtr(rec, recPtr, false);
}
rc =
mxfA429TxAperiodicWrite(txBuffer, MXF_TXAPERIODIC_FLAG_ABSOLUTE_START_TIME, currentTime + delay100ms, MAX_TX_RECORDS_TO_TRANSMIT, rec429);
if (rc == MAXT_SUCCESS)
rc = TX429WaitQueueEmpty(txBuffer);
return rc;
}
private static UInt32 TX429StartAperiodicTransmissionRecordAbsolute(UInt64 device, UInt64 txBuffer, IntPtr rec429)
{
IntPtr recPtr = IntPtr.Zero;
UInt64 label, sdi, data, ssm, parity;
UInt32 record;
UInt64 currentTime;
UInt32 rc;
Console.Write("\nAperiodic transmission (Absolute with timetag)\n");
if (rc != MAXT_SUCCESS)
return rc;
currentTime += 100000;
recPtr = rec429;
for (record = 0; record < MAX_TX_RECORDS_TO_TRANSMIT; record++)
{
rec.timeTag = currentTime + ((record + 1) * 10000);
rec.control = 0;
rec.repeatCount = 1;
rec.reserved = 0;
label = 7;
sdi = 1;
data = record * 32;
ssm = 0;
parity = VMXF_A429_PARITY_ODD;
Marshal.StructureToPtr(rec, recPtr, false);
}
rc =
mxfA429TxAperiodicWrite(txBuffer, MXF_TXAPERIODIC_FLAG_USE_RECORD_ABSOLUTE_TIME, 0, MAX_TX_RECORDS_TO_TRANSMIT, rec429);
if (rc == MAXT_SUCCESS)
rc = TX429WaitQueueEmpty(txBuffer);
return rc;
}
private static UInt32 TX429StartAperiodicTransmissionRecordRelative(UInt64 txBuffer, IntPtr rec429)
{
IntPtr recPtr = IntPtr.Zero;
UInt64 label, sdi, data, ssm, parity;
UInt32 record;
UInt64 currentTime;
UInt32 rc;
Console.Write("\nAperiodic transmission (Record Relative)\n");
recPtr = rec429;
for (record = 0, currentTime = 100000; record < MAX_TX_RECORDS_TO_TRANSMIT; record++)
{
rec.timeTag = currentTime + ((record + 1) * 10000);
rec.control = 0;
rec.repeatCount = 1;
rec.reserved = 0;
label = 010;
sdi = 1;
data = record * 64;
parity = 0;
ssm = 0;
Marshal.StructureToPtr(rec, recPtr, false);
}
rc =
mxfA429TxAperiodicWrite(txBuffer, MXF_TXAPERIODIC_FLAG_USE_RECORD_RELATIVE_TIME, 0, MAX_TX_RECORDS_TO_TRANSMIT, rec429);
if (rc == MAXT_SUCCESS)
rc = TX429WaitQueueEmpty(txBuffer);
return rc;
}
}
}