aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--keyboard/planck/keymaps/default/keymap.c77
-rw-r--r--keyboard/preonic/Makefile55
-rw-r--r--keyboard/preonic/keymaps/default/README.md35
-rw-r--r--keyboard/preonic/keymaps/default/keymap.c264
-rw-r--r--keyboard/preonic/keymaps/default/makefile.mk1
-rw-r--r--quantum/audio.c48
-rw-r--r--quantum/audio.h14
-rw-r--r--quantum/quantum.mk1
-rw-r--r--quantum/tools/README.md6
-rw-r--r--quantum/tools/eeprom_reset.hex9
-rw-r--r--tmk_core/common/avr/eeconfig.c8
-rw-r--r--tmk_core/common/eeconfig.h6
12 files changed, 405 insertions, 119 deletions
diff --git a/keyboard/planck/keymaps/default/keymap.c b/keyboard/planck/keymaps/default/keymap.c
index 56092d04f..ede08ad7f 100644
--- a/keyboard/planck/keymaps/default/keymap.c
+++ b/keyboard/planck/keymaps/default/keymap.c
@@ -19,12 +19,16 @@
19#define _AD 5 19#define _AD 5
20 20
21// Macro name shortcuts 21// Macro name shortcuts
22#define M_QW 0 22#define QWERTY M(_QW)
23#define M_CM 1 23#define COLEMAK M(_CM)
24#define M_DV 2 24#define DVORAK M(_DV)
25#define M_LW 3 25#define LOWER M(_LW)
26#define M_RS 4 26#define RAISE M(_RS)
27#define M_BL 5 27#define M_BL 5
28#ifdef AUDIO_ENABLE
29 #define AUD_OFF M(6)
30 #define AUD_ON M(7)
31#endif
28 32
29// Fillers to make layering more clear 33// Fillers to make layering more clear
30#define _______ KC_TRNS 34#define _______ KC_TRNS
@@ -47,7 +51,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
47 {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, 51 {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
48 {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, 52 {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
49 {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, 53 {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
50 {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, M(M_LW), KC_SPC, KC_SPC, M(M_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} 54 {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
51}, 55},
52 56
53/* Colemak 57/* Colemak
@@ -65,7 +69,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
65 {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, 69 {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
66 {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, 70 {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
67 {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, 71 {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
68 {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, M(M_LW), KC_SPC, KC_SPC, M(M_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} 72 {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
69}, 73},
70 74
71/* Dvorak 75/* Dvorak
@@ -83,7 +87,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
83 {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC}, 87 {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC},
84 {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH}, 88 {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
85 {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT }, 89 {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
86 {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, M(M_LW), KC_SPC, KC_SPC, M(M_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} 90 {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
87}, 91},
88 92
89/* Lower 93/* Lower
@@ -126,7 +130,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
126 * ,-----------------------------------------------------------------------------------. 130 * ,-----------------------------------------------------------------------------------.
127 * | | Reset| | | | | | | | | | Del | 131 * | | Reset| | | | | | | | | | Del |
128 * |------+------+------+------+------+-------------+------+------+------+------+------| 132 * |------+------+------+------+------+-------------+------+------+------+------+------|
129 * | | | | | | | |Qwerty|Colemk|Dvorak| | | 133 * | | | |Aud on|Audoff| | |Qwerty|Colemk|Dvorak| | |
130 * |------+------+------+------+------+------|------+------+------+------+------+------| 134 * |------+------+------+------+------+------|------+------+------+------+------+------|
131 * | | | | | | | | | | | | | 135 * | | | | | | | | | | | | |
132 * |------+------+------+------+------+------+------+------+------+------+------+------| 136 * |------+------+------+------+------+------+------+------+------+------+------+------|
@@ -135,7 +139,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
135 */ 139 */
136[_AD] = { 140[_AD] = {
137 {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, 141 {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL},
138 {_______, _______, _______, _______, _______, _______, _______, M(M_QW), M(M_CM), M(M_DV), _______, _______}, 142 {_______, _______, _______, AUD_ON, AUD_OFF, _______, _______, QWERTY, COLEMAK, DVORAK, _______, _______},
139 {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, 143 {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
140 {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} 144 {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
141} 145}
@@ -146,6 +150,14 @@ const uint16_t PROGMEM fn_actions[] = {
146}; 150};
147 151
148#ifdef AUDIO_ENABLE 152#ifdef AUDIO_ENABLE
153float start_up[][2] = {
154 {440.0*pow(2.0,(67)/12.0), 12},
155 {440.0*pow(2.0,(64)/12.0), 8},
156 {440.0*pow(2.0,(55)/12.0), 8},
157 {440.0*pow(2.0,(60)/12.0), 8},
158 {440.0*pow(2.0,(64)/12.0), 20}
159};
160
149float tone_qw[][2] = { 161float tone_qw[][2] = {
150 {440.0*pow(2.0,(59)/12.0), 8}, 162 {440.0*pow(2.0,(59)/12.0), 8},
151 {440.0*pow(2.0,(60)/12.0), 8}, 163 {440.0*pow(2.0,(60)/12.0), 8},
@@ -157,20 +169,20 @@ float tone_cm[][2] = {
157 {440.0*pow(2.0,(59)/12.0), 8}, 169 {440.0*pow(2.0,(59)/12.0), 8},
158 {440.0*pow(2.0,(60)/12.0), 8}, 170 {440.0*pow(2.0,(60)/12.0), 8},
159 {0, 4}, 171 {0, 4},
160 {440.0*pow(2.0,(67)/12.0), 16}, 172 {440.0*pow(2.0,(67)/12.0), 12},
161 {0, 4}, 173 {0, 4},
162 {440.0*pow(2.0,(71)/12.0), 16} 174 {440.0*pow(2.0,(71)/12.0), 12}
163}; 175};
164 176
165float tone_dv[][2] = { 177float tone_dv[][2] = {
166 {440.0*pow(2.0,(59)/12.0), 8}, 178 {440.0*pow(2.0,(59)/12.0), 8},
167 {440.0*pow(2.0,(60)/12.0), 8}, 179 {440.0*pow(2.0,(60)/12.0), 8},
168 {0, 4}, 180 {0, 4},
169 {440.0*pow(2.0,(67)/12.0), 16}, 181 {440.0*pow(2.0,(67)/12.0), 8},
170 {0, 4}, 182 {0, 4},
171 {440.0*pow(2.0,(69)/12.0), 16}, 183 {440.0*pow(2.0,(69)/12.0), 8},
172 {0, 4}, 184 {0, 4},
173 {440.0*pow(2.0,(67)/12.0), 16} 185 {440.0*pow(2.0,(67)/12.0), 8}
174}; 186};
175#endif 187#endif
176 188
@@ -179,7 +191,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
179{ 191{
180 // MACRODOWN only works in this function 192 // MACRODOWN only works in this function
181 switch(id) { 193 switch(id) {
182 case M_QW: 194 case _QW:
183 if (record->event.pressed) { 195 if (record->event.pressed) {
184 #ifdef AUDIO_ENABLE 196 #ifdef AUDIO_ENABLE
185 play_notes(&tone_qw, 4, false); 197 play_notes(&tone_qw, 4, false);
@@ -187,7 +199,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
187 default_layer_set(1UL<<_QW); 199 default_layer_set(1UL<<_QW);
188 } 200 }
189 break; 201 break;
190 case M_CM: 202 case _CM:
191 if (record->event.pressed) { 203 if (record->event.pressed) {
192 #ifdef AUDIO_ENABLE 204 #ifdef AUDIO_ENABLE
193 play_notes(&tone_cm, 6, false); 205 play_notes(&tone_cm, 6, false);
@@ -195,7 +207,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
195 default_layer_set(1UL<<_CM); 207 default_layer_set(1UL<<_CM);
196 } 208 }
197 break; 209 break;
198 case M_DV: 210 case _DV:
199 if (record->event.pressed) { 211 if (record->event.pressed) {
200 #ifdef AUDIO_ENABLE 212 #ifdef AUDIO_ENABLE
201 play_notes(&tone_dv, 8, false); 213 play_notes(&tone_dv, 8, false);
@@ -203,7 +215,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
203 default_layer_set(1UL<<_DV); 215 default_layer_set(1UL<<_DV);
204 } 216 }
205 break; 217 break;
206 case M_LW: 218 case _LW:
207 if (record->event.pressed) { 219 if (record->event.pressed) {
208 layer_on(_LW); 220 layer_on(_LW);
209 update_tri_layer(_LW, _RS, _AD); 221 update_tri_layer(_LW, _RS, _AD);
@@ -212,7 +224,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
212 update_tri_layer(_LW, _RS, _AD); 224 update_tri_layer(_LW, _RS, _AD);
213 } 225 }
214 break; 226 break;
215 case M_RS: 227 case _RS:
216 if (record->event.pressed) { 228 if (record->event.pressed) {
217 layer_on(_RS); 229 layer_on(_RS);
218 update_tri_layer(_LW, _RS, _AD); 230 update_tri_layer(_LW, _RS, _AD);
@@ -231,20 +243,25 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
231 unregister_code(KC_RSFT); 243 unregister_code(KC_RSFT);
232 } 244 }
233 break; 245 break;
246 case 6:
247 if (record->event.pressed) {
248 #ifdef AUDIO_ENABLE
249 audio_off();
250 #endif
251 }
252 break;
253 case 7:
254 if (record->event.pressed) {
255 #ifdef AUDIO_ENABLE
256 audio_on();
257 play_notes(&start_up, 5, false);
258 #endif
259 }
260 break;
234 } 261 }
235 return MACRO_NONE; 262 return MACRO_NONE;
236}; 263};
237 264
238#ifdef AUDIO_ENABLE
239float start_up[][2] = {
240 {440.0*pow(2.0,(67)/12.0), 12},
241 {440.0*pow(2.0,(64)/12.0), 8},
242 {440.0*pow(2.0,(55)/12.0), 8},
243 {440.0*pow(2.0,(60)/12.0), 8},
244 {440.0*pow(2.0,(64)/12.0), 20}
245};
246#endif
247
248void matrix_init_user(void) { 265void matrix_init_user(void) {
249 #ifdef AUDIO_ENABLE 266 #ifdef AUDIO_ENABLE
250 init_notes(); 267 init_notes();
diff --git a/keyboard/preonic/Makefile b/keyboard/preonic/Makefile
index 664aff732..eaf9ef927 100644
--- a/keyboard/preonic/Makefile
+++ b/keyboard/preonic/Makefile
@@ -126,27 +126,44 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
126# USBaspLoader 2048 126# USBaspLoader 2048
127OPT_DEFS += -DBOOTLOADER_SIZE=4096 127OPT_DEFS += -DBOOTLOADER_SIZE=4096
128 128
129
130# Build Options 129# Build Options
131# comment out to disable the options. 130# change to "no" to disable the options, or define them in the makefile.mk in
132# 131# the appropriate keymap folder that will get included automatically
133BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) 132#
134MOUSEKEY_ENABLE = yes # Mouse keys(+4700) 133BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
135EXTRAKEY_ENABLE = yes # Audio control and System control(+450) 134MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
136CONSOLE_ENABLE = yes # Console for debug(+400) 135EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
137COMMAND_ENABLE = yes # Commands for debug and configuration 136CONSOLE_ENABLE = yes # Console for debug(+400)
137COMMAND_ENABLE = yes # Commands for debug and configuration
138NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
139BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
140MIDI_ENABLE = no # MIDI controls
141AUDIO_ENABLE = no # Audio output on port C6
142UNICODE_ENABLE = no # Unicode
143BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
144RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
145
138# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE 146# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
139# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend 147SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
140# NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work 148
141BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality 149ifdef KEYMAP
142MIDI_ENABLE = YES # MIDI controls 150
143AUDIO_ENABLE = YES # Audio output on port C6 151ifeq ("$(wildcard keymaps/$(KEYMAP).c)","")
144# UNICODE_ENABLE = YES # Unicode 152ifneq ("$(wildcard keymaps/$(KEYMAP)/makefile.mk)","")
145# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID 153 include keymaps/$(KEYMAP)/makefile.mk
146# RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with MIDI at the same time. 154endif
147 155endif
148ifdef BACKLIGHT_ENABLE 156
149 SRC += backlight.c 157else
158
159ifneq ("$(wildcard keymaps/default/makefile.mk)","")
160 include keymaps/default/makefile.mk
161endif
162
163endif
164
165ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
166 SRC := backlight.c $(SRC)
150endif 167endif
151 168
152 169
diff --git a/keyboard/preonic/keymaps/default/README.md b/keyboard/preonic/keymaps/default/README.md
index d2f43bbdb..e911968dd 100644
--- a/keyboard/preonic/keymaps/default/README.md
+++ b/keyboard/preonic/keymaps/default/README.md
@@ -1,34 +1 @@
1# The Default Planck Layout # The default Preonic layout - largely based on the Planck's \ No newline at end of file
2
3 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
4 [_QW] = { /* Qwerty */
5 {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
6 {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
7 {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
8 {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
9 },
10 [_CM] = { /* Colemak */
11 {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
12 {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
13 {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
14 {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
15 },
16 [_DV] = { /* Dvorak */
17 {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC},
18 {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
19 {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
20 {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
21 },
22 [_RS] = { /* RAISE */
23 {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
24 {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
25 {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
26 {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
27 },
28 [_LW] = { /* LOWER */
29 {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
30 {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
31 {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
32 {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
33 }
34 }; \ No newline at end of file
diff --git a/keyboard/preonic/keymaps/default/keymap.c b/keyboard/preonic/keymaps/default/keymap.c
index 784670784..c52d8472f 100644
--- a/keyboard/preonic/keymaps/default/keymap.c
+++ b/keyboard/preonic/keymaps/default/keymap.c
@@ -1,9 +1,7 @@
1// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
2// this is the style you want to emulate.
3
4#include "preonic.h" 1#include "preonic.h"
5#ifdef BACKLIGHT_ENABLE 2#include "action_layer.h"
6 #include "backlight.h" 3#ifdef AUDIO_ENABLE
4 #include "audio.h"
7#endif 5#endif
8 6
9// Each layer gets a name for readability, which is then used in the keymap matrix below. 7// Each layer gets a name for readability, which is then used in the keymap matrix below.
@@ -15,42 +13,150 @@
15#define _DV 2 13#define _DV 2
16#define _LW 3 14#define _LW 3
17#define _RS 4 15#define _RS 4
16#define _AD 5
17
18// Macro name shortcuts
19#define QWERTY M(_QW)
20#define COLEMAK M(_CM)
21#define DVORAK M(_DV)
22#define LOWER M(_LW)
23#define RAISE M(_RS)
24#define M_BL 5
25#ifdef AUDIO_ENABLE
26 #define AUD_OFF M(6)
27 #define AUD_ON M(7)
28#endif
29
30// Fillers to make layering more clear
31#define _______ KC_TRNS
32#define XXXXXXX KC_NO
18 33
19const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 34const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
20[_QW] = { /* Qwerty */ 35
36/* Qwerty
37 * ,-----------------------------------------------------------------------------------.
38 * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
39 * |------+------+------+------+------+------+------+------+------+------+------+------|
40 * | Tab | Q | W | E | R | T | Y | U | I | O | P | Del |
41 * |------+------+------+------+------+-------------+------+------+------+------+------|
42 * | Esc | A | S | D | F | G | H | J | K | L | ; | " |
43 * |------+------+------+------+------+------|------+------+------+------+------+------|
44 * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
45 * |------+------+------+------+------+------+------+------+------+------+------+------|
46 * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
47 * `-----------------------------------------------------------------------------------'
48 */
49[_QW] = {
21 {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, 50 {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
22 {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, 51 {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL},
23 {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, 52 {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
24 {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, 53 {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
25 {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} 54 {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
26}, 55},
27[_CM] = { /* Colemak */ 56
57/* Colemak
58 * ,-----------------------------------------------------------------------------------.
59 * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
60 * |------+------+------+------+------+------+------+------+------+------+------+------|
61 * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Del |
62 * |------+------+------+------+------+-------------+------+------+------+------+------|
63 * | Esc | A | R | S | T | D | H | N | E | I | O | " |
64 * |------+------+------+------+------+------|------+------+------+------+------+------|
65 * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter |
66 * |------+------+------+------+------+------+------+------+------+------+------+------|
67 * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
68 * `-----------------------------------------------------------------------------------'
69 */
70[_CM] = {
28 {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, 71 {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
29 {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, 72 {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL},
30 {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, 73 {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
31 {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, 74 {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
32 {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} 75 {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
33}, 76},
34[_DV] = { /* Dvorak */ 77
78/* Dvorak
79 * ,-----------------------------------------------------------------------------------.
80 * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
81 * |------+------+------+------+------+------+------+------+------+------+------+------|
82 * | Tab | " | , | . | P | Y | F | G | C | R | L | Del |
83 * |------+------+------+------+------+-------------+------+------+------+------+------|
84 * | Esc | A | O | E | U | I | D | H | T | N | S | / |
85 * |------+------+------+------+------+------|------+------+------+------+------+------|
86 * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter |
87 * |------+------+------+------+------+------+------+------+------+------+------+------|
88 * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
89 * `-----------------------------------------------------------------------------------'
90 */
91[_DV] = {
35 {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, 92 {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
36 {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC}, 93 {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL},
37 {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH}, 94 {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
38 {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT }, 95 {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
39 {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} 96 {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
40}, 97},
41[_RS] = { /* RAISE */ 98
42 {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, 99/* Lower
43 {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, 100 * ,-----------------------------------------------------------------------------------.
44 {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, 101 * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
45 {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS}, 102 * |------+------+------+------+------+-------------+------+------+------+------+------|
46 {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} 103 * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del |
104 * |------+------+------+------+------+-------------+------+------+------+------+------|
105 * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
106 * |------+------+------+------+------+------|------+------+------+------+------+------|
107 * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | |Enter |
108 * |------+------+------+------+------+------+------+------+------+------+------+------|
109 * | | | | | | | | Next | Vol- | Vol+ | Play |
110 * `-----------------------------------------------------------------------------------'
111 */
112[_LW] = {
113 {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
114 {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL},
115 {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
116 {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______},
117 {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
47}, 118},
48[_LW] = { /* LOWER */ 119
120/* Raise
121 * ,-----------------------------------------------------------------------------------.
122 * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
123 * |------+------+------+------+------+------+------+------+------+------+------+------|
124 * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del |
125 * |------+------+------+------+------+-------------+------+------+------+------+------|
126 * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
127 * |------+------+------+------+------+------|------+------+------+------+------+------|
128 * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | |Enter |
129 * |------+------+------+------+------+------+------+------+------+------+------+------|
130 * | | | | | | | | Next | Vol- | Vol+ | Play |
131 * `-----------------------------------------------------------------------------------'
132 */
133[_RS] = {
49 {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, 134 {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
50 {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, 135 {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL},
51 {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, 136 {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
52 {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS}, 137 {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______},
53 {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} 138 {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
139},
140
141/* Adjust (Lower + Raise)
142 * ,-----------------------------------------------------------------------------------.
143 * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |
144 * |------+------+------+------+------+------+------+------+------+------+------+------|
145 * | | Reset| | | | | | | | | | Del |
146 * |------+------+------+------+------+-------------+------+------+------+------+------|
147 * | | | |Audoff|Aud on| | |Qwerty|Colemk|Dvorak| | |
148 * |------+------+------+------+------+------|------+------+------+------+------+------|
149 * | | | | | | | | | | | | |
150 * |------+------+------+------+------+------+------+------+------+------+------+------|
151 * | | | | | | | | | | | |
152 * `-----------------------------------------------------------------------------------'
153 */
154[_AD] = {
155 {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12},
156 {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL},
157 {_______, _______, _______, AUD_ON, AUD_OFF, _______, _______, QWERTY, COLEMAK, DVORAK, _______, _______},
158 {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
159 {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
54} 160}
55}; 161};
56 162
@@ -58,19 +164,94 @@ const uint16_t PROGMEM fn_actions[] = {
58 164
59}; 165};
60 166
167#ifdef AUDIO_ENABLE
61float start_up[][2] = { 168float start_up[][2] = {
62 {440.0*pow(2.0,(67)/12.0), 600}, 169 {440.0*pow(2.0,(55)/12.0), 12},
63 {440.0*pow(2.0,(64)/12.0), 400}, 170 {0, 2},
64 {440.0*pow(2.0,(55)/12.0), 400}, 171 {440.0*pow(2.0,(67)/12.0), 8},
65 {440.0*pow(2.0,(60)/12.0), 400}, 172 {440.0*pow(2.0,(64)/12.0), 8},
66 {440.0*pow(2.0,(64)/12.0), 1000}, 173 {440.0*pow(2.0,(55)/12.0), 8},
174 {440.0*pow(2.0,(67)/12.0), 12},
175 {0, 2},
176 {440.0*pow(2.0,(67)/12.0), 12}
177};
178
179float tone_qw[][2] = {
180 {440.0*pow(2.0,(59)/12.0), 8},
181 {440.0*pow(2.0,(60)/12.0), 8},
182 {0, 4},
183 {440.0*pow(2.0,(67)/12.0), 16}
67}; 184};
68 185
186float tone_cm[][2] = {
187 {440.0*pow(2.0,(59)/12.0), 8},
188 {440.0*pow(2.0,(60)/12.0), 8},
189 {0, 4},
190 {440.0*pow(2.0,(67)/12.0), 12},
191 {0, 4},
192 {440.0*pow(2.0,(71)/12.0), 12}
193};
194
195float tone_dv[][2] = {
196 {440.0*pow(2.0,(59)/12.0), 8},
197 {440.0*pow(2.0,(60)/12.0), 8},
198 {0, 4},
199 {440.0*pow(2.0,(67)/12.0), 8},
200 {0, 4},
201 {440.0*pow(2.0,(69)/12.0), 8},
202 {0, 4},
203 {440.0*pow(2.0,(67)/12.0), 8}
204};
205#endif
206
207
69const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) 208const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
70{ 209{
71 // MACRODOWN only works in this function 210 // MACRODOWN only works in this function
72 switch(id) { 211 switch(id) {
73 case 0: 212 case _QW:
213 if (record->event.pressed) {
214 #ifdef AUDIO_ENABLE
215 play_notes(&tone_qw, 4, false);
216 #endif
217 default_layer_set(1UL<<_QW);
218 }
219 break;
220 case _CM:
221 if (record->event.pressed) {
222 #ifdef AUDIO_ENABLE
223 play_notes(&tone_cm, 6, false);
224 #endif
225 default_layer_set(1UL<<_CM);
226 }
227 break;
228 case _DV:
229 if (record->event.pressed) {
230 #ifdef AUDIO_ENABLE
231 play_notes(&tone_dv, 8, false);
232 #endif
233 default_layer_set(1UL<<_DV);
234 }
235 break;
236 case _LW:
237 if (record->event.pressed) {
238 layer_on(_LW);
239 update_tri_layer(_LW, _RS, _AD);
240 } else {
241 layer_off(_LW);
242 update_tri_layer(_LW, _RS, _AD);
243 }
244 break;
245 case _RS:
246 if (record->event.pressed) {
247 layer_on(_RS);
248 update_tri_layer(_LW, _RS, _AD);
249 } else {
250 layer_off(_RS);
251 update_tri_layer(_LW, _RS, _AD);
252 }
253 break;
254 case M_BL:
74 if (record->event.pressed) { 255 if (record->event.pressed) {
75 register_code(KC_RSFT); 256 register_code(KC_RSFT);
76 #ifdef BACKLIGHT_ENABLE 257 #ifdef BACKLIGHT_ENABLE
@@ -80,13 +261,28 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
80 unregister_code(KC_RSFT); 261 unregister_code(KC_RSFT);
81 } 262 }
82 break; 263 break;
264 case 6:
265 if (record->event.pressed) {
266 #ifdef AUDIO_ENABLE
267 audio_off();
268 #endif
269 }
270 break;
271 case 7:
272 if (record->event.pressed) {
273 #ifdef AUDIO_ENABLE
274 audio_on();
275 play_notes(&start_up, 7, false);
276 #endif
277 }
278 break;
83 } 279 }
84 return MACRO_NONE; 280 return MACRO_NONE;
85}; 281};
86 282
87void matrix_init_user(void) { 283void matrix_init_user(void) {
88#ifdef AUDIO_ENABLE 284 #ifdef AUDIO_ENABLE
89 init_notes(); 285 init_notes();
90 play_notes(&start_up, 5, false); 286 play_notes(&start_up, 7, false);
91#endif 287 #endif
92} 288}
diff --git a/keyboard/preonic/keymaps/default/makefile.mk b/keyboard/preonic/keymaps/default/makefile.mk
new file mode 100644
index 000000000..628167ff6
--- /dev/null
+++ b/keyboard/preonic/keymaps/default/makefile.mk
@@ -0,0 +1 @@
AUDIO_ENABLE = yes \ No newline at end of file
diff --git a/quantum/audio.c b/quantum/audio.c
index 50e5505fe..73985479c 100644
--- a/quantum/audio.c
+++ b/quantum/audio.c
@@ -8,6 +8,8 @@
8#include "audio.h" 8#include "audio.h"
9#include "keymap_common.h" 9#include "keymap_common.h"
10 10
11#include "eeconfig.h"
12
11#define PI 3.14159265 13#define PI 3.14159265
12 14
13// #define PWM_AUDIO 15// #define PWM_AUDIO
@@ -57,6 +59,25 @@ uint8_t notes_length;
57bool notes_repeat; 59bool notes_repeat;
58uint8_t current_note = 0; 60uint8_t current_note = 0;
59 61
62audio_config_t audio_config;
63
64
65void audio_toggle(void) {
66 audio_config.enable ^= 1;
67 eeconfig_write_audio(audio_config.raw);
68}
69
70void audio_on(void) {
71 audio_config.enable = 1;
72 eeconfig_write_audio(audio_config.raw);
73}
74
75void audio_off(void) {
76 audio_config.enable = 0;
77 eeconfig_write_audio(audio_config.raw);
78}
79
80
60void stop_all_notes() { 81void stop_all_notes() {
61 voices = 0; 82 voices = 0;
62 #ifdef PWM_AUDIO 83 #ifdef PWM_AUDIO
@@ -129,6 +150,12 @@ void stop_note(double freq) {
129 150
130void init_notes() { 151void init_notes() {
131 152
153 /* check signature */
154 if (!eeconfig_is_enabled()) {
155 eeconfig_init();
156 }
157 audio_config.raw = eeconfig_read_audio();
158
132 #ifdef PWM_AUDIO 159 #ifdef PWM_AUDIO
133 PLLFRQ = _BV(PDIV2); 160 PLLFRQ = _BV(PDIV2);
134 PLLCSR = _BV(PLLE); 161 PLLCSR = _BV(PLLE);
@@ -160,7 +187,6 @@ void init_notes() {
160 187
161 188
162ISR(TIMER3_COMPA_vect) { 189ISR(TIMER3_COMPA_vect) {
163
164 if (note) { 190 if (note) {
165 #ifdef PWM_AUDIO 191 #ifdef PWM_AUDIO
166 if (voices == 1) { 192 if (voices == 1) {
@@ -288,9 +314,16 @@ ISR(TIMER3_COMPA_vect) {
288 314
289 } 315 }
290 316
317 if (!audio_config.enable) {
318 notes = false;
319 note = false;
320 }
291} 321}
292 322
293void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat) { 323void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat) {
324
325if (audio_config.enable) {
326
294 if (note) 327 if (note)
295 stop_all_notes(); 328 stop_all_notes();
296 notes = true; 329 notes = true;
@@ -319,7 +352,12 @@ void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat) {
319 #endif 352 #endif
320} 353}
321 354
355}
356
322void play_sample(uint8_t * s, uint16_t l, bool r) { 357void play_sample(uint8_t * s, uint16_t l, bool r) {
358
359if (audio_config.enable) {
360
323 stop_all_notes(); 361 stop_all_notes();
324 place_int = 0; 362 place_int = 0;
325 sample = s; 363 sample = s;
@@ -330,9 +368,15 @@ void play_sample(uint8_t * s, uint16_t l, bool r) {
330 TIMSK3 |= _BV(OCIE3A); 368 TIMSK3 |= _BV(OCIE3A);
331 #else 369 #else
332 #endif 370 #endif
371
372}
373
333} 374}
334 375
335void play_note(double freq, int vol) { 376void play_note(double freq, int vol) {
377
378if (audio_config.enable) {
379
336 if (notes) 380 if (notes)
337 stop_all_notes(); 381 stop_all_notes();
338 note = true; 382 note = true;
@@ -367,4 +411,6 @@ void play_note(double freq, int vol) {
367 TCCR3A |= _BV(COM3A1); 411 TCCR3A |= _BV(COM3A1);
368 #endif 412 #endif
369 413
414}
415
370} \ No newline at end of file 416} \ No newline at end of file
diff --git a/quantum/audio.h b/quantum/audio.h
index 99203cea7..58270015d 100644
--- a/quantum/audio.h
+++ b/quantum/audio.h
@@ -3,9 +3,21 @@
3#include <avr/io.h> 3#include <avr/io.h>
4#include <util/delay.h> 4#include <util/delay.h>
5 5
6typedef union {
7 uint8_t raw;
8 struct {
9 bool enable :1;
10 uint8_t level :7;
11 };
12} audio_config_t;
13
14void audio_toggle(void);
15void audio_on(void);
16void audio_off(void);
17
6void play_sample(uint8_t * s, uint16_t l, bool r); 18void play_sample(uint8_t * s, uint16_t l, bool r);
7void play_note(double freq, int vol); 19void play_note(double freq, int vol);
8void stop_note(double freq); 20void stop_note(double freq);
9void stop_all_notes(); 21void stop_all_notes();
10void init_notes(); 22void init_notes();
11void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat); \ No newline at end of file 23void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat);
diff --git a/quantum/quantum.mk b/quantum/quantum.mk
index 17bb50171..1fe7390eb 100644
--- a/quantum/quantum.mk
+++ b/quantum/quantum.mk
@@ -46,6 +46,7 @@ endif
46 46
47# Search Path 47# Search Path
48VPATH += $(TOP_DIR)/$(QUANTUM_DIR) 48VPATH += $(TOP_DIR)/$(QUANTUM_DIR)
49VPATH += $(TOP_DIR)/$(QUANTUM_DIR)/keymap_extras
49 50
50include $(TMK_DIR)/protocol/lufa.mk 51include $(TMK_DIR)/protocol/lufa.mk
51 52
diff --git a/quantum/tools/README.md b/quantum/tools/README.md
new file mode 100644
index 000000000..070214423
--- /dev/null
+++ b/quantum/tools/README.md
@@ -0,0 +1,6 @@
1`eeprom_reset.hex` is to reset the eeprom on the Atmega32u4, like this:
2
3 dfu-programmer atmega32u4 erase
4 dfu-programmer atmega32u4 flash --eeprom eeprom-reset.bin
5
6 You'll need to reflash afterwards, because DFU requires the flash to be erased before messing with the eeprom. \ No newline at end of file
diff --git a/quantum/tools/eeprom_reset.hex b/quantum/tools/eeprom_reset.hex
new file mode 100644
index 000000000..a8a75389f
--- /dev/null
+++ b/quantum/tools/eeprom_reset.hex
@@ -0,0 +1,9 @@
1:10000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
2:10001000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0
3:10002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
4:10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
5:10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
6:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
7:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
8:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
9:00000001FF
diff --git a/tmk_core/common/avr/eeconfig.c b/tmk_core/common/avr/eeconfig.c
index 5bd47dc6a..25bb9e849 100644
--- a/tmk_core/common/avr/eeconfig.c
+++ b/tmk_core/common/avr/eeconfig.c
@@ -13,6 +13,9 @@ void eeconfig_init(void)
13#ifdef BACKLIGHT_ENABLE 13#ifdef BACKLIGHT_ENABLE
14 eeprom_write_byte(EECONFIG_BACKLIGHT, 0); 14 eeprom_write_byte(EECONFIG_BACKLIGHT, 0);
15#endif 15#endif
16#ifdef AUDIO_ENABLE
17 eeprom_write_byte(EECONFIG_AUDIO, 0xFF); // On by default
18#endif
16} 19}
17 20
18void eeconfig_enable(void) 21void eeconfig_enable(void)
@@ -43,3 +46,8 @@ void eeconfig_write_keymap(uint8_t val) { eeprom_write_byte(EECONFIG_KEYMAP, val
43uint8_t eeconfig_read_backlight(void) { return eeprom_read_byte(EECONFIG_BACKLIGHT); } 46uint8_t eeconfig_read_backlight(void) { return eeprom_read_byte(EECONFIG_BACKLIGHT); }
44void eeconfig_write_backlight(uint8_t val) { eeprom_write_byte(EECONFIG_BACKLIGHT, val); } 47void eeconfig_write_backlight(uint8_t val) { eeprom_write_byte(EECONFIG_BACKLIGHT, val); }
45#endif 48#endif
49
50#ifdef AUDIO_ENABLE
51uint8_t eeconfig_read_audio(void) { return eeprom_read_byte(EECONFIG_AUDIO); }
52void eeconfig_write_audio(uint8_t val) { eeprom_write_byte(EECONFIG_AUDIO, val); }
53#endif \ No newline at end of file
diff --git a/tmk_core/common/eeconfig.h b/tmk_core/common/eeconfig.h
index 3cd1a174f..ddefca134 100644
--- a/tmk_core/common/eeconfig.h
+++ b/tmk_core/common/eeconfig.h
@@ -31,6 +31,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
31#define EECONFIG_KEYMAP (uint8_t *)4 31#define EECONFIG_KEYMAP (uint8_t *)4
32#define EECONFIG_MOUSEKEY_ACCEL (uint8_t *)5 32#define EECONFIG_MOUSEKEY_ACCEL (uint8_t *)5
33#define EECONFIG_BACKLIGHT (uint8_t *)6 33#define EECONFIG_BACKLIGHT (uint8_t *)6
34#define EECONFIG_AUDIO (uint8_t *)7
34 35
35 36
36/* debug bit */ 37/* debug bit */
@@ -72,4 +73,9 @@ uint8_t eeconfig_read_backlight(void);
72void eeconfig_write_backlight(uint8_t val); 73void eeconfig_write_backlight(uint8_t val);
73#endif 74#endif
74 75
76#ifdef AUDIO_ENABLE
77uint8_t eeconfig_read_audio(void);
78void eeconfig_write_audio(uint8_t val);
79#endif
80
75#endif 81#endif