capture-mag-hid 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #!/usr/bin/python3
  2. #
  3. # Copyright (c) 2019 Clementine Computing LLC.
  4. #
  5. # This file is part of PopuFare.
  6. #
  7. # PopuFare is free software: you can redistribute it and/or modify
  8. # it under the terms of the GNU Affero General Public License as published by
  9. # the Free Software Foundation, either version 3 of the License, or
  10. # (at your option) any later version.
  11. #
  12. # PopuFare is distributed in the hope that it will be useful,
  13. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. # GNU Affero General Public License for more details.
  16. #
  17. # You should have received a copy of the GNU Affero General Public License
  18. # along with PopuFare. If not, see <https://www.gnu.org/licenses/>.
  19. #
  20. import os, sys, evdev, asyncio, os.path
  21. from evdev import InputDevice, categorize, ecodes
  22. import time
  23. import datetime
  24. VERBOSE_LEVEL = 0
  25. dev_init = False
  26. dev = { }
  27. HID_NAME = 'HID c216:0180'
  28. evfns_n = 13
  29. evfns_bd = "/dev/input/"
  30. evfns = [ ]
  31. ecode_map = {
  32. ecodes.KEY_1 : { "code": 2, "ascii": "1", "shift":"!"}, ecodes.KEY_2 : { "code": 3, "ascii": "2", "shift":"@"},
  33. ecodes.KEY_3 : { "code": 4, "ascii": "3", "shift":"#"}, ecodes.KEY_4 : { "code": 5, "ascii": "4", "shift":"$"},
  34. ecodes.KEY_5 : { "code": 6, "ascii": "5", "shift":"%"}, ecodes.KEY_6 : { "code": 7, "ascii": "6", "shift": "^"},
  35. ecodes.KEY_7 : { "code": 8, "ascii": "7", "shift":"&"}, ecodes.KEY_8 : { "code": 9, "ascii": "8", "shift":"*"},
  36. ecodes.KEY_9 : { "code": 10, "ascii": "9", "shift":"("}, ecodes.KEY_0 : { "code": 11, "ascii": "0", "shift":")"},
  37. ecodes.KEY_MINUS : { "code": 12, "ascii": "-", "shift":"_"}, ecodes.KEY_EQUAL : { "code": 13, "ascii": "=", "shift":"+"},
  38. ecodes.KEY_BACKSPACE : { "code": 14, "ascii": "", "shift":""},ecodes.KEY_TAB : { "code": 15, "ascii": "\t"},
  39. ecodes.KEY_Q : { "code": 16, "ascii": "q", "shift":"Q"}, ecodes.KEY_W : { "code": 17, "ascii": "w", "shift":"W"},
  40. ecodes.KEY_E : { "code": 18, "ascii": "e", "shift":"E"}, ecodes.KEY_R : { "code": 19, "ascii": "r", "shift":"R"},
  41. ecodes.KEY_T : { "code": 20, "ascii": "t", "shift":"T"}, ecodes.KEY_Y : { "code": 21, "ascii": "y", "shift":"Y"},
  42. ecodes.KEY_U : { "code": 22, "ascii": "u", "shift":"U"}, ecodes.KEY_I : { "code": 23, "ascii": "i", "shift":"I"},
  43. ecodes.KEY_O : { "code": 24, "ascii": "o", "shift":"O"}, ecodes.KEY_P : { "code": 25, "ascii": "p", "shift":"P"},
  44. ecodes.KEY_LEFTBRACE : { "code": 26, "ascii": "[", "shift":"{"}, ecodes.KEY_RIGHTBRACE : { "code": 27, "ascii": "]", "shift":"}"},
  45. ecodes.KEY_ENTER : { "code": 28, "ascii": "\n", "shift":""}, ecodes.KEY_A : { "code": 30, "ascii": "a", "shift":"A"},
  46. ecodes.KEY_S : { "code": 31, "ascii": "s", "shift":"S"}, ecodes.KEY_D : { "code": 32, "ascii": "d", "shift":"D"},
  47. ecodes.KEY_F : { "code": 33, "ascii": "f", "shift":"F"}, ecodes.KEY_G : { "code": 34, "ascii": "g", "shift":"G"},
  48. ecodes.KEY_H : { "code": 35, "ascii": "h", "shift":"H"}, ecodes.KEY_J : { "code": 36, "ascii": "j", "shift":"J"},
  49. ecodes.KEY_K : { "code": 37, "ascii": "k", "shift":"K"}, ecodes.KEY_L : { "code": 38, "ascii": "l", "shift":"L"},
  50. ecodes.KEY_SEMICOLON : { "code": 39, "ascii": ";", "shift":":"}, ecodes.KEY_APOSTROPHE : { "code": 40, "ascii": "'", "shift":'"'},
  51. ecodes.KEY_BACKSLASH : { "code": 43, "ascii": "\\", "shift":"|"}, ecodes.KEY_Z : { "code": 44, "ascii": "z", "shift":"Z"},
  52. ecodes.KEY_X : { "code": 45, "ascii": "x", "shift":"X"}, ecodes.KEY_C : { "code": 46, "ascii": "c", "shift":"C"},
  53. ecodes.KEY_V : { "code": 47, "ascii": "v", "shift":"V"}, ecodes.KEY_B : { "code": 48, "ascii": "b", "shift":"B"},
  54. ecodes.KEY_N : { "code": 49, "ascii": "n", "shift":"N"}, ecodes.KEY_M : { "code": 50, "ascii": "m", "shift":"M"},
  55. ecodes.KEY_COMMA : { "code": 51, "ascii": ",", "shift":"<"}, ecodes.KEY_DOT : { "code": 52, "ascii": ".", "shift":">"},
  56. ecodes.KEY_SLASH : { "code": 53, "ascii": "/", "shift":"?"}, ecodes.KEY_KPASTERISK : { "code": 55, "ascii": "*"},
  57. ecodes.KEY_SPACE : { "code": 57, "ascii": " "}, ecodes.KEY_KP7 : { "code": 71, "ascii": "7"},
  58. ecodes.KEY_KP8 : { "code": 72, "ascii": "8"}, ecodes.KEY_KP9 : { "code": 73, "ascii": "9"},
  59. ecodes.KEY_KPMINUS : { "code": 74, "ascii": "-"}, ecodes.KEY_KP4 : { "code": 75, "ascii": "4"},
  60. ecodes.KEY_KP5 : { "code": 76, "ascii": "5"}, ecodes.KEY_KP6 : { "code": 77, "ascii": "6"},
  61. ecodes.KEY_KPPLUS : { "code": 78, "ascii": "+"}, ecodes.KEY_KP1 : { "code": 79, "ascii": "1"},
  62. ecodes.KEY_KP2 : { "code": 80, "ascii": "2"}, ecodes.KEY_KP3 : { "code": 81, "ascii": "3"},
  63. ecodes.KEY_KP0 : { "code": 82, "ascii": "0"}, ecodes.KEY_KPDOT : { "code": 83, "ascii": "."},
  64. ecodes.KEY_KPENTER : { "code": 96, "ascii": "\n"}, ecodes.KEY_LINEFEED : { "code": 101, "ascii": "\r"},
  65. ecodes.KEY_DELETE : { "code": 111, "ascii": ""}
  66. }
  67. def code_ascii_map(code, shift):
  68. shift_down = False
  69. if (shift[ecodes.KEY_RIGHTSHIFT] > 0) or (shift[ecodes.KEY_LEFTSHIFT] > 0):
  70. shift_down = True
  71. #print("###", code, shift, code in ecode_map)
  72. if code in ecode_map:
  73. if "shift" not in ecode_map[code]:
  74. return ecode_map[code]["ascii"]
  75. if shift_down:
  76. return ecode_map[code]["shift"]
  77. return ecode_map[code]["ascii"]
  78. return ""
  79. for x in range(evfns_n):
  80. fn = evfns_bd + "event" + str(x)
  81. if (os.path.exists(fn)):
  82. evfns.append(fn)
  83. for evfn in evfns:
  84. _dev = evdev.InputDevice(evfn)
  85. if VERBOSE_LEVEL >= 2: print("## device:", _dev.name)
  86. if _dev.name == HID_NAME:
  87. dev_init = True
  88. dev = _dev
  89. break
  90. if not dev_init:
  91. sys.stderr.write("ERROR: could not find device, exiting\n")
  92. sys.exit(-1)
  93. if VERBOSE_LEVEL >= 2:
  94. print("##", dev)
  95. print("##", dev.capabilities())
  96. print("##", dev.capabilities(verbose=True))
  97. sys.stdout.flush()
  98. dev.grab()
  99. kb_shift_state = {
  100. ecodes.KEY_RIGHTSHIFT: 0,
  101. ecodes.KEY_LEFTSHIFT: 0
  102. }
  103. buf = ""
  104. for event in dev.read_loop():
  105. if event.type == ecodes.EV_KEY:
  106. if event.code == ecodes.KEY_RIGHTSHIFT:
  107. kb_shift_state[ecodes.KEY_RIGHTSHIFT] = event.value
  108. elif event.code == ecodes.KEY_LEFTSHIFT:
  109. kb_shift_state[ecodes.KEY_LEFTSHIFT] = event.value
  110. if VERBOSE_LEVEL>=2:
  111. print("##", event.type, event.code, event.value, categorize(event))
  112. print("##", kb_shift_state)
  113. sys.stdout.flush()
  114. # 'down'
  115. #
  116. if (event.value == 1):
  117. ch = code_ascii_map(event.code, kb_shift_state)
  118. if (ch == '\n'):
  119. #sys.stdout.write( str(datetime.datetime.now()) + ": " + str(buf) + "\n")
  120. sys.stdout.write( str(int(time.time())) + ": " + str(buf) + "\n")
  121. #print(buf)
  122. sys.stdout.flush()
  123. buf = ""
  124. else:
  125. buf += ch
  126. #sys.exit(0)
  127. #async def print_events(device):
  128. # async for event in device.async_read_loop():
  129. # print(device.path, evdev.categorize(event, sep=':'))
  130. #
  131. #for device in dev:
  132. # asyncio.ensure_future(print_events(dev))
  133. #
  134. #
  135. #print("...")