MX Foundation 4
Basic Acquisition

The way to set a basic acquisition receive application is as follows:

  • A receive channel must be obtained using the mxfModuleChannelGet() function or with the mxfModuleChannelAllGet() function by specifying the MXF_SCLASS_RXACQ_SRV subclass.
  • The acquisition buffer must be allocated using the mxfRxAcqBufferAlloc() function.
  • The acquisition mode can be set using the mxfRxAcqModeSet() function.

    Two modes of acquisition are defined:

    Condition Description
    MXF_RXACQ_MODE_LINEAR In this mode the acquisition stops when the buffer is full.
    MXF_RXACQ_MODE_CIRCULAR In this mode the acquisition buffer is circular and never stops receiving.
    Whenever the acquisition queue becomes full, the acquisition process will discard the newest received record.
  • The acquisition must be started using the mxfRxAcqStart() function.
  • A read loop can be implemented using the mxfHDLCRxAcqRead() function. The mxfHDLCNextDataRecordPtrGet() function needs to be used to navigate in the receive buffer.

The MXF_HDLC_DATAREC structure must be used for reading a HDLC messages with acquisition service.

Example

The example below shows how to implement a HDLC basic receive acquisition application.

hdlc.c

HMXF_CHANNEL rxChannel;
HMXF_BUFFER rxBuffer;
size_t rxBufferSize=0;
MXF_HDLC_DATAREC *rxHostBuffer=NULL;
uint64 rxAcqStatus, msgCount, byteCount;
uint32 rc;
...
// Allocates 4 KB buffer for RX data
if(!rc)
{
rxBufferSize = 4*1024;
// Allocates RX acquisition static buffer
rc=mxfRxAcqBufferAlloc(rxChannel, rxBufferSize, &rxBuffer, NULL);
// Host buffer allocation
if(!rc)
{
rxHostBuffer = (MXF_HDLC_DATAREC*) calloc(1, rxBufferSize);
if(!rxHostBuffer)
rc = MAXT_ERROR_MEM;
}
}
// Starts the acquisition process
if (!rc)
rc = mxfRxAcqStart(rxBuffer, MXF_RXACQ_FLAG_DEFAULT, 0, 0);
...
if(!rc)
{
printf("Receiving ...\n");
// Reads rx buffer
rc = mxfHDLCRxAcqRead(rxBuffer, 0, rxBufferSize, &rxAcqStatus, &msgCount, &byteCount, rxHostBuffer);
}
if(!rc)
printf("String received count = %llu \n", msgCount);
if(!rc)
{
uint64 iRec,
iData;
MXF_HDLC_DATAREC *p=rxHostBuffer;
// Displays received strings
printf("\n");
for(iRec=0; iRec < msgCount; iRec++)
{
printf("%03llu %010llu 0x%08x %02u ", iRec, p->timeTag, p->control, p->dataSize);
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");
}
}
// Stops acquisition
if(!rc)
rc = mxfRxAcqStop(rxBuffer);
...
Updated 10/23/2023