]> git.gir.st - tmk_keyboard.git/blob - ps2_vusb/keyboard.c
define sendcha() in usb_debug.c
[tmk_keyboard.git] / ps2_vusb / keyboard.c
1 #include "usb_keycodes.h"
2 #include "host.h"
3 #include "ps2.h"
4 #include "usb.h"
5 #include "keyboard.h"
6 #include "print.h"
7
8 static report_keyboard_t report0;
9 static report_keyboard_t report1;
10 static report_keyboard_t *report = &report0;
11 static report_keyboard_t *report_prev = &report1;
12
13
14 void keyboard_set_led(uint8_t usb_led)
15 {
16 uint8_t ps2_led = 0;
17 if (usb_led & (1<<USB_LED_SCROLL_LOCK))
18 ps2_led |= (1<<PS2_LED_SCROLL_LOCK);
19 if (usb_led & (1<<USB_LED_NUM_LOCK))
20 ps2_led |= (1<<PS2_LED_NUM_LOCK);
21 if (usb_led & (1<<USB_LED_CAPS_LOCK))
22 ps2_led |= (1<<PS2_LED_CAPS_LOCK);
23 print("ps2_led: "); phex(ps2_led); print("\n");
24
25 ps2_host_set_led(ps2_led);
26 }
27
28 void keyboard_send(void)
29 {
30 host_keyboard_send(report);
31 }
32
33 bool keyboard_has_key(void)
34 {
35 for (int i = 0; i < REPORT_KEYS; i++) {
36 if (report->keys[i])
37 return true;
38 }
39 return false;
40 }
41
42 void keyboard_add_mod(uint8_t mod)
43 {
44 report->mods |= mod;
45 }
46
47 void keyboard_add_key(uint8_t code)
48 {
49 int8_t i = 0;
50 int8_t empty = -1;
51 for (; i < REPORT_KEYS; i++) {
52 if (report_prev->keys[i] == code) {
53 report->keys[i] = code;
54 break;
55 }
56 if (empty == -1 && report_prev->keys[i] == KB_NO && report->keys[i] == KB_NO) {
57 empty = i;
58 }
59 }
60 if (i == REPORT_KEYS && empty != -1) {
61 report->keys[empty] = code;
62 }
63 }
64
65 void keyboard_add_code(uint8_t code)
66 {
67 if (IS_MOD(code)) {
68 keyboard_add_mod(code);
69 } else {
70 keyboard_add_key(code);
71 }
72 }
73
74 void keyboard_swap_report(void)
75 {
76 report_keyboard_t *tmp = report_prev;
77 report_prev = report;
78 report = tmp;
79 }
80
81 void keyboard_clear_report(void)
82 {
83 report->mods = 0;
84 for (int8_t i = 0; i < REPORT_KEYS; i++) {
85 report->keys[i] = 0;
86 }
87 }
88
89 report_keyboard_t *keyboard_report(void)
90 {
91 return report;
92 }
93
94 report_keyboard_t *keyboard_report_prev(void)
95 {
96 return report_prev;
97 }
Imprint / Impressum