1
0

Clean code of 6KRO

This commit is contained in:
Kai Ryu 2014-05-13 13:55:03 +09:00
parent 59c8417c9e
commit 79f7f78678

View File

@ -178,42 +178,55 @@ uint8_t get_first_key(void)
#endif #endif
} }
#ifdef USB_6KRO_ENABLE
#ifdef DEBUG
static void dump_report_keys(void) {
dprintf("\n");
for (uint8_t i = 0; i < REPORT_KEYS; i++) {
dprintf("%02X ", keyboard_report->keys[i]);
}
dprintf("\n");
for (uint8_t i = 0; i < REPORT_KEYS; i++) {
dprintf("%c%c ", i==cb_head?'H':' ', i==cb_tail?'T':' ');
}
dprintf("\n");
}
#endif
#endif
/* local functions */ /* local functions */
static inline void add_key_byte(uint8_t code) static inline void add_key_byte(uint8_t code)
{ {
#ifdef USB_6KRO_ENABLE #ifdef USB_6KRO_ENABLE
int8_t i = cb_head; int8_t i = cb_head;
int8_t idle = -1; int8_t empty = -1;
if (cb_count) { if (cb_count) {
do { do {
if (keyboard_report->keys[i] == code) { if (keyboard_report->keys[i] == code) {
return; return;
} }
if (idle == -1 && keyboard_report->keys[i] == 0) { if (empty == -1 && keyboard_report->keys[i] == 0) {
idle = i; empty = i;
} }
i = RO_INC(i); i = RO_INC(i);
} while (i != cb_tail); } while (i != cb_tail);
if (i == cb_tail) { if (i == cb_tail) {
// code is unique
if (cb_tail == cb_head) { if (cb_tail == cb_head) {
// buffer is full // buffer is full
if (idle == -1) { if (empty == -1) {
// pop head when has no idle space // pop head when has no empty space
cb_head = RO_INC(cb_head); cb_head = RO_INC(cb_head);
cb_count--; cb_count--;
} }
else { else {
// pack when has idle space // left shift when has empty space
uint8_t offset = 1; uint8_t offset = 1;
i = RO_INC(idle); i = RO_INC(empty);
do { do {
if (keyboard_report->keys[i] != 0) { if (keyboard_report->keys[i] != 0) {
keyboard_report->keys[idle] = keyboard_report->keys[i]; keyboard_report->keys[empty] = keyboard_report->keys[i];
keyboard_report->keys[i] = 0; keyboard_report->keys[i] = 0;
idle = RO_INC(idle); empty = RO_INC(empty);
} }
else { else {
offset++; offset++;
@ -229,6 +242,9 @@ static inline void add_key_byte(uint8_t code)
keyboard_report->keys[cb_tail] = code; keyboard_report->keys[cb_tail] = code;
cb_tail = RO_INC(cb_tail); cb_tail = RO_INC(cb_tail);
cb_count++; cb_count++;
#ifdef DEBUG
dump_report_keys();
#endif
#else #else
int8_t i = 0; int8_t i = 0;
int8_t empty = -1; int8_t empty = -1;
@ -246,17 +262,6 @@ static inline void add_key_byte(uint8_t code)
} }
} }
#endif #endif
/*
dprintf("\n");
for (uint8_t i = 0; i < REPORT_KEYS; i++) {
dprintf("%02X ", keyboard_report->keys[i]);
}
dprintf("\n");
for (uint8_t i = 0; i < REPORT_KEYS; i++) {
dprintf("%c%c ", i==cb_head?'H':' ', i==cb_tail?'T':' ');
}
dprintf("\n");
*/
} }
static inline void del_key_byte(uint8_t code) static inline void del_key_byte(uint8_t code)
@ -269,9 +274,11 @@ static inline void del_key_byte(uint8_t code)
keyboard_report->keys[i] = 0; keyboard_report->keys[i] = 0;
cb_count--; cb_count--;
if (cb_count == 0) { if (cb_count == 0) {
// reset head and tail
cb_tail = cb_head = 0; cb_tail = cb_head = 0;
} }
if (i == RO_DEC(cb_tail)) { if (i == RO_DEC(cb_tail)) {
// left shift when next to tail
do { do {
cb_tail = RO_DEC(cb_tail); cb_tail = RO_DEC(cb_tail);
if (keyboard_report->keys[RO_DEC(cb_tail)] != 0) { if (keyboard_report->keys[RO_DEC(cb_tail)] != 0) {
@ -284,6 +291,9 @@ static inline void del_key_byte(uint8_t code)
i = RO_INC(i); i = RO_INC(i);
} while (i != cb_tail); } while (i != cb_tail);
} }
#ifdef DEBUG
dump_report_keys();
#endif
#else #else
for (uint8_t i = 0; i < REPORT_KEYS; i++) { for (uint8_t i = 0; i < REPORT_KEYS; i++) {
if (keyboard_report->keys[i] == code) { if (keyboard_report->keys[i] == code) {
@ -291,17 +301,6 @@ static inline void del_key_byte(uint8_t code)
} }
} }
#endif #endif
/*
dprintf("\n");
for (uint8_t i = 0; i < REPORT_KEYS; i++) {
dprintf("%02X ", keyboard_report->keys[i]);
}
dprintf("\n");
for (uint8_t i = 0; i < REPORT_KEYS; i++) {
dprintf("%c%c ", i==cb_head?'H':' ', i==cb_tail?'T':' ');
}
dprintf("\ntail=%d\n", cb_tail);
*/
} }
#ifdef NKRO_ENABLE #ifdef NKRO_ENABLE