Navdy, a company that was briefly popular for attempting to make a decent aftermarket HUD, has been out of business for years. Their hardware, however, continues to thrive, thanks to many enthusiasts who are putting in the work to maintain and update all necessary software.
Our small part is publishing some details about the BLE communication that happens between the main HUD unit and the remote/dial as well as info on how to build/emulate your own dial.
BLE Services and Characteristics
The dial uses quite a few services, listed below.
Generic Access
PRIMARY SERVICE | |
Device Name | |
UUID | 0x2A00 |
Properties | READ |
Value | Navdy Dial (ACFE) |
Descriptors | |
Characteristic User Description | |
UUID | 0x2901 |
Value | Device Name |
Appearance | |
UUID | 0x2A01 |
Properties | READ |
Value | [961] Keyboard (HID subtype) |
Descriptors | |
Characteristic User Description | 0x2901 |
Device Information
PRIMARY SERVICE | |
Manufacturer Name String | |
UUID | 0x2A29 |
Properties | READ |
Value | Navdy |
Descriptors | |
Characteristic User Description | |
UUID | 0x2901 |
Value | Manufacturer Name |
Model Number String | |
UUID | 0x2A24 |
Properties | READ |
Value | RM1 |
Descriptors | |
Characteristic User Description | |
UUID | 0x2901 |
Value | Model Number |
Serial Number String | |
UUID | 0x2A25 |
Properties | READ |
Value | NONE |
Descriptors | |
Characteristic User Description | |
UUID | 0x2901 |
Value | Serial Number |
PNP ID | |
UUID | 0x2A50 |
Properties | READ |
Value | USB Implementer’s Forum Vendor ID: 34456 (0x8698) |
Descriptors | |
Characteristic User Description | |
UUID | 0x2901 |
Value | PNP ID |
Hardware Revision String | |
UUID | 0x2A27 |
Properties | READ |
Value | 3 |
Descriptors | |
Characteristic User Description | |
UUID | 0x2901 |
Value | Hardware Revision String |
Firmware Revision String | |
UUID | 0x2A26 |
Properties | READ |
Value | /HEAD/7f55534 |
Descriptors | |
Characteristic User Description | |
UUID | 0x2901 |
Value | Firmware Revision String |
System ID | |
UUID | 0x2A23 |
Properties | READ |
Value | (0x) FE-AC-EF-FF-FE-80-07-00 |
Descriptors | |
Characteristic User Description | |
UUID | 0x2901 |
Value | System ID |
Battery Service
Primary Service | |
Battery Level | |
UUID | 0x2A19 |
Properties | NOTIFY, READ |
Value | 100% |
Descriptors | |
Client Characteristics Configuration | |
UUID | 0x2902 |
Value | Battery Level |
Temperature | |
UUID | 0x2A6E |
Properties | READ |
Value | 56.82C |
Descriptors | |
Characteristic User Description | |
UUID | 0x2901 |
Value | Temperature |
Unknown | |
UUID | 40cc0c40-3caa-11e6-b55c-0002a5d5c51c |
Properties | NOTIFY, READ |
Value | (0x) BD – 19 |
Descriptors | |
Client Characteristics Configuration | |
UUID | 0x2902 |
Value | Notifications and indications disabled |
Characteristic User Description | |
UUID | 0x2901 |
Value | Raw Battery Level |
Firmware Update Service
Unknown Service | |
UUID | 1d14d6ee-fd63-4fa1-bfa4-8f47b42119f0 |
Unknown Characteristic | |
UUID | f7bf3564-fb6d-4e53-88a4-5e37e0326063 |
Properties | WRITE |
Unknown Characteristic | |
UUID | 98227f3-34fc-4045-a5d0-2c581f81a153 |
Properties | WRITE NO RESPONSE |
Unknown Characteristic | |
UUID | 1fe0485c-7cd8-4ca9-8685-bf1a90c40789 |
Properties | NOTIFY |
Descriptors | |
Client Characteristic Configuration | |
UUID | 0x2902 |
Value | Notifications and indications disabled |
Characteristic User Description | |
UUID | 0x2901 |
Value | OTA chunk received confirmation |
Unknown Characteristic | |
UUID | e6a23c46-0820-475f-b9d6-29983bcec717 |
Properties | READ |
Value | 46-45-62-20-32-33-20-32-30-31-37-20-31-36-3a-35-32-3a-33-34, “Feb 23 2017 16:52:34” |
Descriptors | |
Characteristic User Description | |
UUID | 0x2901 |
Value | OTA build timestamp |
Unknown Characteristic | |
UUID | 2a9e7517-f977-4775-a993-b827ae0fff34 |
Properties | READ |
Value | 36-30, “60” |
Descriptors | |
Characteristic User Description | |
UUID | 0x2901 |
Value | OTA incremental version |
Unknown Characteristic | |
UUID | 87c72b94-46fc-44ae-bd8d-d307bceb3b9f |
Properties | WRITE |
Descriptors | |
Characteristic User Description | |
UUID | 0x2901 |
Value | Clear pairing request |
Unknown Characteristic | |
UUID | 87c72b00-46fc-44ae-bd8d-d307bceb3b9f |
Properties | WRITE |
Descriptors | |
Characteristic User Description | |
UUID | 0x2901 |
Value | Reboot |
HID Service
UUID | 0x1812 |
PRIMARY SERVICE | |
Report | |
UUID | 0x2A4D |
Properties | NOTIFY, READ |
Descriptors | |
Clinet Characteristics Configuration | |
UUID | 0x2902 |
Report Reference | |
UUID | 0x2908 |
Report | |
UUID | 0x2A4D |
Properties | READ, WRITE, WRITE NO RESPONSE |
Descriptors | |
Report Reference | |
UUID | 0x2908 |
Report | |
UUID | 0x2A4D |
Properties | READ, WRITE |
Descriptors | |
Report Reference | |
UUID | 0x2908 |
Report Map | |
UUID | 0x2A4B |
Properties | READ |
HID Information | |
UUID | 0x2A4A |
Properties | READ |
HID Control Point | |
UUID | 0x2A4C |
Properties | WRITE NO RESPONSE |
Boot Keyboard Input Report | |
UUID | 0x2A22 |
Properties | NOTIFY, READ |
Value | 00-00-00-00-00-00-00-00 |
Descriptors | |
Client Characteristic Configuration | 0x2902 |
Value | notifrications disabled |
Boot Keyboard Output Report | |
UUID | 0x2A32 |
Properties | READ, WRITE, WRITE NO RESPONSE |
Protocol Mode | |
UUID | 2A4E |
Properties | READ, WRITE NO RESPONSE |
Value | Report Protocol Mode |
Unknown Characteristic | |
UUID | 40cc0c40-3caa-11e6-b55c-0002a5d5c51b |
Properties | READ |
Value | 0x01 |
Descriptors | |
Characteristic User Description | |
UUID | 0x2901 |
Value | HID host ready Notofication |
Building Your Own Dial
If you took a close look at the services above, you probably noticed the Navdy dial uses a HID service. This service is used to transfer commands between the dial and the main unit. Let’s not get ahead of ourselves though. How do you even make your own ahrdware?
Picking Hardware
Sure, you could build everything from scratch, but why not start with something that already offers most of the features you need. In this case, you are looking for a microcontroller, or BLE peripheral that can double as a HID device, in various roles. Specifically, you would need a MCU/peripheral that can put out a generic HID keyboard service.
Pairing
Thankfully, Navdy kept it simple and didn’t implement any secrets that needed deciphering. Once you have your hardware ready and HID service running, make sure the GAP Device Name is set to “Navdy Dial (ACFE)“. The dial will pair without issues by initiating pairing from the HUD.
But hey, what about all the other services? Sure, you can emulate the battery service (180F) and make sure the HUD doesn’t complain about low dial battery. The other services (firmware update, etc.) are not necessary. The HUD will put some errors in a log, but nothing consequential.
Sending Commands
The Navdy dial has 3 functions: left, right and click. These are all accomplished by sending HID Control Key commands:
Left: 0x45
Right: 0x44
Click: 0x43
We recommend keeping commands at least 150ms apart to avoid any confusion/corruption in the BLE communication between the dial and HUD. However, this may vary greatly, based on the hardware you are using.
Are there other commands? Sure, but we’ll let you figure those out.
Navdy App Debug
Can’t you remote control the HUD from the Navdy app though (debug section)? Yes you can. However, that won’t help you if you are trying to build your own dial, or integrate a completely different device/controller with the Navdy HUD, like we did.
Happy building and coding. Leave us a comment if you build your own device. We’re always happy to see other creations in action.