Nfw.Linux.Hid
1.0.2
dotnet add package Nfw.Linux.Hid --version 1.0.2
NuGet\Install-Package Nfw.Linux.Hid -Version 1.0.2
<PackageReference Include="Nfw.Linux.Hid" Version="1.0.2" />
paket add Nfw.Linux.Hid --version 1.0.2
#r "nuget: Nfw.Linux.Hid, 1.0.2"
// Install Nfw.Linux.Hid as a Cake Addin #addin nuget:?package=Nfw.Linux.Hid&version=1.0.2 // Install Nfw.Linux.Hid as a Cake Tool #tool nuget:?package=Nfw.Linux.Hid&version=1.0.2
Nfw.Linux.Hid
A convenient library for outputting Keyboard and Mouse events via a Linux USB Gadget + OTG + /dev/hidX device.
NuGet
dotnet add package Nfw.Linux.Hid
Sample: Keyboard
using Nfw.Linux.Hid.Keyboard;
SimpleKeyboard keyboard = new SimpleKeyboard();
keyboard.EmitString("test");
You can also use methdos to toggle keys (i.e. 'hold down SHIFT'), send specific keys etc. SendKey
or the Events which can be sent via EmitEvent.
Sample: Mouse
using Nfw.Linux.Hid.Mouse;
SimpleMouse mouse = new SimpleMouse();
// Start at center
mouse.Center();
// Move diagonally from top left, to bottom right
for(int x = 0; x < SimpleMouse.MAX_X; x++) {
mouse.MoveTo(x,x);
Thread.Sleep(1);
}
Note additional methods for clicking, toggling (press-and-hold), etc are also available.
Sample: Joystick
using Nfw.Linux.Hid.Joystick;
string hidDevice = args.Count() > 0 ? args[0] : "/dev/hidg2";
SimpleJoystick joystick = new SimpleJoystick(hidDevice);
// First press them all one by one
for (byte buttonId = 0; buttonId <= SimpleJoystick.MAX_BUTTON_ID; buttonId++) {
joystick.UpdateButton(buttonId, true);
}
// Now release them all one by one
for (byte buttonId = 0; buttonId <= SimpleJoystick.MAX_BUTTON_ID; buttonId++) {
joystick.UpdateButton(buttonId, false);
}
// Press all the odd ones at the same time
joystick.UpdateButtons(new byte[] { 1, 3, 5, 7, 9, 11, 13, 15 }, true);
// And release them all at once
joystick.UpdateButtons(new byte[] { 1, 3, 5, 7, 9, 11, 13, 15 }, false);
References
- https://www.rmedgar.com/blog/using-rpi-zero-as-keyboard-setup-and-device-definition/
- https://www.elinux.org/images/e/ef/USB_Gadget_Configfs_API_0.pdf
- https://www.usb.org/sites/default/files/documents/hid1_11.pdf
- http://www.linux-usb.org/usb.ids
- https://github.com/tiny-pilot/tinypilot/blob/master/app/main.py
Attribution
- Keyboard icons created by Freepik - Flaticon
- Much inspiration, and OTG/HID setup code, from the TinyPilot project
Creating the HID devices
Creating the HID devices via USB Gadget is a bit out of scope for this library, but for reference, the method used by the author is included in the repo here. Only tested on rasbian-lite 32bit on a R-Pi4. Requires the dwc2 OTG driver/overlay:
echo "dtoverlay=dwc2" >> /boot/config.txt
echo "dwc2" >> /etc/modules
Then reboot, and run:
sudo ./init-usb-gadget.sh
sudo ./install-usb-gadget.sh
You should end up with /dev/hidg0, hidg1, hidg2 accordingly.
Note that the samples and code in this lib presume the use of the report descriptors from these scripts, i.e. a 8 byte keyboard report (2 status, 6 keys), a 7 byte mouse report, and an 11 byte joystick (16 buttons, 9 axis).
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net6.0
- Microsoft.Extensions.Logging (>= 6.0.0)
- morelinq (>= 3.3.2)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.