The functions also takes report_kebyoard_t parameters, so that they can be used elsewhere.b6_b7_audio
parent
c38589d861
commit
017458a07b
@ -0,0 +1,177 @@ |
|||||||
|
/* Copyright 2017 Fred Sundvik
|
||||||
|
* |
||||||
|
* This program is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU General Public License as published by |
||||||
|
* the Free Software Foundation, either version 2 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* This program is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU General Public License |
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#include "report.h" |
||||||
|
#include "host.h" |
||||||
|
#include "keycode_config.h" |
||||||
|
#include "debug.h" |
||||||
|
#include "util.h" |
||||||
|
|
||||||
|
uint8_t has_anykey(report_keyboard_t* keyboard_report) |
||||||
|
{ |
||||||
|
uint8_t cnt = 0; |
||||||
|
for (uint8_t i = 1; i < KEYBOARD_REPORT_SIZE; i++) { |
||||||
|
if (keyboard_report->raw[i]) |
||||||
|
cnt++; |
||||||
|
} |
||||||
|
return cnt; |
||||||
|
} |
||||||
|
|
||||||
|
uint8_t get_first_key(report_keyboard_t* keyboard_report) |
||||||
|
{ |
||||||
|
#ifdef NKRO_ENABLE |
||||||
|
if (keyboard_protocol && keymap_config.nkro) { |
||||||
|
uint8_t i = 0; |
||||||
|
for (; i < KEYBOARD_REPORT_BITS && !keyboard_report->nkro.bits[i]; i++) |
||||||
|
; |
||||||
|
return i<<3 | biton(keyboard_report->nkro.bits[i]); |
||||||
|
} |
||||||
|
#endif |
||||||
|
#ifdef USB_6KRO_ENABLE |
||||||
|
uint8_t i = cb_head; |
||||||
|
do { |
||||||
|
if (keyboard_report->keys[i] != 0) { |
||||||
|
break; |
||||||
|
} |
||||||
|
i = RO_INC(i); |
||||||
|
} while (i != cb_tail); |
||||||
|
return keyboard_report->keys[i]; |
||||||
|
#else |
||||||
|
return keyboard_report->keys[0]; |
||||||
|
#endif |
||||||
|
} |
||||||
|
|
||||||
|
void add_key_byte(report_keyboard_t* keyboard_report, uint8_t code) |
||||||
|
{ |
||||||
|
#ifdef USB_6KRO_ENABLE |
||||||
|
int8_t i = cb_head; |
||||||
|
int8_t empty = -1; |
||||||
|
if (cb_count) { |
||||||
|
do { |
||||||
|
if (keyboard_report->keys[i] == code) { |
||||||
|
return; |
||||||
|
} |
||||||
|
if (empty == -1 && keyboard_report->keys[i] == 0) { |
||||||
|
empty = i; |
||||||
|
} |
||||||
|
i = RO_INC(i); |
||||||
|
} while (i != cb_tail); |
||||||
|
if (i == cb_tail) { |
||||||
|
if (cb_tail == cb_head) { |
||||||
|
// buffer is full
|
||||||
|
if (empty == -1) { |
||||||
|
// pop head when has no empty space
|
||||||
|
cb_head = RO_INC(cb_head); |
||||||
|
cb_count--; |
||||||
|
} |
||||||
|
else { |
||||||
|
// left shift when has empty space
|
||||||
|
uint8_t offset = 1; |
||||||
|
i = RO_INC(empty); |
||||||
|
do { |
||||||
|
if (keyboard_report->keys[i] != 0) { |
||||||
|
keyboard_report->keys[empty] = keyboard_report->keys[i]; |
||||||
|
keyboard_report->keys[i] = 0; |
||||||
|
empty = RO_INC(empty); |
||||||
|
} |
||||||
|
else { |
||||||
|
offset++; |
||||||
|
} |
||||||
|
i = RO_INC(i); |
||||||
|
} while (i != cb_tail); |
||||||
|
cb_tail = RO_SUB(cb_tail, offset); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
// add to tail
|
||||||
|
keyboard_report->keys[cb_tail] = code; |
||||||
|
cb_tail = RO_INC(cb_tail); |
||||||
|
cb_count++; |
||||||
|
#else |
||||||
|
int8_t i = 0; |
||||||
|
int8_t empty = -1; |
||||||
|
for (; i < KEYBOARD_REPORT_KEYS; i++) { |
||||||
|
if (keyboard_report->keys[i] == code) { |
||||||
|
break; |
||||||
|
} |
||||||
|
if (empty == -1 && keyboard_report->keys[i] == 0) { |
||||||
|
empty = i; |
||||||
|
} |
||||||
|
} |
||||||
|
if (i == KEYBOARD_REPORT_KEYS) { |
||||||
|
if (empty != -1) { |
||||||
|
keyboard_report->keys[empty] = code; |
||||||
|
} |
||||||
|
} |
||||||
|
#endif |
||||||
|
} |
||||||
|
|
||||||
|
void del_key_byte(report_keyboard_t* keyboard_report, uint8_t code) |
||||||
|
{ |
||||||
|
#ifdef USB_6KRO_ENABLE |
||||||
|
uint8_t i = cb_head; |
||||||
|
if (cb_count) { |
||||||
|
do { |
||||||
|
if (keyboard_report->keys[i] == code) { |
||||||
|
keyboard_report->keys[i] = 0; |
||||||
|
cb_count--; |
||||||
|
if (cb_count == 0) { |
||||||
|
// reset head and tail
|
||||||
|
cb_tail = cb_head = 0; |
||||||
|
} |
||||||
|
if (i == RO_DEC(cb_tail)) { |
||||||
|
// left shift when next to tail
|
||||||
|
do { |
||||||
|
cb_tail = RO_DEC(cb_tail); |
||||||
|
if (keyboard_report->keys[RO_DEC(cb_tail)] != 0) { |
||||||
|
break; |
||||||
|
} |
||||||
|
} while (cb_tail != cb_head); |
||||||
|
} |
||||||
|
break; |
||||||
|
} |
||||||
|
i = RO_INC(i); |
||||||
|
} while (i != cb_tail); |
||||||
|
} |
||||||
|
#else |
||||||
|
for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { |
||||||
|
if (keyboard_report->keys[i] == code) { |
||||||
|
keyboard_report->keys[i] = 0; |
||||||
|
} |
||||||
|
} |
||||||
|
#endif |
||||||
|
} |
||||||
|
|
||||||
|
#ifdef NKRO_ENABLE |
||||||
|
void add_key_bit(report_keyboard_t* keyboard_report, uint8_t code) |
||||||
|
{ |
||||||
|
if ((code>>3) < KEYBOARD_REPORT_BITS) { |
||||||
|
keyboard_report->nkro.bits[code>>3] |= 1<<(code&7); |
||||||
|
} else { |
||||||
|
dprintf("add_key_bit: can't add: %02X\n", code); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void del_key_bit(report_keyboard_t* keyboard_report, uint8_t code) |
||||||
|
{ |
||||||
|
if ((code>>3) < KEYBOARD_REPORT_BITS) { |
||||||
|
keyboard_report->nkro.bits[code>>3] &= ~(1<<(code&7)); |
||||||
|
} else { |
||||||
|
dprintf("del_key_bit: can't del: %02X\n", code); |
||||||
|
} |
||||||
|
} |
||||||
|
#endif |
Loading…
Reference in new issue