LinuxでNumLockLEDを点滅させるPythonプログラムを作成しました。コードを以下に示します。
import fcntl
import os
import time
# Define variables for keyboard and NUM_LOCK LED
KDSETLED = 0x4B32
NUM_LED = 0x02
# Open the "keyboard console" for LED toggling
console_fd = os.open('/dev/console', os.O_NOCTTY)
def blink(tme, cnt):
secs = tme/cnt
for i in range(cnt):
fcntl.ioctl(console_fd, KDSETLED, 0)
time.sleep(secs)
fcntl.ioctl(console_fd, KDSETLED, NUM_LED)
if i < cnt - 1:
time.sleep(secs)
blink(0.5,1)
漠然と見覚えがある場合は、こちらの同様の投稿からのものであるためです。
パワーアップの1つで正しく点滅します!USBテンキー(部品番号:G54-41403)。ただし、プログラムはエラーなしで実行されますが、古いキーボードのLEDは点滅しません(NUM LOCKが正しく動作することも確認しました)。古いキーボードは、USBハブ付きのTargusテンキー(モデルPAUK10Uは、古いモデルをオンラインで見つけることができなかったことに注意してください)と、Rlip ErgonomicKeypadKNP -180です。
Pythonモジュールpython-keyboardleds
(リンクはこちら)を確認したところ、プログラムがキーボードに直接アクセスしていることがわかりました。具体的には、を介してアクセスしている間/dev/console
、プログラムはを介してアクセスし/dev/input/by-path/
ます。リストの最初のキーボードを開くようにコードを変更しようとしましたが、以前と同じ結果が得られました(エラーはなく、他のキーボードモデルではLEDが点滅しませんでした)。私が作成したコードを以下に示します。
#LEDToggle.py
import argparse
import glob
import grp
import os
import pwd
import re
import subprocess
import time
import fcntl
import keyboardleds
def drop_privileges():
uid = pwd.getpwnam('nobody').pw_uid
gid = grp.getgrnam('nogroup').gr_gid
os.setgid(gid)
os.setuid(uid)
def parse_args():
led_names = list(t + '-lock' for t in ('caps', 'num', 'scroll'))
ap = argparse.ArgumentParser()
ap.add_argument('--led', choices=led_names, default=led_names[1],
help='keyboard LED to use',
)
return ap.parse_args()
def blink(tme, cnt):
secs = tme/cnt
options = parse_args()
event_device = glob.glob('/dev/input/by-path/*-event-kbd')[0]
ledkit = keyboardleds.LedKit(event_device)
drop_privileges()
#led = getattr(ledkit, 'num-lock')
led = getattr(ledkit, options.led.replace('-', '_'))
for i in range(cnt):
led.reset()
print "off"
time.sleep(secs)
led.set()
print "on"
if i < cnt - 1:
time.sleep(secs)
blink(5,5)
調査の結果、にアクセスするときに一部のキーボードが正しく呼び出されていないのではないかと思いました/dev/console
。を/dev/input/by-path/
調べると、動作しているキーボードの名前が。であることがわかりますplatform-bcm2708_usb-usb-0:1.3:1.0-event-kbd
。次に、機能していない2つのキーボードの1つを接続しようとすると、同じ名前になります。
また、カーネルのコマンドを使用しsetleds
たり、コンソールを呼び出しtty7
たり、キーボードと通信したりしてみました。これらは両方とも同じことをしました。彼らはパワーアップに取り組みました!キーボードと(エラーなしで)他の2つのキーボードで点滅しませんでした。
これらの古いキーボードと正しく通信していないように感じます。私が試した以外に、キーボードのLEDを切り替える方法はありますか?