MX Foundation 4
ipm_async_rs485_9bit.c
/*****************************************************************************
//
// File:
// ipm_async_rs485_9bit.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 the usage ASYNC 9-bit on IPM-ASYNC.
//
// Hardware requirements:
// - MAXT 500 series carrier with IPM-ASYNC
//
*****************************************************************************/
#include "example.h"
#define MAX_TX_RECORDS_TO_TRANSMIT 128
#define LOOPBACK
int main(void)
{
uint32 rc;
HMXF_SERVER server=0;
HMXF_DEVICE device=0;
HMXF_MODULE module=0;
HMXF_CHANNEL rxChannel=0;
HMXF_CHANNEL txChannel=0;
HMXF_BUFFER rxBuffer=0;
HMXF_BUFFER txBuffer=0;
MXF_ASYNCEH_9BIT_DATAREC recTX[MAX_TX_RECORDS_TO_TRANSMIT];
uint64 moduleCount=0;
uint64 channelCount=0;
size_t txBufferSize=0;
size_t rxBufferSize=0;
uint64 rxAcqStatus=0;
uint64 msgCount=0;
uint64 byteCount=0;
uint32 rec;
uint32 data;
// Connect to services and initialize environment
rc = mxfServerConnect("0.0.0.0", "", "", FALSE, &server);
// Initialize MX Foundation library
if (!rc)
{
printf("Starting ...\n");
rc = mxfSystemInit(server);
}
// Get the device handle
if (!rc)
rc = mxfSystemDeviceGet(server, 0, &device);
// Get handle of first IPM-ASYNC module
if (!rc)
rc = mxfDeviceModuleAllGet(device, MXF_MODULE_ASYNC, 1, &moduleCount, &module);
// Get handle of first IPM-ASYNC RX channel
if(!rc)
rc = mxfModuleChannelAllGet(module, MXF_CLASS_ASYNC_ENHANCED, MXF_SCLASS_RX_CHANNEL, 1, &channelCount, &rxChannel);
// Get handle of first IPM-ASYNC TX channel
if(!rc)
rc = mxfModuleChannelAllGet(module, MXF_CLASS_ASYNC_ENHANCED, MXF_SCLASS_TX_CHANNEL, 1, &channelCount, &txChannel);
// Enable loopback
#ifdef LOOPBACK
if(!rc)
rc = mxfAttributeUint64Set(rxChannel, KMXF_ASYNCEH_TX_RX_TEST_LB , VMXF_ENABLE);
#endif
// Allocate buffer for tx data
if(!rc)
{
txBufferSize = MAX_TX_RECORDS_TO_TRANSMIT*sizeof(MXF_ASYNCEH_9BIT_DATAREC);
// Allocate TX Aperiodic static buffer for HIGH priority queue
rc=mxfTxAperiodicBufferAlloc(txChannel, MXF_TXAPERIODIC_PRIORITY_HIGH, txBufferSize, &txBuffer, NULL);
}
// Allocate buffer for rx data
if(!rc)
{
rxBufferSize = MAX_TX_RECORDS_TO_TRANSMIT*sizeof(MXF_ASYNCEH_9BIT_DATAREC);
// Allocate RX acquisition static buffer
rc=mxfRxAcqBufferAlloc(rxChannel, rxBufferSize, &rxBuffer, NULL);
// Host buffer allocation
if(!rc)
{
recRX = (MXF_ASYNCEH_9BIT_DATAREC*) calloc(1, rxBufferSize);
if(!recRX)
rc = MAXT_ERROR_MEM;
}
}
// Set timebase to RTC usec
if(!rc)
rc = mxfSystemTimeBaseSet(server, MXF_TIMEBASE_DEVICE_USEC);
// Set electrical interface to RS-485 with 9 data bits + 1 stop bit
if(!rc)
rc=mxfAttributeUint64Set(txChannel, KMXF_ASYNCEH_ELECTRICAL_INTERFACE, VMXF_ASYNCEH_ELECTRICAL_INTERFACE_RS485);
if(!rc)
rc=mxfAttributeUint64Set(rxChannel, KMXF_ASYNCEH_PARITY, VMXF_ASYNCEH_PARITY_ODD);
if(!rc)
rc=mxfAttributeUint64Set(txChannel, KMXF_ASYNCEH_PARITY, VMXF_ASYNCEH_PARITY_ODD);
if(!rc)
rc=mxfAttributeUint64Set(rxChannel, KMXF_ASYNCEH_WORDSIZE, 9);
if(!rc)
rc=mxfAttributeUint64Set(txChannel, KMXF_ASYNCEH_WORDSIZE, 9);
if(!rc)
rc=mxfAttributeUint64Set(rxChannel, KMXF_ASYNCEH_STOPBITSIZE, 1);
if(!rc)
rc=mxfAttributeUint64Set(txChannel, KMXF_ASYNCEH_STOPBITSIZE, 1);
// Set RX & TX channels speed to 250 kbps
if(!rc)
rc=mxfAttributeUint64Set(rxChannel, KMXF_ASYNCEH_SPEED, 250000);
if(!rc)
rc=mxfAttributeUint64Set(txChannel, KMXF_ASYNCEH_SPEED, 250000);
// Start acquisition
if(!rc)
rc = mxfRxAcqStart(rxBuffer, MXF_RXACQ_FLAG_DEFAULT, 0, 0);
p = &recTX[0];
for(rec=0; rec<MAX_TX_RECORDS_TO_TRANSMIT && !rc; rec++)
{
p->timeTag = 0;
p->control = 0;
p->repeatCount = 1;
p->reserved = 0;
p->dataSize = 2+(rec*2);
for(data=0; data<p->dataSize/2; data++)
p->data[data] = (uint16)(data*4);
rc = mxfASYNCEH9BitTxAperiodicWrite(txBuffer, 0, 0, 1, p);
mxfSleep(10);
}
if(!rc)
{
mxfSleep(10);
printf("Receiving ...\n");
// Read rx buffer
rc = mxfASYNCEH9BitRxAcqRead(rxBuffer, 0, rxBufferSize, &rxAcqStatus, &msgCount, &byteCount, recRX);
}
if(!rc)
printf("String received count = %llu \n", msgCount);
if(!rc && (msgCount != MAX_TX_RECORDS_TO_TRANSMIT))
printf("Number of records transmited and received does not match");
if(!rc)
{
// Checks if received 9 bit data is as expected
p = recRX;
for(rec=0; rec<(uint32)msgCount && !rc; rec++)
{
for(data=0; data<p->dataSize/2; data++)
{
if((uint16)(data*4) != p->data[data])
printf(" %03u: Timetag=%012llu, Control=%04X\t Data[%u]=%03X\n", rec, p->timeTag, p->control, data, p->data[data]);
}
}
printf("\n\n");
}
// Stop acquisition
if(!rc)
rc = mxfRxAcqStop(rxBuffer);
// Free device and host buffers
if(recRX)
free(recRX);
if(rc)
{
char errorString[200];
if(mxfSystemErrorStringGet(server, rc, sizeof(errorString), errorString))
sprintf (errorString,"ERROR # 0x%X", rc);
printf("%s\n\r", errorString);
}
printf("Terminating ...\n");
// Unload MX Foundation library
// Disconnect from MX Foundation library
printf("\nPress a key to terminate\n");
getchar();
return 0;
}
Updated 10/23/2023