mirror of
https://github.com/google/bumble.git
synced 2026-06-01 07:37:02 +00:00
e02303a448
Includes:
1. HID Host implementation - hid.py
2. HID application to test Host with 3rd party HID Device application - run_hid_host.py
3. HID supporting files for testing - hid_report_parser.py & hid_key_map.py
Commands to run the application:
Default application:
python run_hid_host.py classic1.json usb:0 <device bd-addr>
Menu options for testing (Get/Set):
python run_hid_host.py classic1.json usb:0 <device bd-addr> test-mode
CuttleFish:tcp-client:127.0.0.1:7300
Application used for testing as Device : Bluetooth Keyboard & Mouse-5.3.0.apk
Note: Change in sdp.py file while testing hid profile,
TEXT_STRING: lambda x: DataElement(DataElement.TEXT_STRING, x.decode('utf8')) changed to
TEXT_STRING: lambda x: DataElement(DataElement.TEXT_STRING, x)
as we were facing error "UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa1 in position 4: invalid start byte" while fetching sdp records.
249 lines
4.5 KiB
Python
249 lines
4.5 KiB
Python
# shift map
|
|
|
|
# letters
|
|
shift_map = {
|
|
'a' : 'A',
|
|
'b' : 'B',
|
|
'c' : 'C',
|
|
'd' : 'D',
|
|
'e' : 'E',
|
|
'f' : 'F',
|
|
'g' : 'G',
|
|
'h' : 'H',
|
|
'i' : 'I',
|
|
'j' : 'J',
|
|
'k' : 'K',
|
|
'l' : 'L',
|
|
'm' : 'M',
|
|
'n' : 'N',
|
|
'o' : 'O',
|
|
'p' : 'P',
|
|
'q' : 'Q',
|
|
'r' : 'R',
|
|
's' : 'S',
|
|
't' : 'T',
|
|
'u' : 'U',
|
|
'v' : 'V',
|
|
'w' : 'W',
|
|
'x' : 'X',
|
|
'y' : 'Y',
|
|
'z' : 'Z',
|
|
# numbers
|
|
'1' : '!',
|
|
'2' : '@',
|
|
'3' : '#',
|
|
'4' : '$',
|
|
'5' : '%',
|
|
'6' : '^',
|
|
'7' : '&',
|
|
'8' : '*',
|
|
'9' : '(',
|
|
'0' : ')',
|
|
# symbols
|
|
'-' : '_',
|
|
'=' : '+',
|
|
'[' : '{',
|
|
']' : '}',
|
|
'\\' : '|',
|
|
';' : ':',
|
|
'\'' : '"',
|
|
',' : '<',
|
|
'.' : '>',
|
|
'/' : '?',
|
|
'`' : '~'
|
|
}
|
|
|
|
# hex map
|
|
|
|
# modifier keys
|
|
mod_keys = {
|
|
'00' : '',
|
|
'01' : 'left_ctrl',
|
|
'02' : 'left_shift',
|
|
'04' : 'left_alt',
|
|
'08' : 'left_meta',
|
|
'10' : 'right_ctrl',
|
|
'20' : 'right_shift',
|
|
'40' : 'right_alt',
|
|
'80' : 'right_meta'
|
|
}
|
|
|
|
# base keys
|
|
|
|
base_keys = {
|
|
# meta
|
|
'00' : '', # none
|
|
'01' : 'error_ovf',
|
|
# letters
|
|
'04' : 'a',
|
|
'05' : 'b',
|
|
'06' : 'c',
|
|
'07' : 'd',
|
|
'08' : 'e',
|
|
'09' : 'f',
|
|
'0a' : 'g',
|
|
'0b' : 'h',
|
|
'0c' : 'i',
|
|
'0d' : 'j',
|
|
'0e' : 'k',
|
|
'0f' : 'l',
|
|
'10' : 'm',
|
|
'11' : 'n',
|
|
'12' : 'o',
|
|
'13' : 'p',
|
|
'14' : 'q',
|
|
'15' : 'r',
|
|
'16' : 's',
|
|
'17' : 't',
|
|
'18' : 'u',
|
|
'19' : 'v',
|
|
'1a' : 'w',
|
|
'1b' : 'x',
|
|
'1c' : 'y',
|
|
'1d' : 'z',
|
|
# numbers
|
|
'1e' : '1',
|
|
'1f' : '2',
|
|
'20' : '3',
|
|
'21' : '4',
|
|
'22' : '5',
|
|
'23' : '6',
|
|
'24' : '7',
|
|
'25' : '8',
|
|
'26' : '9',
|
|
'27' : '0',
|
|
# misc
|
|
'28' : 'enter', #enter \n
|
|
'29' : 'esc',
|
|
'2a' : 'backspace',
|
|
'2b' : 'tab',
|
|
'2c' : 'spacebar', #space
|
|
'2d' : '-',
|
|
'2e' : '=',
|
|
'2f' : '[',
|
|
'30' : ']',
|
|
'31' : '\\',
|
|
'32' : '=',
|
|
'33' : '_SEMICOLON',
|
|
'34' : 'KEY_APOSTROPHE',
|
|
'35' : 'KEY_GRAVE',
|
|
'36' : 'KEY_COMMA',
|
|
'37' : 'KEY_DOT',
|
|
'38' : 'KEY_SLASH',
|
|
'39' : 'KEY_CAPSLOCK',
|
|
'3a' : 'KEY_F1',
|
|
'3b' : 'KEY_F2',
|
|
'3c' : 'KEY_F3',
|
|
'3d' : 'KEY_F4',
|
|
'3e' : 'KEY_F5',
|
|
'3f' : 'KEY_F6',
|
|
'40' : 'KEY_F7',
|
|
'41' : 'KEY_F8',
|
|
'42' : 'KEY_F9',
|
|
'43' : 'KEY_F10',
|
|
'44' : 'KEY_F11',
|
|
'45' : 'KEY_F12',
|
|
'46' : 'KEY_SYSRQ',
|
|
'47' : 'KEY_SCROLLLOCK',
|
|
'48' : 'KEY_PAUSE',
|
|
'49' : 'KEY_INSERT',
|
|
'4a' : 'KEY_HOME',
|
|
'4b' : 'KEY_PAGEUP',
|
|
'4c' : 'KEY_DELETE',
|
|
'4d' : 'KEY_END',
|
|
'4e' : 'KEY_PAGEDOWN',
|
|
'4f' : 'KEY_RIGHT',
|
|
'50' : 'KEY_LEFT',
|
|
'51' : 'KEY_DOWN',
|
|
'52' : 'KEY_UP',
|
|
'53' : 'KEY_NUMLOCK',
|
|
'54' : 'KEY_KPSLASH',
|
|
'55' : 'KEY_KPASTERISK',
|
|
'56' : 'KEY_KPMINUS',
|
|
'57' : 'KEY_KPPLUS',
|
|
'58' : 'KEY_KPENTER',
|
|
'59' : 'KEY_KP1',
|
|
'5a' : 'KEY_KP2',
|
|
'5b' : 'KEY_KP3',
|
|
'5c' : 'KEY_KP4',
|
|
'5d' : 'KEY_KP5',
|
|
'5e' : 'KEY_KP6',
|
|
'5f' : 'KEY_KP7',
|
|
'60' : 'KEY_KP8',
|
|
'61' : 'KEY_KP9',
|
|
'62' : 'KEY_KP0',
|
|
'63' : 'KEY_KPDOT',
|
|
'64' : 'KEY_102ND',
|
|
'65' : 'KEY_COMPOSE',
|
|
'66' : 'KEY_POWER',
|
|
'67' : 'KEY_KPEQUAL',
|
|
'68' : 'KEY_F13',
|
|
'69' : 'KEY_F14',
|
|
'6a' : 'KEY_F15',
|
|
'6b' : 'KEY_F16',
|
|
'6c' : 'KEY_F17',
|
|
'6d' : 'KEY_F18',
|
|
'6e' : 'KEY_F19',
|
|
'6f' : 'KEY_F20',
|
|
'70' : 'KEY_F21',
|
|
'71' : 'KEY_F22',
|
|
'72' : 'KEY_F23',
|
|
'73' : 'KEY_F24',
|
|
'74' : 'KEY_OPEN',
|
|
'75' : 'KEY_HELP',
|
|
'76' : 'KEY_PROPS',
|
|
'77' : 'KEY_FRONT',
|
|
'78' : 'KEY_STOP',
|
|
'79' : 'KEY_AGAIN',
|
|
'7a' : 'KEY_UNDO',
|
|
'7b' : 'KEY_CUT',
|
|
'7c' : 'KEY_COPY',
|
|
'7d' : 'KEY_PASTE',
|
|
'7e' : 'KEY_FIND',
|
|
'7f' : 'KEY_MUTE',
|
|
'80' : 'KEY_VOLUMEUP',
|
|
'81' : 'KEY_VOLUMEDOWN',
|
|
'85' : 'KEY_KPCOMMA',
|
|
'87' : 'KEY_RO',
|
|
'88' : 'KEY_KATAKANAHIRAGANA',
|
|
'89' : 'KEY_YEN',
|
|
'8a' : 'KEY_HENKAN',
|
|
'8b' : 'KEY_MUHENKAN',
|
|
'8c' : 'KEY_KPJPCOMMA',
|
|
'90' : 'KEY_HANGEUL',
|
|
'91' : 'KEY_HANJA',
|
|
'92' : 'KEY_KATAKANA',
|
|
'93' : 'KEY_HIRAGANA',
|
|
'94' : 'KEY_ZENKAKUHANKAKU',
|
|
'b6' : 'KEY_KPLEFTPAREN',
|
|
'b7' : 'KEY_KPRIGHTPAREN',
|
|
'e0' : 'KEY_LEFTCTRL',
|
|
'e1' : 'KEY_LEFTSHIFT',
|
|
'e2' : 'KEY_LEFTALT',
|
|
'e3' : 'KEY_LEFTMETA',
|
|
'e4' : 'KEY_RIGHTCTRL',
|
|
'e5' : 'KEY_RIGHTSHIFT',
|
|
'e6' : 'KEY_RIGHTALT',
|
|
'e7' : 'KEY_RIGHTMETA',
|
|
'e8' : 'KEY_MEDIA_PLAYPAUSE',
|
|
'e9' : 'KEY_MEDIA_STOPCD',
|
|
'ea' : 'KEY_MEDIA_PREVIOUSSONG',
|
|
'eb' : 'KEY_MEDIA_NEXTSONG',
|
|
'ec' : 'KEY_MEDIA_EJECTCD',
|
|
'ed' : 'KEY_MEDIA_VOLUMEUP',
|
|
'ee' : 'KEY_MEDIA_VOLUMEDOWN',
|
|
'ef' : 'KEY_MEDIA_MUTE',
|
|
'f0' : 'KEY_MEDIA_WWW',
|
|
'f1' : 'KEY_MEDIA_BACK',
|
|
'f2' : 'KEY_MEDIA_FORWARD',
|
|
'f3' : 'KEY_MEDIA_STOP',
|
|
'f4' : 'KEY_MEDIA_FIND',
|
|
'f5' : 'KEY_MEDIA_SCROLLUP',
|
|
'f6' : 'KEY_MEDIA_SCROLLDOWN',
|
|
'f7' : 'KEY_MEDIA_EDIT',
|
|
'f8' : 'KEY_MEDIA_SLEEP',
|
|
'f9' : 'KEY_MEDIA_COFFEE',
|
|
'fa' : 'KEY_MEDIA_REFRESH',
|
|
'fb' : 'KEY_MEDIA_CALC'
|
|
}
|