MX Foundation 4
flexdio_sync.c
/******************************************************************************
//
// File:
// flexdio_sync.c
//
// Copyright (c) MAX Technologies Inc. 1988-2022, All Rights Reserved.
// CONFIDENTIAL AND PROPRIETARY INFORMATION WHICH IS THE
// PROPERTY OF MAX TECHNOLOGIES INC.
//
// This example demonstrates how to synchronise sampling across two
// FlexMAX DIO.
//
// Hardware requirements:
// - MAXT FlexMAX with two FlexMAX DIO module.
//
*******************************************************************************/
#include "example.h"
//#define LOCAL
int main(void)
{
uint32 rc;
uint64 channelCount=0;
HMXF_SERVER server;
HMXF_DEVICE device=0;
HMXF_CHANNEL io[2]={0};
HMXF_BUFFER bufferRx[2]={0};
uint32 rxBufferSize=0;
MXF_FLEXDIO_DATAREC* rxBuffer=NULL;
char errorString[200];
uint64 chn;
uint64 pin;
int loop;
uint64 timer;
uint64 status, msgCount, byteCount, msg;
// Connect to services and initialize environment
#ifdef LOCAL
rc = mxfServerConnect("0.0.0.0", "", "", FALSE, &server);
#else
rc = mxfServerConnect("192.168.0.1", "admin", "admin", FALSE, &server);
#endif
// Initialize MX Foundation library
if(!rc)
{
printf("Starting ...\n");
rc = mxfSystemInit(server);
}
// Get handle of discrete channel
if(!rc)
rc = mxfChannelAllGet(server, MXF_CLASS_FLEXDIO, MXF_SCLASS_ALL, MXF_MODULE_ALL, 2, &channelCount, io);
if(!rc && (channelCount != 2))
rc = MAXT_ERROR_NOT_FOUND;
if(!rc)
rc = mxfSystemTimeBaseSet(server, MXF_TIMEBASE_DEVICE_USEC);
if(!rc)
rc = mxfChannelInfoGet(io[0], &device, NULL);
if(!rc)
{
rc = mxfDeviceTimerGet(device, &timer);
if(!rc)
timer += 250*1000;
}
for(chn=0; chn<channelCount && !rc; chn++)
{
if (!rc)
rc = mxfAttributeUint64Set(io[chn], KMXF_FLEXDIO_RX_FIFO_MODE, VMXF_FLEXDIO_RX_FIFO_MODE_SAMPLING);
if (!rc)
rc = mxfAttributeUint64Set(io[chn], KMXF_FLEXDIO_RX_SAMP_PERIOD, 1000000);
// Configure all 64 pins as input with pull-up
for (pin = 0; pin<64 && !rc; pin++)
{
rc = mxfFlexDIOModeSet(io[chn], pin, MXF_FLEXDIO_MODE_IN_PULLUP);
}
// Allocate 10KB buffer for rx data
if(!rc)
{
rxBufferSize = 10*1024;
// Device allocation
rc = mxfRxAcqBufferAlloc(io[chn], rxBufferSize, &bufferRx[chn], NULL);
// Host allocation
if(!rc && !rxBuffer)
{
rxBuffer = (MXF_FLEXDIO_DATAREC*)malloc(rxBufferSize);
if(!rxBuffer)
rc = MAXT_ERROR_MEM;
}
}
if(!rc)
rc = mxfFlexDIORxSamplingSync(io[chn], 100*1000, timer);
// Start acquisition
if(!rc)
rc = mxfRxAcqStart(bufferRx[chn], MXF_RXACQ_FLAG_DEFAULT, 0, 0);
}
// wait 3 seconds
for(loop=0; loop<3 && !rc; loop++)
{
mxfSleep(1000);
for (chn = 0; chn<channelCount && !rc; chn++)
{
rc = mxfFlexDIORxAcqRead(bufferRx[chn], 0, rxBufferSize, &status, &msgCount, &byteCount, rxBuffer);
rxRec = rxBuffer;
for (msg = 0; msg<msgCount && !rc; msg++)
{
printf("[%"PRIu64"] - %"PRIu64": 0x%016"PRIx64"\n\r", chn, rxRec->timeTag, rxRec->data);
rc = mxfFlexDIONextDataRecordPtrGet(rxRec, &rxRec);
}
}
}
// Stop acquisition
for (chn = 0; chn<channelCount && !rc; chn++)
{
rc = mxfRxAcqStop(bufferRx[chn]);
// Clear acquisition
if(!rc)
rc = mxfRxAcqClear(bufferRx[chn]);
if (bufferRx[chn])
mxfRxAcqBufferFree(bufferRx[chn]);
}
if(rxBuffer)
free(rxBuffer);
if(rc)
{
if(mxfSystemErrorStringGet(server, rc, sizeof(errorString), errorString))
sprintf (errorString,"ERROR # 0x%08X", rc);
printf("%s\n\r", errorString);
}
// Unload MX Foundation library
printf("\nPress a key to terminate\n");
getchar();
return rc;
}
Updated 10/23/2023