-
-
Notifications
You must be signed in to change notification settings - Fork 68
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 700 Support #10
Comments
Hello, It should be possible to add support for the Rival 700... but as I do no have this mouse, I cannot do the reverse engineering that is required to implement its support in rivalcfg. I am searching for alternative solution to study the mouse, but currently without success. |
Hi flozz If you tel me how to reverse engineering the rival 700, i can help you, I actually have this mouse. |
Hello, I wrote an article on my blog about it: It is in french, but I think that google translate can help. Don't hesitate if you have questions :) |
Haha je suis français, c'est parfait ;) je lirais sa un peut plus tard merci |
Hi, I'll probably buy the Rival 700 this week, so I'll also be able to help you with the reversing :) |
Hi, this I reckon is still an outstanding request - I got my 700 today so I've just started looking into it (using an usb sniffer on Windows). I'll let you know how it goes :) Edit: The dumps I get from the USB logger will be stored at https://drive.google.com/open?id=0B-D4jp_mLMTaYVFyb19rNEVjelE Can't get much to work, but then again I only had a quick look at it. Note: I have the latest firmware on the mouse. |
So, I got the tactile stuff to work. Can't do more on this tonight, though. I've added rival700.py to the above gdrive location with all the tactile variants from the SS utility (with the same names). Next up, the OLED (yeah, I'll do the fun parts first :)) (Edit: I haven't touched any of the other functions in the file, so they won't work with the 700 yet.) |
Hello, Nice see someone working on this mouse! I will take a look to your work when I have some free time. :) |
I've made a few other things in "beta", will upload them eventually. I must've missed something in the OLED part. Interesting license you've digged up, hadn't seen that before. A bit special... :) |
Hello, I am looking at you Edit: I looked at the SteelSeries website. The screen seems to be 128×36px. So for a monochrome screen, we need at least 576 Bytes to transfer an image (if there is no compression at all). → so I think there is some frame missing in your dump :) |
Yes, the OLED handling is illogical as it stands. USBlyzer have always worked for me in the past (doing Arduinostuff) so I dunno. Looking at Got the sensitivity to work (at least it differs in real life tests, don't know how to really check the setting in Linux), but all the color stuff won't "stick" when I set them. I'll rerun the stuff in Windows using another USB logger and see if it differs. Edit: Got it. I'll fix the OLED-support tonight. I've never before used the Export to CSV option of USBlyzer (since I never before needed to export it out of its native format) and lo and behold, it drops anything but the first bytes. Weird development choice that but now I can fix it at least. |
Tried a few other USB loggers but couldn't get it to work. I've been very busy (renovating my house), but I've setup a virtual machine - maybe the 300's solution from the other thread also can be of help to me. I will get this to work :) |
Anyone still working on this? If not I might give it a go. Just thought I would point out that the OLED will show animations at 10FPS, and can have animated GIFs uploaded to it by the SteelSeries software. That might go some way to explaining the "stuff at the very end". It would be cool to run a daemon for this mouse, so that other software can invoke tactile functions or push images directly. Would also be interesting to see if images can be pushed faster than 10FPS - seems that way since you can keep hammering the Invert button in the SteelSeries software and it flickers pretty quick. Could have some nice fractal or random anims running on it, or a ticker of some sort. Maybe system load. Should be able to get 16x4 chars on it, or 16x6 with a smaller font. |
Hello, As far as I know, nobody is working on the Rival 700.
rivalcfg must stay a simple CLI program and a library (maybe a GUI will be also implemented one day as a separated project). So it cannot be a daemon, but a daemon that uses rivalcfg as a library can by implemented separately (we keep all the logic to communicate with the mouse in rivalcfg and we implement a daemon that uses it). |
It would be really nice to have this work like the actual SteelSeries engine (even without the GUI for now) for my Rival 700. The lack of support in Linux is the only thing keeping me from using Linux. Also, i don't think that SteelSeries themselves will release a Linux version of the engine |
Thanks @flozz I wouldn't consider trying to daemonise the python CLI. In fact it might be more profitable for me to do a new one from scratch. It all looks pretty straightforward. @Lejendary if I can get this figured out, I'm thinking about making a daemon that sits on dbus. Then someone could create a QT and/or GTK gui. I did a little playing with WireShark this evening and determined the following...
|
So I've done a bit more tinkering and I have a (very very quick & dirty) .net core command line app which makes the tactile buzzes work. I've also mapped out the colour commands and the bitmap command but need to test all that. Bitmap seems very simple. Command is little endian 0x0159 (bytes [0x59, 0x01]) followed by 576 bits where MSB is left-most and LSB is right-most and they read left to right. It turns out SteelSeries Engine on Windows does 10FPS animations by sending the images to the mouse, so faster than that should be easy, and custom text & computed graphics should be super-simple too. |
The most exciting thing here is that there seemed to have been a huge number of gaps in the tactile stuff, and actually, it seems to be possible to fill them in. Here's what I've got so far, but the perception of some of them will be very subjective. I'm wondering if there's some meaning behind these numbers. They're all 6 bits, is that 3 pairs of 2-bit numbers? Or 6 distinct flags? Or a mixture? Setting the 7th bit seems to have an effect, but it's not clear what's going on just yet. Even with 6 bits, though, we have 64 potential patterns.
|
So it looks like setting the image isn't going to work yet because the URB wValue must be 0x0300 for that request, and if we just push data to /dev/hidraw_x_ it will have wValue 0x0251. Actually I don't know what the 08 00 00 00 00 [...] message is for yet, maybe it's a little ping to keep the screen on, but that has wValue 0x0200 when SteelSeries Engine does it. It might be just lucky that we have tactile stuff working. Now working on a C++ app to get a bit more low-level... |
Woo! I got an image onto the mouse! However, I got the image by saving it as a .bmp and then stealing the bytes from it, and I forgot BMP is bottom-up... |
So I also have it playing video at about 60FPS, although ImageMagick seems to have some problem writing 1-bit files, so I need to write my own converter. 10 FPS lol that's cute steelSeries |
Interestingly, pictures seem to work OK when either the first or last pixel is white but somehow get corrupted if there's some other combination of bits... Going to re-"encode" this with a tweak to set first or last pixels or both and see if I can make it all line up. I know it's hard to believe, so... |
So I just got back to this and found a picture that was screwed up when I put it on the mouse but not when it came from SteelSeries Engine. There's definitely a difference between them (the one that works is longer!!), but I'm going to have to turn it into a stream of 1s and 0s to get a feel for how they're encoding these images. |
faceplam |
So yeah, that works a bit better |
@HughPH wow you made a great work with the reverse engineering of the oled part of the Rival 700. Pretty cool to be able to watch Big Buck Bunny on the mouse :) |
Yeah, could get the whole thing to play but it was never released in 32:9 so it would be badly cropped :) The other fun thing I thought about was actually playing a little game like pong or defender using the side buttons or scroll wheel. Anyway, I'll create a GitHub project soon and post my ropey C++ source. It would be nice to describe the mouse in configuration, then look at implementing support for other SteelSeries peripherals, maybe even other manufacturers devices, then sync them all together and provide a common interface. BTW it looks like SteelSeries Engine can't deal with 2 SteelSeries mice at the same time!! |
Colorshift and Multi color breath command (the only part missing is how the color change is worked out)
SSE only lets yot set up to 14 stages for color shift and only 4 stages for multi color breath stages
color 1 color set at at 25% 255/10/10 hex ffa0a0 0000 80 fa fc d1 60 94 ff ff 53 02 00 0a 01 00 00 00 ....`...S....... |
@nixtux Please confirm if this is correct: 125-129 | start rgb | f0 0f a0 00 a0 00 | rgb color but every other byte ???? eg start color ffa0a0 because it disagrees with this:
You also say you have a colour set at 255/10/10 (0a) but then talk about 160 (a0) What I find most notable about the hex dump is that f0 | 0f = ff, and 00 | 0a = 0a so it looks like maybe the high & low nibbles have been extracted for some reason. To go back and 'decode' my earlier ramblings... In your byte 12 you have 00, I have 01, I never worked out what it was but I don't think it's index. Byte 13 = 00, you also have 00 here but you thought it might be index 00. If we change that same value to 08 in our request, we will get the Trigger colours as defined earlier in the message. On that basis, I'm quite sure it's Mode. I also wrote code on that basis, and it holds water. I think the structure might then be: So to read yours on that basis I would get about the same:
We might be wrong, it might be big-endian data with a null termination:
I agree it seems a bit mad for the last one to have an index of 0, but for my hex dump, I would have had two with the index 0001 Here's my original dump more clearly formatted...
Unfortunately it was ages ago that I did that, and I can't remember what colours I picked. They were probably pretty random. The reason I called it "ramp" is that I suspect it's a delta of some kind, with a reset to the start value that might be in what I think is split nibbles later in your capture. |
Apparently I released this under the wrong kind of license so you can't copy & paste it into your own project. TBH that's not really what I intended anyway - it's not developed with anyone else's code in mind, it's just a hastily thrown together monolithic thing with no architectural design that does some stuff to prove what's possible. Be inspired by it, or something: https://github.com/HughPH/SteelSeriesControl |
yeah sorry make a mistake in that table entry, but yeah every dump i've produced has starting color in that format, will double check table and add another example. |
on a side note to getting colorshift to work https://www.dropbox.com/s/uwheh85b2zp2xsp/rival700snakes.m4v?dl=0 |
What we think is "index" might be "next" Nice work on the snake game :) Unfortunately I destroyed my OLED screen (probably just the cable) when I took the mouse apart to give it a clean (wheel button was double-clicking or not-clicking randomly) and SteelSeries won't send me a replacement. (Obviously they just want me to buy a 710!) |
So after some more testing to workout how color is defined in stages i noticed small change in color values didn't effect the command sent, interesting and look what the result leads to 2 stages selected in sse first stage 05 f3 00 let extract the nibbles lets start with the red channel starting color is 3b or 59 in this stage we have 0 or 5 nibble lets take the last one and do (516)+59=139 so does the low nibble mean add? second stage fb 0d 00 0000 00 86 cb c4 96 8e ff ff 53 02 00 0a 01 00 00 00 ........S....... |
I still need to do more testing to confirm the high low bit values but it does seem to select every color for stages in 12bit |
It's a good thought. It would make sense if the colour doesn't need to be exact, and it might be that the mouse's MCU doesn't support floating point which would cause complications with calculating shift amount per cycle. |
Yeah it was a good thought just the wrong one, but i have found out that each byte is just a signed byte depicting the rate of increase per tick. |
That's pretty much what I expected. |
Is it possible to add Rival 700 support to rivalcfg? Not sure how similar/different the hardware is, but I'd greatly appreciate it if I could configure at least my sensitivity on my Arch install, the rumble and oled screen would be nice to have, but I could take them or leave them. Please let me know if there's anything I can do to help add and troubleshoot support for the Rival 700!
The text was updated successfully, but these errors were encountered: