blob: 8077ff6e4caadf843ce3770c4480b1a833ba5748 [file] [log] [blame]
# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Script to test key sequence using atmel.
Test procedure
1- start servod as sudo servod --board=panther --usbkm232=atmega
look for output USBKM232: /dev/pts/9
2- launch script as USBKM232_UART_DEVICE=/dev/pts/9 python kb.py
3- press 1 and 2 to swtich from vt1 to vt2
4- press 1 to goto vt1, login and open a browser (as guest)
5- press 9 to see [A-Z] output to URL bar
6- press 0 to send [ -~]
7- press f to walk through all function key
8- press i to go into interactive mode and start typing
9- ctrl-x to get out of interactive mode
10 ctrl-x to get out of program
"""
import os
import sys
import termios
import time
import tty
from usbkm232 import usbkm232
keymap = {
0: ['<lctrl>', '@'], # NUL
1: ['<lctrl>', 'a'], # SOH
2: ['<lctrl>', 'b'], # STX
3: ['<lctrl>', 'c'], # ETX
4: ['<lctrl>', 'd'], # EOT
5: ['<lctrl>', 'e'], # ENQ
6: ['<lctrl>', 'f'], # ACK
7: ['<lctrl>', 'g'], # BEL
8: ['<lctrl>', 'h'], # BS
9: ['<tab>'], # HT
10: ['<lctrl>', 'j'], # LF
11: ['<lctrl>', 'k'], # VT
12: ['<lctrl>', 'l'], # FF
13: ['<enter>'], # CR
14: ['<lctrl>', 'n'], # SO
15: ['<lctrl>', 'o'], # SI
16: ['<lctrl>', 'p'], # DLE
17: ['<lctrl>', 'q'], # DC1
18: ['<lctrl>', 'r'], # DC2
19: ['<lctrl>', 's'], # DC3
20: ['<lctrl>', 't'], # DC4
21: ['<lctrl>', 'u'], # NAK
22: ['<lctrl>', 'v'], # SYN
23: ['<lctrl>', 'w'], # ETB
24: ['<lctrl>', 'x'], # CAN
25: ['<lctrl>', 'y'], # EM
26: ['<lctrl>', 'z'], # SUB
27: ['<lctrl>', '['], # ESC
28: ['<lctrl>', '\\'], # FS
29: ['<lctrl>', ']'], # GS
30: ['<lctrl>', '^'], # RS
31: ['<lctrl>', '_'], # US
32: [' '],
33: ['<lshift>', '1'], # !
34: ['<lshift>', '\''],# "
35: ['<lshift>', '3'], # #
36: ['<lshift>', '4'], # $
37: ['<lshift>', '5'], # %
38: ['<lshift>', '7'], # &
39: ['\''],
40: ['<lshift>', '9'], # (
41: ['<lshift>', '0'], # )
42: ['<lshift>', '8'], # *
43: ['<lshift>', '='], # +
44: [','],
45: ['-'],
46: ['.'],
47: ['/'],
48: ['0'],
49: ['1'],
50: ['2'],
51: ['3'],
52: ['4'],
53: ['5'],
54: ['6'],
55: ['7'],
56: ['8'],
57: ['9'],
58: ['<lshift>', ';'],
59: [';'],
60: ['<lshift>', ','], # <
61: ['='],
62: ['<lshift>', '.'], # >
63: ['<lshift>', '/'], # ?
64: ['<lshift>', '2'], # @
65: ['<lshift>', 'a'],
66: ['<lshift>', 'b'],
67: ['<lshift>', 'c'],
68: ['<lshift>', 'd'],
69: ['<lshift>', 'e'],
70: ['<lshift>', 'f'],
71: ['<lshift>', 'g'],
72: ['<lshift>', 'h'],
73: ['<lshift>', 'i'],
74: ['<lshift>', 'j'],
75: ['<lshift>', 'k'],
76: ['<lshift>', 'l'],
77: ['<lshift>', 'm'],
78: ['<lshift>', 'n'],
79: ['<lshift>', 'o'],
80: ['<lshift>', 'p'],
81: ['<lshift>', 'q'],
82: ['<lshift>', 'r'],
83: ['<lshift>', 's'],
84: ['<lshift>', 't'],
85: ['<lshift>', 'u'],
86: ['<lshift>', 'v'],
87: ['<lshift>', 'w'],
88: ['<lshift>', 'x'],
89: ['<lshift>', 'y'],
90: ['<lshift>', 'z'],
91: ['['],
92: ['\\'],
93: [']'],
94: ['<lshift>', '6'], # ^
95: ['<lshift>', '-'], # _
96: ['`'],
97: ['a'],
98: ['b'],
99: ['c'],
100: ['d'],
101: ['e'],
102: ['f'],
103: ['g'],
104: ['h'],
105: ['i'],
106: ['j'],
107: ['k'],
108: ['l'],
109: ['m'],
110: ['n'],
111: ['o'],
112: ['p'],
113: ['q'],
114: ['r'],
115: ['s'],
116: ['t'],
117: ['u'],
118: ['v'],
119: ['w'],
120: ['x'],
121: ['y'],
122: ['z'],
123: ['<lshift>', '['], # {
124: ['<lshift>', '\\'],# |
125: ['<lshift>', ']'], # }
126: ['<lshift>', '`'], # ~
127: ['<backspace>'], # DEL
}
def direct_send_seq(kbd, rlist):
# rlist contains the actual code from usbkm232.py
buf = []
for k in rlist:
buf.append(kbd._press(k))
for k in rlist:
buf.append(kbd._release(k))
kbd._write(buf)
def menu():
print """
\r 1 to VT1
\r 2 to VT2
\r 0 to send [ -~]
\r 9 to send [A-Z]
\r f send function keys (best in VT2 with browser history)
\r i for interactive (ctrl-X to exit mode)
\r ctrl-x to exit program.
\r
"""
def main():
"""Main method."""
try:
kbd = usbkm232(os.environ['USBKM232_UART_DEVICE'])
except KeyError:
print "-E- Must set environment variable USBKM232_UART_DEVICE"
sys.exit(-1)
menu()
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
interactive_mode = False
try:
tty.setraw(sys.stdin.fileno())
while True:
ch = sys.stdin.read(1)
print '\rRead %c:%d\r' % (ch, ord(ch))
if interactive_mode:
if ord(ch) == 24: # Ctrl-X
print '\rInteractive mode off:\r'
interactive_mode = False
menu()
continue
buf = []
for keycode in keymap[ord(ch)]:
buf.append(kbd._press(keycode))
kbd._write(buf)
continue
# Menu items
if ch == 'i': # interactive mode
print '\rInteractive mode on (ctrl-x to leave).\r'
interactive_mode = True
elif ch == 'm':
menu()
elif ch == '1': # VT1
direct_send_seq(kbd, ['<lctrl>', '<lalt>', '<f1>'])
elif ch == '2': # VT2
direct_send_seq(kbd, ['<lctrl>', '<lalt>', '<f2>'])
elif ch == '0': # send [ -~]
for k in range(32,127):
buf = []
for j in keymap[k]:
buf.append(kbd._press(j))
kbd._write(buf)
elif ch == '9': # send [A-Z]. Note no capslock in VT1
kbd._write([kbd._press('<capslock>')])
for k in range(97,123): # [a-z]
buf = []
for j in keymap[k]:
buf.append(kbd._press(j))
kbd._write(buf)
kbd._write([kbd._press('<capslock>')])
elif ch == 'f': # Send F1- F12
for i in range(1,12):
s = '<f%d>' % i
print '\rSend %s' % s
direct_send_seq(kbd, [s])
time.sleep(1)
elif ord(ch) == 24: # Ctrl-X
break
print '\r'
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
kbd.close()
if __name__ == "__main__":
main()