#🤖│community_dev

1 messages · Page 13 of 1

wicked grove
#

Yep, I got a DLL built

placid ledge
#

Cool

wicked grove
#

FN keys = RPM
Numbers = Gear
Nav panel corners = Wheels (contact, drifting, no contact)
Arrows = Steering + brake + gas

hybrid lake
#

that's dope dude, is it subscribed to game events?

wicked grove
#

It uses game's "telemetry" - shared memory block

hybrid lake
#

how do you use that?

wicked grove
#

I copied the code, which obtains the telemetry object from memory to my program, included your library and then ran a loop, which controls RGB dependent on stuff like RPM and steering 😄

placid ledge
#

What game is that?

wicked grove
#

ManiaPlanet -> TrackMania 2

placid ledge
#

Cool, might have to try and add support for that in Aurora

wicked grove
#

When I'm finished with my effect exe I'll publish the code

hybrid lake
#

I understand that, I'm just not aware of the "telemetry" stuff and google is not really helping 😛

wicked grove
#

@hybrid lake It's just reading game's shared memory block

#

They have an example available

hybrid lake
#

Where?

wicked grove
hybrid lake
#

ugh

wicked grove
#

Oh nice

hybrid lake
#

Thanks!

#

Did your keyboard run into any issues with the RGB driver?

wicked grove
#

Currently a few

#

I'm unsure if it's problem of my code, but when I exit my app and close event handle is executed, it restores only few first keys

placid ledge
#

Did you call the restore method?

wicked grove
#

Yep

placid ledge
#

I had that a few times, most of the time it restores properly

#

sometimes it doesn't

wicked grove
#

I only done this: ```CPP
static BOOL WINAPI console_ctrl_handler(DWORD dwCtrlType) {
ApplicationRunning = false;
wootingRGB.wooting_rgb_reset();

return FALSE;

}```

In main: CPP SetConsoleCtrlHandler(console_ctrl_handler, TRUE);

#

ApplicationRunning breaks my while(true) where effects function is called every frame

wicked grove
#

I managed to fix the problem of keyboard not being reset properly

#

Just added Sleep(250) before i call the reset method

wet knot
#

Oh nice

#

Channel got made

#

:3

#

@wicked grove welcome \o/

wicked grove
wet knot
#

Anything that is sent via here or said here stays here

placid ledge
wet knot
#

👀

wicked grove
#

I noticed it only now

#

Will check out asap 😄

#

Video showing W1 + ManiaPlanet soon on YouTube

wet knot
#

@placid ledge Hey, just a heads up.... running the new version crashed my keyboard completely and my mouse

#

Now, yes i never had the wootdev firmware but this could be a huge issue

#

@wicked grove ccan you possibly try and replicate this

placid ledge
#

I have it consistently when on the digital profile, is a known issue with the firmware

wet knot
#

I see

placid ledge
#

Works fine if on analog profile

wet knot
#

Oh i see...

#

thats interesting!

#

So i have to have it on analog before launching?

wicked grove
#

Uh

wet knot
#

Sorry for the stupuid questions.... just concerned is all haha

wicked grove
#

I'll try tomorrow

wet knot
#

I guess its something the firmware needs sorting out with

wicked grove
#

Ah ye my kb bricks when I go to analog mode

#

When it has effects running

wet knot
#

idk why but whatever Auroa did i had to restore my woot, have a feeling the firmware has some issues overall.

placid ledge
#

I have no issues when I'm in the analog profile, I have to unplug the kB if I'm on the digital profile with the rainbow effect every time as it completely freezes

wet knot
#

When i was playing overwatch

#

Auroa randomly closed and froze my keyboard

#

does auroa have any logsd

placid ledge
#

Yeah, %appdata%/aurora/logs

wet knot
#

Ugh

placid ledge
#

Hm, doesn't seem to have thrown out any error. Are you sure that is the right log? Aurora creates a new one for every new instance

wicked grove
#

What exactly does Aurora add to Overwatch? It replaces the razer's DLL or does it add other files?

placid ledge
#

It replaces razer's dll

#

You can add other layers around what lighting is given by overwatch, but there is no other information taken

wicked grove
#

But it works and I don't care

wet knot
#

You love LIS

wicked grove
#

Yes

clear hedge
#

@peak dagger check the pinned messages

wicked grove
#

When you try to analyze audio frequencies of ytdl-core stream but the data chunks are so big your visualizer would have 1/4 fps FeelsBadMan

hybrid lake
#

Back on the wootdev

#

@placid ledge you told me before that your keyboard crashed on digital mode, was that just when you had rainbow running?

#

I think it's crashing because the effect refreshing conflicts with the wootdev now

placid ledge
#

Yeah, I've got the rainbow animation running

hybrid lake
#

Alright that's probably it then

#

Can you double check later if it still happens when you turn the effect off?

placid ledge
#

Sure, I'll check in a bit

#

It works fine if I switch it to a static rainbow

hybrid lake
#

Alright, I'll probably have to add some sort of effect pause

round rivet
#

TLDR (for Unix): Update firmware (use Windows to avoid hassle). Then dev away on Linux?

hybrid lake
#

Haven't had the chance to try everything on linux, but please go ahead

#

hidapi does have linux support already

#

any help here is greatly appreciated

bleak oyster
#

im currently trying to compile the DLLs for analog reading and rgb control. the rgb one compiled just fine, but the analog one gives me a compile errorRC1110 could not open wooting-analog-reader.rc wooting-analog-reader

#

im not that familiar with C programming so idk how to fix this, any ideas?

#

also i just ran the rgb tests in wooting.NET but nothing happens

hybrid lake
#

I'll look into the RC thing

hybrid lake
#

@bleak oyster should be good now

wide nymph
#

@nimble whale This is the Dev channel, @hybrid lake is the guy that can give things a shot on the Keyboard and work it out to something native.

#

Thanks again for reaching out.

bleak oyster
#

@hybrid lake thanks, successfully compiled without any further problems. however the wooting.NET tests still don't work, i don't get any readings in the analog test, nor do the colors change in the rgb test

#

i'll try using it natively

hybrid lake
#

Did you update your keyboard to the wootdev firmware?

nimble whale
#

this should work if the vendor and product ID for the analog HID input stays consistent with wooting one

#

not the nicest architecture I could have there but it does the job

round rivet
#

Hmm, we might wanna keep an index of the different projects.

bleak oyster
#

@hybrid lake oh shit right i forgot about that 😅

#

the keyboard doesnt work right now and idk if i should unplug it now

round rivet
#

Good lord that's one long list of Discord channels.

#

I'd say it is normal. Electron

#

¯_(ツ)_/¯

bleak oyster
#

well how long is this patch supposed to take

hybrid lake
#

just replug and try again

round rivet
#

How many of us are comfortable with CMake?

wet knot
#

I just below people I don't know much of programming blobshrug

round rivet
#

That's a yes in my book. The fact that you are not used to any of the tools - you are equally open to all of them 😄

wet knot
#

Haha

hybrid lake
#

Comfortable as in know how to use it, or open to using it?

round rivet
#

Open to using it. It's cross-platform. You can generate projects for different IDEs as well.

hybrid lake
#

Oh yes of course, would love to have a cross platform build process

#

I'm worried about the keyboard detection on linux though, have you tried it yet?

#

Already have some issues with getting the usage page values on linux in the wootility. Not sure if it's because of the driver or some other USB linux stuff

round rivet
#

Didn't have time to tinker with anything yet.

#

@hybrid lake it would be very cool if you would track the issues you encounter (at least how to reproduce) on Linux (and other) in the Github project. Easier to collaborate.

hybrid lake
#

Yeah we can do it as soon as we know if it does or doesn't work

round rivet
#

That way when I get to it. I wouldn't have to ping you for more info :D

hybrid lake
#

checking it out now @nimble whale 😄

#

We'll have an overview of projects on the portal later

nimble whale
#

thanks, if you have any questions or feedback don't hesitate

hybrid lake
#

I think the HID read timed out,

#

You don't select a certain interface somewhere do you?

nimble whale
#

let's see

#

at line 151 I do

        bool success = DeviceList.Local.TryGetHidDevice(out _hidDevice, 1003, 65281);
#

where 1003 is VID and 65281 is PID

#

are there multiple PID's possible for wooting one?

hybrid lake
#

No, but there are multiple USB interfaces, as in the wooting one is a composite device

#

I'm not sure if it matters here, even if I get the full list with " DeviceList.Local.GetHidDevices(1003, 65281)" I cannot get it right

#

What firmware are you using?

nimble whale
#

the publicly available version 1.17

wet knot
#

you need woot dev

hybrid lake
#

no you dont

wet knot
#

oh

#

ill shut up again

nimble whale
#

nah I've been playing with that HID thing for a while without woot dev

#

I can put back a dropdown list for HID devices as well

#

also filtering for "wooting" name

hybrid lake
#

alright got it

nimble whale
#

oh what was it?

hybrid lake
#

            foreach(HidDevice hid in hids)
            {
                try
                {
                    if(hid.GetMaxInputReportLength() == 33)
                    {
                        _hidStream = hid.Open();
                        HidStatus.Fill = new SolidColorBrush(Color.FromRgb(255, 255, 0));
                    }
                } catch
                {
                }
            }```
#

changed line 151 to this

#

the try catch is because the GetMaxInputReportLength fails for some interfaces

#

I think before it opened the configuration interface instead of the analog one

nimble whale
#

ah ok made sense so interfaces doesn't stay consistent apparently?

bleak oyster
#

ok by some miracle patching the firmware just worked now. RGB control works fine now, but i still cant read any analog values

bleak oyster
#

tried both using wooting.NET and compiling native C tests with the dll, but in both cases only the RGB control works and analog readings always return 0

#

any ides how to fix this?

#

also i just realized that i can no longer change any settings with the wootility. is that expected behavious with the wootdev firmware?

hybrid lake
#

@nimble whale it's very dependent on the driver implementation I've found. I'm still looking for a way that is consistent across all platforms

#

Settings works for me @bleak oyster, have you tried replugging?

#

Also don't use rgb effects in combination with the wootdev stuff for now

bleak oyster
#

with the tool you linked i get analog values

#

they dont max out all the way to 0xFF but i think thatrs expected behaviour?

#

before i patched the firmware my program would just close whenever i tried reading analog. now it always reads a value of 0 instead

hybrid lake
#

Not sure, maybe @placid ledge has an idea

wet knot
#

Wasn't there already an analog range output program from crude ui btw

#

Bit off topic

#

Sorry

placid ledge
#

When I tried to use the analog reader I had it working properly when I read just esc, but the results weren't correct when I read the buffer. It would sometimes get values but it never showed everything pressed

#

This being through the wooting.net tests, I haven't tried it without it, so I'm not sure if it is a firmware/API issue or if it is something to do with the .Net wrapper

#

But I don't think the wrapper would cause the issues like I was having though

bleak oyster
#

@placid ledge its definitely not a problem with the wrapper as the same problem also occurs when i use the analog reader natively (plain C)

placid ledge
#

Ah, okay. Didn't have the time to check it properly, thanks for letting me know

bleak oyster
#

@placid ledge btw i PRd a little code cleanup for the RGB tests to be more comprehensible for first time use

#

still can't figure out why I don't get any analog readings. any ideas how to proceed @hybrid lake ?

hybrid lake
#

Does it work when you just try to repeatedly read a single key?

placid ledge
#

@bleak oyster thanks! Was initially just doing basic tests to just make sure it was basically working, didn't get around to writing proper ones

bleak oyster
#

@hybrid lake thats exactly what I tried to do, but it just returns 0 all the time no matter what

hybrid lake
#

I changed it to a row column index btw, not sure if I pushed that to master

#

I’m not at my pc noe

#

Now*

bleak oyster
#

i used the esc key (0,0) so it shouldnt have made a difference even if you did

hybrid lake
#

Have you tried a different one?

#

Maybe the 0 is bugged

bleak oyster
#

can hardly believe that since its also the key simon uses in his tests, but i'll try

#

also the HID sniffing thing you send before detects the analog input of esc, but I'll double check now

hybrid lake
#

It will also return 0 when it doesn’t connect, might be a problem there

#

I’ll have to look into it later

placid ledge
#

The esc key worked fine for me

round rivet
#

@hybrid lake Yeah, it doesn't detect the keyboard on Linux. Will be looking into it.

Meanwhile while my C might be a bit rusty, but each (this for example -> https://github.com/PastaJ36/wooting-analog-reader/blob/master/src/wooting-analog-reader.c#L27) hid_enumerate call we are leaking memory.

/*
 @returns
                This function returns a pointer to a linked list of type
                struct #hid_device, containing information about the HID devices
                attached to the system, or NULL in the case of failure. Free
                this linked list by calling hid_free_enumeration().
        */
        struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id);

Should be freed with hid_free_enumeration().
Valgrind

==19243== 13,312 bytes in 13 blocks are possibly lost in loss record 21 of 21
==19243==    at 0x4C2FA3F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==19243==    by 0x4C31D84: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==19243==    by 0x5F8FBB3: ??? (in /lib/x86_64-linux-gnu/libusb-1.0.so.0.1.0)
==19243==    by 0x5F90CC3: ??? (in /lib/x86_64-linux-gnu/libusb-1.0.so.0.1.0)
==19243==    by 0x5F8F452: ??? (in /lib/x86_64-linux-gnu/libusb-1.0.so.0.1.0)
==19243==    by 0x5F86C9C: libusb_init (in /lib/x86_64-linux-gnu/libusb-1.0.so.0.1.0)
==19243==    by 0x4E3FB03: hid_init (in /usr/lib/x86_64-linux-gnu/libhidapi-libusb.so.0.0.0)
==19243==    by 0x4E407DC: hid_enumerate (in /usr/lib/x86_64-linux-gnu/libhidapi-libusb.so.0.0.0)
==19243==    by 0x400BA6: wooting::keyboard::AnalogReader::find() (in /home/vtkacenko/CLionProjects/cross-platform-woot/wooting-hidapi-wrapper-cpp/build/wooting_hidapi_wrapper_cpp-example)
==19243==    by 0x400A57: main (in /home/vtkacenko/CLionProjects/cross-platform-woot/wooting-hidapi-wrapper-cpp/build/wooting_hidapi_wrapper_cpp-example)
hybrid lake
#

good catch, I'll change it

bleak oyster
#

Ok I'm really out of ideas now. i tried

  • repatching firmware
  • rebooting
  • different programming language (C and C#)
  • diferent cable
  • different usb port
  • differnt pc
#
#include <stdio.h>
#include "..\..\src\wooting-analog-reader.h"

void main() {
    while (true) {
        uint8_t v = wooting_read_analog(0, 0);
        printf("%d\n", v);
    }
}```
#

honestly can't imagine having a mistake in there but just in case

#

I'd say there's something wrong with my keyboard if it wasnt for the fact that hidtrace reads the buffer just fine

wide nymph
#

Tried a different pc yet?

#

I’m assuming it’s not a problem on your side atm, but if you’re waiting for it 😄

bleak oyster
#
...
- different pc```
"did you try a different pc?"

🤔
wide nymph
#

Oh

bleak oyster
#

jk lol

wide nymph
#

Overlooked it

#

Or you edited it

#

Cheater 😛

bleak oyster
#

i didnt edit it in

#

anyway, yes i tried another pc, same result. i just don't know how to proceed now

#

I understand how it works so i could in theory work without it returning proper values, but not being able to test your code sucks.

round rivet
#

You have quite an agressive loop there. I'd add a sleep.

bleak oyster
#

yeah ik it fries my cpu like that, but it was just to quickly have something for testing

hybrid lake
#

I'll look into it tomorrow, I think it's a problem with detecting the keyboard

cyan saddle
#

So lighting control is plain HID stuff, right?

hybrid lake
#

The rgb control is basically a HID wrapper yeah

#

welcome btw, I pinned the first post with some explanations

bleak oyster
#

why isn't this channel open to everyone in the first place?

wet knot
#

Because it allows more support and tech discussion between people like you and the founders.

#

its just to keep it closed from @ everyone

#

All people need to do is ask 😃

bleak oyster
#

you mean because there would be too much offtopic otherwise?

wet knot
#

Correct.

#

Its just easier overall too, be able to share releases etc before public builds etc

hybrid lake
#

it will be public once we have the website docs up

wet knot
#

^ was holding back on that 😄

placid ledge
#

How soon you reckon? 👀👀

#

Planning to make an Aurora release, but would rather wait till the RGB control stuff is public before hand

hybrid lake
#

end of the month is the target now

cyan saddle
#

Any plans to abstract it more?

hybrid lake
#

More how? How would you like to use it?

cyan saddle
#

Like a lib, can query what keys are where and can set them. Could allow for arbitration between multiple programs as well.

hybrid lake
#

Pushed something to a rgb control develop branch

  • Moved USB code to a seperate file
  • Got rid of the color array, now keep track of everything in raw buffers. The conversion every time felt like a mess and will get worse with the fullsize.
  • RGB effects will pause automatically and restore after the reset is called
  • Freed the HID structure that was allocated by hid_enumerate
#

I could also use feedback how to work with github / keep you guys up to date. I already added the linux opening issue

#

There's also a new wootdev firmware with the update for the RGB pause stuff

cyan saddle
#

Make a read only dev channel and a webhook that automatically dumps commuts into it. Could even make a few for different thimgs and turn it into a category.

round rivet
#

Create a branch (per feature) -> develop feature -> pull request to master -> review -> merge with the master

cyan saddle
#

Could set that all up to dump into a channel I'm pretty sure.

#

The main things I am worried about are:

  • RGB control
  • Input reading
  • Key info (location, size, label, name)
round rivet
#

@hybrid lake Wooting Updater now shows and empty dropdown for me.

hybrid lake
#

Is your system clock correct?

round rivet
#

Nope, it's not.

#

Correct clocked fixed it. But still

#

¯_(ツ)_/¯

round rivet
#

@hybrid lake Linux begs the sudo, otherwise you will get the zeroes with hidapi (if that was your end problem).

hybrid lake
#

Oke cool, thanks

#

It must be something else in the wootility then

#

Does the updater work now?

round rivet
#

With synced clock yes. In my case clock goes out of sync when dual booting Windows<->Linux

bleak oyster
#

how are custom RGB themes supposed to work in the end? do we have a program running on the pc that changes the colors all the time or do we upload some script to the keyboards controller so we don't need to have something running on the pc?

wide nymph
#

Please check the pinned post for the Google doc documentation and Github source

bleak oyster
#

the pin is just about how to make a program on the pc control the RGB. but my question was whether there is plans to somehow upload a script to the keyboard instead so we don't need to have a program running in the background

hybrid lake
#

I think calder wasn't responding to you, give me a sec

bleak oyster
#

oh ok

hybrid lake
#

It's mostly aimed now at app/game developers that want to add support for Wooting keyboards to whatever color integrations they have. That's why it's a seperate library that doesn't require the Wootility or another service to work

bleak oyster
#

ah ok

hybrid lake
#

For custom RGB themes or effects we need some sort of plugin system for the Wootility. I'm not against it, just not sure how to implement something like that

bleak oyster
#

how do the presets in the wootility work? does it keep a background process up on your computer?`

hybrid lake
#

Yeah exactly

bleak oyster
#

uploaded with the firmware?

wide nymph
#

@cursive marlin Here it is, info in pinned

cursive marlin
#

Thanks 😄

hybrid lake
#

The rgb effects are hard-coded in the keyboard, the presets are just color sets that are sent from the Wootility and then saved on the keyboard

bleak oyster
#

so i guess the only way for me to make lets say a inverted ripple effect would be a program that always needs to be running in the background for now?

wicked grove
#

Yep

hybrid lake
hybrid lake
cyan saddle
#

Plugins should not be that hard. Depends on a lot of stuff though.

steel ruin
#

« We are thinking of launching something like a community hub thing on our site, possibly» Maybe also consider using/utilising "topics" on GitHub? (E.g., https://github.com/topics/discourse-theme-component is for repositories with Discourse theme components.) A community hub thing controlled by yourself would still be good though (not all people might have GitHub as their preferred platform, esp. recently…).

steel ruin
#

@round rivet Your time desyncing may be because Linux expects your hw clock to be UTC and Windows expects it to be localtime, so whenever you switch from one to the other, their NTP/time daemons starts stepping towards the "correct" time. (The best solution for this would be to tell Windows to also expect the hwclock to be UTC, but that's arguably a bit more hacky than telling your Linux to expect localtime though.)

#

Also, general heads up, I don't have a Wooting One, but I do almost exclusively run (Arch) Linux, so if you need anything tested (that doesn't require the hard wares), just ping (or, probably better, DM) me. (Not sure how many here are Linux peeps, so thought I'd offer my services as best as I can.)

round rivet
#

@steel ruin Thank you for the nice explanation. I know that. Used to change registry in windows to avoid that. Now I am just lazy :)

steel ruin
#

@round rivet Haha. Alright. You never know what people know, and it is certainly something I could see someone new to Linux/*nix being confounded by.

cyan saddle
#

I just tell Linux not to update the clock.

#

I do exclusively use Linux on my laptop.

hybrid lake
#

thanks for the topics tip, will also make it easier for us to track @steel ruin

sharp patrol
#

I'm having a ton of problems attempting to build the rgb-control, I downloaded it, opened the project, added the hidapi into the folder, as it didn't come by default, and when I build I get all kinds of errors...

bleak oyster
#

maybe forgot to --recurse-submodules while cloning?

sharp patrol
#

I'mma try to clone with git then

#

This time I cloned with git clone https://github.com/PastaJ36/wooting-rgb-control --recurse-submodules, but it still fails to build

bleak oyster
#

are you on debug? if yes try release

sharp patrol
#

Oh

#

Yeah, I was on debug

bleak oyster
#

@hybrid lake already fixed this, guess he still needs to push

round rivet
sharp patrol
#

I got it working, yay.
Also, nice wrapper and test, Dommy 😃

sharp patrol
#

As long as you have a dll, its pretty easy to make it work in python 😃

wicked grove
#

😄

sharp patrol
#

I had a bit of a rough time with the wooting_read_full_buffer, and since I had access to source for the dll, I copy pasta wrote a new function that splits the scan code and analog value into two seperate arrays, because python really dislikes structs 😄

sharp patrol
#
WOOTINGRGBCONTROL_API bool wooting_rgb_array_set_full(uint8_t *colors_buffer);

For that function, how large should colors_buffer be? I'm guessing rows*keys_per_row*3 = 6*21*3, but wanna make sure.

hybrid lake
#

Maybe we should just pass it as array and leave parsing up to the implementation

#

Than at least the memory layout is guaranteed

#

Yes it is @sharp patrol

sharp patrol
#

Alright, thanks, I'm trying to make an python version for it, so I can use it with my discord bot

#

@hybrid lake Its prolly better to keep it to basic types as far as the dll goes, yeah.

#

Mind if I ask if you have a list for scan code to which key it means?

#

If you do, please do add it to the GitHub as well

round rivet
sharp patrol
#

... 🤦

#

Yes, thank you ❤

#

Wait, what about the scan codes for the numpad? (I know none has them now, but worth asking if you wanna extend so that the numpad counts on after the mode key)

#

In Simon's Wooting.NET wrapper, he had a similar list, but his included the numpad and macro keys.

#

Though its worth mentioning his list is a bit different, so its not a straight copy pasta. 🤷

sharp patrol
#

I'm not sure what I am doing wrong, but my keyboard tends to get stuck whenever I try to set the rgb on a key

wicked grove
#

Happens for me sometimes

#

I launch the program and the keyboard doesn't want to draw the colors

sharp patrol
#

Its not just that it doesn't want to draw the colors for me, but it also stops responding, even to keypresses in general.

wicked grove
#

That too, but only if I try to switch current mode from digital to analog or vice versa

sharp patrol
#

It seems that at certain times, reading the (full) buffer will cause the keyboard to get stuck, and repeat any keypress that was pressed until you unplug it

#

I can't see any closer than my code stopping at a dll function call.

placid ledge
#

@sharp patrol The list I made is purely based on the order of keys for easily getting the coords of a key, it's not based on scan codes

sharp patrol
#

Oh, I see

placid ledge
#

I should probably add that scan code enum, it didn't notice it before

sharp patrol
#

it seems writing the RGB is where it often fails for me (and gets stuck)

hybrid lake
#

Do you have the usb improvements branch and latest firmware? @sharp patrol

sharp patrol
#

I installed the wootdev firmware, was that not it?

hybrid lake
#

There’s a branch in the rgb control

#

I’m on mobile now

sharp patrol
#

Oh, a new push to github for the RGB control? @hybrid lake

hybrid lake
#

Yeah it’s a pull request now

sharp patrol
#

Alright, I'll have a look 😃

hybrid lake
#

Alright let me know 👍

sharp patrol
#

@hybrid lake Much much much better with that pull request 👍

#

Having a script in the background writing to the RGB does not impair its ability to type now with the dll from usb refactor

hybrid lake
#

Yes, this is dope 😄

#

Do you use the analog reader for the input too

#

?

sharp patrol
#

Yes it does 😃

#

The RGB control works flawlessly after building the DLL with the usb refactor 😃

hybrid lake
#

great

#

if you publish it on github we can feature it on the dev portal

#

would be nice to have a python example

sharp patrol
#

Will do, just gonna make a proper test file and add documentation to the methods

#

You'll need to change or add a new method for the full buffer that takes the integer arrays instead of a AnalogRaw array. I just named mine wooting_py_read_full_buffer, but I think you might wanna name it better. If you implement/change the function let me know 😃

cyan saddle
hybrid lake
#

Omg, good find!

round rivet
#

@sharp patrol @hybrid lake I guess the PR can be merged now (?)

sharp patrol
#

@round rivet PR?

round rivet
sharp patrol
#

Oh yeah, its vital for it to work properly

#

I tried before without the update, and it worked in a few cases, but very often did the keyboard get stuck sending the same keypress.

#

Then Jeroen mentioned the refactor, and I had a bit of a rough time downloading it and applying it, but after it was done, it was well worth the trouble. 😃

round rivet
#

There's also a memory leak fix. I am a bit confused about why have RGB control and analog reader as separate repositories.

sharp patrol
#

Perhaps someone just wanna read the value? and others just wanna write rgb without reading? Though it's most likely because he developed the reader first, then the rgb controller, but wanted to keep them seperate to make the development easier for the time being ShruggingKyonko

round rivet
#

Maybe, solo development is messy.

wide nymph
#

Because the analog part needs to be universal and not dependent on or intertwined with our own RGB solution.

round rivet
#

What about having it as module/namespace in the same repo? For the whole CRUD to be available in the same SDK API?

sharp patrol
#

I'm not saying that spreading your company's name is wrong, but if you want it to become universal, shouldn't the wooting name in the analog reader be kept to a minimum?

#

The function name doesn't affect the function, so the naming doesn't really matter that much.

round rivet
#
namespace wooting {
    namespace keyboard {

        class AnalogReader;
        class KeyPressEvent;

My take on it.

cyan saddle
#

I do like the idea of keeping them separate. Make the code a little smaller when only one side needs to be used.

hybrid lake
#

I'll merge it this weekend.

#

As for the split, we want to have a complete split to allow the analog reader to develop into something that is not just dependent on a wooting keyboard

#

Hypothetically speaking, razer should be able to use it while keeping their own RGB system

jade drum
#

I wrote some minor patches to get wooting-rgb-control to compile on Linux, would someone be willing to check that I didn't break windows?

hybrid lake
#

I won't have time tonight, but feel free to share and I'll take a look tomorrow 😃

jade drum
cyan saddle
#

Skimming on my phone it looks okay.

jade drum
#

git format-patch HEAD~ was a lot faster lol

wide nymph
#

@grizzled wolf now have access

grizzled wolf
#

Thank you kindly

wide nymph
#

All the information is in the Pinned posts on the top of this discord channel.

#

This July we will release everything public on the dedicated wootdev website.

grizzled wolf
#

allright.gif

cyan saddle
#

Oh cool.

wet knot
#

just to test

#

you should have access now

pliant carbon
hollow iris
#

'Morning here !

wet knot
#

All information needed as said is in the pinned post.

#

Any quesitons feel free to ask other devs who have experience so far (guys in yellow) or the founders ofc, WootHelp is here but im a web dev not a programmer 😃 so im sorry if im unable to help.

pliant carbon
#

sounds good

wet knot
#

Your perm should cover everything here, if there is an issue message me.

pliant carbon
#

I'm not sure what 99% of this means in the github

wet knot
#

I thought you joined to develop something 😂

pliant carbon
#

Do I need something extra?

#

the hidapi?

sleek isle
#

Thanks <@&195660585931636737>

kindred skiff
sharp patrol
#

@pliant carbon Did you solve it or still need help?

pliant carbon
#

No, I'm not sure why it can't find the file

#

An issue with how my visual studio is installed I think

sharp patrol
#

Its looking at "hidapi/hidapi.h", I think

#

Did you download it from the github page, or with git in commandline?

pliant carbon
#

I cloned it from the page

sharp patrol
#

Then you didn't get the hidapi repo with it.

pliant carbon
#

I have that

#

?

sharp patrol
#

But does it have anything inside it?

pliant carbon
#

yes

#

it has the whole repo

sharp patrol
#

Sorry for the delay, from what file does the error message originate from?

pliant carbon
#

hang on

#

when I build wooting rgb control

#

cannot open for some reason

sharp patrol
#

Can you open it to see the code?

#

Otherwise its that VS can't find it

pliant carbon
#

I have the wooting rgb control file open

sharp patrol
#

and the hidapi.h?

cyan saddle
#

Are the inclide paths relitive?

#

@pliant carbon

#

The paths should have something like $(ProjectDir)\..\..\hidapi\hidapi.

pliant carbon
#

um

#

I don't think so

cyan saddle
#

Right click the solution (second to top level in the tree), properties, c++, general, additional include paths or something to that nature.

pliant carbon
#

Yeah I'm there

#

should I add that path to it

cyan saddle
#

Click the edit button, what's in there?

pliant carbon
#

nothing

cyan saddle
#

Really?

pliant carbon
#

or is it that middle one

cyan saddle
#

Well that's probably the issue then. Make sure you close that and choose "all configurations" (or similar) in the combo boxes up top then add it. Should fix the issue if I used the correct path. (On mobile)

pliant carbon
#

It didn't do anything, same error

cyan saddle
#

Alrighty, I'll have to look at that when I get home.

placid ledge
#

@pliant carbon Are you on the Debug or Release build config? I'm pretty sure your issue is due to the Debug config not being setup correctly, so you need to use release

pliant carbon
#

Ah it was set on debug

#

putting it to release fixed it, builds fine now

#

now gotta find a way to use this api with python

cyan saddle
#

I can't help you with that at all.

pliant carbon
#

the wootdev portal explains it well

#

where's the basic-example.js file?

hardy forge
#

is there a github repo or a README file...?

#

oohn i see thank you

hybrid lake
#

Did you do some tests with changing the lights on linux btw?

cyan saddle
#

Your can try in WSL maybe.

sharp patrol
#

I saw the push and decided to build it, and it complained on that xD (Sorry if I'm repeating and you already pushed an patch for it)

hybrid lake
#

Oh man, you're fast 😛

sharp patrol
#

Mode is also redefined

#

I don't know if this is a python specific issue, but I'm getting some cases where the buffer can get really far behind or just plain unresponsive.

hybrid lake
#

Maybe it's because the buffer doesn't get reset?

#

So you feel like there's still values in them

#

the analog reader only updates the buffer untill how many keys are pressed

sharp patrol
#

Well, I'm calling the buffer with 16, to allow the maximum amount of keys. But sometimes I can press some keys, and release them, but the reader still reports them as pressed, even though they were released a few seconds ago

hybrid lake
#

The reader doesn't report them that way, the buffer just doesn't get updated

#

You can reset the buffer after every read or check how many keys are pressed from the function result

#

Not sure how we can make it more clear

#

Added DLL links to the pinned post

#

For everybody that joined today:

#

Welcome to the wootdev channel! Most things are still a work in progress, but feel free to mess around and ask any questions you have. Contributions are very welcome.

sharp patrol
#

Perhaps add a "Read the pinned messages" as the channel topic 🤷

wicked grove
sharp patrol
wet knot
#

@sharp patrol better? :p

wicked grove
#

No 🅱s everywhere, literally unplayable, asking for a refund

wet knot
#

🅱e quiet

#

there

#

@wicked grove Mission Acomplished

wicked grove
#

🅱anks you ve🅱y much

sharp patrol
#

👌

jade drum
#

The only function I was able to test is that I do not have a keyboard connected :P

wet knot
#

You don't have a wooting?

jade drum
#

I haven't had time to order one yet lol

wet knot
#

Oh

rancid root
#

@placid ledge I'm considering doing the work to support for wooting keyboards in the Godot engine when the reader is further along. Anything I should consider?

placid ledge
#

@rancid root Um, I'm not sure

sharp patrol
#

@pliant carbon Check the pinned messages

pliant carbon
#

Oh

#

those links are new

#

they weren't there yesterday

sharp patrol
#

While downloading the DLL files is nice and all, I prefer compiling it myself to have access to the code. But either way, it ends up as a DLL.

#

As for how python works with DLL's, the ctypes modules offers ways to load and call the functions in the DLL.

pliant carbon
#

yeah ty

sharp patrol
#

@hybrid lake Could it be added to the API to return if the keyboard is ANSI/ISO?

#

I mean, atm I have a dictionary of scancode to position on the keyboard to do the lighting upon key press, but I'm sure those positions wouldn't line up for an ANSI keyboard

placid ledge
#

@sharp patrol AFAIK they will be the same, coord wise, only diff is having the extra keys in the iso layout in the middle of the layout

#

in theory, if you're just drawing lighting over the coords it shouldn't matter the layout, as if it is iso it'll light the extra keys, otherwise it won't, the rest of the map is the same for both

sharp patrol
#

So its only a matter that ISO splits the left shift into two keys, while ANSI splits the enter key into two keys?

pliant carbon
#

Hi, I'm confused with how to use the DLL within python, and how to convert the code shown in the Wootdev portal

#

How do I define the functions?

#
import ctypes
dll=ctypes.WinDLL('wooting-rgb-control-64bit.dll')

proto=ctypes.WINFUNCTYPE(
    ctypes.c_bool
    )

parameters=None
keyboardOn=proto(("wooting_rgb_kbd_connected",dll),parameters)
#

this is what I have so far, it returns true

sharp patrol
#

I do not use the WinDLL function, as it becomes unnecessary complex to call functions

pliant carbon
#

which should I use instead?

sharp patrol
#

I use the ctypes.cdll.LoadLibrary(dll_file)

#

which returns an object with the dll loaded and ready to go, assuming the filepath exists.

pliant carbon
#

That's what WinDLL does too apparently

#

as in cdll.LoadLibrary returns the same thing as WinDLL

#
>>> a=dll['wooting_rgb_kbd_connected']
>>> a()
1
#

@sharp patrol is that correct use?

sharp patrol
#

Noooo

pliant carbon
sharp patrol
#

You call it by doing ```py
dll.wooting_rgb_kbd_connected()

pliant carbon
#

oh

#

Why doesn't it appear when you press tab

sharp patrol
#

Cause the interpretter doesn't know what's in the DLL file

placid ledge
#

@sharp patrol ISO has hash and enter, whereas ANSI has backslash and enter

pliant carbon
#

oof

#

wish I knew that before

#

but ty

sharp patrol
#

The important thing to keep in mind though, is that you need to pass ctypes variables to it.

#

@placid ledge Oh, I see

placid ledge
#

I dunno if this has been posted here, but this is the map Jeroen gave me

sharp patrol
#

That's extremly useful!

placid ledge
#

So the BSL at 2,13 is ansi only and the two iso ones are iso only

#

with the rest being the same

#

This map is what I based the dictionary in Wooting.NET on

sharp patrol
#

Hmm, I see, and ISO keyboards will never give the scan code of BSL (And vice versa)? So you can put them in the same dictionary without them sending positions that doesn't exist.

placid ledge
#

I assume so

#

I'm pretty sure it doesn't matter if you give the rgb control coords that aren't relevant to the layout of the connected keyboard

sharp patrol
#

The array with the size 21*6*3 will hold the colors for the non-existing places anyway 🤷

hybrid lake
#

2/13 and 3/12 are the same under the hood

#

they can be combined, not sure yet

placid ledge
#

It makes sense the way it is currently

sharp patrol
#

@hybrid lake Be sure to add that picture to the docs, its very helpful when pointing to a key

hybrid lake
#

Yes I will, I just need to make it wooting style

pliant carbon
#

yay I got it to work

sharp patrol
pliant carbon
#

that map is useful

pliant carbon
#

btw sending too many updates will brick your wooting

wicked grove
#

You mean RGB stops or the entire keyboard?

#

As I ran into both of these already

pliant carbon
#

the entire keyboard

wicked grove
#

Changing mode from digital to analog while rgb is controlled will brick it

pliant carbon
#

wew

wicked grove
#

I only encountered RGBs stopping to update after restarting my app multiple times

sharp patrol
#

I've only encountered the RGB stopping before the USB refactor ShruggingTohru

wicked grove
#

Maybe I have issues as I'm updating keyboard 120 times per second

sharp patrol
wicked grove
#

Cus u know, gotta have em FPS on the keyboard

sharp patrol
#

Can it even update that fast? 02think

wicked grove
#

Idk

sharp patrol
#

I mean, its just some LED's, so I'm sure it has like an update rate of a 1 kHz or more

#

But, the bandwidth to the processor is probably going to limit that rate haHAa

#

Or perhaps ... idk 🤷

pliant carbon
#

consider the effects already on the board

#

the wave effect must update hundreds of times a second

sharp patrol
#

Are you sending each key's color or the massive array?

hybrid lake
#

As for the ANSI/ISO split, I haven't thought of an easy way to add it yet

#

Although I don't think it's necessary

sharp patrol
#

Yeah, I just realized that after Simon went over that the keys don't collide

#

It was just if the lib should have been "Oh, its ISO, I should load this dictionary for the scan code to coordinates"

#

But, since they don't collide, that isn't needed.

hybrid lake
#

👍

pliant carbon
#

@sharp patrol how do I convert tuple to c array with ctypes?

#

sending func((foo,bar),foo) says it doesnt know how to convert (foo,bar)

sharp patrol
#

You declare an C array of the length you want, and initiate it with all zeroes, then pass that onto the function

#

Which function are you doing?

pliant carbon
#

wooting_rgb_direct_reset_key

#
def rgb_timeout(self,row,column,time):
        self.dll.wooting_rgb_direct_reset_key([row,column],time)
sharp patrol
#

wooting_rgb_direct_reset_key only takes row and column, if I didn't miss any update

#

hold on, I'm checking the github

pliant carbon
#

oh it does

#

oh I see you just call it

#

I was confused, I thought you specified when it reset

#

@sharp patrol dw then I got it

sharp patrol
#

Alright

#

It might give an error an error if you attempt to call it with python integer, don't know if it works or not.

pliant carbon
#

they work fine with python integers

#
import ctypes
class rgb_control():
    def __init__(self,file='wooting-rgb-control-64bit.dll'):
        self.dll=ctypes.cdll.LoadLibrary(file)
    def keyboard_connected(self):
        return bool(self.dll.wooting_rgb_kbd_connected())
    def keyboard_reset(self):
        self.dll.wooting_rgb_reset()
    def keyboard_set_rgb(self,row,column,rgb):
        '''rgb must be tuple'''
        red,green,blue=rgb
        self.dll.wooting_rgb_direct_set_key(row,column,red,green,blue)
    def rgb_timeout(self,row,column):
        self.dll.wooting_rgb_direct_reset_key(row,column
#

all of this works fine

sharp patrol
#

Hmm, I set mine to ctype ints, but it looks like its not needed ShruggingTohru

pliant carbon
#

anyway I got a key to light up when someone pings me on discord

sharp patrol
#

I plan to use mine to display various stats of my music bot ShruggingTohru

sharp patrol
#

But, that's after documenting it and uploading it to Github. 😃

sharp patrol
cyan saddle
#

sees brick talk
Uhm, you can flash it at home I hope?

sharp patrol
#

Hmm?

round rivet
#

About the keyboard bricking if changing modes during some of the operations. 🙃

sharp patrol
#

Oh yeah ShruggingTohru

steel ruin
#

@pliant carbon «consider the effects already on the board» but as you say, those are on the board - those instructions don't need to go through the CPU and USB to reach the keyboard. (AIUI anyway.)

#

@sharp patrol (Effectively) Windows-only Python module. FeelsBadMan 😦

hybrid lake
#

@sharp patrol awesome, I'll check it out later

#

Oh changing modes is hard. Effectively I'll have to disable rgb changes when changing modes, but not sure how to indicate a mode change then

sharp patrol
#

@steel ruin Which function is it that unix doesn't have?

steel ruin
#

@sharp patrol DLLs. 😃

sharp patrol
#

Oh, then there isn't much I can do on the software side for you ShruggingKyonko

steel ruin
#

Once I have my own Wooting I'll start poking at it myself. 😃

sharp patrol
#

Well, the api source is there, if you wanna try and rewrite it so it can work on linux 🤷

#

But, with wootility working on linux, I assume they plan to add proper linux support for the api eventually.

round rivet
#

@hybrid lake Don't know how it works on your side. But is it possible to create a queue for requests and drop them/change queues gracefully when the mode is changed?

hybrid lake
#

It's very hard to queue them in the firmware

#

At least I think

sharp patrol
#

🤔

sharp patrol
#

It might be good to add "Is_keyboard_avaliable" (or occupied) function that will return a bool for when its okay to send commands, and if its recently switched profiles, it will return false for maybe a second or two to make sure it doesn't brick when running?

hybrid lake
#

I can queue the color changes, because that's where it crashes

#

The only thing is: let's say I have a custom color scheme running and the user presses the mode key

#

who wins? the custom color scheme or the profile colors in the keyboard

chilly oar
#

I think a check function should be bad, the keyboard has either to ignore or query the changes when it's busy and can't handle it instandly. Normaly I expect a option on the wootility to block all external colour changes from outside (except the wootility itself) and a option in the game or software to give the permission to change it. I also expect that a game integration would override the current default colour of the keyboard and when it's closed the colours are set back to normal.

@edit: I think it would be nice if we can block external colour changes depending on the profile. So no program can change the colour of the digital and profile 2 but on 1 and 3 for example. So the owner decide who wins...

pliant carbon
#

Are array functions in the RGB DLL yet?

round rivet
#

@hybrid lake the way I imagined it - you'd have to switch contexts. Any app/game represents the context. Have two modes - one static, the other dynamic. Dynamic - current context dictates the rgb etc... Static - well, static color schemes.

hybrid lake
#

@chilly oar good ideas, but I would like to keep it logically as simple as possible. I like having a switch in the wootility to completely disables all color changes

#

@pliant carbon they should already be there

pliant carbon
#

ok

hybrid lake
#

@round rivet not a 100% sure what you mean, can you apply it to the situation I described above?

#

So static is no external color changes happening, as soon as an app starts it becomes dynamic and thus solely dictated by the app?

steel ruin
#

Can you do anything in the Wootility that you can't do via the API? (E.g., is the Wootility directly using the API, or is it using its own "secret" API/interfacing.)

chilly oar
#

@hybrid lake A switch for all would be good for now, but maybe later on per profile would be great.

round rivet
#

@hybrid lake in static it ignores all but whitelisted wootility. In dynamic it doesn't ignore integrations, color changes etc. Regarding your issue - user always wins. 😅

chilly oar
#

But I don't assume the logic would be that complicated. One global variable in the memory that represent if it's allowed or not, a test condition per RGB change function and one status value per profile that change the variable when it's set.

hybrid lake
#

Of course the user should win, but in this case the user wants to switch a profile, not necessarily the colors

#

@chilly oar it's not just about the firmware, also UX, profile layout etc

sharp patrol
#

(Imagining the per profile switch has been implemented) So if the user allows it on both profiles, it switches profiles, and keeps the color already made by the API calls?

#

Also, it would be good with a "Reset color combination" if the software communicating with the API encounters an error and doesn't reset the color.

chilly oar
#

@round rivet I don't get it... Now, when no programs are open no changes are made (static) and when a application is open it overrides the colours (dynamic). So what do you want to change?
@hybrid lake Yes, whats the only thing that takes a lot of time for it I guess.
@sharp patrol I would assume that the keyboard changes the colour to the selected profile until the colours are reupdated by the program again.

#

Maybe I missed something in general... The two github Project on top are just the source code of the DLLs right? There are no documentation of the functions available yet or?

sharp patrol
#

I assume it would change to color of the selected profile IF custom colors is turned off for that profile, otherwise changing profile but staying with the color array written by the software.

chilly oar
#

What does "wooting_rgb_set_disconnected_cb" actually do?

sharp patrol
#

If the keyboard disconnects, it calls the function specified

chilly oar
#

oh ok

sharp patrol
#

cb = Callback

chilly oar
#

Will "wooting_rgb_reset" remove all changes from the application so the colours are set to the current profile default values?

sharp patrol
#

Yeah

wet knot
#

@chilly oar you have a wooting right

#

Because you don't have a rank for some reason xD

chilly oar
#

yes, but currently have no time to test it for myself

wet knot
#

Role sorry

#

I'll give it now

chilly oar
#

I don't ask for it because I don't really need this role.

wet knot
#

To late

chilly oar
#

@sharp patrol That would be the best option (colours stay on profile change when it is allowed), but it makes it a little bit more complex.

sharp patrol
#

It just needs to store the boolean value for allowed/or not on the keyboard, so it can check it up ShruggingKyonko

#

And it needs to check it when changing profile.

chilly oar
#

It needs a little bit more @sharp patrol . It has to check, if temporary changes are made or not, too.
So it musst accept and store the values in the memory, even when it's not allowed on the current profile. When the profile changes and it's allowed on it, it has to use the RGB values from the memory, even when it wasn't allowed on the previous profile. Additional it has to check if a program has currently send RGB values or not, because when no program has changed it the keyboard has to show the default colours of the profile.

sharp patrol
#

If I'm not wrong, it already keeps the RGB written to the keyboard in an array, but if its not allowed on the profile it would need a second array to store it in until it becomes avaliable.

#

But, like I said, I could be wrong. Jeroen knows better on this than I do.

abstract talon
#

I have access thx Jeroen!

hybrid lake
#

Make sure to check out the pinned post! 😃

abstract talon
#

aw sweet! I will definitely check it out!

torpid juniper
#

Probably a dumb question, but what's different about the "Wootdev" firmware?

wet knot
#

Wooting API basically

#

For this channel

#

To build stuff with

torpid juniper
#

I see. So the way commands/data are sent to the keyboard with the regular firmware is different than what the newly-released API's use?

wet knot
#

Honesty I'm no programmer

#

But it allows you to access the wootings firmware etc

#

For example a few people have made custom rgb stuff

wide nymph
#

@torpid juniper Wootdev firmware includes the SDK support, in a way, it's a beta version of the next firmware release. It'll be standard on every keyboard.

torpid juniper
#

Cool. I guess I just figured that the SDK would communicate with the keyboard in the same way that wootility does now, so I didn't think a firmware update would be necessary. That was probably naive of me. I'm sure there's a good reason for the update.

wide nymph
#

We separated the RGB and analog communication. Before, it was 1 piece.

#

The separation is to ensure that we can apply the analog communication on any analog input device instead of only our own keyboard.

torpid juniper
#

Interesting. So you envision this SDK being used to communicate with many analog devices in the future? So devs work with one SDK, and get support for a wide # of devices? I guess that fits with your goal to make analog keyboards a standard.

wide nymph
#

Yes exactly @torpid juniper that’s why it we are also opting for open sourcing as much as we can.

pliant carbon
#

regarding bool wooting_rgb_array_set_full(const uint8_t* colors_buffer) {
does it take a single number as an input, or an array?

chilly oar
#

It sends 378 (6 * 21 * 3) byte to the keyboard, starts with the given address.

#

To answer you question correctly, it takes a address, not a value.

#

And if you don't want to send nonsense you have to ensure you give it a array of that size that you set before.

pliant carbon
#

I dont get that

#

in the code all that colors_buffer does it set the colour

#

@chilly oar

uint8_t red = colors_buffer[baseIndex + 0];
uint8_t green = colors_buffer[baseIndex + 1];
uint8_t blue = colors_buffer[baseIndex + 2];
chilly oar
#

give me a second

#

You have to give that function the address of a array with 378 bytes. A byte matrix of 6 row, 21 columns and the three values of the colour (red, green & blue).

pliant carbon
#

I see

chilly oar
#

The function gose other eyery key in the 6 row - 21 column matrix and take the 3 colour values and send it to the internal buffer.

pliant carbon
#

I'm using python with a DLL so it might be hard to get an array and stuff

chilly oar
#

I don't khow phyton before, but try ' array = [[1,2], [3,4], [5,6], [7,8]] ' for a 4 * 2 array, for example.

#

But maybe you have to use a char instead of a integer to hold a byte.

pliant carbon
#

oh maybe that would work

#

an integer works as a byte in python

chilly oar
#

An integer only has 255 different values in phyton, sounds weird?

pliant carbon
#

no but it works

#

eg I can do this

#
    def keyboard_set_rgb(self,row,column,rgb):
        red,green,blue=rgb
        self.dll.wooting_rgb_direct_set_key(column,row,red,green,blue)
#

don't need to be bytes

chilly oar
#

If you want to use a array maybe this will work ' examplearray = bytes([0x13, 0x00, 0x00, 0x00, 0x08, 0x00]) ' for a 1 * 6 array.

#

For phyton 3

pliant carbon
#

ok I'll see if I can make it work

chilly oar
#

Or you can make your integer array as usual and just convert it for the function.

integerList = [1, 2, 3, 4, 5]
byteArray = bytes(integerList )

sharp patrol
#

For an array you use the ctype uint8 array 🤔

#

I stick to converting everything to ctypes in my wrapper to avoid any possible error on that part.

#

@pliant carbon

c_array = (ctypes.c_uint8 * (length))(*(0 for i in range(length)))
pliant carbon
#

¯_(ツ)_/¯

#

ok

steel ruin
#

Note that there are a ton of modules on PyPI to do various things with colors, if interested: https://pypi.org/search/?q=color

#

(PyPI is the official Python package(/module) index.)

chilly oar
#

@hybrid lake As I understand it correctly the W1 uses two special dedicated USB devices, one for RGB write and one for analog read and you differ them by the usage id. But as I understand the HID stuff by now, you use a reserved value for it befause 0x1337 for RGB and 0x1338 for analog are in the 92 - FEFE reserved range and not in the FF00 - FFFF vendor defined range.

See table 1 on caption 3 in http://www.usb.org/developers/hidpage/Hut1_12v2.pdf

hybrid lake
#

Yeah you're right, I should change it

#

Who experienced crashes again while switching profiles? I can't reproduce it with the latest WOOTDEV firmware

chilly oar
#

I think it was @wicked grove

wicked grove
#

Maybe I need to update my kb

chilly oar
#

So it's good that I figured it out before the public opening of the dev portal, because the current dll wil no longer work then.

chilly oar
#

@hybrid lake You wrote "Scan_Numpad5" instead of "SCAN_Numpad5" on https://github.com/PastaJ36/wooting-analog-reader/blob/master/src/wooting-scan-codes.h#L102.
And on https://github.com/PastaJ36/wooting-analog-reader/blob/master/src/wooting-analog-reader.c#L61 you use a 0 millisecond timeout. I think there must be a -1 instead so it handle the call as a blocking one, 0 milliseconds are to fast

pliant carbon
#

madlad

sharp patrol
chilly oar
#

thx

hybrid lake
#

It's non blocking on purpose. The idea is that the function can be called faster than there are new packets available. I'll add it as a comment to make the purpose clear

#

I changed the spelling error thanks

#

Feel free to request it in the future on github yourself 😃

round rivet
#

@chilly oar Maybe we could do PRs on Github and discuss there, like the cool kids 🤔

hybrid lake
#

Damn timing lol

#

But yeah I agree, especially to prevent some closed circle that just works on discord

round rivet
#

And for many other reasons as well 🙃

hybrid lake
#

It might be over the top for this, but I'm just experimenting with github workflow

chilly oar
#

ok, but the weird thing is now it works for me with the zero...

hybrid lake
chilly oar
#

yesterday I never got any data from it until I use it in blocking mode, as I said weird thing.

round rivet
#

HeisenFirmware

hybrid lake
#

data from where? how did you use it?

chilly oar
#

At the moment I play a little bit around with the wooting-analog-reader. I set up a Visual Studio project and imported all the sourcefiles so I can debug it. I use Wireshark and some other tools to inspect the USB device informations and capture and inspect the RAW data from the wooting one.

#

I want to figure out how the HID stuff work and try to create a virtual device, but currently I only use SendInput to send keystrockes to Win.

#

Did you know if it's possible to send data to the already installed W1 devices from Win itself? So I can send a command to the keyboard device from a program so Win thinks this would came from the hardware.

round rivet
#

😕 so you want to reverse engineer the "protocol" and create virtual w1?

chilly oar
#

Only to know how the USB stuff is working. If it's possible I would reuse the existing devices so I don't need to create my own virtual ones.

#

I watched the USB raw data only because I don't got any data from the analog reader. So I found out the wooting one was corretly sending the data, but the program don't saw it. But now it work just fine, so on...

hybrid lake
chilly oar
#

Thx, I don't really want to depend on some big projects, after all I want to learn how this stuff works too and don't rely on other projects. Your last link look very interesting.

#

I interested in how I can communicate to a USB device but also to a registred device in Win itself.

placid ledge
#

By any chance could anyone test the latest commit on Wooting.net and Aurora? I've updated them with the renamed lib but I won't be able to test it for a few days

hybrid lake
#

I'll check it out later today

main bronze
#

Hi all, wrote this wooting101 example to use functions from both dlls : the key pressed and side keys are lightened depending on how much you press 😃

#

nodejs

#

however when you have this running, the keyboard becomes so sluggish it's impossible to use

#

i guess that kind of stuff would run better as c

#

anyway, dll are easy to use, the doc needs some work, but that was forewarned, good work team !!!

quiet root
#

why not use node-gyp bindings tho

round rivet
#

@quiet root tell me more

quiet root
#

?

#

this is used for things like node-opus etc aswell

round rivet
#

Cool, I was wondering why is node-gyp better in this case.

hybrid lake
#

Mostly because I've never used it before and this method is more in line with how you would use it in other languages @quiet root

quiet root
#

well node-gyp would give a more native interface to what pmuch all node modules work like

#

might actually make the node-gyp bindings myself and a coresponding npm package

hybrid lake
#

Yeah for sure, please feel free to do so 👍

quiet root
#

will do once i got my wooting kbd 😄

hybrid lake
#

Are you waiting for the two?

hybrid lake
#

Checked it out @placid ledge , looks good. I'm still tweaking some header file comments, working on the RGB part today. The analog part is pretty much final

#

As in: I read it, didn't test it, sorry

quiet root
#

yes jeroen

#

and giving out untested code is just against my german nature i guess.... would feel really weird

placid ledge
#

@hybrid lake Thanks

#

Are there going to be anymore changes to the RGB SDK before release? I was going to make an Aurora release but wanted to wait incase you updated it

round rivet
#

@placid ledge @hybrid lake what about the reporting protocol to identify the keyboard on Linux?

hybrid lake
#

No API changes, I'm still looking into the Linux thing but that shouldn't influence aurora too much

#

We're going live today or this weekend

#

@round rivet haven't found the time for it yet, sorry. Prepping everything takes a lot longer than expected

#

Would love to get everyone's feedback on something:

I'm thinking about releasing the SDK on Mozilla Public License Version 2.0. Basically: you can use it for commercial purposes, but modifications need to be published. (As far as I understand)

We choose this so any developer can take the whole library, implement it and release it with whatever. It should protect us from a bigger entity taking everything, modify it without backwards compatibility and push it to developers.

placid ledge
#

That sounds good

grizzled wolf
#

@hybrid lake MPL sounds fine - there were a few issues with the older one but 2.0 looks grand

quiet root
#

looks good

#

i mean u could also go with GNUGPL3

#

since that wouldnt be bound by the whole same license per file

#

with MPL2 you could technically get away with not disclosing the source of large changes in where u add new files to the whole thing that werent a part of it before

#

you could even change the license that those files would fall under

steel ruin
#

@quiet root "Problem" with GPL is that, say, Razer couldn't static link the analog API library to their custom keyboard setup program, without making their whole program covered by the GPL, meaning they'd have to release their source code.

#

Using MPL (or LGPL or another "weak copyleft" license) circumvents this problem.

#

MPL means that the individual source files are covered by the license, but anyone can include the files in any project, as long as they don't alter the MPL-licensed files. (And if they alter the MPL'd files, they can release just those files with alterations, without necessarily releasing the entire project's source.)

quiet root
#

razer has a custom keyboard setup program?

#

i mean i wouldnt be able to think of a current thing that would be like "oh but they cant do this and that without releasing their source" since well the big entities have their own keyboards and wouldnt support other kbds anyways

#

altho in that case u could also just use GNULGPL3

#

that would cover even big additions of the libraries but would allow for closed source or different licenses of software that uses any interface the opensource library offers

steel ruin
#

@quiet root The point of open sourcing the analog API (apart from being The Right Thing To Do™) isn't that companies can support each other's keyboards, but that they can all share the same API, instead of each company developing their own, which could potentially lower the cost to entry for other manufacturers looking into adding analog to their keyboard line-up.

#

Razer or Roccat or Logitech or whatever aren't necessarily expected to contribute code to the analog API, even if they decide to use it.

quiet root
#

ik that this isnt about supporting other kbds but in that case u can always just go LGPL3

#

which, as you prob know yourself, in this case would allow for closed source config porograms or whatever interfaces with the library/api

steel ruin
#

Or they can just use MPL. 🤷

#

(Which allows for the same.)

quiet root
#

technically could add files to the api/lib that change the entire lib and not release those since well only changes to existing files have to keep the license

steel ruin
#

Sure. Technically, you can also add a front-end interface to an LGPL library that changes the entire LGPL lib and not release that front-end interface.

quiet root
#

and prob also crap the performance

#

i mean as far as i understood the MPL renaming files would consider them as new files

#

altho im not a lawyer

steel ruin
#

No, it wouldn't.

#

It's the contents that are copyrighted, not the filename.

#

I can't just republish Lord of the Rings under a new name and not have copyright apply to it.

quiet root
#

like i said i only know that large enough work done on the source can be entirely published under different licenses

steel ruin
#

If it contains any of the original source, it's a derivative work and the license will apply to it.

quiet root
#

welp at the end its for woot people to choose

steel ruin
#

My recommendation for the license (in PMs with Jeroen) was Apache 2.0, which is a libre license. MPL is more strict than this, but (ever so slightly) less strict than LGPL.

#

This is good. Less strict = bigger chance of wider adoption.

#

And the goal is wide adoption.

#

(MPL does have a trademark clause though, unlike LGPL.)

quiet root
#

altho cant u just release the entire thing under a new license then?

steel ruin
#

@quiet root If it's released under the MPL? Depends on the version of MPL.

quiet root
#

no the AL2

steel ruin
#

Yes, with AL2 you could. It is a "libre" license.

#

Which is good for adoption.

#

But potentially bad for upstream/community.

#

(Potentially!)

quiet root
#

oh cause Jeroen said

We choose this so any developer can take the whole library, implement it and release it with whatever. It  should protect us from a bigger entity taking everything, modify it without backwards compatibility and push it to developers.
steel ruin
#

Yep.

quiet root
#

which is also what id be concerned about

steel ruin
#

That's why he went with MPL over AL2.

#

In the livestream he also mentioned he felt like the (L)GPL were ideologically burdened, coming from Stallman et al. I don't think so, but eh. I honestly don't care too much about MPL vs. LGPL. They're close enough, and either of them does what Jeroen wants it to do for this.

quiet root
#

i technically dont care about what license it would be but thats just cause i personally go full open source anyway

steel ruin
#

Anyway. Bed time now. I'll be happy to discuss more tomorrow. Licenses (and copyright law) is interesting and mostly poorly understood. 😃

quiet root
#

most my work is using The Unlicense

#

but ya gn

steel ruin
#

(I prefer to use CC0 for public domaining, since I know CC has a ton of lawyers and smart people behind it. No clue where Unlicense comes/originates from.)

#

👋

quiet root
#

unlicense is basically having no license

#

thats the entire unlicense license

steel ruin
#

@quiet root The Unlicense is very much not like having no license. Having no license means full copyright applies. The Unlicense is licensing the work into the public domain, which is also what CC0 does. See https://creativecommons.org/share-your-work/public-domain/cc0 for the background/thoughts behind the Creative Commons' "Zero"/public domain license. The Unlicense seems like it's a one-man creation, made by someone who's not a lawyer(?). Multiple organisations recommend using CC0 over the Unlicense license due to CC0 being more mature/more comprehensive: https://en.wikipedia.org/wiki/Unlicense#Reception

“No Rights Reserved” CC0 enables scientists, educators, artists and other creators and owners of copyright- or database-protected content to waive those interests in their works and thereby place them as completely as possible in the public domain, so that others may free...

The Unlicense is a public domain equivalent license with a focus on an anti-copyright message. It was first published on January 1 (Public Domain Day), 2010. The Unlicense offers a public domain waiver text with a fall-back public-domain-like license, inspired by permissive l...

quiet root
#

dont really understand how u got copyright when its unlicensed anyway

#

just blows my mind

steel ruin
#

@quiet root All creative works are copyrighted by default. You license your copyrighted work under the Unlicense to waive the rights that copyright gives you.

#

(This is how all software licenses work. Full copyright protection is the default - whatever license you choose determines which copyright rights you waive.)

quiet root
#

dont see how i should get copyright when i dont care enough to specify what license my work falls under

#

just blows my mind

steel ruin
#

Because that's how copyright works. 😃 If you don't specify a license, full copyright is applied. (Specifying the Unlicense license is specifying a license.)

quiet root
#

like i said blows my mind how not giving a crap about a pretty important step of the creation process (choosing the right license) would still reward u

#

welp at least i know i wont become a copyright lawyer

#

i mean now i know that those wont affect me much anyway

jade drum
#

Is source code for the updater available?

chilly oar
#

No but you can unpack the wooting-updater+Setup+1.1.0.exe file with 7zip and have a look. It seems to me that the necessary JS code is under $PLUGINSDIR\app-64\resources\app.asar

#

Line 933622 and follows

jade drum
#

7z can open EXEs???

chilly oar
#

it depends, if the exe are a selfcontaining zip file yes

jade drum
#

Oh neat. Thanks!

chilly oar
#

and if not you may get some structure of the build of the file

#

but until now I don't get the address of the firmware files out of it

grizzled wolf
#

7z can open every pe file

#

it will just show you the sections if it's not any kind of selfunpacking stuff

jade drum
#

Oh that's really cool

chilly oar
#

Just check out the line on it I wrote above, it's very interesting I think. But I don't want to post the code here.

grizzled wolf
#

alright so i coded something to add analog moving to csgo without the joystick thing

#

there's only 1 problem

jade drum
#

How'd you do that?

grizzled wolf
#

altering the movement struct in memory

jade drum
#

That sounds like an ez ban lol

grizzled wolf
#

nah

#

it's not a cheat

jade drum
#

Yeah, but games don't like it when you poke around their memory

#

Idk about Valve though

grizzled wolf
#

i'm not doing anything to trigger vac's checks 😛

#

or rather i'm not doing anything that can trigger vac's checks

jade drum
#

Ah

#

You wanna share source? :P

grizzled wolf
#

sure, let me upload it to github

#

pm me your github username

jade drum
#

It's the same as my username here lol

grizzled wolf
#

ah k

jade drum
#

Neat

grizzled wolf
#

just throw wooting-analog-reader.dll in the csgo directory

#

in case you want to try it out

#

or loadlibrary will fail

jade drum
#

Does windows just load everything?

grizzled wolf
#

wym

jade drum
#

How do you make CSGO load your library?

#

I have no idea how windows works lol

grizzled wolf
#

use a dll injector

jade drum
#

Ah

grizzled wolf
#

also please use the -insecure parameter in csgo

#

to disable vac, just in case.

jade drum
#

I thought VAC didn't exist on Linux

grizzled wolf
#

it does

jade drum
#

Huh

#

Alrighty, cool

#

I'm gonna try and port it to Linux

grizzled wolf
#

if you're on linux you're going to need to recompile their analog reader library

jade drum
#

Did they even port that?

grizzled wolf
#

and replace winapi functions in my project

jade drum
#

Yep

grizzled wolf
#

i assume

jade drum
#

I remeber having to mess with their RGB library

#

Looks like it doesn't :(

grizzled wolf
#

i'll go sleep, it is 5:33am

#

good night

jade drum
#

Gn

hybrid lake
#

@jade drum I recommend just using the RGB SDK if you want to do custom effects, it's a real pain to do it in the FW.

#

I also said in the tech_talk that the fwr file you were looking at is in this format: https://en.wikipedia.org/wiki/Intel_HEX

Intel HEX is a file format that conveys binary information in ASCII text form. It is commonly used for programming microcontrollers, EPROMs, and other types of programmable logic devices. In a typical application, a compiler or assembler converts a program's source code (such...

#

And I think somebody else mentioned the MCU type: ATXMEGA128A4U and it is indeed made with atmel studio

#

I'm happy to answer any questions you have about the firmware. It's just not as easy to get to the actual source code compared to JS or something 😛

#

If you want to get started with FW development I can recommend getting a Teensy or Arduino

jade drum
#

I have some experience in FW development

#

Some of the effects I wanted to do would require extremely fast polling

#

Which is something I really want to avoid

#

Could probably do a kernel module that maps the analog to evdev

#

But that seems more painful

cyan saddle
#

I am just not active here because I don't have my Two yet.

jade drum
#

So, how hard is it to recover from bad fw?

#

If I flashed a FW that did literally nothing, would it still be recoverable?

#

Is that implemented in the firmware though?

#

@hybrid lake

hybrid lake
#

Hey, I'm thinking about it

#

I think flashing is not a big issue, I'm just not sure how you can work on it without full access to the firmware code

jade drum
#

The switches and microcontroller are both standard hardware, no?

hybrid lake
#

Yes they are

#

I could modify our updater tool a little bit to just get the firmware files locally

jade drum
#

It's just an S3 url?

hybrid lake
#

Then you'll always have "safe" flashing at least

#

yea

jade drum
#

I'm not sure how to flash it though

#

I can't read JS lol

hybrid lake
#

If I modify it you can just place the HEX file in the folder and press the update button

#

should work

jade drum
#

That would be awesome

#

The Intel Hex file?

hybrid lake
#

The compiled firmware yeah, it's the standard output from Atmel Studio

jade drum
#

Neat

hybrid lake
#

But then again, getting it all to work requires knowledge about the hardware too

jade drum
#

Sounds like a fun project :D

hybrid lake
#

Let me discuss it with calder and erik a little bit. I've been thinking about doing some sort of open-source lite firmware

jade drum
#

O_o

#

That would be even more awesome

hybrid lake
#

no promises though 😅

#

I just prefer working with the SDK's because it's easier to provide support for

#

Basic knowledge required is not as high and no bricking issues etc

grizzled wolf
#

opensource stuff is always great

jade drum
#

Idk if I can do the effects I want with the SDK though :(

#

Bricking is part of the experience :P

chilly oar
#

@hybrid lake I was a little bit disappointed when I heared in a stream that you are don't plan to make it open source any more due to your company property, but I can unterstand that. But if you can offer the code for a lite version of it, with maybe only very simple basic stuff or even a little project with only the necessary settings to start to read out the keypress values, it would be great. I don't know but maybe it's possible to have a starting project and some libraries so we can play around and add stuff to it by yourselves without to see your actually written code.

hybrid lake
#

@round rivet I pushed a branch with a new method for linux opening, can you (or someone else) check if it works?

round rivet
#

@hybrid lake Is the latest wootdev firmware required?

hybrid lake
#

Shouldn’t be

round rivet
#

@hybrid lake Works for me 👌

#
vtkacenko@Teapot:~/CLionProjects/cross-platform-woot/wooting-hidapi-wrapper-cpp/build$ sudo ./wooting_hidapi_wrapper_cpp-example 
Creating analog reader
Creating dispatch queue: AnalogReaderKeyboardNotificationQueue
Dispatch threads: 1
Hidapi initialization status 0.
Analog reader found
Usage page 0. 
Product WootingOne. 
Manufacturer Wooting. 
Path 0002:0005:05 
magic
onKeyboardConnected
Closed handle.
Exited library - status 0. 
Destructor: Destroying dispatch threads...
Destructor: Joining thread 0 until completion

round rivet
#

But the hid_read_timeout reads 0 bytes even when making a blocking call 🤔

chilly oar
#

Did you install the Dev firmware? It's necessary for the analog reader because it uses the usage page 0x1338 that are not used in the standard firmware.

round rivet
#

@chilly oar Yeah, I have dev firmware, albeit not the latest available.

chilly oar
#

So maybe this is the reason, as far as I know you have to use the WOOTDEV one.

quiet root
#

whats the major differences between dev and standard fw

lucid island
#

one is for developers

#

and one is for normal people :p

quiet root
#

no i mean is there anything that prevents the dev fw from working like a normal one

sharp patrol
#

(This is my personal opinion on it and nothing more)
I think dev is for people who have done one or more of three things:

* Joined the development and contribute so that Jeroen could fix the code to compile and work properly.
* Developed implementations for the API(This means on a larger scale, rather than coding something yourself that uses the API)
* Extended the API with a wrapper for a previously unsupported language

There are of course exceptions, but that is my view of it. 😃

round rivet
#

Maybe somebody wants to get into dev; maybe somebody is willing to do the grunt work should the need arise.

quiet root
#

well i was asking cause when i get my w2 i want to make a wrapper should the lang still be unsupported

round rivet
#

What language are you targeting?

quiet root
#

node

sharp patrol
#

I managed to make a python wrapper since python supports loading dll's and feeding it with c types

steel ruin
#

Can I ask Linux packaging questions here? Assuming yes, the Wootility AppImage has some files in usr/bin/locales/. Are these translations for Wootility itself or from/for bundled framework(s) etc.?

hybrid lake
#

Not sure, we just use a json for translations

#

is it good or bad?

steel ruin
#

@hybrid lake Neither? I was mostly just poking around trying to see if I could take the .AppImage and package it in a nicer way. (E.g., using up-to-date and non-duplicated system libraries instead of the bundled ones.)

hybrid lake
#

Electron builder docs say:
Linux: AppImage, snap, debian package (deb), rpm, freebsd, pacman, p5p, apk

#

Is snap new?

round rivet
#

@hybrid lake wdym by new ?

hybrid lake
#

As in more recent, I don't remember seeing it before

#

I'll need to revisit the building and updating, hate not having updates on linux and mac

round rivet
#

Kinda. Currently there "is a fight" between Snapcraft and Flatpak

#

Snapcraft is bundled with latest Ubuntu distros. But is also kinda annoying, since almost all 'useful' packages require snap install --classic ... which is annoying in my experience. Also some other issues...

wet knot
#

Ye Linux is meh for updates

#

Discord you have to manually update via terminal :(

round rivet
#

yeah :(

hybrid lake
#

There is no one-thing fits all right?

round rivet
#

Too early for that. Too early for even the "just works without too much hassle" goto solution.

hybrid lake
#

Hmm auto updating seems to work with AppImage now

#

Can you recommend sticking with AppImage? I feel like it has been pretty smooth so far

steel ruin
#

@wet knot Not sure what you mean by "manually update". For me the discord install is managed like all other system packages and get updated when I update everything else.

wet knot
#

you mean via apt-get upgrade?

steel ruin
#

yaourt -Syu 😃

wet knot
#

Meh its never updated for me

#

tbh

steel ruin
#

I don't like non-rolling release distros (like pretty much all Debian-offspring), so no idea how it'd work there.

#

But don't blame Linux, blame your distribution(/packaging system/packager). 😃

wet knot
#

"i have to update via the terminal"

#

i meant it wont auto update via the client itself

steel ruin
#

That's a plus in my book. And most packaging systems have GUIs by now.

wet knot
#

i love using the termina

steel ruin
#

If you want the client to autoupdate itself, don't install it via the package manager.

wet knot
#

but apps like discord would be mice to just auto update

#

i dont

#

i use terminal for everything

steel ruin
#

You don't want the client to autoupdate itself? Or you don't install it via your package manager?

wet knot
#

no i mean i install everything via the termina

#

and discord still does not auto update

#

🤷

steel ruin
#

Exactly. You install discord via your package manager.

#

Don't do that if you want Discord to update itself.

#

(Installing packages via you package manager installs them into system directories. You don't want Discord to have permission to write to system directories when run as your user.)

#

(Installing Discord as your user (not via package manager) will install it into your $HOME and it will have write permission to overwrite its own files, so it can autoupdate.)

#

@hybrid lake I wonder what the "pacman" build option/target does. (pacman is Arch Linux's package manager.)

#

(But a .deb or .rpm can easily be massaged for Arch packaging too.)

wet knot
#

not related but i need to change my distro, i installed mint and never used it at uni due to a bad install

#

id just run linux but uni applications require windows sometimes

#

😄

steel ruin
#

And they won't run under Wine?

wet knot
#

Some have most wont.

steel ruin
#

When I took a high school level supplementary course to up my Physics level for acceptance to a uni course, there was a math-ish program needed that I worked seamlessly in Wine. (With the added bonus that I could just wipe and remake the Wine prefix when the 30 day trial period expired. 😂)

quiet root
jade drum
#

Is it at all possible to access the ISP ports?

round rivet
#

If someone did manage to read analog values for Wooting One on Linux - please share your incantations. 🙃

grizzled wolf
#

@wet knot Discord auto updates fine for me - what distro are you on?

#

ah I see - Mint

#

Sorry - I just read the rest of it - @steel ruin already explained

#

btw @steel ruin yaourt is out of date and not maintained - plenty of nice alternatives (I use "yay")

steel ruin
#

@grizzled wolf Yeah, I already replaced with aurman (and actually also yay) a few days ago.

#

@grizzled wolf What distro are you on?

#

@grizzled wolf (I'm guessing Arch since you use yay, did you try the wootility AUR package?)