This file describes my findings so far. This document is WPI (I wouldn't bet my life on it), but it's a start on analyzing the protocol to at least get started.
08
- A data packet from the host to the mouse00
- A data packet from the mouse to the host
It seems that the second byte is for choosing which command to send (at least from the host to the mouse).
08 01
- Send setting to08 02
- Read setting???08 05
- ???08 06
- Change something related to Lightning08 08
- ???08 09
- ???08 0d
- ???
08 01 07 00 xx
- Change Angle snapping, where xx is for enable or disable angle snapping (0 or 1)08 01 (21-23 & 1e) 00 xx xx
- Change DPI setting. See the "Changing DPI Settings" section
08 02 13
- Read the firmware version, in which the mouse will respond with00 02 00 XX YY ZZ
, Where XX, YY, and ZZ are the version number in hex, corresponding to the sub-version. For example, if firmware version is 1.16.107, we expect XX to be 0x01, YY to be 0x10, and ZZ to be 0x6B.
The following command must be sent by the host to change the polling rate:
08 01 01 00 XX
, where XX is:
- 01 for 125Hz/8ms
- 02 for 250Hz/4ms
- 03 for 500Hz/2ms
- 04 for 1000Hz/1ms
After the command has been sent to the mouse, it will respond with the following packet:
00 01
. Then, it will reset and reconnecting it in software is required.
The 4 packets are sent to the host to change the DPI, which goes as follows:
08 01 21 00 XX XX
08 01 22 00 YY YY
08 01 23 00 DD DD
08 01 1e 00 PP 00
Where:
- XX XX: The x-axis DPI for the current profile (in reverse, so 1800(0x0708) would be
08 07
) - YY YY: The y-axis DPI for the current profile (in reverse)
- DD DD: It seems like this is some default DPI, as it sends the x-axis dpi of the first level (even if it's disabled).
- PP: The current DPI level (0, 1, or 2)
Also to note, the last 2 packets get sent about 2 seconds after the first 2. I can't seem to find a reason for it
While the Icue software is open, I had it preview the colors on the GUI and recorded the packets with Wireshark (and saved the data as IronclawWireless_While_Icue_Open_Color_Change_All_1.json
). The logo was switching between light-blue and yellow, the scrollwheel was switching between red and blue, and the front of the mouse was switching between green and purple. From then, I am passing the packets thru a Python script that plots each settable color place/area on the mouse on a graph. The colors are stored as a RGB bytes in different locations, so I combine them in Python to recreate the colors. Here are the screenshots for that finding:
After analyzing the data, I conclude that each 'LED' packet looks like the following:
08 06 01 12 00 00 00 LOGO-R SCROLL-R FRONT-R DPI-L-R DPI-M-R DPI-T-R LOGO-G SCROLL-G FRONT-G DPI-L-G DPI-M-G DPI-T-G LOGO-B SCROLL-B FRONT-B DPI-L-B DPI-M-B DPI-T-B
Where COLOR is the diffrent RGB bytes for each section of the mouse, such as:
- SCROLL-x is the scroll wheel's LEDs
- LOGO-x is the logo's LEDs
- FRONT-x is the front of the mouse's LEDs
- DPI-L-x is the button DPI LED's color
- DPI-M-x is the middle DPI LED's color
- DPI-T-x is the top DPI LED's color
The mouse seems to always respond with the following packet after a color has been set:
00 06
Interestingly, the packets don't different if the color is set in "Lightning Effects" and "Hardware Lightning", where the host will still seem to command the mouse during "Hardware Lightning" mode, which in my opinion is a waste of resources.