2

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を切り替える方法はありますか?

4

1 に答える 1

1

動作しない場合setledsは、2つの古いキーボードにプログラムでアクセスできるLEDがないか、動作している場合はLinuxコンソールドライバーからアクセスできないことが問題である可能性があります。

これらがキーパッドであり、フルキーボード(通常はすでに独自のLEDを備えている)と一緒に使用することを目的としているという事実は、合理的な設計上の決定のように思われるかもしれません。

USBレベルでキーボードと直接通信しようとしない限り、これで完了だと思います。

于 2013-03-25T22:24:48.367 に答える