mirror of
https://github.com/qmk/qmk_firmware.git
synced 2024-12-12 12:51:18 +00:00
Merge remote-tracking branch 'origin/develop' into xap
This commit is contained in:
commit
900abbf874
@ -17,6 +17,8 @@
|
|||||||
"APA102_DI_PIN": {"info_key": "apa102.data_pin"},
|
"APA102_DI_PIN": {"info_key": "apa102.data_pin"},
|
||||||
|
|
||||||
// Audio
|
// Audio
|
||||||
|
"AUDIO_DEFAULT_ON": {"info_key": "audio.default.on", "value_type": "bool"},
|
||||||
|
"AUDIO_DEFAULT_CLICKY_ON": {"info_key": "audio.default.clicky", "value_type": "bool"},
|
||||||
"AUDIO_VOICES": {"info_key": "audio.voices", "value_type": "bool"},
|
"AUDIO_VOICES": {"info_key": "audio.voices", "value_type": "bool"},
|
||||||
"SENDSTRING_BELL": {"info_key": "audio.macro_beep", "value_type": "bool"},
|
"SENDSTRING_BELL": {"info_key": "audio.macro_beep", "value_type": "bool"},
|
||||||
|
|
||||||
|
@ -123,6 +123,14 @@
|
|||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
|
"default": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"on": {"type": "boolean"},
|
||||||
|
"clicky": {"type": "boolean"}
|
||||||
|
}
|
||||||
|
},
|
||||||
"macro_beep": {"type": "boolean"},
|
"macro_beep": {"type": "boolean"},
|
||||||
"pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
|
"pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
|
||||||
"voices": {"type": "boolean"}
|
"voices": {"type": "boolean"}
|
||||||
|
@ -173,7 +173,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||||||
|
|
||||||
switch (keycode) {
|
switch (keycode) {
|
||||||
case TD(CT_CLN): // list all tap dance keycodes with tap-hold configurations
|
case TD(CT_CLN): // list all tap dance keycodes with tap-hold configurations
|
||||||
action = &tap_dance_actions[TD_INDEX(keycode)];
|
action = &tap_dance_actions[QK_TAP_DANCE_GET_INDEX(keycode)];
|
||||||
if (!record->event.pressed && action->state.count && !action->state.finished) {
|
if (!record->event.pressed && action->state.count && !action->state.finished) {
|
||||||
tap_dance_tap_hold_t *tap_hold = (tap_dance_tap_hold_t *)action->user_data;
|
tap_dance_tap_hold_t *tap_hold = (tap_dance_tap_hold_t *)action->user_data;
|
||||||
tap_code16(tap_hold->tap);
|
tap_code16(tap_hold->tap);
|
||||||
|
@ -111,6 +111,13 @@ Configures the [APA102](apa102_driver.md) driver.
|
|||||||
Configures the [Audio](feature_audio.md) feature.
|
Configures the [Audio](feature_audio.md) feature.
|
||||||
|
|
||||||
* `audio`
|
* `audio`
|
||||||
|
* `default`
|
||||||
|
* `on`
|
||||||
|
* The default audio enabled state.
|
||||||
|
* Default: `true`
|
||||||
|
* `clicky`
|
||||||
|
* The default audio clicky enabled state.
|
||||||
|
* Default: `true`
|
||||||
* `macro_beep`
|
* `macro_beep`
|
||||||
* Play a short beep for `\a` (ASCII `BEL`) characters in Send String macros.
|
* Play a short beep for `\a` (ASCII `BEL`) characters in Send String macros.
|
||||||
* Default: `false`
|
* Default: `false`
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
#include "audio.h"
|
#include "audio.h"
|
||||||
#include "eeconfig.h"
|
#include "eeconfig.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
|
#include "debug.h"
|
||||||
#include "wait.h"
|
#include "wait.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
@ -62,6 +63,13 @@
|
|||||||
* the internal state of the audio system does its calculations with the later - ms
|
* the internal state of the audio system does its calculations with the later - ms
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef AUDIO_DEFAULT_ON
|
||||||
|
# define AUDIO_DEFAULT_ON true
|
||||||
|
#endif
|
||||||
|
#ifndef AUDIO_DEFAULT_CLICKY_ON
|
||||||
|
# define AUDIO_DEFAULT_CLICKY_ON true
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef AUDIO_TONE_STACKSIZE
|
#ifndef AUDIO_TONE_STACKSIZE
|
||||||
# define AUDIO_TONE_STACKSIZE 8
|
# define AUDIO_TONE_STACKSIZE 8
|
||||||
#endif
|
#endif
|
||||||
@ -117,32 +125,31 @@ void eeconfig_update_audio_current(void) {
|
|||||||
eeconfig_update_audio(audio_config.raw);
|
eeconfig_update_audio(audio_config.raw);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void eeconfig_update_audio_default(void) {
|
||||||
|
audio_config.valid = true;
|
||||||
|
audio_config.enable = AUDIO_DEFAULT_ON;
|
||||||
|
audio_config.clicky_enable = AUDIO_DEFAULT_CLICKY_ON;
|
||||||
|
eeconfig_update_audio(audio_config.raw);
|
||||||
|
}
|
||||||
|
|
||||||
void audio_init(void) {
|
void audio_init(void) {
|
||||||
if (audio_initialized) {
|
if (audio_initialized) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check EEPROM
|
|
||||||
#ifdef EEPROM_ENABLE
|
|
||||||
if (!eeconfig_is_enabled()) {
|
|
||||||
eeconfig_init();
|
|
||||||
}
|
|
||||||
audio_config.raw = eeconfig_read_audio();
|
audio_config.raw = eeconfig_read_audio();
|
||||||
#else // EEPROM settings
|
if (!audio_config.valid) {
|
||||||
audio_config.enable = true;
|
dprintf("audio_init audio_config.valid = 0. Write default values to EEPROM.\n");
|
||||||
# ifdef AUDIO_CLICKY_ON
|
eeconfig_update_audio_default();
|
||||||
audio_config.clicky_enable = true;
|
}
|
||||||
# endif
|
|
||||||
#endif // EEPROM settings
|
|
||||||
|
|
||||||
for (uint8_t i = 0; i < AUDIO_TONE_STACKSIZE; i++) {
|
for (uint8_t i = 0; i < AUDIO_TONE_STACKSIZE; i++) {
|
||||||
tones[i] = (musical_tone_t){.time_started = 0, .pitch = -1.0f, .duration = 0};
|
tones[i] = (musical_tone_t){.time_started = 0, .pitch = -1.0f, .duration = 0};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!audio_initialized) {
|
audio_driver_initialize();
|
||||||
audio_driver_initialize();
|
audio_initialized = true;
|
||||||
audio_initialized = true;
|
|
||||||
}
|
|
||||||
stop_all_notes();
|
stop_all_notes();
|
||||||
#ifndef AUDIO_INIT_DELAY
|
#ifndef AUDIO_INIT_DELAY
|
||||||
audio_startup();
|
audio_startup();
|
||||||
|
@ -33,7 +33,8 @@ typedef union {
|
|||||||
struct {
|
struct {
|
||||||
bool enable : 1;
|
bool enable : 1;
|
||||||
bool clicky_enable : 1;
|
bool clicky_enable : 1;
|
||||||
uint8_t level : 6;
|
bool valid : 1;
|
||||||
|
uint8_t reserved : 5;
|
||||||
};
|
};
|
||||||
} audio_config_t;
|
} audio_config_t;
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ void eeconfig_init_quantum(void) {
|
|||||||
// Enable oneshot and autocorrect by default: 0b0001 0100 0000 0000
|
// Enable oneshot and autocorrect by default: 0b0001 0100 0000 0000
|
||||||
eeprom_update_word(EECONFIG_KEYMAP, 0x1400);
|
eeprom_update_word(EECONFIG_KEYMAP, 0x1400);
|
||||||
eeprom_update_byte(EECONFIG_BACKLIGHT, 0);
|
eeprom_update_byte(EECONFIG_BACKLIGHT, 0);
|
||||||
eeprom_update_byte(EECONFIG_AUDIO, 0xFF); // On by default
|
eeprom_update_byte(EECONFIG_AUDIO, 0);
|
||||||
eeprom_update_dword(EECONFIG_RGBLIGHT, 0);
|
eeprom_update_dword(EECONFIG_RGBLIGHT, 0);
|
||||||
eeprom_update_byte(EECONFIG_RGBLIGHT_EXTENDED, 0);
|
eeprom_update_byte(EECONFIG_RGBLIGHT_EXTENDED, 0);
|
||||||
eeprom_update_byte(EECONFIG_UNUSED, 0);
|
eeprom_update_byte(EECONFIG_UNUSED, 0);
|
||||||
|
@ -133,7 +133,7 @@ bool preprocess_tap_dance(uint16_t keycode, keyrecord_t *record) {
|
|||||||
|
|
||||||
if (!active_td || keycode == active_td) return false;
|
if (!active_td || keycode == active_td) return false;
|
||||||
|
|
||||||
action = &tap_dance_actions[TD_INDEX(active_td)];
|
action = &tap_dance_actions[QK_TAP_DANCE_GET_INDEX(active_td)];
|
||||||
action->state.interrupted = true;
|
action->state.interrupted = true;
|
||||||
action->state.interrupting_keycode = keycode;
|
action->state.interrupting_keycode = keycode;
|
||||||
process_tap_dance_action_on_dance_finished(action);
|
process_tap_dance_action_on_dance_finished(action);
|
||||||
@ -154,7 +154,7 @@ bool process_tap_dance(uint16_t keycode, keyrecord_t *record) {
|
|||||||
|
|
||||||
switch (keycode) {
|
switch (keycode) {
|
||||||
case QK_TAP_DANCE ... QK_TAP_DANCE_MAX:
|
case QK_TAP_DANCE ... QK_TAP_DANCE_MAX:
|
||||||
action = &tap_dance_actions[TD_INDEX(keycode)];
|
action = &tap_dance_actions[QK_TAP_DANCE_GET_INDEX(keycode)];
|
||||||
|
|
||||||
action->state.pressed = record->event.pressed;
|
action->state.pressed = record->event.pressed;
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
@ -182,7 +182,7 @@ void tap_dance_task(void) {
|
|||||||
|
|
||||||
if (!active_td || timer_elapsed(last_tap_time) <= GET_TAPPING_TERM(active_td, &(keyrecord_t){})) return;
|
if (!active_td || timer_elapsed(last_tap_time) <= GET_TAPPING_TERM(active_td, &(keyrecord_t){})) return;
|
||||||
|
|
||||||
action = &tap_dance_actions[TD_INDEX(active_td)];
|
action = &tap_dance_actions[QK_TAP_DANCE_GET_INDEX(active_td)];
|
||||||
if (!action->state.interrupted) {
|
if (!action->state.interrupted) {
|
||||||
process_tap_dance_action_on_dance_finished(action);
|
process_tap_dance_action_on_dance_finished(action);
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include "action.h"
|
#include "action.h"
|
||||||
|
#include "quantum_keycodes.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint16_t interrupting_keycode;
|
uint16_t interrupting_keycode;
|
||||||
@ -74,8 +75,7 @@ typedef struct {
|
|||||||
#define ACTION_TAP_DANCE_FN_ADVANCED_WITH_RELEASE(user_fn_on_each_tap, user_fn_on_each_release, user_fn_on_dance_finished, user_fn_on_dance_reset) \
|
#define ACTION_TAP_DANCE_FN_ADVANCED_WITH_RELEASE(user_fn_on_each_tap, user_fn_on_each_release, user_fn_on_dance_finished, user_fn_on_dance_reset) \
|
||||||
{ .fn = {user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_dance_reset, user_fn_on_each_release}, .user_data = NULL, }
|
{ .fn = {user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_dance_reset, user_fn_on_each_release}, .user_data = NULL, }
|
||||||
|
|
||||||
#define TD(n) (QK_TAP_DANCE | TD_INDEX(n))
|
#define TD_INDEX(code) QK_TAP_DANCE_GET_INDEX(code)
|
||||||
#define TD_INDEX(code) ((code)&0xFF)
|
|
||||||
#define TAP_DANCE_KEYCODE(state) TD(((tap_dance_action_t *)state) - tap_dance_actions)
|
#define TAP_DANCE_KEYCODE(state) TD(((tap_dance_action_t *)state) - tap_dance_actions)
|
||||||
|
|
||||||
extern tap_dance_action_t tap_dance_actions[];
|
extern tap_dance_action_t tap_dance_actions[];
|
||||||
|
@ -190,6 +190,10 @@
|
|||||||
#define SH_T(kc) (QK_SWAP_HANDS | ((kc)&0xFF))
|
#define SH_T(kc) (QK_SWAP_HANDS | ((kc)&0xFF))
|
||||||
#define QK_SWAP_HANDS_GET_TAP_KEYCODE(kc) ((kc)&0xFF)
|
#define QK_SWAP_HANDS_GET_TAP_KEYCODE(kc) ((kc)&0xFF)
|
||||||
|
|
||||||
|
// Tap dance
|
||||||
|
#define TD(i) (QK_TAP_DANCE | ((i)&0xFF))
|
||||||
|
#define QK_TAP_DANCE_GET_INDEX(kc) ((kc)&0xFF)
|
||||||
|
|
||||||
// MIDI aliases
|
// MIDI aliases
|
||||||
#define MIDI_TONE_MIN QK_MIDI_NOTE_C_0
|
#define MIDI_TONE_MIN QK_MIDI_NOTE_C_0
|
||||||
#define MIDI_TONE_MAX QK_MIDI_NOTE_B_5
|
#define MIDI_TONE_MAX QK_MIDI_NOTE_B_5
|
||||||
|
@ -83,7 +83,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||||||
|
|
||||||
switch (keycode) {
|
switch (keycode) {
|
||||||
case TD(CT_CLN):
|
case TD(CT_CLN):
|
||||||
action = &tap_dance_actions[TD_INDEX(keycode)];
|
action = &tap_dance_actions[QK_TAP_DANCE_GET_INDEX(keycode)];
|
||||||
if (!record->event.pressed && action->state.count && !action->state.finished) {
|
if (!record->event.pressed && action->state.count && !action->state.finished) {
|
||||||
tap_dance_tap_hold_t *tap_hold = (tap_dance_tap_hold_t *)action->user_data;
|
tap_dance_tap_hold_t *tap_hold = (tap_dance_tap_hold_t *)action->user_data;
|
||||||
tap_code16(tap_hold->tap);
|
tap_code16(tap_hold->tap);
|
||||||
|
Loading…
Reference in New Issue
Block a user