You are not logged in.
In addition to what I've tried in this post, I created a udev rule to run when my keyboard is plugged in:
/usr/udev/rules.d/10-local.rules
----
ATTRS{name}=="foostan Corne Keyboard (crkbd)", ACTION=="add", RUN+="/usr/local/shsc/kbdrate"
/usr/local/shsc/kbdrate
----
/usr/bin/kbdrate -s -d 1000 -r 15
touch /home/loaf/triggered
I confirm that it's run by writing the file 'triggered', but it does not take effect at the login console for my external keyboard. I am not sure how to further debug this. As stated in my other post, if I run the command as root after logging in, it works for my external keyboard. If I try to trigger it at or after login by plugging and unplugging the keyboard, it does not work. At the console login and after login it works for the built in laptop keyboard, but not my USB keyboard.
Last edited by ThinkPad (2020-07-18 23:18:59)
Offline
Overridden? Runs before keyboard is initialized?
Did you try to delay the call, eg. prepend "sleep 1"?
Offline
This is what I tried:
/usr/local/shsc/kbdrate
----
#!/bin/sh
/bin/sleep 1
/usr/bin/kbdrate -s -d 1000 -r 15
touch /home/loaf/triggered
It didn't work.
Last edited by ThinkPad (2020-07-19 18:00:55)
Offline
If you replace touch with the following to check the exit status of kbdrate
echo $? > /home/loaf/triggered
Is the exit status 0?
Offline
Oddly, the service, but not the udev rule, seems to work now after installing powertop, running powertop --calibrate, and enabling the powertop service as per these instructions. powertop --calibrate soft blocked my wifi card and bluetooth, not sure if that is causation. This is all with the sleep line removed. I've since disabled the powertop service as it was affecting keyboard input and missing strokes. The service also works with powertop uninstalled.
Using your suggestion, the rule writes a '0'.
I will wait to mark as solved as I am not sure what the fix was or if it will persist. If you have anything you'd like me to test let me know. I appreciate the help.
Last edited by ThinkPad (2020-07-19 19:10:47)
Offline
I am not sure how to further debug this.
'udevadm monitor', 'udevadm info' etc. can give insight.
the Archwiki has a long page on udev too.
Offline
So it seems the udev does not take effect, and that the service only takes effect if the keyboard is plugged in before the machine is powered on. I tested with the rule in place and the service and tried unplugging and plugging at login to trigger.
I will reread the udev wiki entry. I thought udevadm info was to get parameters to use in rules. I will explore both, thank you for the guidance.
Offline
If the udev rule doesn't work, why would /home/loaf/triggered get updated (and exit status 0)?
Offline
Not sure. Even when the service wasn't working it still showed correct output that the delay was changed. Again, it takes effect for my built in keyboard, but not the external which is why I think it returns without error. The external only works as intended when the computer is started after the board is plugged in and with the service, not the udev.
Offline
If /home/loaf/triggered gets updated when you plug in the keyboard (maybe ensure that this isn't a false positive because it got updated w/ eg. the service only?) the udev rule hits and the script gets called.
If "/usr/bin/kbdrate -s -d 1000 -r 15" generally works and is called by the script when you plug the keyboard, it either fails to affect the keyboard at that time or gets reset later on.
In that case, adding a random delay should™ sanitize the situation unless the reset is triggered by a voluntary later action (eg. a login script and your login)
Offline
This problem still persists.
Updated udev
SUBSYSTEM=="input", ATTRS{manufacturer}=="foostan", ATTRS{product}=="Corne", ATTRS{idProduct}=="0001", ATTRS{idVendor}=="4653", ACTION=="add", RUN+="/usr/local/shsc/kbdrate"
Updated script
#!/bin/sh
/usr/bin/kbdrate -d 50000000 -r 4
printf "%d\n%s\n" $? "`date`" > /home/loaf/triggered
printf "kbdrate script called\n" > /dev/stdin
Service
[Unit]
Description=Keyboard repeat rate in tty.
[Service]
Type=oneshot
RemainAfterExit=yes
StandardInput=tty
StandardOutput=tty
ExecStart=/usr/bin/kbdrate -d 50000000 -r 4
[Install]
WantedBy=multi-user.target
Observed behavior
1. udev rule triggers successfully on keyboard plugin during boot, but does not take effect for external keyboard; only takes
effect for the built-in keyboard. Oddly,
sudo kbdrate -p
shows the defaults, even though the built-in keyboard is still affected. Same behavior with and without a `sleep 5`. This was tested with the service disabled.
2. Service starts successfully, but only takes effect on external keyboard if it's plugged in before boot. This was tested with the udev disabled.
Questions
1. Is it normal for kbdrate to only effect the input devices plugged in? I would imagine it is the setting for any console input. Is there a way to set this behavior?
2. Why won't the udev rule take effect for the external keyboard?
Offline