MX Foundation 4
Basic Transmission

The basic transmission method consists of sending one or more data records on the data bus and does not care about any timing considerations between the records.

This is the most basic method of sending data. The example below shows all the steps required to build a basic CSDB transmission function.

  • How to initialize and set a transmit channel was discussed in a previous section.
  • Allocate the specific aperiodic buffer for transmission
  • Build the data record.
    • The time tag is set to 0 : transmit as soon as possible.
    • The repeat count is set to 1 : the record will be not be repeated.
  • Finally, mxfCSDBTxAperiodicWrite() with MXF_TXAPERIODIC_FLAG_DEFAULT flag must be used.

Example

csdb_aperiodic.c

#define BUFFER_SIZE 4096 // 4KB
#define MAX_TX_RECORDS_TO_TRANSMIT 8
#define BLOCKCOUNT 6
HMXF_SERVER server;
HMXF_CHANNEL txChannel;
HMXF_BUFFER txBuffer=0;
HMXF_CSDB_DATAREC *recCsdb=NULL;
HMXF_CSDB_DATAREC *rec;
uint32 record;
uint64 delay100ms = 100000;
uint32 rc;
...
// Set timebase to 64-bit microseconds
if (!rc)
rc = mxfSystemTimeBaseSet(server, MXF_TIMEBASE_DEVICE_USEC);
// Allocates Aperiodic TX static buffer for HIGH priority queue
if (!rc)
rc = mxfTxAperiodicBufferAlloc(txChannel, MXF_TXAPERIODIC_PRIORITY_HIGH, BUFFER_SIZE, &txBuffer, NULL);
// Allocate host buffer
if (!rc)
{
recCsdb = (MXF_CSDB_DATAREC*)malloc(BUFFER_SIZE);
if (!recCsdb)
rc = MAXT_ERROR_MEM;
}
// Set the record
rec = recCsdb;
for (record=0; record < MAX_TX_RECORDS_TO_TRANSMIT && !rc; record++)
{
if(record == 0)
{
// Set sync block
rec->timeTag = 0;
rec->control = 0;
rec->repeatCount = 1;
rec->reserved = 0;
for(dataIdx=0; dataIdx<BLOCKCOUNT; dataIdx++)
rec->data[dataIdx] = 0xA5;
}
else
{
// Set each record: LABEL=5, SI=1
rec->timeTag = 0;
rec->control = 0;
rec->repeatCount = 1;
rec->reserved = 0;
rec->data[0] = 5;
rec->data[1] = 1;
for(dataIdx=2; dataIdx<BLOCKCOUNT; dataIdx++)
rec->data[dataIdx] = (uint8)(0x11*record);
}
}
// Transmits the array of records
if (!rc)
rc = mxfCSDBTxAperiodicWrite(txBuffer, MXF_TXAPERIODIC_FLAG_DEFAULT, delay100ms, MAX_TX_RECORDS_TO_TRANSMIT, recCsdb);
if (recCsdb)
free(recCsdb);
...
Updated 10/23/2023