public NativeCAN() { handle = FRC_CAN_Reader_Native_Create(); readThread = new Thread(() => { var eventHandle = FRC_CAN_Reader_Native_GetEventHandle(handle); while (true) { int dataLen = 0; if (WPI_WaitForObjectTimeout(eventHandle, 1, &dataLen) != 0) { dataLen = 0; CANData *messages = FRC_CAN_Reader_Native_ReadMessages(handle, &dataLen); if (messages == null) { continue; } for (int i = 0; i < dataLen; i++) { CANData data = messages[i]; ulong ulongData = Unsafe.ReadUnaligned <ulong>(data.data); CANMessageReceived?.Invoke((uint)data.id, ulongData, data.length, (uint)data.timestamp); } } } }); readThread.IsBackground = true; readThread.Name = "CAN Managed Reader"; readThread.Start(); }
private static extern unsafe CANData *FRC_CAN_Reader_Native_FreeMessages(CANData *data, int dataLen);