aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Humbert <jack.humb@gmail.com>2017-02-13 10:58:50 -0500
committerGitHub <noreply@github.com>2017-02-13 10:58:50 -0500
commitfd2925efbac0d7963f3d267dd5264f08a0a4e9dc (patch)
tree906568677ed027a807d5e9c0c1bc1c2ae001f0f6
parent21ad0c5bcdf38d3a9bc365ee23d721bfc8af9c56 (diff)
parent8c93c5d9ab8a0a69d84f707db71f417b66402693 (diff)
downloadqmk_firmware-fd2925efbac0d7963f3d267dd5264f08a0a4e9dc.tar.gz
qmk_firmware-fd2925efbac0d7963f3d267dd5264f08a0a4e9dc.zip
Merge pull request #1094 from priyadi/faux_clicky
Implement faux-clicky feature
-rw-r--r--build_keyboard.mk5
-rw-r--r--keyboards/planck/keymaps/priyadi/Makefile3
-rw-r--r--keyboards/planck/keymaps/priyadi/keymap.c4
-rw-r--r--quantum/fauxclicky.c68
-rw-r--r--quantum/fauxclicky.h99
-rw-r--r--quantum/quantum.c24
-rw-r--r--quantum/quantum_keycodes.h7
-rw-r--r--quantum/template/rules.mk1
-rw-r--r--tmk_core/common/action.c13
-rw-r--r--tmk_core/common/keyboard.c6
10 files changed, 227 insertions, 3 deletions
diff --git a/build_keyboard.mk b/build_keyboard.mk
index 2c64e93a2..c8e82cf0e 100644
--- a/build_keyboard.mk
+++ b/build_keyboard.mk
@@ -161,6 +161,11 @@ ifeq ($(strip $(AUDIO_ENABLE)), yes)
161 SRC += $(QUANTUM_DIR)/audio/luts.c 161 SRC += $(QUANTUM_DIR)/audio/luts.c
162endif 162endif
163 163
164ifeq ($(strip $(FAUXCLICKY_ENABLE)), yes)
165 OPT_DEFS += -DFAUXCLICKY_ENABLE
166 SRC += $(QUANTUM_DIR)/fauxclicky.c
167endif
168
164ifeq ($(strip $(UCIS_ENABLE)), yes) 169ifeq ($(strip $(UCIS_ENABLE)), yes)
165 OPT_DEFS += -DUCIS_ENABLE 170 OPT_DEFS += -DUCIS_ENABLE
166 UNICODE_ENABLE = yes 171 UNICODE_ENABLE = yes
diff --git a/keyboards/planck/keymaps/priyadi/Makefile b/keyboards/planck/keymaps/priyadi/Makefile
index 336608b8c..27c2638e2 100644
--- a/keyboards/planck/keymaps/priyadi/Makefile
+++ b/keyboards/planck/keymaps/priyadi/Makefile
@@ -10,12 +10,13 @@ COMMAND_ENABLE = no # Commands for debug and configuration
10NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work 10NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
11BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality 11BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
12MIDI_ENABLE = no # MIDI controls 12MIDI_ENABLE = no # MIDI controls
13AUDIO_ENABLE = yes # Audio output on port C6 13AUDIO_ENABLE = no # Audio output on port C6
14UNICODE_ENABLE = no # Unicode 14UNICODE_ENABLE = no # Unicode
15UNICODEMAP_ENABLE = yes # Unicode map 15UNICODEMAP_ENABLE = yes # Unicode map
16BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID 16BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
17RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. 17RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
18API_SYSEX_ENABLE = no 18API_SYSEX_ENABLE = no
19FAUXCLICKY_ENABLE = yes
19 20
20# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE 21# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
21SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend 22SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
diff --git a/keyboards/planck/keymaps/priyadi/keymap.c b/keyboards/planck/keymaps/priyadi/keymap.c
index 2e979221a..13668fd10 100644
--- a/keyboards/planck/keymaps/priyadi/keymap.c
+++ b/keyboards/planck/keymaps/priyadi/keymap.c
@@ -268,8 +268,8 @@ const uint32_t PROGMEM unicode_map[] = {
268 268
269 269
270// hybrid right-gui & scroll lock (mapped to Compose in OS) 270// hybrid right-gui & scroll lock (mapped to Compose in OS)
271#undef KC_RCTL 271#undef KC_RALT
272#define KC_RCTL MT(MOD_LCTL, KC_SLCK) 272#define KC_RALT MT(MOD_RALT, KC_SLCK)
273 273
274// keymaps 274// keymaps
275 275
diff --git a/quantum/fauxclicky.c b/quantum/fauxclicky.c
new file mode 100644
index 000000000..13273e705
--- /dev/null
+++ b/quantum/fauxclicky.c
@@ -0,0 +1,68 @@
1/*
2Copyright 2017 Priyadi Iman Nurcahyo
3
4This program is free software: you can redistribute it and/or modify
5it under the terms of the GNU General Public License as published by
6the Free Software Foundation, either version 2 of the License, or
7(at your option) any later version.
8This program is distributed in the hope that it will be useful,
9but WITHOUT ANY WARRANTY; without even the implied warranty of
10MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11GNU General Public License for more details.
12You should have received a copy of the GNU General Public License
13along with this program. If not, see <http://www.gnu.org/licenses/>.
14*/
15
16#include <avr/interrupt.h>
17#include <avr/io.h>
18#include <timer.h>
19#include <fauxclicky.h>
20#include <stdbool.h>
21#include <musical_notes.h>
22
23__attribute__ ((weak))
24float fauxclicky_pressed_note[2] = MUSICAL_NOTE(_F3, 2);
25__attribute__ ((weak))
26float fauxclicky_released_note[2] = MUSICAL_NOTE(_A3, 2);
27__attribute__ ((weak))
28float fauxclicky_beep_note[2] = MUSICAL_NOTE(_C3, 2);
29
30bool fauxclicky_enabled = true;
31uint16_t note_start = 0;
32bool note_playing = false;
33uint16_t note_period = 0;
34
35void fauxclicky_init()
36{
37 // Set port PC6 (OC3A and /OC4A) as output
38 DDRC |= _BV(PORTC6);
39
40 // TCCR3A / TCCR3B: Timer/Counter #3 Control Registers
41 TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
42 TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30);
43}
44
45void fauxclicky_stop()
46{
47 FAUXCLICKY_DISABLE_OUTPUT;
48 note_playing = false;
49}
50
51void fauxclicky_play(float note[2]) {
52 if (!fauxclicky_enabled) return;
53 if (note_playing) fauxclicky_stop();
54 FAUXCLICKY_TIMER_PERIOD = (uint16_t)(((float)F_CPU) / (note[0] * FAUXCLICKY_CPU_PRESCALER));
55 FAUXCLICKY_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (note[0] * FAUXCLICKY_CPU_PRESCALER)) / 2);
56 note_playing = true;
57 note_period = (note[1] / 16) * (60 / (float)FAUXCLICKY_TEMPO) * 100; // check this
58 note_start = timer_read();
59 FAUXCLICKY_ENABLE_OUTPUT;
60}
61
62void fauxclicky_check() {
63 if (!note_playing) return;
64
65 if (timer_elapsed(note_start) > note_period) {
66 fauxclicky_stop();
67 }
68}
diff --git a/quantum/fauxclicky.h b/quantum/fauxclicky.h
new file mode 100644
index 000000000..109bd0d83
--- /dev/null
+++ b/quantum/fauxclicky.h
@@ -0,0 +1,99 @@
1/*
2Copyright 2017 Priyadi Iman Nurcahyo
3
4This program is free software: you can redistribute it and/or modify
5it under the terms of the GNU General Public License as published by
6the Free Software Foundation, either version 2 of the License, or
7(at your option) any later version.
8This program is distributed in the hope that it will be useful,
9but WITHOUT ANY WARRANTY; without even the implied warranty of
10MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11GNU General Public License for more details.
12You should have received a copy of the GNU General Public License
13along with this program. If not, see <http://www.gnu.org/licenses/>.
14*/
15
16#ifdef AUDIO_ENABLE
17#error "AUDIO_ENABLE and FAUXCLICKY_ENABLE cannot be both enabled"
18#endif
19
20#include "musical_notes.h"
21#include "stdbool.h"
22
23__attribute__ ((weak))
24float fauxclicky_pressed_note[2];
25__attribute__ ((weak))
26float fauxclicky_released_note[2];
27__attribute__ ((weak))
28float fauxclicky_beep_note[2];
29
30bool fauxclicky_enabled;
31
32//
33// tempo in BPM
34//
35
36#ifndef FAUXCLICKY_TEMPO
37#define FAUXCLICKY_TEMPO TEMPO_DEFAULT
38#endif
39
40// beep on press
41#define FAUXCLICKY_ACTION_PRESS fauxclicky_play(fauxclicky_pressed_note)
42
43// beep on release
44#define FAUXCLICKY_ACTION_RELEASE fauxclicky_play(fauxclicky_released_note)
45
46// general purpose beep
47#define FAUXCLICKY_BEEP fauxclicky_play(fauxclicky_beep_note)
48
49// enable
50#define FAUXCLICKY_ON fauxclicky_enabled = true
51
52// disable
53#define FAUXCLICKY_OFF do { \
54 fauxclicky_enabled = false; \
55 fauxclicky_stop(); \
56} while (0)
57
58// toggle
59#define FAUXCLICKY_TOGGLE do { \
60 if (fauxclicky_enabled) { \
61 FAUXCLICKY_OFF; \
62 } else { \
63 FAUXCLICKY_ON; \
64 } \
65} while (0)
66
67//
68// pin configuration
69//
70
71#ifndef FAUXCLICKY_CPU_PRESCALER
72#define FAUXCLICKY_CPU_PRESCALER 8
73#endif
74
75#ifndef FAUXCLICKY_ENABLE_OUTPUT
76#define FAUXCLICKY_ENABLE_OUTPUT TCCR3A |= _BV(COM3A1);
77#endif
78
79#ifndef FAUXCLICKY_DISABLE_OUTPUT
80#define FAUXCLICKY_DISABLE_OUTPUT TCCR3A &= ~(_BV(COM3A1) | _BV(COM3A0));
81#endif
82
83#ifndef FAUXCLICKY_TIMER_PERIOD
84#define FAUXCLICKY_TIMER_PERIOD ICR3
85#endif
86
87#ifndef FAUXCLICKY_DUTY_CYCLE
88#define FAUXCLICKY_DUTY_CYCLE OCR3A
89#endif
90
91//
92// definitions
93//
94
95void fauxclicky_init(void);
96void fauxclicky_stop(void);
97void fauxclicky_play(float note[2]);
98void fauxclicky_check(void);
99
diff --git a/quantum/quantum.c b/quantum/quantum.c
index 45ea8cb73..2088c10c9 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -7,6 +7,10 @@
7#define TAPPING_TERM 200 7#define TAPPING_TERM 200
8#endif 8#endif
9 9
10#ifdef FAUXCLICKY_ENABLE
11#include "fauxclicky.h"
12#endif
13
10static void do_code16 (uint16_t code, void (*f) (uint8_t)) { 14static void do_code16 (uint16_t code, void (*f) (uint8_t)) {
11 switch (code) { 15 switch (code) {
12 case QK_MODS ... QK_MODS_MAX: 16 case QK_MODS ... QK_MODS_MAX:
@@ -196,6 +200,26 @@ bool process_record_quantum(keyrecord_t *record) {
196 } 200 }
197 return false; 201 return false;
198 break; 202 break;
203 #ifdef FAUXCLICKY_ENABLE
204 case FC_TOG:
205 if (record->event.pressed) {
206 FAUXCLICKY_TOGGLE;
207 }
208 return false;
209 break;
210 case FC_ON:
211 if (record->event.pressed) {
212 FAUXCLICKY_ON;
213 }
214 return false;
215 break;
216 case FC_OFF:
217 if (record->event.pressed) {
218 FAUXCLICKY_OFF;
219 }
220 return false;
221 break;
222 #endif
199 #ifdef RGBLIGHT_ENABLE 223 #ifdef RGBLIGHT_ENABLE
200 case RGB_TOG: 224 case RGB_TOG:
201 if (record->event.pressed) { 225 if (record->event.pressed) {
diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h
index ab2e79026..cc7a5013f 100644
--- a/quantum/quantum_keycodes.h
+++ b/quantum/quantum_keycodes.h
@@ -86,6 +86,13 @@ enum quantum_keycodes {
86 AU_OFF, 86 AU_OFF,
87 AU_TOG, 87 AU_TOG,
88 88
89#ifdef FAUXCLICKY_ENABLE
90 // Faux clicky
91 FC_ON,
92 FC_OFF,
93 FC_TOG,
94#endif
95
89 // Music mode on/off/toggle 96 // Music mode on/off/toggle
90 MU_ON, 97 MU_ON,
91 MU_OFF, 98 MU_OFF,
diff --git a/quantum/template/rules.mk b/quantum/template/rules.mk
index 55898147d..bad3387bf 100644
--- a/quantum/template/rules.mk
+++ b/quantum/template/rules.mk
@@ -65,3 +65,4 @@ MIDI_ENABLE ?= no # MIDI controls
65UNICODE_ENABLE ?= no # Unicode 65UNICODE_ENABLE ?= no # Unicode
66BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID 66BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID
67AUDIO_ENABLE ?= no # Audio output on port C6 67AUDIO_ENABLE ?= no # Audio output on port C6
68FAUXCLICKY_ENABLE ?= no # Use buzzer to emulate clicky switches
diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c
index f03670a7f..94de36918 100644
--- a/tmk_core/common/action.c
+++ b/tmk_core/common/action.c
@@ -33,6 +33,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
33#include "nodebug.h" 33#include "nodebug.h"
34#endif 34#endif
35 35
36#ifdef FAUXCLICKY_ENABLE
37#include <fauxclicky.h>
38#endif
36 39
37void action_exec(keyevent_t event) 40void action_exec(keyevent_t event)
38{ 41{
@@ -41,6 +44,16 @@ void action_exec(keyevent_t event)
41 dprint("EVENT: "); debug_event(event); dprintln(); 44 dprint("EVENT: "); debug_event(event); dprintln();
42 } 45 }
43 46
47#ifdef FAUXCLICKY_ENABLE
48 if (IS_PRESSED(event)) {
49 FAUXCLICKY_ACTION_PRESS;
50 }
51 if (IS_RELEASED(event)) {
52 FAUXCLICKY_ACTION_RELEASE;
53 }
54 fauxclicky_check();
55#endif
56
44#ifdef ONEHAND_ENABLE 57#ifdef ONEHAND_ENABLE
45 if (!IS_NOEVENT(event)) { 58 if (!IS_NOEVENT(event)) {
46 process_hand_swap(&event); 59 process_hand_swap(&event);
diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c
index 3aa82231b..eac1f1dd8 100644
--- a/tmk_core/common/keyboard.c
+++ b/tmk_core/common/keyboard.c
@@ -51,6 +51,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
51#ifdef RGBLIGHT_ENABLE 51#ifdef RGBLIGHT_ENABLE
52# include "rgblight.h" 52# include "rgblight.h"
53#endif 53#endif
54#ifdef FAUXCLICKY_ENABLE
55# include "fauxclicky.h"
56#endif
54#ifdef SERIAL_LINK_ENABLE 57#ifdef SERIAL_LINK_ENABLE
55# include "serial_link/system/serial_link.h" 58# include "serial_link/system/serial_link.h"
56#endif 59#endif
@@ -108,6 +111,9 @@ void keyboard_init(void) {
108#ifdef RGBLIGHT_ENABLE 111#ifdef RGBLIGHT_ENABLE
109 rgblight_init(); 112 rgblight_init();
110#endif 113#endif
114#ifdef FAUXCLICKY_ENABLE
115 fauxclicky_init();
116#endif
111#if defined(NKRO_ENABLE) && defined(FORCE_NKRO) 117#if defined(NKRO_ENABLE) && defined(FORCE_NKRO)
112 keymap_config.nkro = 1; 118 keymap_config.nkro = 1;
113#endif 119#endif