using System;
using static MAXT.MXFoundation.mxf;
using System.Runtime.InteropServices;
using System.Text;
namespace DevelopmentAPICSharp
{
class canbus
{
const int BUFFER_SIZE = (512 * 1024);
const int MAX_TX_RECORDS_TO_TRANSMIT = 8;
static void Main(string[] args)
{
UInt32 rc;
UInt64 server;
UInt64 device = 0;
var module = new UInt64[1];
UInt64 count = 0;
var channel = new UInt64[2];
UInt64 rxBuffer = 0;
UInt64 txBuffer = 0;
IntPtr recCanbus = IntPtr.Zero;
UInt64 status, txErrorCnt, rxErrorCnt;
int chn;
#if LOCAL
#else
rc =
mxfServerConnect(
"192.168.0.1",
"admin",
"admin", Convert.ToUInt64(
false), out server);
#endif
if (rc != MAXT_SUCCESS)
{
Console.WriteLine("Failed to connect; rc=0x{0:x8}", rc);
Console.WriteLine("Press a key to terminate");
Console.Read();
return;
}
Console.WriteLine();
Console.WriteLine("Starting");
if (rc == MAXT_ERROR_ANOTHER_PROCESS_RUNNING)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if ((rc == MAXT_SUCCESS) && (count != 0))
if ((rc == MAXT_SUCCESS) && (count == 0))
rc = MAXT_ERROR_NOT_FOUND;
if (rc == MAXT_SUCCESS)
for (chn = 0; chn < 2 && (rc == MAXT_SUCCESS); chn++)
{
if (rc == MAXT_SUCCESS)
{
}
}
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
{
try
{
recCanbus = Marshal.AllocHGlobal(BUFFER_SIZE);
}
catch (OutOfMemoryException)
{
rc = MAXT_ERROR_MEM;
}
}
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
{
if (rc == MAXT_SUCCESS)
{
Console.WriteLine();
Console.WriteLine("Acquisition started");
}
}
if (rc == MAXT_SUCCESS)
{
rc = TXCanbusStartAperiodicTransmissionDefault(txBuffer, recCanbus);
if (rc == MAXT_SUCCESS)
rc = RXCanbusReadAcquisitionData(rxBuffer, recCanbus);
if (rc == MAXT_SUCCESS)
rc = TXCanbusStartAperiodicTransmissionAbsolute(device, txBuffer, recCanbus);
if (rc == MAXT_SUCCESS)
rc = RXCanbusReadAcquisitionData(rxBuffer, recCanbus);
if (rc == MAXT_SUCCESS)
rc = TXCanbusStartAperiodicTransmissionRecordAbsolute(device, txBuffer, recCanbus);
if (rc == MAXT_SUCCESS)
rc = RXCanbusReadAcquisitionData(rxBuffer, recCanbus);
if (rc == MAXT_SUCCESS)
rc = TXCanbusStartAperiodicTransmissionRecordRelative(txBuffer, recCanbus);
if (rc == MAXT_SUCCESS)
rc = RXCanbusReadAcquisitionData(rxBuffer, recCanbus);
}
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
{
if (rc == MAXT_SUCCESS)
{
Console.WriteLine();
Console.WriteLine("Acquisition stopped");
}
}
for (chn = 0; chn < 2 && (rc == MAXT_SUCCESS); chn++)
{
if (rc == MAXT_SUCCESS)
{
StringBuilder sb = new StringBuilder();
if ((status & MXF_CANBUS_BUS_STATUS_ERROR_OFF) == MXF_CANBUS_BUS_STATUS_ERROR_OFF)
sb.Append("OFF (Error)");
else if ((status & MXF_CANBUS_BUS_STATUS_ERROR_PASSIVE) == MXF_CANBUS_BUS_STATUS_ERROR_PASSIVE)
sb.Append("Error Passive");
else if ((status & MXF_CANBUS_BUS_STATUS_ON) == MXF_CANBUS_BUS_STATUS_ON)
sb.Append("ON");
else
sb.Append("OFF");
Console.WriteLine("txErrorCnt={0}, rxErrorCnt={1}, status={2}", txErrorCnt, rxErrorCnt, sb);
}
if (rc == MAXT_SUCCESS)
{
if (rc == MAXT_SUCCESS)
{
Console.WriteLine("txFrame={0}, rxFrame={1}, txArbLost={2}, rxFrameError={3}", stats.txFrame, stats.rxFrame, stats.txArbLost, stats.rxFrameError);
}
}
}
if (rc != MAXT_SUCCESS)
{
StringBuilder buffer = new StringBuilder(256);
buffer.Append(string.Format("ERROR # 0x{0:x8}", rc));
Console.WriteLine(buffer);
}
Console.WriteLine();
Console.WriteLine("Terminating");
for (chn = 0; chn < 2; chn++)
if (rxBuffer != 0)
if (txBuffer != 0)
if (recCanbus != IntPtr.Zero)
Marshal.FreeHGlobal(recCanbus);
Console.WriteLine();
Console.WriteLine("Press enter to terminate");
Console.Read();
return;
}
private static UInt32 RXCanbusReadAcquisitionData(UInt64 rxBuffer, IntPtr recCanbus)
{
IntPtr recPtr = recCanbus;
UInt64 status, msgsCount, bytesCount;
UInt64 index;
UInt32 rc, Byte;
rc =
mxfCanBusRxAcqRead(rxBuffer, 0, BUFFER_SIZE, out status, out msgsCount, out bytesCount, recCanbus);
for (index = 0; (index < msgsCount) && (rc == MAXT_SUCCESS); index++)
{
Console.Write(
" {0:D3}: Timetag={1:D12}, Size={2}", index, rec.
timeTag, rec.
dataSize);
Console.Write(" OK");
else
Console.Write(" Error");
Console.Write("\n Data=");
for (Byte = 0; Byte < rec.
dataSize; Byte++)
{
Console.Write(
"{0:x2} ", rec.
data[Byte]);
}
Console.WriteLine();
}
return rc;
}
private static UInt32 TXCanbusStartAperiodicTransmissionDefault(UInt64 txBuffer, IntPtr recCanbus)
{
IntPtr recPtr = recCanbus;
UInt32 record;
UInt64 delay100ms = 100 * 1000 * 1000;
UInt32 rc = 0;
UInt32 i;
Console.WriteLine();
Console.WriteLine("Aperiodic transmission (Relative Start Time-Default)");
for (record = 0; (rc == MAXT_SUCCESS) && (record < MAX_TX_RECORDS_TO_TRANSMIT); record++)
{
rec.
info = MXF_CANBUS_REC_INFO_EXTENDED | 8;
Marshal.StructureToPtr(rec, recPtr, false);
}
if (rc == MAXT_SUCCESS)
if (rc == MAXT_SUCCESS)
return rc;
}
private static UInt32 TXCanbusStartAperiodicTransmissionAbsolute(UInt64 device, UInt64 txBuffer, IntPtr recCanbus)
{
IntPtr recPtr = recCanbus;
UInt32 record, rc = 0;
UInt64 delay100ms = 100 * 1000 * 1000;
UInt64 currentTime;
UInt32 i;
if (rc != MAXT_SUCCESS)
return rc;
Console.WriteLine();
Console.WriteLine("Aperiodic transmission (Absolute)");
for (record = 0; (rc == MAXT_SUCCESS) && (record < MAX_TX_RECORDS_TO_TRANSMIT); record++)
{
if (record == 1)
{
rec.
control |= MXF_CANBUS_TX_REC_CTRL_ERROR_INJ | MXF_CANBUS_TX_REC_CTRL_SINGLE_SHOT;
}
rec.
info = MXF_CANBUS_REC_INFO_EXTENDED | 4;
Marshal.StructureToPtr(rec, recPtr, false);
}
if (rc == MAXT_SUCCESS)
rc =
mxfCanBusTxAperiodicWrite(txBuffer, MXF_TXAPERIODIC_FLAG_ABSOLUTE_START_TIME, currentTime + delay100ms, MAX_TX_RECORDS_TO_TRANSMIT, recCanbus);
if (rc == MAXT_SUCCESS)
return rc;
}
private static UInt32 TXCanbusStartAperiodicTransmissionRecordAbsolute(UInt64 device, UInt64 txBuffer, IntPtr recCanbus)
{
IntPtr recPtr = recCanbus;
UInt32 record;
UInt64 currentTime;
UInt32 rc = 0;
UInt32 i;
Console.WriteLine();
Console.WriteLine("Aperiodic transmission (Absolute with timetag)");
if (rc != MAXT_SUCCESS)
return rc;
currentTime += 100 * 1000 * 1000;
for (record = 0; (rc == MAXT_SUCCESS) && (record < MAX_TX_RECORDS_TO_TRANSMIT); record++)
{
rec.
timeTag = currentTime + ((record + 1) * 10 * 1000 * 1000);
rec.
info = MXF_CANBUS_REC_INFO_EXTENDED | 2;
Marshal.StructureToPtr(rec, recPtr, false);
}
if (rc == MAXT_SUCCESS)
rc =
mxfCanBusTxAperiodicWrite(txBuffer, MXF_TXAPERIODIC_FLAG_USE_RECORD_ABSOLUTE_TIME, 0, MAX_TX_RECORDS_TO_TRANSMIT, recCanbus);
if (rc == MAXT_SUCCESS)
return rc;
}
private static UInt32 TXCanbusStartAperiodicTransmissionRecordRelative(UInt64 txBuffer, IntPtr recCanbus)
{
IntPtr recPtr = recCanbus;
UInt32 record;
UInt64 currentTime;
UInt32 rc = 0;
UInt32 i;
Console.WriteLine();
Console.WriteLine("Aperiodic transmission (Record Relative)");
for (record = 0, currentTime = 100 * 1000 * 1000; (rc == MAXT_SUCCESS) && (record < MAX_TX_RECORDS_TO_TRANSMIT); record++)
{
rec.
timeTag = currentTime + ((record + 1) * 10 * 1000 * 1000);
Marshal.StructureToPtr(rec, recPtr, false);
}
if (rc == MAXT_SUCCESS)
rc =
mxfCanBusTxAperiodicWrite(txBuffer, MXF_TXAPERIODIC_FLAG_USE_RECORD_RELATIVE_TIME, 0, MAX_TX_RECORDS_TO_TRANSMIT, recCanbus);
if (rc == MAXT_SUCCESS)
return rc;
}
}
}