Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RIVAL 3 WIRELESS Support? #146

Open
SecretSQL opened this issue Oct 19, 2020 · 57 comments
Open

RIVAL 3 WIRELESS Support? #146

SecretSQL opened this issue Oct 19, 2020 · 57 comments

Comments

@SecretSQL
Copy link

I have a new RIVAL 3 WIRELESS mouse, which has both USB and Bluetooth support.
https://steelseries.com/gaming-mice/rival-3-wireless

I purchased it for the Bluetooth support. The mouse 'works' with both Bluetooth and USB.
I installed rivalcfg and see that the Rival 3 Wireless is not supported.
(Although I tried anyway. )

I am running a Debian derivative (Linux Mint 20).
When connected via the USB dongle, the USB device lsusb info is:
$ lsusb
ID 1038:1830 SteelSeries ApS SteelSeries Rival 3 Wireless

When connected via Bluetooth, lsusb does not list the device.
However hcitool lists the address:
$ hcitool con
Connections:
< LE 28:9A:4B:A0:B3:D9 handle 7 state 1 lm MASTER AUTH ENCRYPT

Any chance of adding the Rival 3 wireless to the supported devices?

I am willing to help, but would need pointers on reverse engineering. I have some python experience, and have had a quick look through your code base, which is very well organized.
Thanks.

@flozz
Copy link
Owner

flozz commented Oct 19, 2020

Hello,

Currently I am working on the Sensei TEN, and then I have to work on the Rival 500 and the Rival 650. Then I will ask SteelSeries for a Wireless Rival 3 to work on it.

I think this device will be supported in USB mode first, and maybe we will be able to support it in Bluetooth mode (but probably only on Linux, as the kernel's hidraw backend abstracts the communication part of HID devices).

@kosmiciatakuja
Copy link

Hi, I code in python everyday and I have the mouse in question. Is there any info on how to go about implementing a new mouse in your code, I would be happy to try creating a PR, if I can manage that. I guess the mouse has very similar capabilities to the wired rival 3 so at least the USB mode should be easy, I guess. Thanks for the great work anyway!

@FFY00
Copy link

FFY00 commented Jan 9, 2021

@flozz actually it should work OOTB if you are using hidapi with the hidraw backend, instead of the libusb one, which is the default in Linux for some reason. This is the case in Arch Linux for eg. It should be a matter of just adding the bluetooth IDs there.

@el1-x
Copy link

el1-x commented Feb 3, 2021

Keen to get this added as well. I have one and am happy to pass on anything required.

@flozz
Copy link
Owner

flozz commented Feb 4, 2021

@el1-x After installing Rivalcfg, can execute one of the following command (depending which python version your Rivalcfg installation is using):

sudo python -c "import hid;print(hid.enumerate())"
sudo python3 -c "import hid;print(hid.enumerate())"

and give me the output? :)

@el1-x
Copy link

el1-x commented Feb 4, 2021

Here is the output. I don't have python2 installed.
https://gist.github.com/el1-x/0ca999c2eff6f08783baa3ca45141a37

@flozz
Copy link
Owner

flozz commented Feb 4, 2021

Thank you.

Can you change 0x1824 by 0x1830 in the rivalcfg/devices/rival3.py file of your Rivalcfg installation:

And test if everything work?

NOTE¹: you may need to run rivalcfg as root as udev rules will not be up to date with this change
NOTE²: if you do not know where Rivalcfg is installed, be sure you have the v4.3.0 (released monday), and run the following command: rivalcfg --print-debug. It will tell you where the module is installed :)

@el1-x
Copy link

el1-x commented Feb 5, 2021

I'm using Arch and the AUR package is out of date. I just flagged it.

Update:
Making the changes specified provides more options when using --help as opposed to prior to the changes being made.
As of writing this i am yet to attempt to make any changes to the mouse configuration.

  • I made the change to rival3.py
  • Running rivacfg as a regular user did not work.
  • No errors when run as root.

Error when run as standard user

Traceback (most recent call last):
  File "/usr/bin/rivalcfg", line 33, in <module>
    sys.exit(load_entry_point('rivalcfg==4.2.0', 'console_scripts', 'rivalcfg')())
  File "/usr/lib/python3.9/site-packages/rivalcfg/__main__.py", line 45, in main
    mouse = get_first_mouse()
  File "/usr/lib/python3.9/site-packages/rivalcfg/__init__.py", line 27, in get_first_mouse
    return mouse.get_mouse(
  File "/usr/lib/python3.9/site-packages/rivalcfg/mouse.py", line 30, in get_mouse
    hid_device = usbhid.open_device(vendor_id, product_id, profile["endpoint"])
  File "/usr/lib/python3.9/site-packages/rivalcfg/usbhid.py", line 93, in open_device
    device.open_path(path)
  File "hidraw.pyx", line 74, in hid.device.open_path
OSError: open failed

Output from rivalcfg --list
SteelSeries Rival 3:

1038:1830 | SteelSeries Rival 3
1038:184c | SteelSeries Rival 3 (firmware v0.37.0.0)

Output from rivalcfg --help

SteelSeries Rival 3 Options:
  -s SENSITIVITY, --sensitivity SENSITIVITY
                        Set sensitivity preset (DPI) (up to 5 settings,
                        from 200 dpi to 8500 dpi, default: '800, 1600')
  -p POLLING_RATE, --polling-rate POLLING_RATE
                        Set polling rate (Hz) (values: 125, 250, 500,
                        1000, default: 1000)
  --strip-top-color Z1_COLOR, --z1 Z1_COLOR
                        Set the color of the top LED of the strip (e.g.
                        red, #ff0000, ff0000, #f00, f00, default: red)
  --strip-middle-color Z2_COLOR, --z2 Z2_COLOR
                        Set the color of the middle LED of the strip (e.g.
                        red, #ff0000, ff0000, #f00, f00, default: lime)
  --strip-bottom-color Z3_COLOR, --z3 Z3_COLOR
                        Set the color of the bottom LED of the strip (e.g.
                        red, #ff0000, ff0000, #f00, f00, default: blue)
  -c LOGO_COLOR, --logo-color LOGO_COLOR, --z4 LOGO_COLOR
                        Set the color of the logo LED (e.g. red, #ff0000,
                        ff0000, #f00, f00, default: purple)
  -e LIGHT_EFFECT, --light-effect LIGHT_EFFECT
                        Set the light effect (values: rainbow-shift,
                        breath-fast, breath, breath-slow, steady, rainbow-
                        breath, disco, default: steady)
  -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))
  -r, --reset           Reset all settings to their factory default

@flozz
Copy link
Owner

flozz commented Feb 5, 2021

Thank you @el1-x

  • For the AUR package, I forgot it... I will update it very soon :)
  • Running rivacfg as a regular user did not work, as expected (permission issue, you can try to run rivalcfg --update-udev as root to fix that ; a reboot may be required)
  • The --help option shows the Rival 3 options, as expected, but does it work (can you try to change de DPI, colors, etc to confirm it works?)

@flozz
Copy link
Owner

flozz commented Feb 5, 2021

(AUR package updated!)

@el1-x
Copy link

el1-x commented Feb 6, 2021

I have updated to the latest release via the AUR.

  • I had already tried running --update-dev but was unable to launch rivalcfg without root permissions.
  • However, since updating and performing a reboot --help performs as expected with regular user permissions.

I attempted to make a change to the polling rate and set it to 500. I assume because i received no error message that the change was successful. However, i checked the setting via the Steelseries Engine software and it was reporting the polling rate remained at 1000.

Here is the --print-debug output.

RIVALCFG
========
Version: 4.3.0
udev rules installed: True
udev rules up to date: True
Installation path: /usr/lib/python3.9/site-packages/rivalcfg

OPERATING SYSTEM
================
OS: Linux
Platform: Linux-5.10.13-arch1-1-x86_64-with-glibc2.32
Version: #1 SMP PREEMPT Wed, 03 Feb 2021 23:44:07 +0000
Distribution issue: Arch Linux \r (\l)

PYTHON
======
Python version: 3.9.1
HIDAPI version: 0.10.1

PLUGGED STEELSERIES DEVICES ENDPOINTS
=====================================
1038:1830 | 00 | SteelSeries Rival 3 Wireless (firmware v)
1038:1830 | 00 | SteelSeries Rival 3 Wireless (firmware v)
1038:1830 | 01 | SteelSeries Rival 3 Wireless (firmware v)
1038:1830 | 01 | SteelSeries Rival 3 Wireless (firmware v)
1038:1830 | 02 | SteelSeries Rival 3 Wireless (firmware v)
1038:1830 | 03 | SteelSeries Rival 3 Wireless (firmware v)

I have updated the firmware using Windows and the Steelseris Engine software.
Here is a screenshot of the software and available mouse settings. The Rival 3 Wireless is a no frills mouse so all of the RGB settings available for the standard Rival 3 are of no use.

steelseries-rival3w-engine

@flozz
Copy link
Owner

flozz commented Feb 6, 2021

For the DPI Settings, you will not be able to check them back in the SSE3. SSE3 will not read them from the mouse, it will just send the settings it saved on you HDD to the device when you plug it.

So to check the DPI, set the lowest available DPI to your mouse, move it (it should be slow), then set the maximum DPI and the cursor should move very quickly.


For colors... if there is no LED those options will not do anything... ^^'

→ I will implement this device as se separated mouse family to not have useless options :)


You can also check the button mapping setting:

rivalcfg --buttons "buttons(button5=A)"

Now the B5 of the mouse should correspond to the keyboard "A" button (of a QWERTY keyboard)

To reset this setting:

rivalcfg --buttons default

:)

@el1-x
Copy link

el1-x commented Feb 6, 2021

Neither adjusting the buttons, nor the DPI had any effect.

rivalcfg -b "buttons(button5=A)"
rivalcfg -s 2000

@flozz
Copy link
Owner

flozz commented Feb 6, 2021

OK... So this device will need some reverse engineering then...

@el1-x
Copy link

el1-x commented Feb 7, 2021

What do you need from me?

@flozz
Copy link
Owner

flozz commented Feb 23, 2021

Hello, sorry for the long time I took to answer...

If you are able to do some reverse engineering, it would help, else I will have to find an other way to work on this device :)

@el1-x
Copy link

el1-x commented Apr 2, 2021

Don't worry about taking time to answer, life gets in the way.
I'm just the same. What do you need me to do specifically? I will give you whatever information I can.

@flozz
Copy link
Owner

flozz commented Apr 2, 2021

I wrote articles about reverse engineering USB devices:

The articles are in French but Google Translate should help. I think it should not be too difficult to try on the Wireless Rival 3 using the USB dongle (I have no experience with the Bluetooth mode).

What you can do is to capture packets as described in the articles and post what you get here:

  • Change one parameter at time
  • capture the corresponding packet

so we will see what we can do :)

@GoboTheGeek
Copy link

Hi,

i've a problem with my new Rival 3 Wireless. After some days, wheel start blinking green (or yellow) and then stops. I've replaced batteries and it was ok for (may be) ten days. And then green blinking starts again and mouse stops working.
Any idea?

Thanks for your help

G.

@el1-x
Copy link

el1-x commented Aug 28, 2021

That is normal operation. The flashing green/yellow indicator lets you know the batteries are low. It will blink faster as the battery drains.
From my experience you'll never get the advertised 400hr battery life from the device, to extend it as far as possible you need to enable 'High Efficiency Mode' which disables all lighting and drops the polling rate to 125Hz.
This needs to be done using the Windows based software.

@tomaszg7
Copy link

What is your average battery life time? In my case it drains in about a week or so with several hours a day of use. It is without battery saving mode.

@el1-x
Copy link

el1-x commented Aug 28, 2021

My experience is the about the same as yours @tomaszg7

@GoboTheGeek
Copy link

It's hard to estimate battery life time but i'll say around 35 hours (approx. 15 days as i mainly use my computer on week-ends).
This mouse is not expensive to buy but if i need to change 1 battery set (or more) per month, it's a wreck and i'll have to think about changing it...

For now, i've set polling rate to 250.

@TheBready
Copy link

Hey, nice to see other people having the same needs. Any news on reverse engineering?

@TheBready
Copy link

I followed your manual and was tracking the data fragments for some things. Is this helpful?
I was not able to test it but I was able to reproduce it in Wireshark.

rival3w.txt

@flozz
Copy link
Owner

flozz commented Dec 13, 2021

Yes, it is very useful. Here what I learn for DPI and Polling rate with the data you provided:

Sensitivity

  • Range: 100 - 18000 dpi (00 00 - D6 00)

  • Increment: ??

  • Endianess: Little Endian?

  • First preset: 1

  • Max presets: 5

  • Packet:

    | 20      | 05           | 05            | 04 00 | 09 00 | 0d 00 | 12 00 | 17 00 |
    | Command | Preset count | Active preset | Prst1 | Prst2 | Prst3 | Prst4 | Prst5 |
    

Polling rate

  • Choice: 1k, 500, 250, 125 Hz (default: 1k)

  • Packet:

    | 17      | 00    |
    | Command | Value |
    
  • Values:

    • 0x00: 1 kHz
    • 0x01: 500 Hz
    • 0x02: 250 Hz
    • 0x03: 125 Hz

@TheBready
Copy link

The increments of the sensitivity are 100. If my math is correct then there are 180 levels. Is it possible to add a profile for the rival 3 wireless that? I would try it myself but I am not really used working with data like that. Would be a real hassle to get into.

@flozz
Copy link
Owner

flozz commented Dec 13, 2021

The sensor of the Rival 3 Wireless is the same as the one of the Aerox 3 Wireless (and Prime Wireless and Prime Mini Wireless too). So I already know it is not perfectly linear:

Capture d’écran de 2021-11-15 13-22-21

So we will be able have an increment of 50 dpi with a +/- 50 dpi of error margin:

Capture d’écran de 2021-11-16 13-01-48


I am currently working on the Rival 650, but I will try to start a branch with a minimal set of feature to let you test if it work :)

@TheBready
Copy link

TheBready commented Dec 13, 2021

That sounds great. I think +/- 50 dpi is nothing noticeable. Let me know when the branch is ready for testing.

Have this coffee.

@flozz
Copy link
Owner

flozz commented Dec 13, 2021

Thank you for the coffee ☕ :)


I implemented the sensitivity and the polling rate. But as the save command is missing, you will have to add the --no-save parameter to test:

python -m rivalcfg --no-save --sensitivity 100
python -m rivalcfg --no-save --sensitivity 400,800,1600
python -m rivalcfg --no-save --polling-rate 125
python -m rivalcfg --no-save --polling-rate 1000

You will find everything in the rival3-wireless branch, please test with various configuration to check if it works :)


I need to know what is the save command in order to have a minimal working profile. When you hit the "save" button of the SSE/GG Engine, what is the last packet sent to the device? (generally it is 09, but it is different on some devices)


Also this device seems to have a LED on the wheel, can you capture packets when you change the LED color?

@TheBready
Copy link

Thanks for creating the branch.
I can always see this data fragment after a command:
09000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
So it seems to be 0x09.

I can't see any commands when changing the LEDs when saving.

Changing the sensitivity is not working and tbh I don't know if the polling rate is changing.

@flozz
Copy link
Owner

flozz commented Dec 14, 2021

So it seems to be 0x09.

Ok, cool,

I can't see any commands when changing the LEDs when saving.

The LED probably changes in real time when you set a command (so it will not be sent again when you hit the "save" button)

Changing the sensitivity is not working

Hum... Maybe it is a matter of packet length or the repport type... Can you give me the values of the wValue and the wLength fields?

image

@TheBready
Copy link

TheBready commented Dec 14, 2021

Here I changed the sensitivity to Level 1 400 DPI:
image
The packets always appear with four.

For the LED are ten packets send. Here I switched to steady #ff0000:
image

@flozz
Copy link
Owner

flozz commented Dec 14, 2021

The packets always appear with four.

What did you mean?


I think I found why it not worked... I assumed that the command endpoint is the 0... but wIndex is 3... :)


  • Can you test if Sensitivity works now?
  • Also, "Save" should works too. Can you try to set a sensitivity, then unplug / replug the mouse to check it was saved?

@tomaszg7
Copy link

I can confirm that sensitivity now seems to work. However the settings seem to be saved even with --nosave option. I tried removing USB dongle and switching off the mouse but settings seem to persist.

@TheBready
Copy link

Yes, now it is working like a charm. Thanks a lot. To be honest that is enough for me. I don't need RGB. breathing red is all I need.
However, let me know if you need something else.
Will the change come to the AUR?

@flozz
Copy link
Owner

flozz commented Dec 15, 2021

Cool if it work \o/

I will continue to work on it a bit to try to support RGB and powering features. If it is too complicated, I may release a Rivalcfg version with a partial support for the device.

Will the change come to the AUR?

I completely forget I was now the maintainer of both AUR packages... I will try to update it by the end of the year... And I will try to update the package publishing, if it is possible.

@flozz
Copy link
Owner

flozz commented Dec 15, 2021

I found someone to lend me the mouse today, so I was able to study it a little more:

  • It has button binding that works almost the same than the ones of the Rival 650
  • It as scroll binding like the one of the Rival 650
  • The color packets looks the same as the ones of the Rival 650 (I will have some work on this as it is not yet supported by rivalcfg)
  • I found how powering options work (I just do not know why smart illumination are enabled sometime by 0x32 and other time by 0x64)

What I have not found yet is

  • How to get the battery level Edit: AA 01LL LL CC (where LL LL is the level (int 0-100, little endian) and CC the charging status (always discharging on this model))
  • How to get the Firmware number

image

@flozz
Copy link
Owner

flozz commented Dec 15, 2021

Button bindings are now working. :)

For example, the following command will make the left button write "q" (if the keyboard layout is QWERTY) instead of clicking:

rivalcfg -b "buttons(button1=q)"

To reset to default:

rivalcfg -b default

@TheBready
Copy link

That's awesome work!

@flozz
Copy link
Owner

flozz commented Dec 16, 2021

Battery level can now be read (--battery-level) and I added doc. I will not have time to do much more by the end of the year so I merged this initial support on master to have it in the next release :)

@tianleq
Copy link

tianleq commented Apr 19, 2022

I am a little bit confused here.

@el1-x After installing Rivalcfg, can execute one of the following command (depending which python version your Rivalcfg installation is using):

sudo python -c "import hid;print(hid.enumerate())"
sudo python3 -c "import hid;print(hid.enumerate())"

and give me the output? :)

I get nothing when connecting through bluetooth. So you assume using 2.4G here?

@flozz
Copy link
Owner

flozz commented Apr 19, 2022

@tianleq on Linux, the hidraw kernel module (that should be used by Rivalcfg on Linux) can access both USB and Bluetooth HID devices. If the previous command returns nothing when the mouse is connected with Bluetooth, Rivalcfg will not be able to support it (at least not through the hidraw backend).

I gave this command to check if there were something easy we can do to support the Rival 3 over Bluetooth, but it seems it is not the case.

@tianleq
Copy link

tianleq commented Apr 19, 2022

@flozz Thanks for the clarification.

@winteriscariot
Copy link

  • I found how powering options work

was this ever implemented? i go through a pair of batteries about once every week or two (rechargeable AAAs ftw) and i'm looking to try to improve this

@flozz
Copy link
Owner

flozz commented Nov 29, 2022

@winteriscariot No this is not implemented yet.

In the mean time, you can send the power configuration command to the mouse manually. Here is some Python code that does the trick:

#!/usr/bin/env python3

import rivalcfg

mouse = rivalcfg.get_first_mouse()
mouse._hid_write(data=[
    0x2B,
    0x01,        # High Efficiency (0x00 = OFF, 0x01 = ON)
    0x64,        # Smart illumination (0x00 = OFF, 0x32 or 0x64 = ON)
    0x2C, 0x01,  # Unknown
    0x2C, 0x01,  # Sleep timer (seconds, little endian)
                 #   0x3C, 0x00 =  1 min
                 #   0x78, 0x00 =  2 min
                 #   0xB4, 0x00 =  3 min
                 #   0xF0, 0x00 =  4 min
                 #   0x2C, 0x01 =  5 min
                 #   0xB4, 0x04 = 20 min
])
mouse.save()

@winteriscariot
Copy link

awesome, workarounds work too. thank you!

@faptaincrunch
Copy link

Was the RGB wheel ever figured out? The blinking orange kills me lol. Thanks

@flozz
Copy link
Owner

flozz commented Aug 17, 2023

@faptaincrunch No the RGB of the wheel is not implemented but it is in my TODO list. :)

@Firminator
Copy link

Hi there,
Thanks on the work on the Rival 3 Wireless so far. I'm going to play with the rivalcfg but before I hit a rabbithole had a few questions..

You can also check the button mapping setting:

rivalcfg --buttons "buttons(button5=A)"

Now the B5 of the mouse should correspond to the keyboard "A" button (of a QWERTY keyboard)

To reset this setting:

rivalcfg --buttons default

Are the functions keys (F1 to F12) supported and if yes would I just substitue A with F12 for example?

Also since the below quoted code was verified by @winteriscariot to be working could this be implemented in one of the next updates:

@winteriscariot No this is not implemented yet.

In the mean time, you can send the power configuration command to the mouse manually. Here is some Python code that does the trick:

#!/usr/bin/env python3

import rivalcfg

mouse = rivalcfg.get_first_mouse()
mouse._hid_write(data=[
    0x2B,
    0x01,        # High Efficiency (0x00 = OFF, 0x01 = ON)
    0x64,        # Smart illumination (0x00 = OFF, 0x32 or 0x64 = ON)
    0x2C, 0x01,  # Unknown
    0x2C, 0x01,  # Sleep timer (seconds, little endian)
                 #   0x3C, 0x00 =  1 min
                 #   0x78, 0x00 =  2 min
                 #   0xB4, 0x00 =  3 min
                 #   0xF0, 0x00 =  4 min
                 #   0x2C, 0x01 =  5 min
                 #   0xB4, 0x04 = 20 min
])
mouse.save()

Any news regarding RGB wheel lightning or firmware readout? I didn't find any hints regarding firmware readout on your reverse-engineering blog @ https://blog.flozz.fr/2016/03/27/steelseries-rival-100-reverse-engineering-dun-peripherique-usb/
Here's my dmesg output... I'm using Wireless mode; bcdDevice=0.20 is not what I assumed the firmware but rather the Device Release Number indicating the device-defined revision number accd. to https://beyondlogic.org/usbnutshell/usb5.shtml ... well was worth a try :)

usb 3-3.4: New USB device found, idVendor=1038, idProduct=1830, bcdDevice= 0.20
usb 3-3.4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 3-3.4: Product: SteelSeries Rival 3 Wireless
usb 3-3.4: Manufacturer: SteelSeries
input: SteelSeries SteelSeries Rival 3 Wireless as /devices/pci0000:00/0000:00:14.0/usb3/3-3/3-3.4/3-3.4:1.0/0003:1038:1830.000D/input/input27
hid-generic 0003:1038:1830.000D: input,hidraw8: USB HID v1.11 Mouse [SteelSeries SteelSeries Rival 3 Wireless] on usb-0000:00:14.0-3.4/input0
input: SteelSeries SteelSeries Rival 3 Wireless Keyboard as /devices/pci0000:00/0000:00:14.0/usb3/3-3/3-3.4/3-3.4:1.1/0003:1038:1830.000E/input/input28
hid-generic 0003:1038:1830.000E: input,hidraw9: USB HID v1.11 Keyboard [SteelSeries SteelSeries Rival 3 Wireless] on usb-0000:00:14.0-3.4/input1
hid-generic 0003:1038:1830.000F: hiddev3,hidraw10: USB HID v1.11 Device [SteelSeries SteelSeries Rival 3 Wireless] on usb-0000:00:14.0-3.4/input2
hid-generic 0003:1038:1830.0010: hiddev4,hidraw11: USB HID v1.11 Device [SteelSeries SteelSeries Rival 3 Wireless] on usb-0000:00:14.0-3.4/input3
hid-generic 0003:1038:1830.0011: hiddev4,hidraw11: USB HID v1.11 Device [SteelSeries SteelSeries Rival 3 Wireless] on usb-0000:00:14.0-3.4/input3
hid-generic 0003:1038:1830.0012: hiddev4,hidraw11: USB HID v1.11 Device [SteelSeries SteelSeries Rival 3 Wireless] on usb-0000:00:14.0-3.4/input3
hid-generic 0003:1038:1830.0013: hiddev4,hidraw11: USB HID v1.11 Device [SteelSeries SteelSeries Rival 3 Wireless] on usb-0000:00:14.0-3.4/input3
hid-generic 0003:1038:1830.0014: hiddev4,hidraw11: USB HID v1.11 Device [SteelSeries SteelSeries Rival 3 Wireless] on usb-0000:00:14.0-3.4/input3
hid-generic 0003:1038:1830.0015: hiddev4,hidraw12: USB HID v1.11 Device [SteelSeries SteelSeries Rival 3 Wireless] on usb-0000:00:14.0-3.4/input3
hid-generic 0003:1038:1830.0016: hiddev4,hidraw12: USB HID v1.11 Device [SteelSeries SteelSeries Rival 3 Wireless] on usb-0000:00:14.0-3.4/input3
hid-generic 0003:1038:1830.0017: hiddev4,hidraw12: USB HID v1.11 Device [SteelSeries SteelSeries Rival 3 Wireless] on usb-0000:00:14.0-3.4/input3
hid-generic 0003:1038:1830.0018: hiddev4,hidraw12: USB HID v1.11 Device [SteelSeries SteelSeries Rival 3 Wireless] on usb-0000:00:14.0-3.4/input3
hid-generic 0003:1038:1830.0019: hiddev4,hidraw12: USB HID v1.11 Device [SteelSeries SteelSeries Rival 3 Wireless] on usb-0000:00:14.0-3.4/input3
hid-generic 0003:1038:1830.001A: hiddev4,hidraw13: USB HID v1.11 Device [SteelSeries SteelSeries Rival 3 Wireless] on usb-0000:00:14.0-3.4/input3
hid-generic 0003:1038:1830.001B: hiddev4,hidraw13: USB HID v1.11 Device [SteelSeries SteelSeries Rival 3 Wireless] on usb-0000:00:14.0-3.4/input3
hid-generic 0003:1038:1830.001C: hiddev4,hidraw13: USB HID v1.11 Device [SteelSeries SteelSeries Rival 3 Wireless] on usb-0000:00:14.0-3.4/input3

Odd that the kernel detects 10+ devices and also a 'Wireless Keyboard'. Anyone have an explanation for this behaviour?

@Firminator
Copy link

Accd to https://flozz.github.io/rivalcfg/devices/rival3_wireless.html#mapping-keyboard-keys linking to the supported keys @ https://github.com/flozz/rivalcfg/blob/master/rivalcfg/handlers/buttons/layout_qwerty.py the Function keys are supported. Tried rivalcfg -b "buttons(button5=q)" but had no luck. Anyone else seeing this?

@flozz
Copy link
Owner

flozz commented Feb 26, 2024

Also since the below quoted code was verified by @winteriscariot to be working could this be implemented in one of the next updates:

This need a bit of work to be implemented in Rivalcfg (this require to implement a new handler, with a custom syntax to handle all parameters).

Any news regarding RGB wheel

It is in my TODO, but I do not have access to this device anymore... I will ask my colleague to know if he still have it... But if my notes are exacts, this mouse have a complicated protocol for lighting (at least a different one from other devices...)

or firmware readout? I didn't find any hints regarding firmware readout on your reverse-engineering blog

You mean reading the firmware version?

@Firminator
Copy link

Firminator commented Feb 27, 2024

Also since the below quoted code was verified by @winteriscariot to be working could this be implemented in one of the next updates:

This need a bit of work to be implemented in Rivalcfg (this require to implement a new handler, with a custom syntax to handle all parameters).
No worries then. Not a biggie.

Any news regarding RGB wheel

It is in my TODO, but I do not have access to this device anymore... I will ask my colleague to know if he still have it... But if my notes are exacts, this mouse have a complicated protocol for lighting (at least a different one from other devices...)

Yes their marketing dubs it as "Quantum 2.0 Dual Wireless - easily switch between gaming-grade wireless and universal Bluetooth connectivity"; I checked their site to see if other mice have it ( https://steelseries.com/innovation/quantum-wireless ) but was so far only able to determine that the Rival 3 Wireless was the first mouse having this 'feature'. They state on the Rival 3 Wireless product page it has (at time of release) "brand new Quantum 2.0 Dual Wireless technology".

Update: All their Wireless mice @ https://steelseries.com/gaming-mice/wireless use "Quantum 2.0 Dual Wireless" protocol, except for the Rival 650 which seems to come with the first iteration of this protocol and doesn't have bluetooth.

2.0 Dual (2.4 and BT)

1.0 (2.4 only)

Do you have an Aerox 3, 5 or 9 to gain some insight about the protocol?

or firmware readout? I didn't find any hints regarding firmware readout on your reverse-engineering blog

You mean reading the firmware version?

Yes firmware version readout.

Button mapping working would be highest on my wishlist, but if this is also an issue related to not understanding this new Quantum protocol I'll understand how it will take the backseat until that has been figured out. If shipping to Europe wouldn't be half the price of the mouse I'd sponsor one.

@Firminator
Copy link

Firminator commented Feb 27, 2024

Actually I'm just seeing over @ https://github.com/flozz/rivalcfg/blob/master/ssdb/sse3.db.csv there is already support for Aerox 3, 5, and 9 so that's promising if the Rival 3 Wireless uses the same protocol.

I purchased it for the Bluetooth support. The mouse 'works' with both Bluetooth and USB.

A bit late and possibly redundant clarification for OP: There is no USB cable... just an USB dongle providing dual bluetooth and 2.4Ghz wireless functionality.

@flozz
Copy link
Owner

flozz commented Feb 27, 2024

Do you have an Aerox 3, 5 or 9 to gain some insight about the protocol?

I have none of them... But my colleague still have its Rival 3 Wireless so I will be able to work from this \o/

Button mapping working would be highest on my wishlist, but if this is also an issue related to not understanding this new Quantum protocol I'll understand how it will take the backseat until that has been figured out

I do not think there is a "quantum protocol"... just regular SteelSeries messy protocol x)

A bit late and possibly redundant clarification for OP: There is no USB cable... just an USB dongle providing dual bluetooth and 2.4Ghz wireless functionality.

We currently have a basic support for the Rival 3 when using the 2.4 GHz mode (Bluetooth not supported). I will see if I can add a basic lighting support (just a still color, no animation/gradient) for next Rivalcfg release.


also, button mapping should already work but i will check

@flozz
Copy link
Owner

flozz commented Feb 29, 2024

also, button mapping should already work but i will check

I checked button mapping → it works fine.

I will see if I can add a basic lighting support (just a still color, no animation/gradient) for next Rivalcfg release.

So... nope. This feature will have to wait few months... It requires sending at least 4 packets to configure even a single static color, so it could not be supported right now. ^^'

@Firminator
Copy link

What OS/kernel are you working with? That would be my step to replicate a known working setup on a test device.
I tested this with a texteditor open and used
rivalcfg -b "buttons(button5=q)"
in a terminal, then pressing button 5 but 'q' doesn't populate in the texteditor.
Then testing
rivalcfg -b "buttons(button4=VolumeDown; button5=VolumeUp)"
but it doesn't adjust my volume either.
How are you testing button mapping? Anything I forget or need to consider?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests