#include "example.h"
#define MAX_TX_RECORDS_TO_TRANSMIT 8
#define MAX_TX_SUBFRAMES_TO_TRANSMIT 4 //minimum 4 to have at least one full frame.
uint32 initHandler(HMXF_SERVER server, uint64 deviceIndex, uint64 moduleIndex, uint64 channelIndex, uint64 attrib, uint64* value);
void writeCompletion(HMXF_BUFFER bufferHandle, uint32 result, void* context, uint64* output);
void readCompletion(HMXF_BUFFER bufferHandle, uint32 result, void* context, uint64* output);
typedef struct
{
HMXF_SERVER server;
uint64 protocol;
uint32 processed;
uint32 rc;
}
ASYNC_CALLBACK_INFO;
int main(void)
{
uint32 rc;
HMXF_SERVER server = 0;
HMXF_CHANNEL rxChannelHDLC = 0;
HMXF_CHANNEL rxChannelA717 = 0;
HMXF_CHANNEL txChannelHDLC = 0;
HMXF_CHANNEL txChannelA717 = 0;
HMXF_BUFFER rxBufferHDLC = 0;
HMXF_BUFFER txBufferHDLC = 0;
HMXF_BUFFER rxBufferA717 = 0;
HMXF_BUFFER txBufferA717 = 0;
size_t txBufferSize = 0;
size_t rxBufferSize = 0;
uint64 rxAcqStatus = 0;
uint64 msgCount = 0;
uint64 byteCount = 0;
uint64 data, word, subframeSize;
uint64 freebytes;
ASYNC_CALLBACK_INFO asyncInfoHDLC, asyncInfoA717;
#ifdef LOCAL
#else
#endif
if (!rc)
if (!rc)
{
printf("Starting ...\n");
}
if (!rc)
rc =
mxfChannelGet(server, MXF_CLASS_HDLC, MXF_SCLASS_RX_CHANNEL, MXF_MODULE_MULTI_EH, 0, &rxChannelHDLC);
if (!rc)
rc =
mxfChannelGet(server, MXF_CLASS_HDLC, MXF_SCLASS_TX_CHANNEL, MXF_MODULE_MULTI_EH, 0, &txChannelHDLC);
if (!rc)
rc =
mxfChannelGet(server, MXF_CLASS_A717, MXF_SCLASS_RX_CHANNEL, MXF_MODULE_MULTI_EH, 0, &rxChannelA717);
if (!rc)
rc =
mxfChannelGet(server, MXF_CLASS_A717, MXF_SCLASS_TX_CHANNEL, MXF_MODULE_MULTI_EH, 0, &txChannelA717);
if (!rc)
if (!rc)
if (!rc)
if (!rc)
subframeSize = 128;
if (!rc)
if (!rc)
if (!rc)
rc =
mxfAttributeUint64Set(rxChannelA717, KMXF_A717_BIT_ENCODING, VMXF_A717_BIT_ENCODING_HARVARDBIPHASE);
if (!rc)
rc =
mxfAttributeUint64Set(txChannelA717, KMXF_A717_BIT_ENCODING, VMXF_A717_BIT_ENCODING_HARVARDBIPHASE);
if (!rc)
rc =
mxfAttributeUint64Set(rxChannelA717, KMXF_A717_ELECTRICAL_SELECTION, VMXF_A717_ELECTRICAL_SELECT_DEFAULT);
if (!rc)
rc =
mxfAttributeUint64Set(txChannelA717, KMXF_A717_ELECTRICAL_SELECTION, VMXF_A717_ELECTRICAL_SELECT_DEFAULT);
#ifdef LOOPBACK
if (!rc)
if (!rc)
#endif
if (!rc)
{
txBufferSize = 4 * 1024;
if (!rc)
{
if (!txHostBufferHDLC)
rc = MAXT_ERROR_MEM;
}
}
if (!rc)
{
rxBufferSize = 4 * 1024;
if (!rc)
{
if (!rxHostBufferHDLC)
rc = MAXT_ERROR_MEM;
}
}
asyncInfoHDLC.HostBufferHDLC = rxHostBufferHDLC;
asyncInfoHDLC.protocol = 0;
asyncInfoHDLC.processed = 0;
asyncInfoHDLC.rc = 0;
if (!rc)
{
if (!rc)
{
if (!txHostBufferA717)
rc = MAXT_ERROR_MEM;
}
}
if (!rc)
{
if (!rc)
{
if (!rxHostBufferA717)
rc = MAXT_ERROR_MEM;
}
}
asyncInfoA717.HostBufferA717 = rxHostBufferA717;
asyncInfoA717.protocol = 1;
asyncInfoA717.processed = 0;
asyncInfoA717.rc = 0;
if (!rc)
if (!rc)
if (!rc)
if (!rc)
{
recHDLC = 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);
}
}
}
if (!rc)
rc =
mxfTxAperiodicWriteAsync(txBufferHDLC, MXF_TXAPERIODIC_FLAG_DEFAULT, 0, MAX_TX_RECORDS_TO_TRANSMIT, txHostBufferHDLC, writeCompletion, &asyncInfoHDLC);
if (!rc)
{
recA717 = 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);
}
}
}
if (!rc)
rc =
mxfTxAperiodicWriteAsync(txBufferA717, MXF_TXAPERIODIC_FLAG_DEFAULT, 0, MAX_TX_SUBFRAMES_TO_TRANSMIT, txHostBufferA717, writeCompletion, &asyncInfoA717);
if (!rc)
{
do
{
} while (!asyncInfoHDLC.processed || !asyncInfoA717.processed);
if (asyncInfoHDLC.rc)
rc = asyncInfoHDLC.rc;
else if (asyncInfoA717.rc)
rc = asyncInfoA717.rc;
if (!rc)
{
uint64 msgCountA717 = 0;
do
{
if (!rc)
} while (!rc && ((msgCount != MAX_TX_RECORDS_TO_TRANSMIT) || (msgCountA717 != MAX_TX_SUBFRAMES_TO_TRANSMIT)));
}
}
if (!rc)
{
printf("Receiving ...\n\n");
asyncInfoHDLC.processed = 0;
asyncInfoA717.processed = 0;
rc =
mxfRxAcqReadAsync(rxBufferHDLC, 0, rxBufferSize, asyncInfoHDLC.HostBufferHDLC, readCompletion, &asyncInfoHDLC);
if (!rc)
rc =
mxfRxAcqReadAsync(rxBufferA717, 0, rxBufferSize, asyncInfoA717.HostBufferA717, readCompletion, &asyncInfoA717);
}
if (!rc)
{
do
{
} while (!asyncInfoHDLC.processed || !asyncInfoA717.processed);
}
if (!rc)
if (!rc)
if (txHostBufferHDLC)
free(txHostBufferHDLC);
if (txHostBufferA717)
free(txHostBufferA717);
if (rxHostBufferHDLC)
free(rxHostBufferHDLC);
if (rxHostBufferA717)
free(rxHostBufferA717);
if (rc)
{
char errorString[200];
sprintf(errorString, "ERROR # 0x%X", rc);
printf("%s\n\r", errorString);
}
printf("Terminating ...\n");
printf("\nPress a key to terminate\n");
getchar();
return rc;
}
uint32 initHandler(HMXF_SERVER server, uint64 deviceIndex, uint64 moduleIndex, uint64 channelIndex, uint64 attrib, uint64* value)
{
HMXF_DEVICE device = 0;
uint32 rc = 0;
uint64 i = 0;
int64 modulePosition = 999;
if(!rc)
{
{
break;
}
}
if (attrib == KMXF_CHANNEL_CLASS && !rc)
{
if ((deviceIndex == 0) && (moduleIndex == (uint64)modulePosition) && ((channelIndex == 0) || (channelIndex == 8)))
{
*value = MXF_CLASS_HDLC;
return TRUE;
}
else if ((deviceIndex == 0) && (moduleIndex == (uint64)modulePosition) && ((channelIndex == 4) || (channelIndex == 12)))
{
*value = MXF_CLASS_CLOCK;
return TRUE;
}
if ((deviceIndex == 0) && (moduleIndex == (uint64)modulePosition) && ((channelIndex == 1) || (channelIndex == 9)))
{
*value = MXF_CLASS_A717;
return TRUE;
}
}
return FALSE;
}
void writeCompletion(HMXF_BUFFER bufferHandle, uint32 result, void* context, uint64* output)
{
ASYNC_CALLBACK_INFO* info = (ASYNC_CALLBACK_INFO*)(context);
bufferHandle = bufferHandle;
if (!result)
{
if (info->protocol == 0)
{
printf("%llu HDLC records have been successfully transmitted.\n\n", output[0]);
}
else
{
printf("%llu ARINC 717 records have been successfully transmitted.\n\n", output[0]);
}
}
else
{
char errorString[200];
sprintf(errorString, "ERROR # 0x%X", result);
printf("%s\n\r", errorString);
}
info->rc = result;
info->processed = 1;
}
void readCompletion(HMXF_BUFFER bufferHandle, uint32 result, void* context, uint64* output)
{
ASYNC_CALLBACK_INFO* info = (ASYNC_CALLBACK_INFO*)(context);
bufferHandle = bufferHandle;
if (!result)
{
if (info->protocol == 0)
{
printf("HDLC string received count = %llu \n", output[1]);
DisplayDataArrayHDLC(output[1], info->HostBufferHDLC);
printf("\n");
}
else
{
printf("ARINC 717 string received count = %llu \n", output[1]);
DisplayDataArrayA717(output[1], info->HostBufferA717);
printf("\n");
}
}
else
{
char errorString[200];
sprintf(errorString, "ERROR # 0x%X", result);
printf("%s\n\r", errorString);
}
info->rc = result;
info->processed = 1;
}
{
uint64 iRec,
iData;
printf("\n");
for (iRec = 0; iRec < recNum; iRec++)
{
for (iData = 0; iData < p->
dataSize / 2; iData++)
{
printf(
"%04x ", p->
data[iData]);
if (!((iData + 1) % 8) && (iData + 1 < p->
dataSize / 2))
printf("\n ");
}
printf("\n");
}
}
{
uint64 iRec,
iData;
printf("\n");
for (iRec = 0; iRec < recNum; iRec++)
{
for (iData = 0; iData < (p->
dataSize) / 2; iData++)
{
printf(
"%03x", p->
data[iData]);
if (!((iData + 1) % 16) && (iData + 1 < p->
dataSize))
printf("\n ");
}
printf("\n");
}
}