- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
主要问题解决后try to read from multiple HID inputs我在这里为以下(和不同的)问题打开一个新问题:
我安装了 minibian在树莓派上。整个系统运行在'de_DE'
上,详细信息:
root@ddpi:~# 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=
和
root@ddpi:~# grep -v ^# /etc/locale.gen
de_DE.UTF-8 UTF-8
还有 python locale.getdefaultlocale()
说 'de_DE','utf-8'
。
X 没有运行(因为没有安装):ps -aux | grep X
表示 1297 0.0 0.1 4212 1828 pts/0 S+ 10:13 0:00 grep X
和 systemctl get-default
表示 多用户.target
.
但存在以下问题:我连接了德语键盘,它在控制台中按预期写入德语,但被 evdev 识别为英语。我正在使用这些脚本,read input from usb keyboard in linux结合reading events from multiple devices它按预期工作,除了语言。我的 Y
击键被识别为 KEY_Z
,我的 Z
击键被识别为 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))
说
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
yzß
击键。
这是怎么回事?
最佳答案
所以。根据我自己创建德语键盘映射的建议,这是我的两个脚本,它们仍然是开发版本,尚未投入生产,但在控制台输出上可以正常工作。我将第一个命名为 hidraw_survey.py
,因为它一直想知道新的 HID 是否已连接或拔出。这两个事件都会导致 pkill -f
并重新启动第二个脚本 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
myname@email.com
KEY_0
KEY_0
KEY_0
KEY_5
KEY_6
KEY_1
KEY_1
KEY_4
KEY_9
KEY_6
0005611496
关于python 3, headless RaspPi,python-evdev 不可能使用语言环境 de_DE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47262144/
至少在某些 ML 系列语言中,您可以定义可以执行模式匹配的记录,例如http://learnyouahaskell.com/making-our-own-types-and-typeclasses -
这可能是其他人已经看到的一个问题,但我正在尝试寻找一种专为(或支持)并发编程而设计的语言,该语言可以在 .net 平台上运行。 我一直在 erlang 中进行辅助开发,以了解该语言,并且喜欢建立一个稳
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
我正在寻找一种进程间通信工具,可以在相同或不同系统上运行的语言和/或环境之间使用。例如,它应该允许在 Java、C# 和/或 C++ 组件之间发送信号,并且还应该支持某种排队机制。唯一明显与环境和语言
我有一些以不同语言返回的文本。现在,客户端返回的文本格式为(en-us,又名美国英语): Stuff here to keep. -- Delete Here -- all of this below
问题:我希望在 R 中找到类似 findInterval 的函数,它为输入提供一个标量和一个表示区间起点的向量,并返回标量落入的区间的索引。例如在 R 中: findInterval(x = 2.6,
我是安卓新手。我正在尝试进行简单的登录 Activity ,但当我单击“登录”按钮时出现运行时错误。我认为我没有正确获取数据。我已经检查过,SQLite 中有一个与该 PK 相对应的数据。 日志猫。
大家好,感谢您帮助我。 我用 C# 制作了这个计算器,但遇到了一个问题。 当我添加像 5+5+5 这样的东西时,它给了我正确的结果,但是当我想减去两个以上的数字并且还想除或乘以两个以上的数字时,我没有
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 4 年前。 Improve th
这就是我所拥有的 #include #include void print(int a[], int size); void sort (int a[], int size); v
你好,我正在寻找我哪里做错了? #include #include int main(int argc, char *argv[]) { int account_on_the_ban
嘿,当我开始向数组输入数据时,我的代码崩溃了。该程序应该将数字读入数组,然后将新数字插入数组中,最后按升序排列所有内容。我不确定它出了什么问题。有人有建议吗? 这是我的代码 #include #in
我已经盯着这个问题好几个星期了,但我一无所获!它不起作用,我知道那么多,但我不知道为什么或出了什么问题。我确实知道开发人员针对我突出显示的行吐出了“错误:预期表达式”,但这实际上只是冰山一角。如果有人
我正在编写一个点对点聊天程序。在此程序中,客户端和服务器功能写入一个唯一的文件中。首先我想问一下我程序中的机制是否正确? I fork() two processes, one for client
基本上我需要找到一种方法来发现段落是否以句点 (.) 结束。 此时我已经可以计算给定文本的段落数,但我没有想出任何东西来检查它是否在句点内结束。 任何帮助都会帮助我,谢谢 char ch; FI
我的函数 save_words 接收 Armazena 和大小。 Armazena 是一个包含段落的动态数组,size 是数组的大小。在这个函数中,我想将单词放入其他称为单词的动态数组中。当我运行它时
我有一个结构 struct Human { char *name; struct location *location; int
我正在尝试缩进以下代码的字符串输出,但由于某种原因,我的变量不断从文件中提取,并且具有不同长度的噪声或空间(我不确定)。 这是我的代码: #include #include int main (v
我想让用户选择一个选项。所以我声明了一个名为 Choice 的变量,我希望它输入一个只能是 'M' 的 char 、'C'、'O' 或 'P'。 这是我的代码: char Choice; printf
我正在寻找一种解决方案,将定义和变量的值连接到数组中。我已经尝试过像这样使用 memcpy 但它不起作用: #define ADDRESS {0x00, 0x00, 0x00, 0x00, 0x0
我是一名优秀的程序员,十分优秀!