[New Device] AULA F99 Keyboard
<!--When naming the support request please title the request as `[New Device] <Name of new device>` Please open one issue per device you would like to add--> ### Name of device: <!--Please put the name of the product, including manufacturer, beneath this line--> ### Link to manufacturer's product page: https://www.aulastar.com/gaming-keyboard/156.html ### Please select what type of device/interface the device uses: <!--Please select from one of the following This determines how the device connects to the PC--> ~"DeviceType::USB" <!--Please delete any lines that are not relevant--> ### ID information: <!--For PCI (GPU) devices we will need the Vendor ID, Device ID, Sub-Vendor ID and Sub-Device IDs To get the Device ID formation for a GPU on Windows run the following command in Powershell: wmic path Win32_VideoController get name,PNPDeviceID Linux this can be found using the terminal: lspci -d 1002: -nnvm | head -6 | tail -n 4 && lspci -d 10DE: -nnvm | head -6 | tail -n 4--> <!--For USB devices we will need the USB VID and PID Windows Powershell: gwmi Win32_USBControllerDevice |%{[wmi]($_.Dependent)} | Sort Manufacturer,Description,DeviceID | Ft -GroupBy Manufacturer Description,Service,DeviceID Linux Terminal: lsusb--> #### Wireless VID: 0x3554, PID: 0xfa09, Page: 0xff02, Usage: 0x0002 #### Wired VID: 0x258a, PID: 0x010c, Page: 0xff00, Usage: 0x0001 ### Please attach screenshots of the device's official control application here: <!--Screenshots of the official control software should show lists of supported modes, color selection, and zone/LED selection capabilities of the device's official software.--> ![image](/uploads/da0c4cf97c1398aa667010768c88e41d/image.png) ### Please attach device captures here: <!--If you have code examples from other projects please link them here or alternatively for information on how to capture device packets please refer to the wiki article https://gitlab.com/Dr_No/OpenRGB/-/wikis/OpenRGB-doesn%27t-have-my-device--> I have been able to capture only in wireless mode for now: [F99-7-keys-colorful-starts-with-blue.pcapng](/uploads/d28bf41daeb539e9a9e8cfe490081c3e/F99-7-keys-colorful-starts-with-blue.pcapng)[F99-7-keys-red.pcapng](/uploads/1cd429fe0e2598ae24a118dd220d4013/F99-7-keys-red.pcapng) [F99-handshake.pcapng](/uploads/4ed8cb8125ce16a30b4a68c0101fdfa1/F99-handshake.pcapng) [F99-red-full-keyboard-breathing.pcapng](/uploads/362029f58d4de9245fb9f311a3e18d8e/F99-red-full-keyboard-breathing.pcapng) [F99-red-sound-waves.pcapng](/uploads/e9c446c978870625e7e065b4b310f8f2/F99-red-sound-waves.pcapng) [F99-1-key-letter-u-rainbow.pcapng](/uploads/0e0b392696a266505897a671c39d965d/F99-1-key-letter-u-rainbow.pcapng) #### Procotol for wireless mode I managed to reverse engineer the led direct mode by running the "sound waves" tool of the official software. Packets have 20 bytes and go like this: | Byte(s) | Size | Group | Description | |---------|------|-------|-------------| | 0-4 | 5 | Header | Command and sequencing info | | 5-18 | 14 | Payload | The actual data | | 19 | 1 | CRC | Sum of bytes 0-18 & 0xFF | The header looks like this: | Byte | Field | Value | Description | |------|-------|-------|-------------| | 0 | Signature 1 | 0x13 | Static byte, part of the command signature. | | 1 | Signature 2 | 0x07, 0x05, 0x88 | Type of command. 0x05 gets the model ID and other data which I'm not sure what they are. 0x07 Is the first the software runs, don't know what it is either. **0x88 sends LED color information.** | | 2 | Total Packets | 0x01 - 0x0N | The total number of packets in this complete message. When the message is too big to fit a single packet, multiple packets will be sent. | | 3 | Packet Index | 0x00 - 0x0N-1 | The index of the current packet in the message. | | 4 | Mode & Data Length | Mode: 0x10, 0x20; Data Length: 0x0N | For setting colors, the mode can be 0x10 (individual LED colors) or 0x20 (full keyboard solid color). There other modes apparently, but I don't know much about them yet. N is the number of meaningful bytes in this packet's payload. So in a payload with only 5 bytes, this will be 0x15. | For example, to set the whole keyboard as red, you would send: `0x13, 0x88, 0x1, 0x0, 0x23, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbe` (1 packet, mode 0x20 (solid color), payload size of 3 bytes (just the color), color FF0000, padding, CRC) To set specific key colors, the payload goes like this: R,G,B,Count,Key,Key,Key... So for setting one single key in a specific color: `0x13, 0x88, 0x1, 0x0, 0x15, 0x0, 0x0, 0x8b, 0x1, 0x2c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x69` (1 packet, mode 0x10 (per-key color), payload size of 5 bytes, color 00008B, 1 key, key code (0x2c), padding, CRC) Example of message bigger than 20 bytes: `0x13, 0x88, 0x2, 0x0, 0x1e, 0x0, 0x1c, 0xe7, 0x6, 0x2b, 0x31, 0x26, 0x32, 0x27, 0x2d, 0x0, 0x9f, 0xff, 0x1, 0x6b` (2 packets, packet number 0, mode 0x10, payload size of 0x0e (14) bytes, color 001CE7, 6 keys, the 6 IDs, color 009FFF, 1 key, CRC) `0x13, 0x88, 0x2, 0x1, 0x11, 0x2c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdb` (2 packets, packet number 1, mode 0x10, payload size of 0x01 byte, key code 0x2c (continuation of last packet), padding, CRC) #### Getting device model ID: The OEM software sends this to get info about the device (basically just command 0x05 according to the above) `0x13, 0x5, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19` #### Input with model ID is: `0x13, 0x5, 0x1, 0x0, 0xa, 0x3, 0x0, 0x0, 0x0, 0x0, 0xa4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcb` where the 10th byte is the model ID. 0xa4 is Aula F99, 0xcd is Aula F75 (#4232), which means the IDs are the same as used in the wired protocol. SignalRGB supports the wired protocol and they have those same IDs in their Sinowealth plugin. I have a PoC for the solid color, that should work in a lot of other devices with the same wireless receiver in !3026, and another specific for Aula F99 in !3027. <!--For admin purposes: Please leave this section as is--> # Checklist for Step2 - [ ] Name of device - [ ] A link to the vendors product page has been included - [ ] The transport bus has been identified and the appropriate label added to the issue. - [ ] The device ID's have been included for [USB](https://gitlab.com/Dr_No/OpenRGB/-/wikis/USB-Vendor-Identification-and-Product-Identification) or PCI - [ ] Screenshots of the OEM Application are included - [ ] There is either, appropriate code examples linked or suitable device captures attached <!--For admin purposes: Please leave this section as is-->
issue