2017-11-13 15 views
0

は、私はここで、以下の(と異なる)の問題のために新しい質問を開く:のpython 3、ヘッドレスRaspPi、ロケールde_DEのではない可能性

私はRaspPiにminibianをインストールしました。システム全体を詳細に、'de_DE'上で実行されている:

[email protected]:~# locale 
LANG=de_DE.UTF-8 
LANGUAGE= 
LC_CTYPE="de_DE.UTF-8" 
LC_NUMERIC="de_DE.UTF-8" 
LC_TIME="de_DE.UTF-8" 
LC_COLLATE="de_DE.UTF-8" 
LC_MONETARY="de_DE.UTF-8" 
LC_MESSAGES="de_DE.UTF-8" 
LC_PAPER="de_DE.UTF-8" 
LC_NAME="de_DE.UTF-8" 
LC_ADDRESS="de_DE.UTF-8" 
LC_TELEPHONE="de_DE.UTF-8" 
LC_MEASUREMENT="de_DE.UTF-8" 
LC_IDENTIFICATION="de_DE.UTF-8" 
LC_ALL= 

[email protected]:~# grep -v ^# /etc/locale.gen 
de_DE.UTF-8 UTF-8 

ともパイソンをlocale.getdefaultlocale()'de_DE','utf-8'氏は述べています。 (それがインストールされていないので)

は、実行中のXはありません: ps -aux | grep X1297 0.0 0.1 4212 1828 pts/0 S+ 10:13 0:00 grep Xsystemctl get-defaultmulti-user.targetを言うと言います。

しかし、次のような問題があります。ドイツ語のキーボードが接続されています。ドイツ語のキーボードがコンソールに期待通りに書き込まれていますが、evdevの英語として認識されています。私はこれらのスクリプトread input from usb keyboard in linuxreading events from multiple devicesを組み合わせて使用​​していますが、言語を除いて期待通りに動作します。私のYキーストロークは、KEY_ZZキーストローク、KEY_YßKEY_MINUSなどと認識されます。しかし、今まで私が見ることのできるものはすべて、de_DEに設定されています。

このスクリプト(のみevdevの部分)

from evdev import InputDevice, categorize, ecodes 
dev = InputDevice('/dev/input/event0') 

print(dev) 
#device /dev/input/event1, name "Dell Dell USB Keyboard", phys "usb-0000:00:12.1-2/input0" 

for event in dev.read_loop(): 
    if event.type == ecodes.EV_KEY: 
     print(categorize(event)) 

yzßキーストロークのため

key event at 1510568613.966220, 44 (KEY_Z), down 
key event at 1510568614.039341, 44 (KEY_Z), up 
key event at 1510568614.926334, 21 (KEY_Y), down 
key event at 1510568614.998331, 21 (KEY_Y), up 
key event at 1510568615.799577, 12 (KEY_MINUS), down 
key event at 1510568615.863569, 12 (KEY_MINUS), up 

を言います。

ここで何が間違っていますか?

+0

こんにちは@ddlab。これは、スキャンコードとキーコード(「AZERTY」キーボードを使用していた場合、「A」を押すとスキャンコード「KEY_Q」とキーコード「a」になります)を明確にするために必要です。スキャンコードのキーコードへのマッピングは、仮想コンソールドライバによって行われます。 Evdevはスキャンコードのみを実行できます。 2つの間のマッピングは単純ではありませんが、私はpython-evdevに例を追加することを考えていました。これはしばしば要求される機能です(この週末に試してみます)。その間、[キーボード](https://github.com/boppreh/keyboard/blob/master/keyboard/_nixkeyboard.py#L54)プロジェクトをご覧ください。 – gvalkov

+0

@gvalkovあなたの努力に感謝します。私の場合、最も簡単で荒い方法は、次のような言語変数でマッピングを拡張することです:findig language LANG = locale.getdefaultlocale()[0] .split( '_')[0] .upper() 'そしてCODE_MAP_CHAR = { \t 'DE' 'のようなマップ:{ \t \t 'KEY_Z': "Y"、 \t \t 'KEY_Y': "Z" \t}、 \t 'EN':{ \t \t 'KEY_Z': "Z"、 \t \t 'KEY_Y': "Y" \t}} ' こののような機能'def parse_key_to_char(val): \t return CODE_MAP_CHAR [LANG] [val] CODE_MAP_CHARの値であれば[LANG] else" "' – ddlab

答えて

0

So.ドイツのキーボードマッピングを作成する私自身の提案によれば、ここでは2つのスクリプトがあります。これはまだDEVバージョンであり、まだ稼働していませんが、コンソール出力で正しく動作します。 最初のものはhidraw_survey.pyと命名されました。なぜなら、新しいHIDが接続されているか、接続されていないと、いつも不思議に思われるからです。どちらのイベントでもpkill -fが発生し、2番目のスクリプトread_hidraw_scanner.pyが再起動され、接続されたすべてのHIDのキーボードイベントを一度に処理します。 は以下があるので:

device /dev/input/event4, name "OPTO-E Barcode Device", phys "usb-3f980000.usb-1.5.4/input0" 
device /dev/input/event0, name "CHICONY HP Basic USB Keyboard", phys "usb-3f980000.usb-1.5.1/input0" 
device /dev/input/event1, name "Sycreader USB Reader", phys "usb-3f980000.usb-1.5.2/input0" 
device /dev/input/event2, name "HID 04d9:1203", phys "usb-3f980000.usb-1.5.3/input0" 
device /dev/input/event3, name "HID 04d9:1203", phys "usb-3f980000.usb-1.5.3/input1" 

なぜ(最後のリスト上の)テンキーは...二回は考えてカウントされませんが、入力イベントが正しく処理されています。

両方のスクリプトは、0と9の間の入力イベント接続の数を調べて、それらの数値をスキップしてテストが成功しないようにします。言語固有のマッピングそのものはLANG = locale.getdefaultlocale()[0].split('_')[0].upper()によって実現され、私はDEを配信します。

最初のスクリプトhidraw_survey.py

import sys 
import os 
from pathlib import Path 
import time 


logfile = '/ddpos/log/hidraw_scanner.txt' 

f = open(logfile, 'a') 
f.write('hidraw_scanner started: '+time.strftime("%d.%m.%Y %H:%M:%S")+'\n') 
f.close() 

def try_kill_script(script): 
    try: 
     os.system('pkill -f '+script) 
    except OSError: 
     return False 
    else: 
     return True 

old = '' 
new = '' 
while 1: 
    out = '' 
    for i in range(10): 
     hidrawfile = '/dev/hidraw'+str(i) 
     hidrawpath = Path(hidrawfile) 
     if hidrawpath.exists(): 
      out += str(i) 
      #print (out) 
    new = out 
    if new != old: 
     print ('change registered') 
     f = open(logfile, 'a') 
     f.write('USB changed to: '+out+'\n') 
     f.close() 
     try_kill_script('read_hidraw_scanner.py') 
     os.system('python3 /ddpos/test/read_hidraw_scanner.py &') 
    old = out 

第二スクリプトread_hidraw_scanner.py

import os 
import sys 
from evdev import InputDevice, list_devices, ecodes, categorize 
from select import select 
from pathlib import Path 
import locale 

LANG = locale.getdefaultlocale()[0].split('_')[0].upper() 

CODE_MAP_CHAR = { 
    'DE': { 
     'KEY_A': "a", 
     'KEY_B': "b", 
     'KEY_C': "c", 
     'KEY_D': "d", 
     'KEY_E': "e", 
     'KEY_F': "f", 
     'KEY_G': "g", 
     'KEY_H': "h", 
     'KEY_I': "i", 
     'KEY_J': "j", 
     'KEY_K': "k", 
     'KEY_L': "l", 
     'KEY_M': "m", 
     'KEY_N': "n", 
     'KEY_O': "o", 
     'KEY_P': "p", 
     'KEY_Q': "q", 
     'KEY_R': "r", 
     'KEY_S': "s", 
     'KEY_T': "t", 
     'KEY_U': "u", 
     'KEY_V': "v", 
     'KEY_W': "w", 
     'KEY_X': "x", 
     'KEY_Y': "z", 
     'KEY_Z': "y", 
     'SHIFT_KEY_A': "A", 
     'SHIFT_KEY_B': "B", 
     'SHIFT_KEY_C': "C", 
     'SHIFT_KEY_D': "D", 
     'SHIFT_KEY_E': "E", 
     'SHIFT_KEY_F': "F", 
     'SHIFT_KEY_G': "G", 
     'SHIFT_KEY_H': "H", 
     'SHIFT_KEY_I': "I", 
     'SHIFT_KEY_J': "J", 
     'SHIFT_KEY_K': "K", 
     'SHIFT_KEY_L': "L", 
     'SHIFT_KEY_M': "M", 
     'SHIFT_KEY_N': "N", 
     'SHIFT_KEY_O': "O", 
     'SHIFT_KEY_P': "P", 
     'SHIFT_KEY_Q': "Q", 
     'SHIFT_KEY_R': "R", 
     'SHIFT_KEY_S': "S", 
     'SHIFT_KEY_T': "T", 
     'SHIFT_KEY_U': "U", 
     'SHIFT_KEY_V': "V", 
     'SHIFT_KEY_W': "W", 
     'SHIFT_KEY_X': "X", 
     'SHIFT_KEY_Y': "Z", 
     'SHIFT_KEY_Z': "Y", 

     'SHIFT_KEY_GRAVE':'°', 
     'SHIFT_KEY_1': "!", 
     'SHIFT_KEY_2': "\"", 
     'SHIFT_KEY_3': "§", 
     'SHIFT_KEY_4': "$", 
     'SHIFT_KEY_5': "%", 
     'SHIFT_KEY_6': "&", 
     'SHIFT_KEY_7': "/", 
     'SHIFT_KEY_8': "(", 
     'SHIFT_KEY_9': ")", 
     'SHIFT_KEY_0': "=", 
     'SHIFT_KEY_EQUAL': "`", 
     'SHIFT_KEY_RIGHTBRACE':'*', 
     'SHIFT_KEY_BACKSLASH':'\'', 
     'SHIFT_KEY_COMMA':';', 
     'SHIFT_KEY_DOT':':', 
     'SHIFT_KEY_SLASH':'_', 

     'ALTGR_KEY_Q': "@", 
     'ALTGR_KEY_MINUS': "\\", 
     'ALTGR_KEY_7': "{", 
     'ALTGR_KEY_0': "}", 
     'ALTGR_KEY_8': "[", 
     'ALTGR_KEY_9': "]", 
     'ALTGR_KEY_RIGHTBRACE':'~', 

     'KEY_NUMERIC_STAR': "*", 

     'KEY_GRAVE':'^', 
     'KEY_LEFTBRACE':'Ü', 
     'KEY_RIGHTBRACE':'+', 
     'KEY_SEMICOLON':'Ö', 
     'KEY_APOSTROPHE':'Ä', 
     'KEY_BACKSLASH':'#', 
     'KEY_102ND':'<', 
     'KEY_COMMA':',', 
     'KEY_DOT':'.', 
     'KEY_SLASH':'-', 
     'KEY_KPSLASH':'/', 
     'KEY_KPASTERISK':'*', 
     'KEY_KPMINUS':'-', 
     'KEY_KPPLUS':'+', 
     'KEY_KPDOT':'.', 
     'KEY_SPACE': " ", 
     'KEY_EQUAL': "´", 
     'KEY_TAB': "\t", 

     'KEY_MINUS': "ß", 
     'KEY_SPACE': " ", 

     'KEY_NUMERIC_1': "1", 
     'KEY_NUMERIC_2': "2", 
     'KEY_NUMERIC_3': "3", 
     'KEY_NUMERIC_4': "4", 
     'KEY_NUMERIC_5': "5", 
     'KEY_NUMERIC_6': "6", 
     'KEY_NUMERIC_7': "7", 
     'KEY_NUMERIC_8': "8", 
     'KEY_NUMERIC_9': "9", 
     'KEY_NUMERIC_0': "0", 
     'KEY_KP1': "1", 
     'KEY_KP2': "2", 
     'KEY_KP3': "3", 
     'KEY_KP4': "4", 
     'KEY_KP5': "5", 
     'KEY_KP6': "6", 
     'KEY_KP7': "7", 
     'KEY_KP8': "8", 
     'KEY_KP9': "9", 
     'KEY_KP0': "0", 
     'KEY_1': "1", 
     'KEY_2': "2", 
     'KEY_3': "3", 
     'KEY_4': "4", 
     'KEY_5': "5", 
     'KEY_6': "6", 
     'KEY_7': "7", 
     'KEY_8': "8", 
     'KEY_9': "9", 
     'KEY_0': "0" 
    }, 
    'EN': { 
     'KEY_A': "A", 
     'KEY_B': "B", 
     'KEY_C': "C", 
     'KEY_D': "D", 
     'KEY_E': "E", 
     'KEY_F': "F", 
     'KEY_G': "G", 
     'KEY_H': "H", 
     'KEY_I': "I", 
     'KEY_J': "J", 
     'KEY_K': "K", 
     'KEY_L': "L", 
     'KEY_M': "M", 
     'KEY_N': "N", 
     'KEY_O': "O", 
     'KEY_P': "P", 
     'KEY_Q': "Q", 
     'KEY_R': "R", 
     'KEY_S': "S", 
     'KEY_T': "T", 
     'KEY_U': "U", 
     'KEY_V': "V", 
     'KEY_W': "W", 
     'KEY_X': "X", 
     'KEY_Y': "Y", 
     'KEY_Z': "Z", 
     'KEY_GRAVE':'`', 
     'KEY_MINUS': "-", 
     'KEY_SPACE': " ", 
     'KEY_BACKSLASH': "\\", 
     'KEY_GRAVE': "`", 
     'KEY_NUMERIC_STAR': "*", 
     'KEY_LEFTBRACE': "[", 
     'KEY_RIGHTBRACE': "]",  
     'KEY_COMMA': ",", 
     'KEY_EQUAL': "=",  
     'KEY_SEMICOLON': ";", 
     'KEY_APOSTROPHE': "'", 
     'KEY_TAB': "\t", 
     'KEY_DOT': ".", 
     'KEY_SLASH': "/", 
     'KEY_NUMERIC_1': "1", 
     'KEY_NUMERIC_2': "2", 
     'KEY_NUMERIC_3': "3", 
     'KEY_NUMERIC_4': "4", 
     'KEY_NUMERIC_5': "5", 
     'KEY_NUMERIC_6': "6", 
     'KEY_NUMERIC_7': "7", 
     'KEY_NUMERIC_8': "8", 
     'KEY_NUMERIC_9': "9", 
     'KEY_NUMERIC_0': "0", 
     'KEY_KP1': "1", 
     'KEY_KP2': "2", 
     'KEY_KP3': "3", 
     'KEY_KP4': "4", 
     'KEY_KP5': "5", 
     'KEY_KP6': "6", 
     'KEY_KP7': "7", 
     'KEY_KP8': "8", 
     'KEY_KP9': "9", 
     'KEY_KP0': "0", 
     'KEY_1': "1", 
     'KEY_2': "2", 
     'KEY_3': "3", 
     'KEY_4': "4", 
     'KEY_5': "5", 
     'KEY_6': "6", 
     'KEY_7': "7", 
     'KEY_8': "8", 
     'KEY_9': "9", 
     'KEY_0': "0" 
    } 
} 

def parse_key_to_char(val): 
    return CODE_MAP_CHAR[LANG][val] if val in CODE_MAP_CHAR[LANG] else "" 

def try_kill_script(script): 
    try: 
     os.system('pkill -f '+script) 
    except OSError: 
     return False 
    else: 
     return True 

founddev = [] 
for i in range(10): 
    trydev = '/dev/input/event'+str(i) 
    if Path(trydev).exists(): 
     founddev.append(trydev) 

devices = map(InputDevice, founddev) 
devices = {dev.fd: dev for dev in devices} 

for dev in devices.values(): 
    print(dev) 

chars = '' 
prefix = '' 

while 1: 

    r, w, x = select(devices, [], []) 
    for fd in r: 
     try: 
      for event in devices[fd].read(): 
       if event.type == ecodes.EV_KEY: 
        e = categorize(event) 
        if e.keystate == e.key_down: 
         if e.keycode == 'KEY_LEFTSHIFT' or e.keycode == 'KEY_RIGHTSHIFT': 
          prefix = 'SHIFT_' 
         elif e.keycode == 'KEY_LEFTALT': 
          prefix = 'ALT_' 
         elif e.keycode == 'KEY_RIGHTALT': 
          prefix = 'ALTGR_' 
          print ('prefix='+prefix) 
         elif e.keycode == 'KEY_ESC': 
          chars = '' 
         elif e.keycode == 'KEY_BACKSPACE': 
          chars = chars[:-1] 
         elif e.keycode == 'KEY_ENTER' or e.keycode == 'KEY_KPENTER': 
          sys.stdout.write(chars+'\n') 
          sys.stdout.flush() 
          chars = '' 
         else: 
          #print (ecodes.EV_LED) # which outputs 17 forever 
          print (prefix + e.keycode) 
          chars += parse_key_to_char(prefix + e.keycode) 
        elif e.keystate == e.key_up: 
         #sys.stdout.write(parse_key_to_char(e.keycode)) 
         #sys.stdout.flush() 
         #print ("'"+e.keycode+"':'"+parse_key_to_char(e.keycode)+"',") 
         if e.keycode == 'KEY_LEFTSHIFT' or e.keycode == 'KEY_RIGHTSHIFT': 
          prefix = '' 
         elif e.keycode == 'KEY_LEFTALT': 
          prefix = '' 
         elif e.keycode == 'KEY_RIGHTALT': 
          prefix = '' 
     except: 
      try_kill_script('read_hidraw_scanner.py') 

どちらのスクリプトは、私のようなPythonの初心者で作られたへこみやしわに満ちているが、私は少しを考えます改善や簡素化のためにRaspPiに設定やパスワードの入力などを伝えるのは本当に素敵なおもちゃです(私の場合、読み取り不可能なバーコードの場合は代替の手動入力を持つバーコードスキャナとRFID

マッピングは、SHIFTとALTGR(右のALT)を含むすべてのドイツ語キーボードのキーをカバーし、まだALT(左のALT)ではありません。しかし、それはèやéやñやCAPSLOCKのようなアクセントでは機能しません。改善は大歓迎です。

更新 出力は現時点ではそのように見えます。 最後にスキャンされた数字のバーコード、英数字のバーコード、キーボード入力、RDFIDリーダーです。

KEY_0 
KEY_4 
KEY_0 
KEY_1 
KEY_3 
KEY_6 
KEY_0 
KEY_0 
KEY_0 
KEY_0 
KEY_4 
KEY_8 
KEY_6 
KEY_0 
KEY_9 
KEY_5 
0401360000486095 
KEY_2 
SHIFT_KEY_B 
KEY_5 
KEY_6 
KEY_6 
KEY_9 
SHIFT_KEY_C 
SHIFT_KEY_F 
KEY_4 
SHIFT_KEY_A 
KEY_2 
KEY_1 
SHIFT_KEY_C 
KEY_1 
SHIFT_KEY_B 
KEY_7 
2B5669CF4A21C1B7 
KEY_M 
KEY_Z 
KEY_N 
KEY_A 
KEY_M 
KEY_E 
ALTGR_KEY_Q 
KEY_E 
KEY_M 
KEY_A 
KEY_I 
KEY_L 
KEY_DOT 
KEY_C 
KEY_O 
KEY_M 
[email protected] 
KEY_0 
KEY_0 
KEY_0 
KEY_5 
KEY_6 
KEY_1 
KEY_1 
KEY_4 
KEY_9 
KEY_6 
0005611496 
関連する問題