#define LOCAL
using System;
using static MAXT.MXFoundation.mxf;
using System.Runtime.InteropServices;
using System.Text;
using System.IO;
namespace discrete_example
{
public struct EVENT_INFO
{
public UInt64 rxBufferSize;
public IntPtr rxHostBuffer;
}
class discrete_event_handler
{
static void Main(string[] args)
{
UInt32 rc;
UInt64 channelCount = 0;
UInt64 msgCount, pendingBytes, freeBytes;
UInt64 server;
var device = new UInt64[1];
var module = new UInt64[1];
var rx = new UInt64[1];
var tx = new UInt64[1];
UInt64 bufferRx = 0;
UInt64 bufferTx = 0;
UInt64 asyncEvent = 0;
MXF_ASYNCEVENT_HANDLER eventHandler = EventHandler;
EVENT_INFO eventInfo = new EVENT_INFO();
StringBuilder errorString = new StringBuilder();
UInt64 moduleType = 0;
UInt32 edge = 0x0010;
#if LOCAL
#else
#endif
if (rc == MAXT_SUCCESS)
{
Console.Write("Starting ...\n");
};
if (rc == MAXT_SUCCESS)
rc =
mxfChannelAllGet(server, MXF_CLASS_DISCRETE, MXF_SCLASS_RX_CHANNEL, MXF_MODULE_ALL, 1, out channelCount, rx);
if ((rc == MAXT_SUCCESS) && (channelCount > 0))
rc =
mxfChannelAllGet(server, MXF_CLASS_DISCRETE, MXF_SCLASS_TX_CHANNEL, MXF_MODULE_ALL, 1, out channelCount, tx);
if ((rc == MAXT_SUCCESS) && (channelCount == 0))
rc = MAXT_ERROR_NOT_FOUND;
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
{
if(moduleType == MXF_MODULE_DIOFIFO_EH)
{
edge = 0xffff;
#if LOOPBACK
if (rc == MAXT_SUCCESS)
#endif
}
else
{
}
}
if (rc == MAXT_SUCCESS)
{
eventInfo.rxBufferSize = 10 * 1024;
if (rc == MAXT_SUCCESS)
{
try
{
eventInfo.rxHostBuffer = Marshal.AllocHGlobal((int)eventInfo.rxBufferSize);
}
catch (OutOfMemoryException)
{
rc = MAXT_ERROR_MEM;
}
}
}
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
{
IntPtr eventInfoPtr = IntPtr.Zero;
try
{
eventInfoPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(EVENT_INFO)));
}
catch (OutOfMemoryException)
{
rc = MAXT_ERROR_MEM;
}
Marshal.StructureToPtr(eventInfo, eventInfoPtr, false);
}
if (rc == MAXT_SUCCESS)
{
condition[0].condID = MXF_ASYNCEVENT_COND_RXACQ_BUFFER_THRESHOLD;
condition[0].condition.txAperiodicBufferThreshold.almostEmpty = 5;
condition[0].condition.txAperiodicBufferThreshold.almostFull = 10;
condition[0].condition.txAperiodicBufferThreshold.buffer = bufferRx;
}
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
Console.Write("Acquisition started\n");
if (rc == MAXT_SUCCESS)
{
UInt32 pulseCount;
UInt64 timer = 0;
if (rc == MAXT_SUCCESS)
{
IntPtr dioRecBuffPtr = IntPtr.Zero;
try
{
}
catch (OutOfMemoryException)
{
rc = MAXT_ERROR_MEM;
}
if (rc == MAXT_SUCCESS)
for (pulseCount = 0; rc == MAXT_SUCCESS && pulseCount < 149 - 1; pulseCount++)
{
IntPtr recPtr = dioRecBuffPtr;
timer += (UInt64)100 * 1000 * 1000;
dioRec[0].repeatCount = 1;
dioRec[0].control = 0;
dioRec[0].timeTag = timer;
dioRec[0].edge = edge;
dioRec[0].data = 0x0010;
timer += 100 * 1000 * 1000;
dioRec[1].repeatCount = 1;
dioRec[1].control = 0;
dioRec[1].timeTag = timer;
dioRec[1].edge = edge;
dioRec[1].data = 0x0000;
Marshal.StructureToPtr(dioRec[0], recPtr, false);
if (rc == MAXT_SUCCESS)
Marshal.StructureToPtr(dioRec[1], recPtr, false);
if (rc == MAXT_SUCCESS)
if (rc != MAXT_SUCCESS)
Console.Write("mxfDiscreteTxAperiodicWrite() error; rc=0x{0:x8}, pulse count={1}\n", rc, pulseCount);
do
{
} while (msgCount != 0);
}
Marshal.FreeHGlobal(dioRecBuffPtr);
}
}
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
rc = ReadDiscreteInput(bufferRx, eventInfo);
Console.Write("\n");
if (eventInfo.rxHostBuffer != IntPtr.Zero)
Marshal.FreeHGlobal(eventInfo.rxHostBuffer);
if (rc != MAXT_SUCCESS)
{
Console.Write(" {0} ERROR # 0x{1:X8}", errorString, rc);
Console.Write("{0}\n\r", errorString);
}
if (bufferRx > 0)
{
if (rc != MAXT_SUCCESS)
Console.Write("Free buffer failed !\n\r");
}
if (bufferTx > 0)
{
if (rc != MAXT_SUCCESS)
Console.Write("Free buffer failed !\n\r");
}
Console.Write("\nPress a key to terminate\n");
Console.ReadKey();
return;
}
private static UInt32 EventHandler(UInt64 asyncEvent, IntPtr param)
{
UInt32 rc;
UInt64 count;
EVENT_INFO eventInfo = new EVENT_INFO();
eventInfo = (EVENT_INFO)Marshal.PtrToStructure(param, typeof(EVENT_INFO));
if (rc == MAXT_SUCCESS && count > 0)
{
if (pendingInfo[0].condID == MXF_ASYNCEVENT_COND_RXACQ_BUFFER_THRESHOLD)
{
rc = ReadDiscreteInput(pendingInfo[0].condition.rxAcqBufferThreshold.buffer, eventInfo);
Console.Write("+");
}
}
if (rc != MAXT_SUCCESS)
Console.Write("event handler rc=0x{0:x8}\n", rc);
return rc;
}
private static UInt32 ReadDiscreteInput(UInt64 bufferRx, EVENT_INFO eventInfo)
{
UInt32 rc;
UInt64 status, msgCount, byteCount, msg;
rc =
mxfDiscreteRxAcqRead(bufferRx, 0, eventInfo.rxBufferSize, out status, out msgCount, out byteCount, eventInfo.rxHostBuffer);
using (StreamWriter file = new StreamWriter("discrete_log.txt", true))
{
IntPtr rxRecPtr = eventInfo.rxHostBuffer;
for (msg = 0; msg < msgCount && rc == MAXT_SUCCESS; msg++)
{
file.WriteLine(String.Format(
"{0}: 0x{1:x4} 0x{2:x4}", rxRec.
timeTag, rxRec.
data, rxRec.
edge));
file.WriteLine();
}
}
return rc;
}
}
}