110 lines
3.1 KiB
C#
110 lines
3.1 KiB
C#
using UnityEngine;
|
|
using System.Collections.Generic;
|
|
using System;
|
|
using System.Runtime.InteropServices;
|
|
|
|
public class OmniManager
|
|
{
|
|
private const ushort vendor_id_omni = 0x29eb;
|
|
private const ushort product_id_omni = 0x00ff;
|
|
|
|
private IntPtr hidapi_handle;
|
|
|
|
private byte[] inputBuf = new byte[65];
|
|
private byte[] outputBuf = new byte[65];
|
|
|
|
public bool omniDisconnected = true;
|
|
|
|
|
|
public bool FindOmni()
|
|
{
|
|
Debug.Log(System.DateTime.Now.ToLongTimeString() + ": OmniManager(FindOmni) - Trying to find the Omni");
|
|
ushort vendor = 0;
|
|
ushort product = 0;
|
|
|
|
vendor = vendor_id_omni;
|
|
product = product_id_omni;
|
|
|
|
IntPtr ptr = HIDapi.hid_enumerate(vendor, product);
|
|
IntPtr cur_ptr = ptr;
|
|
|
|
if (ptr == IntPtr.Zero)
|
|
return false;
|
|
|
|
hid_device_info enumerate = (hid_device_info)Marshal.PtrToStructure(ptr, typeof(hid_device_info));
|
|
|
|
bool found = false;
|
|
|
|
while (cur_ptr != IntPtr.Zero)
|
|
{
|
|
IntPtr handle = HIDapi.hid_open_path(enumerate.path);
|
|
|
|
if (enumerate.path.Contains("mi_04"))
|
|
{
|
|
hidapi_handle = handle;
|
|
HIDapi.hid_set_nonblocking(hidapi_handle, 1);
|
|
found = true;
|
|
omniDisconnected = false;
|
|
break;
|
|
}
|
|
|
|
if (enumerate.path.Contains("mi_00"))
|
|
{
|
|
hidapi_handle = handle;
|
|
HIDapi.hid_set_nonblocking(hidapi_handle, 1);
|
|
found = true;
|
|
omniDisconnected = false;
|
|
break;
|
|
}
|
|
|
|
cur_ptr = enumerate.next;
|
|
if (cur_ptr != IntPtr.Zero)
|
|
enumerate = (hid_device_info)Marshal.PtrToStructure(cur_ptr, typeof(hid_device_info));
|
|
}
|
|
HIDapi.hid_free_enumeration(ptr);
|
|
|
|
Debug.Log(System.DateTime.Now.ToLongTimeString() + ": OmniManager(FindOmni) - Result of trying to find the Omni = " + found);
|
|
return found;
|
|
}
|
|
|
|
public void Cleanup()
|
|
{
|
|
if (hidapi_handle != IntPtr.Zero)
|
|
{
|
|
HIDapi.hid_close(hidapi_handle);
|
|
hidapi_handle = IntPtr.Zero;
|
|
}
|
|
}
|
|
|
|
public int ReadData(ref byte[] packet)
|
|
{
|
|
if (omniDisconnected) //if disconnected, don't do anything
|
|
return -2;
|
|
|
|
if (hidapi_handle == IntPtr.Zero) return -2;
|
|
|
|
Array.Clear(inputBuf, 0, 65);
|
|
|
|
HIDapi.hid_read(hidapi_handle, inputBuf, new UIntPtr(Convert.ToUInt32(inputBuf.Length)));
|
|
|
|
|
|
if(inputBuf[0] != 0xEF) //Checking for invalid message
|
|
{
|
|
Debug.LogError(System.DateTime.Now.ToLongTimeString() + ": OmniManager(ReadData) - The Omni has been diconnected and is no longer being detected.");
|
|
omniDisconnected = true;
|
|
Cleanup();
|
|
}
|
|
|
|
if (inputBuf[2] == 169) // hex A9
|
|
{
|
|
packet = new byte[inputBuf[1]];
|
|
Buffer.BlockCopy(inputBuf, 0, packet, 0, inputBuf[1]);
|
|
} else
|
|
{
|
|
return -2; //pods off or write data
|
|
}
|
|
|
|
return inputBuf[1];
|
|
}
|
|
}
|