Closed haemka closed 1 year ago
Thank you for all the detail.
If someone is able to reverse engineer the device, I can help to implement it in Rivalcfg :)
What do you need? I can probably do some USB packet traces from a Windows 10 QEMU VM. Do you have a sepcific test schema/plan I could work with?
Yes I need some packet capture.
While capturing packets, you have to change one setting at time in the SSE3 and match the changed setting with captured packets.
I wrote articles about that on my blog (they are in French but Google Translate should help):
Here is an example of of the work done for the Aerox 3 Wireless:
As it is a Wireless mouse, the work must be done twice:
(ProductID and commands are a bit different in wired and wireless modes)
:)
So, I finally found the time to look into this. This is what I got so far: https://gist.github.com/haemka/45f135661090438518fbd97a64dde52f
But I'm having a really hard time, finding any hint at battery levels. I was able to reproduce your reverse engineering process of battery levels for my Arctis 7 but that does not seem to help with this mouse. The protocol seems to communicate battery levels in another way. In some reddit comments I found out, that newer mouses such as the Aerox 3 and Prime Wireless never showed battery percentage but only 3-bar-levels in SSE3.
Maybe you (@flozz) or @gort818 could give me some pointers, where to look for this last missing piece?
Edit: Unknown but maybe interesting captured packets are listed, here: https://gist.github.com/haemka/45f135661090438518fbd97a64dde52f#otherunknown-packets
Hello !
I started working on the Prime Wireless.
Currently I implemented DPI, Polling Rate and Color in wired mode:
SteelSeries Prime Wireless (wired mode) Options:
-s SENSITIVITY, --sensitivity SENSITIVITY
Set sensitivity preset (DPI) (up to 5 settings, from 100 dpi to
18000 dpi, default: '400, 800, 1200, 2400, 3200')
-p POLLING_RATE, --polling-rate POLLING_RATE
Set polling rate (Hz) (values: 125, 250, 500, 1000, default: 1000)
-c COLOR, --color COLOR
Set the mouse LED color (e.g. red, #ff0000, ff0000, #f00, f00,
default: red)
-r, --reset Reset all settings to their factory default
Can someone test it works? The work is in the prime-wireless
branch :)
Update:
-b BUTTONS_MAPPING, --buttons BUTTONS_MAPPING
Set the mapping of the buttons (default: buttons(button1=button1;
button2=button2; button3=button3; button4=button4; button5=button5;
button6=dpi; scrollup=scrollup; scrolldown=scrolldown;
layout=qwerty))
:)
Thanks for your work!
So far everything listed above seems to work.
Only shortcoming (not sure if that's intended) I realized is, that I can't use the dpi-Button to cycle through sensitivity. The button seems to only switch to the next higher level until the highest level is reached. From there on a reset of sensitivity levels or full settings reset is needed, which will also re-select the lowest level from where "upwards selection" is possible again.
@haemka for the dpi button, its behavior is implemented by the mouse firmware so I cannot do anything for this :/
I get some info about reading the battery level so I added it:
--battery-level Print the battery level of the mouse and exit
can someone test this too? :)
can someone test this too? :)
$ sudo rivalcfg --battery-level
Discharging [= ] 15 %
;)
I added Sleep Timer and Dim Timer:
-t SLEEP_TIMER, --sleep-timer SLEEP_TIMER
Set the IDLE time before the mouse goes to sleep mode (minutes, 0 =
disable) (from 0 to 20, default: 5)
-T DIM_TIMER, --dim-timer DIM_TIMER
Set the IDLE time before the mouse light is dimmed (seconds, 0 =
disable) (from 0 to 1200, default: 30)
If someone can confirm it works before I merge this to master
:)
Note: I will not implement brightness setting (as it is already possible to do this using a darker color). I will not implement smart mode neither for now.
Sleep timer seems to work. At least when testing with 1 minute (-t 1
).
Dim timer seems to behave somewhat strange. But I'm pretty sure this is the default for this device as I haven't seen any other behavior since I got it. Regardless of the setting the LED will light up bright for about half a second when the mouse is moved and dims afterwards. If movement persists the LED keeps turned off.
I recorded a short video of the behavior: https://youtu.be/Iane0guFExI
Hum... Is it possible that the smart mode disable the light when moving? Maybe 0x01
enables it instead of disabling it?
EDIT: Can you try to change rivalcfg/devices/prime_wireless_wired.py:102
from
"command": [0x23, 0x0F, 0x01, 0x01],
to
"command": [0x23, 0x0F, 0x01, 0x00],
?
Hum The timing is probably wrong too, I forget a byte ... Can you also try with
"command": [0x23, 0x0F, 0x01, 0x01, 0x00],
and
"command": [0x23, 0x0F, 0x01, 0x00, 0x00],
"command": [0x23, 0x0F, 0x01, 0x00],
Stops turning off the LED on movement. But does not change any timings
"command": [0x23, 0x0F, 0x01, 0x01, 0x00],
Turns the LED off on movement and dims immediately after stopping (same behavior as before).
"command": [0x23, 0x0F, 0x01, 0x00, 0x00],
Lights up on movement and dims after the specified amount of seconds. This seems right.
But that "accidental implementation" of smart mode (which I had probably always enabled and didn't remember) was also nice. :)
Thank you, I fixed the implementation :)
This mouse is now supported by Rivalcfg v4.6.0 :)
Function wise very similar to the normal Prime mouse, which was added through PR #169, but wireless.
Webpage: https://steelseries.com/gaming-mice/prime-wireless
Wireless mode (1038:1840)
(Wired mode is below)
kern.log:
lsusb:
Wired mode (1038:1842)
kern.log:
lsusb:
Logs generated on: