Browse Source

Add tap flags on record_t

core
tmk 11 years ago
parent
commit
71bd9a72fb
3 changed files with 40 additions and 25 deletions
  1. 25
    21
      common/action.c
  2. 15
    3
      common/action.h
  3. 0
    1
      common/action_macro.c

+ 25
- 21
common/action.c View File

static void process_action(keyrecord_t *record) static void process_action(keyrecord_t *record)
{ {
keyevent_t event = record->event; keyevent_t event = record->event;
uint8_t tap_count = record->tap_count;
uint8_t tap_count = record->tap.count;


if (IS_NOEVENT(event)) { return; } if (IS_NOEVENT(event)) { return; }


if (waiting_buffer_has_anykey_pressed()) { if (waiting_buffer_has_anykey_pressed()) {
debug("MODS_TAP: Tap: Cancel: add_mods\n"); debug("MODS_TAP: Tap: Cancel: add_mods\n");
// ad hoc: set 0 to cancel tap // ad hoc: set 0 to cancel tap
record->tap_count = 0;
record->tap.count = 0;
add_mods(mods); add_mods(mods);
} else { } else {
debug("MODS_TAP: Tap: register_code\n"); debug("MODS_TAP: Tap: register_code\n");
// if tapping // if tapping
if (IS_TAPPING_PRESSED()) { if (IS_TAPPING_PRESSED()) {
if (WITHIN_TAPPING_TERM(event)) { if (WITHIN_TAPPING_TERM(event)) {
if (tapping_key.tap_count == 0) {
if (tapping_key.tap.count == 0) {
if (IS_TAPPING_KEY(event.key) && !event.pressed) { if (IS_TAPPING_KEY(event.key) && !event.pressed) {
// first tap! // first tap!
debug("Tapping: First tap(0->1).\n"); debug("Tapping: First tap(0->1).\n");
tapping_key.tap_count = 1;
tapping_key.tap.count = 1;
tapping_key.tap.interrupted = (waiting_buffer_has_anykey_pressed() ? true : false);
debug_tapping_key(); debug_tapping_key();
process_action(&tapping_key); process_action(&tapping_key);


// enqueue // enqueue
keyp->tap_count = tapping_key.tap_count;
keyp->tap = tapping_key.tap;
return false; return false;
} }
#if TAPPING_TERM >= 500 #if TAPPING_TERM >= 500
// tap_count > 0 // tap_count > 0
else { else {
if (IS_TAPPING_KEY(event.key) && !event.pressed) { if (IS_TAPPING_KEY(event.key) && !event.pressed) {
debug("Tapping: Tap release("); debug_dec(tapping_key.tap_count); debug(")\n");
keyp->tap_count = tapping_key.tap_count;
debug("Tapping: Tap release("); debug_dec(tapping_key.tap.count); debug(")\n");
keyp->tap = tapping_key.tap;
process_action(keyp); process_action(keyp);
tapping_key = *keyp; tapping_key = *keyp;
debug_tapping_key(); debug_tapping_key();
return true; return true;
} }
else if (is_tap_key(keyp->event.key) && event.pressed) { else if (is_tap_key(keyp->event.key) && event.pressed) {
if (tapping_key.tap_count > 1) {
if (tapping_key.tap.count > 1) {
debug("Tapping: Start new tap with releasing last tap(>1).\n"); debug("Tapping: Start new tap with releasing last tap(>1).\n");
// unregister key // unregister key
process_action(&(keyrecord_t){ process_action(&(keyrecord_t){
.tap_count = tapping_key.tap_count,
.tap = tapping_key.tap,
.event.key = tapping_key.event.key, .event.key = tapping_key.event.key,
.event.time = event.time, .event.time = event.time,
.event.pressed = false .event.pressed = false
} }
// after TAPPING_TERM // after TAPPING_TERM
else { else {
if (tapping_key.tap_count == 0) {
if (tapping_key.tap.count == 0) {
debug("Tapping: End. Timeout. Not tap(0): "); debug("Tapping: End. Timeout. Not tap(0): ");
debug_event(event); debug("\n"); debug_event(event); debug("\n");
process_action(&tapping_key); process_action(&tapping_key);
} else { } else {
if (IS_TAPPING_KEY(event.key) && !event.pressed) { if (IS_TAPPING_KEY(event.key) && !event.pressed) {
debug("Tapping: End. last timeout tap release(>0)."); debug("Tapping: End. last timeout tap release(>0).");
keyp->tap_count = tapping_key.tap_count;
keyp->tap = tapping_key.tap;
process_action(keyp); process_action(keyp);
tapping_key = (keyrecord_t){}; tapping_key = (keyrecord_t){};
return true; return true;
} }
else if (is_tap_key(keyp->event.key) && event.pressed) { else if (is_tap_key(keyp->event.key) && event.pressed) {
if (tapping_key.tap_count > 1) {
if (tapping_key.tap.count > 1) {
debug("Tapping: Start new tap with releasing last timeout tap(>1).\n"); debug("Tapping: Start new tap with releasing last timeout tap(>1).\n");
// unregister key // unregister key
process_action(&(keyrecord_t){ process_action(&(keyrecord_t){
.tap_count = tapping_key.tap_count,
.tap = tapping_key.tap,
.event.key = tapping_key.event.key, .event.key = tapping_key.event.key,
.event.time = event.time, .event.time = event.time,
.event.pressed = false .event.pressed = false
} }
} else if (IS_TAPPING_RELEASED()) { } else if (IS_TAPPING_RELEASED()) {
if (WITHIN_TAPPING_TERM(event)) { if (WITHIN_TAPPING_TERM(event)) {
if (tapping_key.tap_count > 0 && IS_TAPPING_KEY(event.key) && event.pressed) {
if (tapping_key.tap.count > 0 && IS_TAPPING_KEY(event.key) && event.pressed) {
// sequential tap. // sequential tap.
keyp->tap_count = tapping_key.tap_count + 1;
debug("Tapping: Tap press("); debug_dec(keyp->tap_count); debug(")\n");
keyp->tap = tapping_key.tap;
keyp->tap.count += 1;
debug("Tapping: Tap press("); debug_dec(keyp->tap.count); debug(")\n");
process_action(keyp); process_action(keyp);
tapping_key = *keyp; tapping_key = *keyp;
debug_tapping_key(); debug_tapping_key();
static void waiting_buffer_scan_tap(void) static void waiting_buffer_scan_tap(void)
{ {
// tapping already is settled // tapping already is settled
if (tapping_key.tap_count > 0) return;
// invalid state: tapping_key released && tap_count == 0
if (tapping_key.tap.count > 0) return;
// invalid state: tapping_key released && tap.count == 0
if (!tapping_key.event.pressed) return; if (!tapping_key.event.pressed) return;


for (uint8_t i = waiting_buffer_tail; i != waiting_buffer_head; i = (i + 1) % WAITING_BUFFER_SIZE) { for (uint8_t i = waiting_buffer_tail; i != waiting_buffer_head; i = (i + 1) % WAITING_BUFFER_SIZE) {
if (IS_TAPPING_KEY(waiting_buffer[i].event.key) && if (IS_TAPPING_KEY(waiting_buffer[i].event.key) &&
!waiting_buffer[i].event.pressed && !waiting_buffer[i].event.pressed &&
WITHIN_TAPPING_TERM(waiting_buffer[i].event)) { WITHIN_TAPPING_TERM(waiting_buffer[i].event)) {
tapping_key.tap_count = 1;
waiting_buffer[i].tap_count = 1;
tapping_key.tap.count = 1;
waiting_buffer[i].tap.count = 1;
process_action(&tapping_key); process_action(&tapping_key);


debug("waiting_buffer_scan_tap: found at ["); debug_dec(i); debug("]\n"); debug("waiting_buffer_scan_tap: found at ["); debug_dec(i); debug("]\n");
default: default:
return false; return false;
} }
case ACT_MACRO:
case ACT_FUNCTION: case ACT_FUNCTION:
if (action.func.opt & FUNC_TAP) { return true; } if (action.func.opt & FUNC_TAP) { return true; }
return false; return false;
} }
static void debug_record(keyrecord_t record) static void debug_record(keyrecord_t record)
{ {
debug_event(record.event); debug(":"); debug_dec(record.tap_count);
debug_event(record.event); debug(":"); debug_dec(record.tap.count);
if (record.tap.interrupted) debug("-");
} }
static void debug_action(action_t action) static void debug_action(action_t action)
{ {

+ 15
- 3
common/action.h View File





/* Struct to record event and tap count */ /* Struct to record event and tap count */
typedef union {
struct {
bool interrupted :1;
bool reserved2 :1;
bool reserved1 :1;
bool reserved0 :1;
uint8_t count :4;
};
} tap_t;

typedef struct { typedef struct {
keyevent_t event; keyevent_t event;
uint8_t tap_count;
tap_t tap;
} keyrecord_t; } keyrecord_t;


/* Action struct. /* Action struct.
*/ */
/* Macro */ /* Macro */
#define ACTION_MACRO(id) ACTION(ACT_MACRO, (id)) #define ACTION_MACRO(id) ACTION(ACT_MACRO, (id))
#define ACTION_MACRO_TAP(id) ACTION(ACT_MACRO, FUNC_TAP<<8 | (id))
#define ACTION_MACRO_OPT(id, opt) ACTION(ACT_MACRO, (opt)<<8 | (id)) #define ACTION_MACRO_OPT(id, opt) ACTION(ACT_MACRO, (opt)<<8 | (id))


/* Command */ /* Command */
enum function_opts { enum function_opts {
FUNC_TAP = 0x8, /* indciates function is tappable */ FUNC_TAP = 0x8, /* indciates function is tappable */
}; };
#define ACTION_FUNCTION(id, opt) ACTION(ACT_FUNCTION, (opt)<<8 | id)
#define ACTION_FUNCTION_TAP(id) ACTION(ACT_FUNCTION, FUNC_TAP<<8 | id)
#define ACTION_FUNCTION(id) ACTION(ACT_FUNCTION, (id))
#define ACTION_FUNCTION_TAP(id) ACTION(ACT_FUNCTION, FUNC_TAP<<8 | (id))
#define ACTION_FUNCTION_OPT(id, opt) ACTION(ACT_FUNCTION, (opt)<<8 | (id))


#endif /* ACTION_H */ #endif /* ACTION_H */

+ 0
- 1
common/action_macro.c View File

case MODS_DOWN: case MODS_DOWN:
MACRO_READ(); MACRO_READ();
debug("MODS_DOWN("); debug_hex(macro); debug(")\n"); debug("MODS_DOWN("); debug_hex(macro); debug(")\n");
debug("MODS_UP("); debug_hex(macro); debug(")\n");
add_mods(macro); add_mods(macro);
break; break;
case MODS_UP: case MODS_UP: