#define LOOPBACK
using System;
using static MAXT.MXFoundation.mxf;
using System.Runtime.InteropServices;
using System.Text;
namespace ar717_example
{
class ar717_bridge_from_ar429
{
const int ar717_TX_SUBFRAMES_TO_TRANSMIT = 8;
const int SUBFRAMESIZE = 64;
const int BNR = 0;
const int BCD = 1;
const int REAL = 2;
const int ar429_TX_RECORDS_TO_TRANSMIT = 8;
public struct strucEncoding
{
public UInt32 encoding429;
public UInt32 encoding717;
public double dataRange;
public UInt64 bitRange429;
public UInt64 bitRange717;
}
static uint BUFFER_SIZE = (uint)ar717_TX_SUBFRAMES_TO_TRANSMIT * (uint)Marshal.SizeOf(typeof(
MXF_A717_DATAREC));
public static void Main(string[] args)
{
UInt32 rc;
UInt64 server;
var device = new UInt64[1];
var module = new UInt64[1];
var tx717 = new UInt64[1];
var rx717 = new UInt64[1];
var tx429 = new UInt64[1];
var rx429 = new UInt64[1];
UInt64 txBuffer717 = 0, rxBuffer717 = 0;
UInt64 txBuffer429 = 0, rxBuffer429 = 0;
IntPtr tx717HostBuffer = IntPtr.Zero;
IntPtr rx717HostBuffer = IntPtr.Zero;
IntPtr tx429HostBuffer = IntPtr.Zero;
IntPtr rx429HostBuffer = IntPtr.Zero;
UInt64 count = 0, msgsCount429 = 0;
int nbFrames = ar717_TX_SUBFRAMES_TO_TRANSMIT;
MXF_SYSTEM_INIT_ATTRIBUTE_UINT64_HANDLER _initHandler = initHandler;
{
data = new UInt16[8192]
};
#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.WriteLine();
Console.WriteLine("Press a key to terminate");
Console.Read();
return;
}
Console.WriteLine("Starting");
if (rc == MAXT_SUCCESS)
if ((rc == MAXT_SUCCESS) && (count != 0))
if ((rc == MAXT_SUCCESS) && (count != 0))
if ((rc == MAXT_SUCCESS) && (count != 0))
if ((rc == MAXT_SUCCESS) && (count != 0))
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)
{
try
{
tx717HostBuffer = Marshal.AllocHGlobal((int)BUFFER_SIZE);
}
catch (OutOfMemoryException)
{
rc = MAXT_ERROR_MEM;
}
}
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
{
try
{
tx429HostBuffer = Marshal.AllocHGlobal((int)BUFFER_SIZE);
}
catch (OutOfMemoryException)
{
rc = MAXT_ERROR_MEM;
}
}
if (rc == MAXT_SUCCESS)
{
if (rc == MAXT_SUCCESS)
{
try
{
rx717HostBuffer = Marshal.AllocHGlobal((int)BUFFER_SIZE);
}
catch (OutOfMemoryException)
{
rc = MAXT_ERROR_MEM;
}
}
}
if (rc == MAXT_SUCCESS)
{
if (rc == MAXT_SUCCESS)
{
try
{
rx429HostBuffer = Marshal.AllocHGlobal((int)BUFFER_SIZE);
}
catch (OutOfMemoryException)
{
rc = MAXT_ERROR_MEM;
}
}
}
if (rc == MAXT_SUCCESS)
#if LOOPBACK
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
#endif
if (nbFrames < 4)
{
if (rc == MAXT_SUCCESS)
Console.Write("\nNumber of subframes to transmit less than 4: synchronization will not occur.\n\n");
}
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
rc =
mxfAttributeUint64Set(rx717[0], KMXF_A717_ELECTRICAL_SELECTION, VMXF_A717_ELECTRICAL_SELECT_DEFAULT);
if (rc == MAXT_SUCCESS)
rc =
mxfAttributeUint64Set(tx717[0], KMXF_A717_ELECTRICAL_SELECTION, VMXF_A717_ELECTRICAL_SELECT_DEFAULT);
if (rc == MAXT_SUCCESS)
{
if (rc == MAXT_SUCCESS)
Console.Write("\nA429 Acquisition started\n\r");
}
if (rc == MAXT_SUCCESS)
{
if (rc == MAXT_SUCCESS)
Console.Write("\nA717 Acquisition started\n\r");
}
if (rc == MAXT_SUCCESS)
rc = write429Msgs(txBuffer429, tx429HostBuffer);
if (rc == MAXT_SUCCESS)
rc = read429Acquisition(rxBuffer429, ref msgsCount429, rx429HostBuffer);
if (msgsCount429 == 0)
{
rc = MAXT_ERROR_COUNT;
}
if (rc == MAXT_SUCCESS)
rc = write717Msgs(txBuffer717, rx429HostBuffer, msgsCount429, tx717HostBuffer);
if (rc == MAXT_SUCCESS)
rc = read717Acquisition(rxBuffer717, rx717HostBuffer);
if (rc == MAXT_SUCCESS)
rc = writeEng(rx429HostBuffer, msgsCount429, rx717HostBuffer);
if (rc != MAXT_SUCCESS)
{
StringBuilder buffer = new StringBuilder(256);
buffer.Append(string.Format("ERROR # 0x{0:x8}", rc));
Console.WriteLine(buffer);
}
if (rxBuffer429 != 0)
if (rxBuffer717 != 0)
if (txBuffer429 != 0)
if (txBuffer717 != 0)
if (tx429HostBuffer != IntPtr.Zero)
Marshal.FreeHGlobal(tx429HostBuffer);
if (tx717HostBuffer != IntPtr.Zero)
Marshal.FreeHGlobal(tx717HostBuffer);
if (rx429HostBuffer != IntPtr.Zero)
Marshal.FreeHGlobal(rx429HostBuffer);
if (rx717HostBuffer != IntPtr.Zero)
Marshal.FreeHGlobal(rx717HostBuffer);
Console.WriteLine();
Console.WriteLine("Press enter to terminate");
Console.Read();
return;
}
private static UInt32 changeBitEncoding(UInt32 originBitEncoding, UInt32 destinationBitEncoding, double dataRange, UInt64 originBitRange, UInt64 destinationBitRange, UInt32 originData, ref UInt32 destinationData)
{
double realData = 0;
UInt32 rc = MAXT_SUCCESS;
switch (originBitEncoding)
{
case BNR:
originData <<= 10;
break;
case BCD:
rc = MAXT_ERROR_NOT_SUPPORTED;
break;
case REAL:
realData = (double)originData;
break;
default:
rc = MAXT_ERROR_PARAM;
break;
}
switch (destinationBitEncoding)
{
case BNR:
destinationData >>= 10;
break;
case BCD:
rc = MAXT_ERROR_NOT_SUPPORTED;
break;
case REAL:
destinationData = (UInt32)realData;
break;
default:
rc = MAXT_ERROR_PARAM;
break;
}
return rc;
}
private static UInt32 Ar429ToAr717Bridge(IntPtr Ptr429, UInt64 msgsCount429, IntPtr Ptr717)
{
IntPtr recPtr717 = IntPtr.Zero;
IntPtr recPtr429 = Ptr429;
UInt64 label = 0, sdi, data = 0, ssm, parity;
UInt32 rc = MAXT_SUCCESS, dataTemp = 0;
UInt64 iSubframe, iMsgs429, i, iWord;
UInt64 NbOfSubframes = 0, NbOfWords = 0;
var subframes = new UInt64[4];
var words = new UInt64[10];
strucEncoding encoding = new strucEncoding();
{
data = new UInt16[8192]
};
for (iMsgs429 = 0; (iMsgs429 < msgsCount429) && (rc == MAXT_SUCCESS); iMsgs429++)
{
recPtr717 = Ptr717;
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
{
ARINC717DataDefinition(label, ref NbOfSubframes, ref subframes, ref NbOfWords, ref words, ref encoding);
if (encoding.bitRange429 != encoding.bitRange717 || encoding.encoding429 != encoding.encoding717)
{
changeBitEncoding(encoding.encoding429, encoding.encoding717, encoding.dataRange, encoding.bitRange429, encoding.bitRange717, (UInt32)data, ref dataTemp);
data = dataTemp;
}
data >>= 7;
}
for (iSubframe = 0; (rc == MAXT_SUCCESS) && (iSubframe < ar717_TX_SUBFRAMES_TO_TRANSMIT); iSubframe++)
{
rec717.
dataSize = 2 * (UInt32)SUBFRAMESIZE;
for (i = 0; i < NbOfSubframes; i++)
{
if (iSubframe % 4 == subframes[i] - 1)
{
for (iWord = 0; iWord < NbOfWords; iWord++)
{
rec717.
data[words[iWord] - 1] = (UInt16)data;
}
}
}
switch (iSubframe % 4)
{
case 0:
break;
case 1:
break;
case 2:
break;
case 3:
break;
default:
break;
}
if (rc == MAXT_SUCCESS)
{
Marshal.StructureToPtr(rec717, recPtr717, false);
}
}
}
return rc;
}
private static UInt32 ARINC717DataDefinition(UInt64 label, ref UInt64 NbOfSubframes, ref UInt64[] subframes, ref UInt64 NbOfWords, ref UInt64[] words, ref strucEncoding encoding)
{
switch (label)
{
case 65:
{
subframes[0] = 1;
subframes[1] = 2;
subframes[2] = 3;
subframes[3] = 4;
words[0] = 19;
NbOfSubframes = 4;
NbOfWords = 1;
encoding.encoding429 = BNR;
encoding.encoding717 = BNR;
encoding.dataRange = 180;
encoding.bitRange429 = 12;
encoding.bitRange717 = 12;
}
break;
case 66:
{
subframes[0] = 1;
subframes[1] = 2;
subframes[2] = 3;
subframes[3] = 4;
words[0] = 17;
NbOfSubframes = 4;
NbOfWords = 1;
encoding.encoding429 = BNR;
encoding.encoding717 = BNR;
encoding.dataRange = 65536;
encoding.bitRange429 = 16;
encoding.bitRange717 = 12;
}
break;
case 67:
{
subframes[0] = 1;
subframes[1] = 2;
subframes[2] = 3;
subframes[3] = 4;
words[0] = 32;
NbOfSubframes = 4;
NbOfWords = 1;
encoding.encoding429 = BNR;
encoding.encoding717 = BNR;
encoding.dataRange = 512;
encoding.bitRange429 = 11;
encoding.bitRange717 = 12;
}
break;
case 68:
{
subframes[0] = 1;
subframes[1] = 2;
subframes[2] = 3;
subframes[3] = 4;
words[0] = 11;
NbOfSubframes = 4;
NbOfWords = 1;
encoding.encoding429 = BNR;
encoding.encoding717 = BNR;
encoding.dataRange = 16384;
encoding.bitRange429 = 10;
encoding.bitRange717 = 12;
}
break;
case 208:
{
subframes[0] = 1;
subframes[1] = 2;
subframes[2] = 3;
subframes[3] = 4;
words[0] = 9;
NbOfSubframes = 4;
NbOfWords = 1;
encoding.encoding429 = BNR;
encoding.encoding717 = BNR;
encoding.dataRange = 180;
encoding.bitRange429 = 15;
encoding.bitRange717 = 12;
}
break;
case 213:
{
subframes[0] = 1;
subframes[1] = 2;
subframes[2] = 3;
subframes[3] = 4;
words[0] = 14;
words[1] = 46;
NbOfSubframes = 4;
NbOfWords = 2;
encoding.encoding429 = BNR;
encoding.encoding717 = BNR;
encoding.dataRange = 180;
encoding.bitRange429 = 14;
encoding.bitRange717 = 12;
}
break;
case 217:
{
subframes[0] = 1;
subframes[1] = 2;
subframes[2] = 3;
subframes[3] = 4;
words[0] = 5;
words[1] = 21;
words[2] = 37;
words[3] = 53;
NbOfSubframes = 4;
NbOfWords = 4;
encoding.encoding429 = BNR;
encoding.encoding717 = BNR;
encoding.dataRange = 2;
encoding.bitRange429 = 12;
encoding.bitRange717 = 12;
}
break;
case 218:
{
subframes[0] = 1;
subframes[1] = 2;
subframes[2] = 3;
subframes[3] = 4;
words[0] = 6;
words[1] = 22;
words[2] = 38;
words[3] = 54;
NbOfSubframes = 4;
NbOfWords = 4;
encoding.encoding429 = BNR;
encoding.encoding717 = BNR;
encoding.dataRange = 2;
encoding.bitRange429 = 12;
encoding.bitRange717 = 12;
}
break;
default:
break;
}
return MAXT_SUCCESS;
}
private static UInt32 write717Msgs(UInt64 buffer, IntPtr rec429, UInt64 msgsCount429, IntPtr tx717HostBuffer)
{
UInt32 rc = 0;
Console.Write("\nA717 Aperiodic transmission\n");
rc = Ar429ToAr717Bridge(rec429, msgsCount429, tx717HostBuffer);
if (rc == MAXT_SUCCESS)
rc =
mxfA717TxAperiodicWrite(buffer, MXF_TXAPERIODIC_FLAG_DEFAULT, 0, ar717_TX_SUBFRAMES_TO_TRANSMIT, tx717HostBuffer);
if (rc == MAXT_SUCCESS)
mxfSleep((ar717_TX_SUBFRAMES_TO_TRANSMIT + 1) * 1000);
if (rc != MAXT_SUCCESS)
Console.Write("A717 transmit failed; rc=0x{0:x8}\n", rc);
else
Console.Write("\nWriting A717-records\n");
return rc;
}
private static UInt32 write429Msgs(UInt64 txBuffer, IntPtr rec429)
{
IntPtr recPtr = rec429;
UInt32 label, sdi, data, ssm, parity;
double value;
UInt32 record;
UInt64 delay100ms = 100000;
UInt32 rc =0;
UInt64 msgCount, usedBytes, freeBytes;
Console.Write("\nA429 Aperiodic transmission\n");
for (record = 0; (record < ar429_TX_RECORDS_TO_TRANSMIT) && (rc == MAXT_SUCCESS); record++)
{
data = 0;
sdi = 1;
ssm = 0;
parity = (UInt32)VMXF_A429_PARITY_ODD;
switch (record)
{
case 0:
label = Convert.ToUInt32("331", 8); ;
value = 0.6501;
data >>= 10;
break;
case 1:
label = Convert.ToUInt32("332", 8);
value = -0.0141;
data >>= 10;
break;
case 2:
label = Convert.ToUInt32("320", 8);
value = 45.342;
data >>= 10;
break;
case 3:
label = Convert.ToUInt32("104", 8);
value = 231;
data >>= 10;
break;
case 4:
label = Convert.ToUInt32("325", 8);
value = 3.67;
data >>= 10;
break;
case 5:
label = Convert.ToUInt32("102", 8);
value = 13400;
data >>= 10;
break;
case 6:
label = Convert.ToUInt32("101", 8);
value = 48;
data >>= 10;
break;
case 7:
label = Convert.ToUInt32("103", 8);
value = 435.54;
data >>= 10;
break;
default:
label = Convert.ToUInt32("001", 8);
data = 0;
break;
}
if (rc == MAXT_SUCCESS)
{
Marshal.StructureToPtr(rec, recPtr, false);
}
}
rc =
mxfA429TxAperiodicWrite(txBuffer, MXF_TXAPERIODIC_FLAG_DEFAULT, delay100ms, ar429_TX_RECORDS_TO_TRANSMIT, rec429);
do
{
if (rc != MAXT_SUCCESS)
return rc;
} while (msgCount != 0);
return rc;
}
private static UInt32 read717Acquisition(UInt64 rxBuffer, IntPtr rx717HostBuffer)
{
IntPtr recPtr = rx717HostBuffer;
UInt64 status, msgsCount, bytesCount;
UInt64 word, data;
UInt32 rc;
{
data = new UInt16[8192]
};
Console.Write("\nA717 reading\n");
rc =
mxfA717RxAcqRead(rxBuffer, 0, (UInt64)BUFFER_SIZE, out status, out msgsCount, out bytesCount, rx717HostBuffer);
if (rc == MAXT_SUCCESS)
Console.Write("String received count = {0} \n", msgsCount);
if (rc == MAXT_SUCCESS)
{
for (data = 0; (data < msgsCount) && (rc == MAXT_SUCCESS); data++)
{
Console.Write(
"\n{0:D2}: Timetag={1:D12}, Size={2} words\n", data, rec.
timeTag, (rec.
dataSize) / 2);
for (word = 0; word < SUBFRAMESIZE; word++)
{
Console.Write(
"{0:X3} ", rec.
data[word]);
else
Console.Write("--- ");
}
Console.Write("\n");
}
}
if (rc != MAXT_SUCCESS)
Console.Write("A717 acquisition read failed; rc=0x{0:x8}\n", rc);
return rc;
}
private static UInt32 read429Acquisition(UInt64 rxBuffer, ref UInt64 msgsCount429, IntPtr rec429)
{
IntPtr recPtr = rec429;
UInt64 status, bytesCount;
UInt64 label, sdi, data, ssm, parity;
UInt64 j;
UInt32 rc;
Console.Write("\nA429 reading\n");
rc =
mxfA429RxAcqRead(rxBuffer, 0, BUFFER_SIZE, out status, out msgsCount429, out bytesCount, rec429);
for (j = 0; (j < msgsCount429) && (rc == MAXT_SUCCESS); j++)
{
if (rc == MAXT_SUCCESS)
{
Console.Write("{0:D2}: Timetag {1} - ARINC429 word=[{2},{3},{4:X5},{5},{6}]\n",
j, rec.
timeTag, Convert.ToString((
int)label, 8).PadLeft(3,
'0'), sdi, data, ssm, (parity == VMXF_A429_PARITY_ODD) ?
"ODD" :
"EVEN");
if (rc == MAXT_SUCCESS)
}
}
if (rc != MAXT_SUCCESS)
Console.Write("A429 acquisition read failed; rc=0x{0:x8}\n", rc);
return rc;
}
private static UInt32 writeEng(IntPtr Ptr429, UInt64 msgsCount429, IntPtr Ptr717)
{
UInt32 rc = MAXT_SUCCESS;
IntPtr recPtr429 = Ptr429;
IntPtr recPtr717 = IntPtr.Zero;
UInt64 label, sdi, data429, ssm, parity;
UInt64 iMsgCount, iSubframe;
UInt64 data717, NbOfSubframes = 0, NbOfWords = 0;
var subframes = new UInt64[4];
var words = new UInt64[10];
strucEncoding encoding = new strucEncoding();
double real429, real717;
{
data = new UInt16[8192]
};
Console.Write("\n\n");
Console.Write("---------------------------------------------------------------------\n");
Console.Write("| Label | Value received in A429 | Value received in A717 |\n");
Console.Write("---------------------------------------------------------------------\n");
for (iMsgCount = 0; (iMsgCount < msgsCount429) && (rc == MAXT_SUCCESS); iMsgCount++)
{
real429 = 0;
real717 = 0;
recPtr717 = Ptr717;
if (rc == MAXT_SUCCESS)
ARINC717DataDefinition(label, ref NbOfSubframes, ref subframes, ref NbOfWords, ref words, ref encoding);
if (rc == MAXT_SUCCESS)
{
data429 <<= 10;
rc =
mxfA429ArwBnrToReal((UInt32)data429, encoding.dataRange, encoding.bitRange429, out real429);
}
if (rc == MAXT_SUCCESS)
{
for (iSubframe = 0; iSubframe < 4; iSubframe++)
{
if (iSubframe == subframes[0])
{
data717 = rec717.
data[words[0] - 1];
data717 <<= 17;
if (rc == MAXT_SUCCESS)
rc =
mxfA429ArwBnrToReal((UInt32)data717, encoding.dataRange, encoding.bitRange717, out real717);
}
else
{
}
}
}
if (rc == MAXT_SUCCESS)
if (real429 < -10000)
Console.Write("| {0} | {1} | {2} |\n", Convert.ToString((int)label, 8).PadLeft(3, '0'), String.Format("{0:0.0}", real429), String.Format("{0:0.0}", real717));
else if (real429 < -1000)
Console.Write("| {0} | {1} | {2} |\n", Convert.ToString((int)label, 8).PadLeft(3, '0'), String.Format("{0:0.00}", real429), String.Format("{0:0.00}", real717));
else if (real429 < -100)
Console.Write("| {0} | {1} | {2} |\n", Convert.ToString((int)label, 8).PadLeft(3, '0'), String.Format("{0:0.00}", real429), String.Format("{0:0.00}", real717));
else if (real429 < -10)
Console.Write("| {0} | {1} | {2} |\n", Convert.ToString((int)label, 8).PadLeft(3, '0'), String.Format("{0:0.000}", real429), String.Format("{0:0.000}", real717));
else if (real429 < 0)
Console.Write("| {0} | {1} | {2} |\n", Convert.ToString((int)label, 8).PadLeft(3, '0'), String.Format("{0:0.000}", real429), String.Format("{0:0.000}", real717));
else if (real429 < 10)
Console.Write("| {0} | {1} | {2} |\n", Convert.ToString((int)label, 8).PadLeft(3, '0'), String.Format("{0:0.000}", real429), String.Format("{0:0.000}", real717));
else if (real429 < 100)
Console.Write("| {0} | {1} | {2} |\n", Convert.ToString((int)label, 8).PadLeft(3, '0'), String.Format("{0:0.000}", real429), String.Format("{0:0.000}", real717));
else if (real429 < 1000)
Console.Write("| {0} | {1} | {2} |\n", Convert.ToString((int)label, 8).PadLeft(3, '0'), String.Format("{0:0.00}", real429), String.Format("{0:0.00}", real717));
else if (real429 < 10000)
Console.Write("| {0} | {1} | {2} |\n", Convert.ToString((int)label, 8).PadLeft(3, '0'), String.Format("{0:0.00}", real429), String.Format("{0:0.00}", real717));
else if (real429 < 100000)
Console.Write("| {0} | {1} | {2} |\n", Convert.ToString((int)label, 8).PadLeft(3, '0'), String.Format("{0:0.0}", real429), String.Format("{0:0.0}", real717));
else if (real429 >= 100000)
Console.Write("| {0} | {1} | {2} |\n", Convert.ToString((int)label, 8).PadLeft(3, '0'), String.Format("{0:0.0}", real429), String.Format("{0:0.0}", real717));
}
Console.Write("---------------------------------------------------------------------\n");
return rc;
}
private static UInt32 initHandler(UInt64 server, UInt64 deviceIndex, UInt64 moduleIndex, UInt64 channelIndex, UInt64 attrib, ref UInt64 value)
{
UInt64 device;
UInt32 rc;
server = server;
deviceIndex = deviceIndex;
if (attrib == KMXF_CHANNEL_CLASS)
{
if (rc == MAXT_SUCCESS)
if ((rc == MAXT_SUCCESS) && (deviceInfo.modules[moduleIndex].type == MXF_MODULE_MULTI_EH))
{
if ((channelIndex == 0) || (channelIndex == deviceInfo.modules[moduleIndex].txCount))
{
value = MXF_CLASS_A717;
return Convert.ToUInt32(true);
}
}
}
return Convert.ToUInt32(false);
}
}
}