diff --git a/ProtocolTests.sln b/ProtocolTests.sln index a87f23b..b02463c 100644 --- a/ProtocolTests.sln +++ b/ProtocolTests.sln @@ -9,7 +9,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UsbHidTestApp", "UsbHidTest EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UdpTestApp", "UdpTestApp\UdpTestApp.csproj", "{97751007-78CC-4356-9F17-F118BA9297FB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpTestApp", "TcpTestApp\TcpTestApp.csproj", "{AFDCE6F1-D0E8-42DA-B0D9-201958AC0BAD}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TcpTestApp", "TcpTestApp\TcpTestApp.csproj", "{AFDCE6F1-D0E8-42DA-B0D9-201958AC0BAD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UsbHidTestApp_libusb", "UsbHidTestApp_libusb\UsbHidTestApp_libusb.csproj", "{7610FE08-8496-46D7-9044-29BFEAAC4C81}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -33,6 +35,10 @@ Global {AFDCE6F1-D0E8-42DA-B0D9-201958AC0BAD}.Debug|Any CPU.Build.0 = Debug|Any CPU {AFDCE6F1-D0E8-42DA-B0D9-201958AC0BAD}.Release|Any CPU.ActiveCfg = Release|Any CPU {AFDCE6F1-D0E8-42DA-B0D9-201958AC0BAD}.Release|Any CPU.Build.0 = Release|Any CPU + {7610FE08-8496-46D7-9044-29BFEAAC4C81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7610FE08-8496-46D7-9044-29BFEAAC4C81}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7610FE08-8496-46D7-9044-29BFEAAC4C81}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7610FE08-8496-46D7-9044-29BFEAAC4C81}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/UsbHidTestApp_libusb/Program.cs b/UsbHidTestApp_libusb/Program.cs new file mode 100644 index 0000000..d3b1ab0 --- /dev/null +++ b/UsbHidTestApp_libusb/Program.cs @@ -0,0 +1,178 @@ +using HidApi; +using System.Text; + +namespace UsbHidTestApp_libusb; + +internal class Program +{ + private static HidApi.Device? _device; + private static bool _continue; + private static Thread? readThread; + private static IEnumerable? lastDevices; + private static StringComparer stringComparer = StringComparer.OrdinalIgnoreCase; + + public static bool applicationQuitRequested { get; private set; } + + + static void Main(string[] args) + { + while (applicationQuitRequested == false) + { + Console.WriteLine($"----- USB HID PROTOCOL TEST APP -----"); + Console.WriteLine($"Command list:"); + Console.WriteLine($"l = list devices"); + Console.WriteLine($"c = connect"); + Console.WriteLine($"q = quit"); + + var key = Console.ReadKey(); + + switch (key.Key) + { + // list devices + case ConsoleKey.L: + var hidDevices = Hid.Enumerate(); + Console.WriteLine($"Following HID devices were found: {Environment.NewLine}"); + + foreach (var deviceInfo in hidDevices) + { + bool newDevice = false; + var device = deviceInfo.ConnectToDevice(); + if (lastDevices?.Where(x => x.Path == device.GetDeviceInfo().Path).Any() == false) + { + Console.ForegroundColor = ConsoleColor.Green; + newDevice = true; + } + Console.WriteLine($"-- VendorId: 0x{deviceInfo.VendorId.ToString("X4")}, ProductId: 0x{deviceInfo.ProductId.ToString("X4")}, Manufacturer: {deviceInfo.ManufacturerString}, Path:"); + Console.WriteLine($" {deviceInfo.Path}"); + if (newDevice) + { + Console.ForegroundColor = ConsoleColor.White; + } + } + + lastDevices = hidDevices; + + break; + + // connect + case ConsoleKey.C: + Console.Write($"Write device vendor id as hex: "); + string? vendorIdString = Console.ReadLine(); + ushort vendorId; + + if (vendorIdString == null || + vendorIdString == "" || + ushort.TryParse(vendorIdString, System.Globalization.NumberStyles.HexNumber, null, out vendorId) == false) + { + Console.WriteLine($"Invalid vendor ID entered."); + break; + } + + Console.Write($"Write product vendor id as hex: "); + string? productIdString = Console.ReadLine(); + ushort productId; + + if (productIdString == null || + productIdString == "" || + ushort.TryParse(productIdString, System.Globalization.NumberStyles.HexNumber, null, out productId) == false) + { + Console.WriteLine($"Invalid product ID entered."); + break; + } + + _device = new Device(vendorId, productId); + if (_device == null) + { + Console.WriteLine("Could not find device."); + break; + } + + _continue = true; + readThread = new Thread(Read); + readThread.Start(); + + var devInfo = _device.GetDeviceInfo(); + Console.WriteLine($"Connected to device VendorId: 0x{devInfo.VendorId.ToString("X4")}, ProductId: 0x{devInfo.ProductId.ToString("X4")}, Manufacturer: {devInfo.ManufacturerString}."); + Console.WriteLine("Write 'quit' to end communication."); + + while (_continue) + { + var message = Console.ReadLine(); + + if (stringComparer.Equals("quit", message)) + { + _continue = false; + } + else + { + byte[] msgBytes = Encoding.ASCII.GetBytes(message!); + List listBytes = new List(); + listBytes.Add((byte)' '); // temp fix for first sign wrong + listBytes.AddRange(msgBytes); + listBytes.Add((byte)'\n'); + _device.Write(listBytes.ToArray()); + } + } + + readThread.Join(); + readThread = null; + _device.Dispose(); // "close" + Console.WriteLine("Closed connection to device."); + + + break; + + // quit + case ConsoleKey.Q: + applicationQuitRequested = true; + break; + + default: + Console.WriteLine($"{Environment.NewLine}Did not recognize key.. {Environment.NewLine}"); + break; + } + + + } + + Hid.Exit(); //Call at the end of your program + + } + + public static void Read() + { + while (_continue) + { + try + { + ReadOnlySpan readData = null; + if(_device != null) + { + readData = _device.Read(1000); + } + else + { + Thread.Sleep(20); + } + + if (readData != null && readData.IsEmpty == false) + { + string print = Encoding.UTF8.GetString(readData); + //print = print.Replace("\r", "").Replace("\n", ""); // Newline Mode: none + //print = print.Replace("\r", ""); // Newline Mode: only print \n + //print = print.Replace("\0", ""); // delete null chars + if (String.IsNullOrEmpty(print) == false) + { + Console.WriteLine(print); + } + } + } + catch (HidException hidex) + { + Console.WriteLine($"Got HidException, device likely disconnected: {hidex}"); + Console.WriteLine($"Write 'quit' to end"); + _continue = false; + } + } + } +} \ No newline at end of file diff --git a/UsbHidTestApp_libusb/UsbHidTestApp_libusb.csproj b/UsbHidTestApp_libusb/UsbHidTestApp_libusb.csproj new file mode 100644 index 0000000..e22808c --- /dev/null +++ b/UsbHidTestApp_libusb/UsbHidTestApp_libusb.csproj @@ -0,0 +1,26 @@ + + + + Exe + net6.0 + enable + enable + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + + + + + diff --git a/UsbHidTestApp_libusb/hidapi.dll b/UsbHidTestApp_libusb/hidapi.dll new file mode 100644 index 0000000..55a11e9 Binary files /dev/null and b/UsbHidTestApp_libusb/hidapi.dll differ diff --git a/UsbHidTestApp_libusb/hidapi.lib b/UsbHidTestApp_libusb/hidapi.lib new file mode 100644 index 0000000..c8dd7f7 Binary files /dev/null and b/UsbHidTestApp_libusb/hidapi.lib differ