Android Gamepad Emulator Troubleshooting

Job ID: 40513852

Budget: $10 – $30 USD

My Kotlin-based Android app emulates a generic Xbox-style gamepad. It advertises itself as a Bluetooth LE HID GamePad and Windows happily pairs with it, requests InputReports, and even receives my packets—yet the data isn't being received by test programs. The frames appear to leave the phone intact, so something in the report composition, descriptor, or timing is clearly off. It is tantalizingly close, but I can't seem to "bring it over the finish line" and I need a fresh set of eyes to locate and correct the fault.

You’ll be working with clean, well-commented Kotlin code that is already broken into clear layers (BLE transport, HID descriptor construction, game-logic encoder, MVVM). The task is to trace why the InputReport that “looks” correct on the Android side and reports as being received by the Windows BLE host is not interpreted correctly on the Windows side I have been using for tests. It only needs to work with Windows 11.

What I need from you
• Identify the precise cause of the mis-processed InputReports.
• Implement the code or descriptor fix so Windows recognises control codes correctly.
• Each button click or joystick movement in the provided Android gamepad emulator must be reflected by the Windows GamePad test utility (Win-R: joy.cpl)

You should already be comfortable with Android BLE APIs, HID over GATT, report descriptors, and packet-level debugging tools such as nRF Connect, Wireshark with USBPcap, or similar. If you have developed a game controller and are comfortable developing in Kotlin on Android, you’ll feel right at home and this shouldn't take long.

I’ll supply the full Android Studio project and any capture logs you need as soon as we start. Once the fix lets Windows read every button and axis reliably, the job is done.

To bid on this project you must provide a link or description of a HID or gamepad project you previously worked on in your initial response. Responses without this information will be ignored to help filter out automated or unqualified responses. Thanks for your understanding.