forked from mirrors/qmk_firmware
Move functionality from action_util to report
The functions also takes report_kebyoard_t parameters, so that they can be used elsewhere.
This commit is contained in:
parent
c38589d861
commit
017458a07b
5 changed files with 193 additions and 173 deletions
|
@ -18,6 +18,7 @@ TMK_COMMON_SRC += $(COMMON_DIR)/host.c \
|
||||||
$(COMMON_DIR)/debug.c \
|
$(COMMON_DIR)/debug.c \
|
||||||
$(COMMON_DIR)/util.c \
|
$(COMMON_DIR)/util.c \
|
||||||
$(COMMON_DIR)/eeconfig.c \
|
$(COMMON_DIR)/eeconfig.c \
|
||||||
|
$(COMMON_DIR)/report.c \
|
||||||
$(PLATFORM_COMMON_DIR)/suspend.c \
|
$(PLATFORM_COMMON_DIR)/suspend.c \
|
||||||
$(PLATFORM_COMMON_DIR)/timer.c \
|
$(PLATFORM_COMMON_DIR)/timer.c \
|
||||||
$(PLATFORM_COMMON_DIR)/bootloader.c \
|
$(PLATFORM_COMMON_DIR)/bootloader.c \
|
||||||
|
|
|
@ -25,13 +25,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
extern keymap_config_t keymap_config;
|
extern keymap_config_t keymap_config;
|
||||||
|
|
||||||
|
|
||||||
static inline void add_key_byte(uint8_t code);
|
|
||||||
static inline void del_key_byte(uint8_t code);
|
|
||||||
#ifdef NKRO_ENABLE
|
|
||||||
static inline void add_key_bit(uint8_t code);
|
|
||||||
static inline void del_key_bit(uint8_t code);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static uint8_t real_mods = 0;
|
static uint8_t real_mods = 0;
|
||||||
static uint8_t weak_mods = 0;
|
static uint8_t weak_mods = 0;
|
||||||
static uint8_t macro_mods = 0;
|
static uint8_t macro_mods = 0;
|
||||||
|
@ -134,7 +127,7 @@ void send_keyboard_report(void) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
keyboard_report->mods |= oneshot_mods;
|
keyboard_report->mods |= oneshot_mods;
|
||||||
if (has_anykey()) {
|
if (has_anykey(keyboard_report)) {
|
||||||
clear_oneshot_mods();
|
clear_oneshot_mods();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -148,22 +141,22 @@ void add_key(uint8_t key)
|
||||||
{
|
{
|
||||||
#ifdef NKRO_ENABLE
|
#ifdef NKRO_ENABLE
|
||||||
if (keyboard_protocol && keymap_config.nkro) {
|
if (keyboard_protocol && keymap_config.nkro) {
|
||||||
add_key_bit(key);
|
add_key_bit(keyboard_report, key);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
add_key_byte(key);
|
add_key_byte(keyboard_report, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
void del_key(uint8_t key)
|
void del_key(uint8_t key)
|
||||||
{
|
{
|
||||||
#ifdef NKRO_ENABLE
|
#ifdef NKRO_ENABLE
|
||||||
if (keyboard_protocol && keymap_config.nkro) {
|
if (keyboard_protocol && keymap_config.nkro) {
|
||||||
del_key_bit(key);
|
del_key_bit(keyboard_report, key);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
del_key_byte(key);
|
del_key_byte(keyboard_report, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
void clear_keys(void)
|
void clear_keys(void)
|
||||||
|
@ -221,166 +214,7 @@ uint8_t get_oneshot_mods(void)
|
||||||
/*
|
/*
|
||||||
* inspect keyboard state
|
* inspect keyboard state
|
||||||
*/
|
*/
|
||||||
uint8_t has_anykey(void)
|
|
||||||
{
|
|
||||||
uint8_t cnt = 0;
|
|
||||||
for (uint8_t i = 1; i < KEYBOARD_REPORT_SIZE; i++) {
|
|
||||||
if (keyboard_report->raw[i])
|
|
||||||
cnt++;
|
|
||||||
}
|
|
||||||
return cnt;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t has_anymod(void)
|
uint8_t has_anymod(void)
|
||||||
{
|
{
|
||||||
return bitpop(real_mods);
|
return bitpop(real_mods);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t get_first_key(void)
|
|
||||||
{
|
|
||||||
#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
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* local functions */
|
|
||||||
static inline void add_key_byte(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
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void del_key_byte(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
|
|
||||||
static inline void add_key_bit(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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void del_key_bit(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
|
|
||||||
|
|
|
@ -82,9 +82,7 @@ uint8_t get_oneshot_layer_state(void);
|
||||||
bool has_oneshot_layer_timed_out(void);
|
bool has_oneshot_layer_timed_out(void);
|
||||||
|
|
||||||
/* inspect */
|
/* inspect */
|
||||||
uint8_t has_anykey(void);
|
|
||||||
uint8_t has_anymod(void);
|
uint8_t has_anymod(void);
|
||||||
uint8_t get_first_key(void);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
177
tmk_core/common/report.c
Normal file
177
tmk_core/common/report.c
Normal file
|
@ -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
|
|
@ -174,6 +174,16 @@ typedef struct {
|
||||||
(key == KC_WWW_REFRESH ? AC_REFRESH : \
|
(key == KC_WWW_REFRESH ? AC_REFRESH : \
|
||||||
(key == KC_WWW_FAVORITES ? AC_BOOKMARKS : 0)))))))))))))))))))))
|
(key == KC_WWW_FAVORITES ? AC_BOOKMARKS : 0)))))))))))))))))))))
|
||||||
|
|
||||||
|
uint8_t has_anykey(report_keyboard_t* keyboard_report);
|
||||||
|
uint8_t get_first_key(report_keyboard_t* keyboard_report);
|
||||||
|
|
||||||
|
void add_key_byte(report_keyboard_t* keyboard_report, uint8_t code);
|
||||||
|
void del_key_byte(report_keyboard_t* keyboard_report, uint8_t code);
|
||||||
|
#ifdef NKRO_ENABLE
|
||||||
|
void add_key_bit(report_keyboard_t* keyboard_report, uint8_t code);
|
||||||
|
void del_key_bit(report_keyboard_t* keyboard_report, uint8_t code);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue