Fix typo in uart.c backport and add 32A "support" (#8219)
[jackhill/qmk/firmware.git] / tmk_core / common / host.c
1 /*
2 Copyright 2011,2012 Jun Wako <wakojun@gmail.com>
3
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 2 of the License, or
7 (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18 #include <stdint.h>
19 //#include <avr/interrupt.h>
20 #include "keycode.h"
21 #include "host.h"
22 #include "util.h"
23 #include "debug.h"
24
25 #ifdef NKRO_ENABLE
26 # include "keycode_config.h"
27 extern keymap_config_t keymap_config;
28 #endif
29
30 static host_driver_t *driver;
31 static uint16_t last_system_report = 0;
32 static uint16_t last_consumer_report = 0;
33
34 void host_set_driver(host_driver_t *d) { driver = d; }
35
36 host_driver_t *host_get_driver(void) { return driver; }
37
38 uint8_t host_keyboard_leds(void) {
39 if (!driver) return 0;
40 return (*driver->keyboard_leds)();
41 }
42
43 led_t host_keyboard_led_state(void) {
44 if (!driver) return (led_t){0};
45 return (led_t)((*driver->keyboard_leds)());
46 }
47
48 /* send report */
49 void host_keyboard_send(report_keyboard_t *report) {
50 if (!driver) return;
51 #if defined(NKRO_ENABLE) && defined(NKRO_SHARED_EP)
52 if (keyboard_protocol && keymap_config.nkro) {
53 /* The callers of this function assume that report->mods is where mods go in.
54 * But report->nkro.mods can be at a different offset if core keyboard does not have a report ID.
55 */
56 report->nkro.mods = report->mods;
57 report->nkro.report_id = REPORT_ID_NKRO;
58 } else
59 #endif
60 {
61 #ifdef KEYBOARD_SHARED_EP
62 report->report_id = REPORT_ID_KEYBOARD;
63 #endif
64 }
65 (*driver->send_keyboard)(report);
66
67 if (debug_keyboard) {
68 dprint("keyboard_report: ");
69 for (uint8_t i = 0; i < KEYBOARD_REPORT_SIZE; i++) {
70 dprintf("%02X ", report->raw[i]);
71 }
72 dprint("\n");
73 }
74 }
75
76 void host_mouse_send(report_mouse_t *report) {
77 if (!driver) return;
78 #ifdef MOUSE_SHARED_EP
79 report->report_id = REPORT_ID_MOUSE;
80 #endif
81 (*driver->send_mouse)(report);
82 }
83
84 void host_system_send(uint16_t report) {
85 if (report == last_system_report) return;
86 last_system_report = report;
87
88 if (!driver) return;
89 (*driver->send_system)(report);
90 }
91
92 void host_consumer_send(uint16_t report) {
93 if (report == last_consumer_report) return;
94 last_consumer_report = report;
95
96 if (!driver) return;
97 (*driver->send_consumer)(report);
98 }
99
100 uint16_t host_last_system_report(void) { return last_system_report; }
101
102 uint16_t host_last_consumer_report(void) { return last_consumer_report; }