Skip to content

Commit

Permalink
Add timeout option to MODS_ONESHOT #66
Browse files Browse the repository at this point in the history
  • Loading branch information
yashikno committed Oct 7, 2013
1 parent d52d554 commit 35f9f30
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 30 deletions.
17 changes: 3 additions & 14 deletions common/action.c
Original file line number Diff line number Diff line change
Expand Up @@ -100,40 +100,29 @@ void process_action(keyrecord_t *record)
action.key.mods<<4;
switch (action.layer_tap.code) {
#ifndef NO_ACTION_ONESHOT
case 0x00:
case MODS_ONESHOT:
// Oneshot modifier
if (event.pressed) {
if (tap_count == 0) {
dprint("MODS_TAP: Oneshot: add_mods\n");
register_mods(mods);
}
else if (tap_count == 1) {
dprint("MODS_TAP: Oneshot: start\n");
set_oneshot_mods(mods);
}
else if (tap_count == TAPPING_TOGGLE) {
dprint("MODS_TAP: Oneshot: toggle\n");
oneshot_toggle();
}
else {
dprint("MODS_TAP: Oneshot: cancel&add_mods\n");
// double tap cancels oneshot and works as normal modifier.
clear_oneshot_mods();
register_mods(mods);
}
} else {
if (tap_count == 0) {
dprint("MODS_TAP: Oneshot: cancel/del_mods\n");
// cancel oneshot on hold
clear_oneshot_mods();
unregister_mods(mods);
}
else if (tap_count == 1) {
// Oneshot
// Retain Oneshot mods
}
else {
dprint("MODS_TAP: Oneshot: del_mods\n");
// cancel Mods
clear_oneshot_mods();
unregister_mods(mods);
}
}
Expand Down
39 changes: 30 additions & 9 deletions common/action_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "report.h"
#include "debug.h"
#include "action_util.h"
#include "timer.h"

static inline void add_key_byte(uint8_t code);
static inline void del_key_byte(uint8_t code);
Expand All @@ -35,17 +36,28 @@ static uint8_t weak_mods = 0;
report_keyboard_t *keyboard_report = &(report_keyboard_t){};

#ifndef NO_ACTION_ONESHOT
static bool oneshot_enabled = true;
static int8_t oneshot_mods = 0;
#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
static int16_t oneshot_time = 0;
#endif
#endif


void send_keyboard_report(void) {
keyboard_report->mods = real_mods;
keyboard_report->mods |= weak_mods;
#ifndef NO_ACTION_ONESHOT
keyboard_report->mods |= oneshot_mods;
if (has_anykey()) {
clear_oneshot_mods();
if (oneshot_mods) {
#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
if (TIMER_DIFF_16(timer_read(), oneshot_time) >= ONESHOT_TIMEOUT) {
dprintf("Oneshot: timeout\n");
clear_oneshot_mods();
}
#endif
keyboard_report->mods |= oneshot_mods;
if (has_anykey()) {
clear_oneshot_mods();
}
}
#endif
host_keyboard_send(keyboard_report);
Expand Down Expand Up @@ -99,11 +111,20 @@ void clear_weak_mods(void) { weak_mods = 0; }

/* Oneshot modifier */
#ifndef NO_ACTION_ONESHOT
void set_oneshot_mods(uint8_t mods) { oneshot_mods = mods; }
void clear_oneshot_mods(void) { oneshot_mods = 0; }
void oneshot_toggle(void) { oneshot_enabled = !oneshot_enabled; }
void oneshot_enable(void) { oneshot_enabled = true; }
void oneshot_disable(void) { oneshot_enabled = false; }
void set_oneshot_mods(uint8_t mods)
{
oneshot_mods = mods;
#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
oneshot_time = timer_read();
#endif
}
void clear_oneshot_mods(void)
{
oneshot_mods = 0;
#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
oneshot_time = 0;
#endif
}
#endif


Expand Down
9 changes: 5 additions & 4 deletions doc/keymap.md
Original file line number Diff line number Diff line change
Expand Up @@ -516,13 +516,14 @@ This is a feature to assign both toggle layer and momentary switch layer action
ACTION_LAYER_TAP_TOGGLE(1)


### 4.3 One Shot Modifier
This adds oneshot feature to modifier key. 'One Shot Modifier' is one time modifier which has effect only on following just one key.
It works as normal modifier key when holding but oneshot modifier when tapping.
### 4.3 Oneshot Modifier
This runs onetime effect swhich modify only on just one following key. It works as normal modifier key when holding down while oneshot modifier when tapping.

ACTION_MODS_ONESHOT(MOD_LSFT)

Say you want to type 'The', you have to push and hold Shift before type 't' then release Shift before type 'h' and 'e' or you'll get 'THe'. With One Shot Modifier you can tap Shift then type 't', 'h' and 'e' normally, you don't need to holding Shift key properly here.
Say you want to type 'The', you have to push and hold Shift key before type 't' then release it before type 'h' and 'e', otherwise you'll get 'THe' or 'the' unintentionally. With Oneshot Modifier you can tap Shift then type 't', 'h' and 'e' normally, you don't need to holding Shift key properly here. This mean you can realease Shift before 't' is pressed down.

Oneshot effect is cancel unless following key is pressed down within `ONESHOT_TIMEOUT` of `config.h`. No timeout when it is `0` or not defined.



Expand Down
6 changes: 4 additions & 2 deletions keyboard/hhkb/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,8 @@ include $(TOP_DIR)/protocol/lufa.mk
include $(TOP_DIR)/common.mk
include $(TOP_DIR)/rules.mk

debug-on: EXTRAFLAGS += -DDEBUG
#debug-on: EXTRAFLAGS += -DDEBUG -DDEBUG_ACTION
debug-on: EXTRAFLAGS += -DDEBUG -DDEBUG_ACTION
debug-on: all

debug-off: EXTRAFLAGS += -DNO_DEBUG -DNO_PRINT
debug-off: all
3 changes: 2 additions & 1 deletion keyboard/hhkb/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define TAPPING_TERM 300
/* tap count needed for toggling a feature */
#define TAPPING_TOGGLE 5

/* Oneshot timeout(ms) */
#define ONESHOT_TIMEOUT 300

/* Boot Magic salt key: Space */
#define BOOTMAGIC_KEY_SALT KC_FN6
Expand Down

0 comments on commit 35f9f30

Please sign in to comment.