#include "example.h"
#define BUFFER_SIZE     4096 // 4KB
#define MAX_TX_RECORDS_TO_TRANSMIT 4
uint32 ReadAcquisitionData(HMXF_BUFFER rxBuffer, 
MXF_A708_DATAREC* rxHostBuffer);
uint32 WaitQueueEmpty(HMXF_BUFFER txBuffer);
uint32 StartAperiodicTransmissionDefault(HMXF_BUFFER txBuffer, 
MXF_A708_DATAREC* txHostBuffer);
uint32 StartAperiodicTransmissionAbsolute(HMXF_DEVICE device, HMXF_BUFFER txBuffer, 
MXF_A708_DATAREC* txHostBuffer);
uint32 StartAperiodicTransmissionRecordAbsolute(HMXF_DEVICE device, HMXF_BUFFER txBuffer, 
MXF_A708_DATAREC* txHostBuffer);
uint32 StartAperiodicTransmissionRecordRelative(HMXF_BUFFER txBuffer, 
MXF_A708_DATAREC* txHostBuffer);
int main(void)
{
uint32 rc;
HMXF_SERVER  server;
HMXF_DEVICE  device=0;
HMXF_MODULE  module=0;
uint64 moduleCount=0, channelCount=0;
HMXF_CHANNEL rxChannel=0;
HMXF_CHANNEL txChannel=0;
HMXF_BUFFER  rxBuffer=0;
HMXF_BUFFER  txBuffer=0;
size_t       txBufferSize=0;
size_t       rxBufferSize=0;
uint64 dev, mod, port;
   
   
#ifdef LOCAL
#else
#endif
   if (rc)
   {
      printf("Failed to connect; rc=0x%08x", rc);
      printf("\nPress a key to terminate\n");
      getchar();
      return 0;
   }
   
   if (!rc)
   {
      printf("Starting ...\n");
   }
   
   if (!rc)
   
   if (!rc)
   
   if(!rc && !moduleCount)
      rc = MAXT_ERROR_NOT_FOUND;
   
   if (!rc)
   {
      if (rc == MAXT_ERROR_NOT_SUPPORTED) 
         rc = MAXT_SUCCESS;
   }
   
   if(!rc)
   
   if (!rc)
   
   #ifdef LOOPBACK
   if(!rc)
   #endif
   
   if(!rc)
   {
      txBufferSize = 4*1024;
      
      
      if(!rc)
      {
         if(!txHostBuffer)
            rc = MAXT_ERROR_MEM;
      }
   }
   
   if(!rc)
   {
      rxBufferSize = 4*1024;
      
      
      if(!rc)
      {
         if(!rxHostBuffer)
            rc = MAXT_ERROR_MEM;
      }
   }
   
   if(!rc)
   
   
   if (!rc)
   {
      if (!rc)
         printf("Acquisition Channel (RX) location=%llu.%llu.%llu\n", dev, mod, port);
   }
   if (!rc)
   {
      if (!rc)
         printf("Transmitter Channel (TX) location=%llu.%llu.%llu\n", dev, mod, port);
   }
    
   if (!rc)
   if (!rc)
   if (!rc)
   {
      
      rc = StartAperiodicTransmissionDefault(txBuffer, txHostBuffer);
      if (!rc)
         rc = ReadAcquisitionData(rxBuffer, rxHostBuffer);
      if (!rc)
         rc = StartAperiodicTransmissionAbsolute(device, txBuffer, txHostBuffer);
      if (!rc)
         rc = ReadAcquisitionData(rxBuffer, rxHostBuffer);
      if (!rc)
         rc = StartAperiodicTransmissionRecordAbsolute(device, txBuffer, txHostBuffer);
      if (!rc)
         rc = ReadAcquisitionData(rxBuffer, rxHostBuffer);
      if (!rc)
         rc = StartAperiodicTransmissionRecordRelative(txBuffer, rxHostBuffer);
      if (!rc)
         rc = ReadAcquisitionData(rxBuffer, rxHostBuffer);
   }
   
   
   if(!rc)
   
   if (rxBuffer)
   if (txBuffer)
   if(txHostBuffer)
      free(txHostBuffer);
   if(rxHostBuffer)
      free(rxHostBuffer);
   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 ReadAcquisitionData(HMXF_BUFFER rxBuffer, 
MXF_A708_DATAREC* rxHostBuffer)
{
uint64 status, msgsCount, bytesCount;
uint32 rc=0;
   
   
   printf("Receiving ...\n");
   rc = 
mxfA708RxAcqRead(rxBuffer, 0, BUFFER_SIZE, &status, &msgsCount, &bytesCount, rxHostBuffer);
   if(!rc)
      printf("String received count = %llu \n", msgsCount);
   
   if(!rc)
      DisplayDataArray(msgsCount, rxHostBuffer);
   
   if(rc)
      printf("Acquisition read failed; rc=0x%08x\n\r", rc);
return rc;
}
uint32 WaitQueueEmpty(HMXF_BUFFER txBuffer)
{
uint64 msgCount, usedBytes, freeBytes;
uint32 rc;
   
   
   do
   {
      if (rc)
         return rc;
   }while(msgCount !=0 );
 
   
   
   return MAXT_SUCCESS;
}
uint32 StartAperiodicTransmissionDefault(HMXF_BUFFER txBuffer, 
MXF_A708_DATAREC* txHostBuffer)
{
uint64 data, word;
uint32 rc=0;
uint32 delay100ms = 100000000;
   
   
   
   printf("\nAperiodic transmission (Relative Start Time-Default)\n");
   
   for(data=0; data<MAX_TX_RECORDS_TO_TRANSMIT; data++)
   {
      for(word=0; word < rec->
dataSize/2; word++)
 
      {
         switch(word)
         {
         case 0:
            break;
         case 1:
         case 2:
         case 3:
            rec->
data[word] = 0x0000;
            break;
         default:
            rec->
data[word] = (uint16)(0x0101*data);
         }
      }
   }
   
     
   if(!rc)
   {
      printf("Transmitting ...\n");
      
      rc = 
mxfA708TxAperiodicWrite(txBuffer, MXF_TXAPERIODIC_FLAG_DEFAULT, delay100ms, MAX_TX_RECORDS_TO_TRANSMIT, txHostBuffer);
   }
   
   if (!rc)
      rc = WaitQueueEmpty(txBuffer);
   
   return rc;
}
uint32 StartAperiodicTransmissionAbsolute(HMXF_DEVICE device, HMXF_BUFFER txBuffer, 
MXF_A708_DATAREC* txHostBuffer)
{
uint32 rc;
uint32 delay100ms = 100000000;
uint64 currentTime;
uint64 data, word;
   
   
   if (rc)
      return rc;
   
   
   
   
   
   printf("\nAperiodic transmission (Absolute)\n");
   if(!rc)
   {
      
      for(data=0; data<MAX_TX_RECORDS_TO_TRANSMIT; data++)
      {
         for(word=0; word < rec->
dataSize/2; word++)
 
         {
            switch(word)
            {
            case 0:
               break;
            case 1:
            case 2:
            case 3:
               rec->
data[word] = 0x0000;
               break;
            default:
               rec->
data[word] = (uint16)(0x0101*data);
            }
         }
      }
   }
   
      
    
   
   if(!rc)
   {
      printf("Transmitting ...\n");
      rc = 
mxfA708TxAperiodicWrite(txBuffer, MXF_TXAPERIODIC_FLAG_ABSOLUTE_START_TIME, currentTime+delay100ms, MAX_TX_RECORDS_TO_TRANSMIT, txHostBuffer);
   }
   
  
   if (!rc)
      rc = WaitQueueEmpty(txBuffer);
   
   return rc;
}
uint32 StartAperiodicTransmissionRecordAbsolute(HMXF_DEVICE device, HMXF_BUFFER txBuffer, 
MXF_A708_DATAREC* txHostBuffer)
{
uint64 currentTime;
uint32 rc;
uint64 data, word;
   
   
   
   
   
   
   printf("\nAperiodic transmission (Absolute with timetag)\n");
   
   
   if (rc)
      return rc;
   
   currentTime+=100000000;
   
   
      
      
      
   if(!rc)
   {
      
      for(data=0; data<MAX_TX_RECORDS_TO_TRANSMIT; data++)
      {
         rec->
timeTag      = currentTime+(data*5000000);
         for(word=0; word < rec->
dataSize/2; word++)
 
         {
            switch(word)
            {
            case 0:
               break;
            case 1:
            case 2:
            case 3:
               rec->
data[word] = 0x0000;
               break;
            default:
               rec->
data[word] = (uint16)(0x0101*data);
            }
         }
      }
   }
   
      
   
   if(!rc)
   {
      printf("Transmitting ...\n");
      rc = 
mxfA708TxAperiodicWrite(txBuffer, MXF_TXAPERIODIC_FLAG_USE_RECORD_ABSOLUTE_TIME, 0, MAX_TX_RECORDS_TO_TRANSMIT, txHostBuffer);
   }
   
   
   if (!rc)
      rc = WaitQueueEmpty(txBuffer);
   
   return rc;
}
uint32 StartAperiodicTransmissionRecordRelative(HMXF_BUFFER txBuffer, 
MXF_A708_DATAREC* txHostBuffer)
{
uint64 currentTime;
uint32 rc=0;
uint64 data, word;
   
   
   
   
   
   
   printf("\nAperiodic transmission (Record Relative)\n");
   
   
      
      
      
   if(!rc)
   {
      
      for(data=0, currentTime=100000000; data<MAX_TX_RECORDS_TO_TRANSMIT; data++)
      {
         rec->
timeTag      = currentTime+(data*5000000);
         for(word=0; word < rec->
dataSize/2; word++)
 
         {
            switch(word)
            {
            case 0:
               break;
            case 1:
            case 2:
            case 3:
               rec->
data[word] = 0x0000;
               break;
            default:
               rec->
data[word] = (uint16)(0x0101*data);
            }
         }
      }
   }
   
      
   
   if(!rc)
   {
      printf("Transmitting ...\n");
      rc = 
mxfA708TxAperiodicWrite(txBuffer, MXF_TXAPERIODIC_FLAG_USE_RECORD_RELATIVE_TIME, 0, MAX_TX_RECORDS_TO_TRANSMIT, txHostBuffer);
   }
   
   if (!rc)
      rc = WaitQueueEmpty(txBuffer);
   
   return rc;
}
{
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");
   }
}