]> Joshua Wise's Git repositories - netwatch.git/blame - aseg/keyboard.c
packet receive code; keyboard injection
[netwatch.git] / aseg / keyboard.c
CommitLineData
50d89a31
JP
1#include "keyboard.h"
2#include <output.h>
3
4static unsigned char kbd_inj_buffer[128];
5static int kbd_inj_start = 0;
6static int kbd_inj_end = 0;
7int kbd_mode = 2;
8
9static const char scancodes2[][8] = {
10 ['a'] = "\x1e\xf0\x1e",
11 ['b'] = "\x30\xf0\x30",
12 ['c'] = "\x2e\xf0\x2e",
13 ['d'] = "\x20\xf0\x20",
14 ['e'] = "\x12\xf0\x12",
15 ['f'] = "\x21\xf0\x21",
16 ['g'] = "\x22\xf0\x22",
17 ['h'] = "\x23\xf0\x23",
18 ['i'] = "\x17\xf0\x17",
19 ['j'] = "\x24\xf0\x24",
20 ['k'] = "\x25\xf0\x25",
21 ['l'] = "\x26\xf0\x26",
22 ['m'] = "\x32\xf0\x32",
23 ['n'] = "\x31\xf0\x31",
24 ['o'] = "\x18\xf0\x18",
25 ['p'] = "\x19\xf0\x19",
26 ['q'] = "\x10\xf0\x10",
27 ['r'] = "\x13\xf0\x13",
28 ['s'] = "\x1f\xf0\x1f",
29 ['t'] = "\x14\xf0\x14",
30 ['u'] = "\x16\xf0\x16",
31 ['v'] = "\x2f\xf0\x2f",
32 ['w'] = "\x11\xf0\x11",
33 ['x'] = "\x2d\xf0\x2d",
34 ['y'] = "\x15\xf0\x15",
35 ['z'] = "\x2c\xf0\x2c",
36 ['A'] = "\x12\x1e\xf0\x1e\xf0\x12",
37 ['B'] = "\x12\x30\xf0\x30\xf0\x12",
38 ['C'] = "\x12\x2e\xf0\x2e\xf0\x12",
39 ['D'] = "\x12\x20\xf0\x20\xf0\x12",
40 ['E'] = "\x12\x12\xf0\x12\xf0\x12",
41 ['F'] = "\x12\x21\xf0\x21\xf0\x12",
42 ['G'] = "\x12\x22\xf0\x22\xf0\x12",
43 ['H'] = "\x12\x23\xf0\x23\xf0\x12",
44 ['I'] = "\x12\x17\xf0\x17\xf0\x12",
45 ['J'] = "\x12\x24\xf0\x24\xf0\x12",
46 ['K'] = "\x12\x25\xf0\x25\xf0\x12",
47 ['L'] = "\x12\x26\xf0\x26\xf0\x12",
48 ['M'] = "\x12\x32\xf0\x32\xf0\x12",
49 ['N'] = "\x12\x31\xf0\x31\xf0\x12",
50 ['O'] = "\x12\x18\xf0\x18\xf0\x12",
51 ['P'] = "\x12\x19\xf0\x19\xf0\x12",
52 ['Q'] = "\x12\x10\xf0\x10\xf0\x12",
53 ['R'] = "\x12\x13\xf0\x13\xf0\x12",
54 ['S'] = "\x12\x1f\xf0\x1f\xf0\x12",
55 ['T'] = "\x12\x14\xf0\x14\xf0\x12",
56 ['U'] = "\x12\x16\xf0\x16\xf0\x12",
57 ['V'] = "\x12\x2f\xf0\x2f\xf0\x12",
58 ['W'] = "\x12\x11\xf0\x11\xf0\x12",
59 ['X'] = "\x12\x2d\xf0\x2d\xf0\x12",
60 ['Y'] = "\x12\x15\xf0\x15\xf0\x12",
61 ['Z'] = "\x12\x2c\xf0\x2c\xf0\x12",
62 ['`'] = "\x0e\xf0\x0e",
63 ['~'] = "\x12\x0e\xf0\x0e\xf0\x12",
64 ['1'] = "\x16\xf0\x16",
65 ['!'] = "\x12\x16\xf0\x16\xf0\x12",
66 ['2'] = "\x1e\xf0\x1e",
67 ['@'] = "\x12\x1e\xf0\x1e\xf0\x12",
68 ['3'] = "\x26\xf0\x26",
69 ['#'] = "\x12\x26\xf0\x26\xf0\x12",
70 ['4'] = "\x25\xf0\x25",
71 ['$'] = "\x12\x25\xf0\x25\xf0\x12",
72 ['5'] = "\x2e\xf0\x2e",
73 ['%'] = "\x12\x2e\xf0\x2e\xf0\x12",
74 ['6'] = "\x36\xf0\x36",
75 ['^'] = "\x12\x36\xf0\x36\xf0\x12",
76 ['7'] = "\x3d\xf0\x3d",
77 ['&'] = "\x12\x3d\xf0\x3d\xf0\x12",
78 ['8'] = "\x3e\xf0\x3e",
79 ['*'] = "\x12\x3e\xf0\x3e\xf0\x12",
80 ['9'] = "\x46\xf0\x46",
81 ['('] = "\x12\x46\xf0\x46\xf0\x12",
82 ['0'] = "\x45\xf0\x45",
83 [')'] = "\x12\x45\xf0\x45\xf0\x12",
84 ['-'] = "\x4e\xf0\x4e",
85 ['_'] = "\x12\x4e\xf0\x4e\xf0\x12",
86 ['='] = "\x55\xf0\x55",
87 ['+'] = "\x12\x55\xf0\x55\xf0\x12",
88 ['['] = "\x54\xf0\x54",
89 ['{'] = "\x12\x54\xf0\x54\xf0\x12",
90 [']'] = "\x5b\xf0\x5b",
91 ['}'] = "\x12\x5b\xf0\x5b\xf0\x12",
92 ['\\'] = "\x5d\xf0\x5d",
93 ['|'] = "\x12\x5d\xf0\x5d\xf0\x12",
94 [';'] = "\x4c\xf0\x4c",
95 [':'] = "\x12\x4c\xf0\x4c\xf0\x12",
96 ['\''] = "\x52\xf0\x52",
97 ['"'] = "\x12\x52\xf0\x52\xf0\x12",
98 [','] = "\x41\xf0\x41",
99 ['<'] = "\x12\x41\xf0\x41\xf0\x12",
100 ['.'] = "\x49\xf0\x49",
101 ['>'] = "\x12\x49\xf0\x49\xf0\x12",
102 ['/'] = "\x4a\xf0\x4a",
103 ['?'] = "\x12\x4a\xf0\x4a\xf0\x12",
104};
105
106const unsigned char convert_table[] = {
107 0xff, 0x43, 0x41, 0x3f, 0x3d, 0x3b, 0x3c, 0x58, 0x64, 0x44, 0x42, 0x40, 0x3e, 0x0f, 0x29, 0x59,
108 0x65, 0x38, 0x2a, 0x70, 0x1d, 0x10, 0x02, 0x5a, 0x66, 0x71, 0x2c, 0x1f, 0x1e, 0x11, 0x03, 0x5b,
109 0x67, 0x2e, 0x2d, 0x20, 0x12, 0x05, 0x04, 0x5c, 0x68, 0x39, 0x2f, 0x21, 0x14, 0x13, 0x06, 0x5d,
110 0x69, 0x31, 0x30, 0x23, 0x22, 0x15, 0x07, 0x5e, 0x6a, 0x72, 0x32, 0x24, 0x16, 0x08, 0x09, 0x5f,
111 0x6b, 0x33, 0x25, 0x17, 0x18, 0x0b, 0x0a, 0x60, 0x6c, 0x34, 0x35, 0x26, 0x27, 0x19, 0x0c, 0x61,
112 0x6d, 0x73, 0x28, 0x74, 0x1a, 0x0d, 0x62, 0x6e, 0x3a, 0x36, 0x1c, 0x1b, 0x75, 0x2b, 0x63, 0x76,
113 0x55, 0x56, 0x77, 0x78, 0x79, 0x7a, 0x0e, 0x7b, 0x7c, 0x4f, 0x7d, 0x4b, 0x47, 0x7e, 0x7f, 0x6f,
114 0x52, 0x53, 0x50, 0x4c, 0x4d, 0x48, 0x01, 0x45, 0x57, 0x4e, 0x51, 0x4a, 0x37, 0x49, 0x46, 0x54,
115 0x80, 0x81, 0x82, 0x41, 0x54, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
116 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
117 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
118 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
119 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
120 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
121 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
122 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
123};
124
125unsigned char sc_convert_1(unsigned char in) {
126 static int shifted = 0;
127
128 if (shifted) {
129 shifted = 0;
130 return convert_table[in] | 0x80;
131 }
132
133 if (in == 0xF0) {
134 shifted = 1;
135 return 0;
136 } else {
137 return convert_table[in];
138 }
139}
140
141void kbd_inject_scancode (unsigned char sc) {
142 outputf("Buffering %02x", sc);
143 kbd_inj_buffer[kbd_inj_end] = sc;
144 kbd_inj_end += 1;
145 kbd_inj_end %= sizeof(kbd_inj_buffer);
146}
147
148void kbd_inject_key(unsigned char k) {
149
150 if (kbd_mode == 1) {
151 const char * c = scancodes2[k];
152 if (!c) return;
153 while (*c) {
154 char cconv = sc_convert_1(*c);
155 if (cconv) kbd_inject_scancode(cconv);
156 c++;
157 }
158 } else {
159 const char * c = scancodes2[k];
160 if (!c) return;
161 while (*c) {
162 kbd_inject_scancode(*c);
163 c++;
164 }
165 }
166}
167
168unsigned char kbd_get_injected_scancode()
169{
170 unsigned char b;
171
172 if (kbd_inj_end != kbd_inj_start) {
173 b = kbd_inj_buffer[kbd_inj_start];
174 kbd_inj_start += 1;
175 kbd_inj_start %= sizeof(kbd_inj_buffer);
176 outputf("Injecting %02x", b);
177 return b;
178 } else {
179 outputf("Not injecting");
180 return 0;
181 }
182}
This page took 0.03696 seconds and 4 git commands to generate.