mirror of
https://github.com/qmk/qmk_firmware.git
synced 2026-10-02 06:49:16 +02:00
Merge branch 'master' of github.com:qmk/qmk_firmware into planck_rev6
This commit is contained in:
+114
-79
@@ -35,44 +35,81 @@
|
||||
// Timer Abstractions
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
// TIMSK3 - Timer/Counter #3 Interrupt Mask Register
|
||||
// Turn on/off 3A interputs, stopping/enabling the ISR calls
|
||||
#ifdef C6_AUDIO
|
||||
//Currently we support timers 1 and 3 used at the sime time, channels A-C,
|
||||
//pins PB5, PB6, PB7, PC4, PC5, and PC6
|
||||
#if defined(C6_AUDIO)
|
||||
#define CPIN_AUDIO
|
||||
#define CPIN_SET_DIRECTION DDRC |= _BV(PORTC6);
|
||||
#define INIT_AUDIO_COUNTER_3 TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
|
||||
#define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3A)
|
||||
#define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3A)
|
||||
#endif
|
||||
|
||||
#ifdef B5_AUDIO
|
||||
#define ENABLE_AUDIO_COUNTER_1_ISR TIMSK1 |= _BV(OCIE1A)
|
||||
#define DISABLE_AUDIO_COUNTER_1_ISR TIMSK1 &= ~_BV(OCIE1A)
|
||||
#endif
|
||||
|
||||
// TCCR3A: Timer/Counter #3 Control Register
|
||||
// Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6
|
||||
|
||||
#ifdef C6_AUDIO
|
||||
#define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3A1);
|
||||
#define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3A1) | _BV(COM3A0));
|
||||
#endif
|
||||
|
||||
#ifdef B5_AUDIO
|
||||
#define ENABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A |= _BV(COM1A1);
|
||||
#define DISABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A &= ~(_BV(COM1A1) | _BV(COM1A0));
|
||||
#endif
|
||||
|
||||
// Fast PWM Mode Controls
|
||||
|
||||
#ifdef C6_AUDIO
|
||||
#define TIMER_3_PERIOD ICR3
|
||||
#define TIMER_3_DUTY_CYCLE OCR3A
|
||||
#define TIMER3_AUDIO_vect TIMER3_COMPA_vect
|
||||
#endif
|
||||
#if defined(C5_AUDIO)
|
||||
#define CPIN_AUDIO
|
||||
#define CPIN_SET_DIRECTION DDRC |= _BV(PORTC5);
|
||||
#define INIT_AUDIO_COUNTER_3 TCCR3A = (0 << COM3B1) | (0 << COM3B0) | (1 << WGM31) | (0 << WGM30);
|
||||
#define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3B)
|
||||
#define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3B)
|
||||
#define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3B1);
|
||||
#define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3B1) | _BV(COM3B0));
|
||||
#define TIMER_3_PERIOD ICR3
|
||||
#define TIMER_3_DUTY_CYCLE OCR3B
|
||||
#define TIMER3_AUDIO_vect TIMER3_COMPB_vect
|
||||
#endif
|
||||
#if defined(C4_AUDIO)
|
||||
#define CPIN_AUDIO
|
||||
#define CPIN_SET_DIRECTION DDRC |= _BV(PORTC4);
|
||||
#define INIT_AUDIO_COUNTER_3 TCCR3A = (0 << COM3C1) | (0 << COM3C0) | (1 << WGM31) | (0 << WGM30);
|
||||
#define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3C)
|
||||
#define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3C)
|
||||
#define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3C1);
|
||||
#define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3C1) | _BV(COM3C0));
|
||||
#define TIMER_3_PERIOD ICR3
|
||||
#define TIMER_3_DUTY_CYCLE OCR3C
|
||||
#define TIMER3_AUDIO_vect TIMER3_COMPC_vect
|
||||
#endif
|
||||
|
||||
#ifdef B5_AUDIO
|
||||
#if defined(B5_AUDIO)
|
||||
#define BPIN_AUDIO
|
||||
#define BPIN_SET_DIRECTION DDRB |= _BV(PORTB5);
|
||||
#define INIT_AUDIO_COUNTER_1 TCCR1A = (0 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (0 << WGM10);
|
||||
#define ENABLE_AUDIO_COUNTER_1_ISR TIMSK1 |= _BV(OCIE1A)
|
||||
#define DISABLE_AUDIO_COUNTER_1_ISR TIMSK1 &= ~_BV(OCIE1A)
|
||||
#define ENABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A |= _BV(COM1A1);
|
||||
#define DISABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A &= ~(_BV(COM1A1) | _BV(COM1A0));
|
||||
#define TIMER_1_PERIOD ICR1
|
||||
#define TIMER_1_DUTY_CYCLE OCR1A
|
||||
#define TIMER1_AUDIO_vect TIMER1_COMPA_vect
|
||||
#endif
|
||||
#if defined(B6_AUDIO)
|
||||
#define BPIN_AUDIO
|
||||
#define BPIN_SET_DIRECTION DDRB |= _BV(PORTB6);
|
||||
#define INIT_AUDIO_COUNTER_1 TCCR1A = (0 << COM1B1) | (0 << COM1B0) | (1 << WGM11) | (0 << WGM10);
|
||||
#define ENABLE_AUDIO_COUNTER_1_ISR TIMSK1 |= _BV(OCIE1B)
|
||||
#define DISABLE_AUDIO_COUNTER_1_ISR TIMSK1 &= ~_BV(OCIE1B)
|
||||
#define ENABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A |= _BV(COM1B1);
|
||||
#define DISABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A &= ~(_BV(COM1B1) | _BV(COM1B0));
|
||||
#define TIMER_1_PERIOD ICR1
|
||||
#define TIMER_1_DUTY_CYCLE OCR1B
|
||||
#define TIMER1_AUDIO_vect TIMER1_COMPB_vect
|
||||
#endif
|
||||
#if defined(B7_AUDIO)
|
||||
#define BPIN_AUDIO
|
||||
#define BPIN_SET_DIRECTION DDRB |= _BV(PORTB7);
|
||||
#define INIT_AUDIO_COUNTER_1 TCCR1A = (0 << COM1C1) | (0 << COM1C0) | (1 << WGM11) | (0 << WGM10);
|
||||
#define ENABLE_AUDIO_COUNTER_1_ISR TIMSK1 |= _BV(OCIE1C)
|
||||
#define DISABLE_AUDIO_COUNTER_1_ISR TIMSK1 &= ~_BV(OCIE1C)
|
||||
#define ENABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A |= _BV(COM1C1);
|
||||
#define DISABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A &= ~(_BV(COM1C1) | _BV(COM1C0));
|
||||
#define TIMER_1_PERIOD ICR1
|
||||
#define TIMER_1_DUTY_CYCLE OCR1C
|
||||
#define TIMER1_AUDIO_vect TIMER1_COMPC_vect
|
||||
#endif
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -147,47 +184,46 @@ void audio_init()
|
||||
|
||||
if (!audio_initialized) {
|
||||
|
||||
// Set port PC6 (OC3A and /OC4A) as output
|
||||
|
||||
#ifdef C6_AUDIO
|
||||
DDRC |= _BV(PORTC6);
|
||||
//#else
|
||||
// DDRC |= _BV(PORTC6); // Why is PC6 being set as output low, if C6_audio isn't defined?
|
||||
// PORTC &= ~_BV(PORTC6);
|
||||
// Set audio ports as output
|
||||
#ifdef CPIN_AUDIO
|
||||
CPIN_SET_DIRECTION
|
||||
DISABLE_AUDIO_COUNTER_3_ISR;
|
||||
#endif
|
||||
#ifdef BPIN_AUDIO
|
||||
BPIN_SET_DIRECTION
|
||||
DISABLE_AUDIO_COUNTER_1_ISR;
|
||||
#endif
|
||||
|
||||
#ifdef B5_AUDIO
|
||||
DDRB |= _BV(PORTB5);
|
||||
//#else
|
||||
// DDRB |= _BV(PORTB5); // Same as with PC6
|
||||
// PORTB &= ~_BV(PORTB5);
|
||||
#endif
|
||||
// TCCR3A / TCCR3B: Timer/Counter #3 Control Registers TCCR3A/TCCR3B, TCCR1A/TCCR1B
|
||||
// Compare Output Mode (COM3An and COM1An) = 0b00 = Normal port operation
|
||||
// OC3A -- PC6
|
||||
// OC3B -- PC5
|
||||
// OC3C -- PC4
|
||||
// OC1A -- PB5
|
||||
// OC1B -- PB6
|
||||
// OC1C -- PB7
|
||||
|
||||
#ifdef C6_AUDIO
|
||||
DISABLE_AUDIO_COUNTER_3_ISR;
|
||||
#endif
|
||||
|
||||
#ifdef B5_AUDIO
|
||||
DISABLE_AUDIO_COUNTER_1_ISR;
|
||||
#endif
|
||||
// Waveform Generation Mode (WGM3n) = 0b1110 = Fast PWM Mode 14. Period = ICR3, Duty Cycle OCR3A)
|
||||
// OCR3A - PC6
|
||||
// OCR3B - PC5
|
||||
// OCR3C - PC4
|
||||
// OCR1A - PB5
|
||||
// OCR1B - PB6
|
||||
// OCR1C - PB7
|
||||
|
||||
// TCCR3A / TCCR3B: Timer/Counter #3 Control Registers
|
||||
// Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6
|
||||
// Waveform Generation Mode (WGM3n) = 0b1110 = Fast PWM Mode 14 (Period = ICR3, Duty Cycle = OCR3A)
|
||||
// Clock Select (CS3n) = 0b010 = Clock / 8
|
||||
|
||||
#ifdef C6_AUDIO
|
||||
TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
|
||||
#ifdef CPIN_AUDIO
|
||||
INIT_AUDIO_COUNTER_3
|
||||
TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30);
|
||||
TIMER_3_PERIOD = (uint16_t)(((float)F_CPU) / (440 * CPU_PRESCALER));
|
||||
TIMER_3_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (440 * CPU_PRESCALER)) * note_timbre);
|
||||
#endif
|
||||
|
||||
#ifdef B5_AUDIO
|
||||
TCCR1A = (0 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (0 << WGM10);
|
||||
#ifdef BPIN_AUDIO
|
||||
INIT_AUDIO_COUNTER_1
|
||||
TCCR1B = (1 << WGM13) | (1 << WGM12) | (0 << CS12) | (1 << CS11) | (0 << CS10);
|
||||
|
||||
TIMER_1_PERIOD = (uint16_t)(((float)F_CPU) / (440 * CPU_PRESCALER));
|
||||
TIMER_1_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (440 * CPU_PRESCALER)) * note_timbre);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
audio_initialized = true;
|
||||
}
|
||||
@@ -207,13 +243,12 @@ void stop_all_notes()
|
||||
}
|
||||
voices = 0;
|
||||
|
||||
|
||||
#ifdef C6_AUDIO
|
||||
#ifdef CPIN_AUDIO
|
||||
DISABLE_AUDIO_COUNTER_3_ISR;
|
||||
DISABLE_AUDIO_COUNTER_3_OUTPUT;
|
||||
#endif
|
||||
|
||||
#ifdef B5_AUDIO
|
||||
#ifdef BPIN_AUDIO
|
||||
DISABLE_AUDIO_COUNTER_1_ISR;
|
||||
DISABLE_AUDIO_COUNTER_1_OUTPUT;
|
||||
#endif
|
||||
@@ -259,11 +294,11 @@ void stop_note(float freq)
|
||||
voice_place = 0;
|
||||
}
|
||||
if (voices == 0) {
|
||||
#ifdef C6_AUDIO
|
||||
#ifdef CPIN_AUDIO
|
||||
DISABLE_AUDIO_COUNTER_3_ISR;
|
||||
DISABLE_AUDIO_COUNTER_3_OUTPUT;
|
||||
#endif
|
||||
#ifdef B5_AUDIO
|
||||
#ifdef BPIN_AUDIO
|
||||
DISABLE_AUDIO_COUNTER_1_ISR;
|
||||
DISABLE_AUDIO_COUNTER_1_OUTPUT;
|
||||
#endif
|
||||
@@ -295,15 +330,15 @@ float vibrato(float average_freq) {
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef C6_AUDIO
|
||||
ISR(TIMER3_COMPA_vect)
|
||||
#ifdef CPIN_AUDIO
|
||||
ISR(TIMER3_AUDIO_vect)
|
||||
{
|
||||
float freq;
|
||||
|
||||
if (playing_note) {
|
||||
if (voices > 0) {
|
||||
|
||||
#ifdef B5_AUDIO
|
||||
#ifdef BPIN_AUDIO
|
||||
float freq_alt = 0;
|
||||
if (voices > 1) {
|
||||
if (polyphony_rate == 0) {
|
||||
@@ -477,10 +512,10 @@ ISR(TIMER3_COMPA_vect)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef B5_AUDIO
|
||||
ISR(TIMER1_COMPA_vect)
|
||||
#ifdef BPIN_AUDIO
|
||||
ISR(TIMER1_AUDIO_vect)
|
||||
{
|
||||
#if defined(B5_AUDIO) && !defined(C6_AUDIO)
|
||||
#if defined(BPIN_AUDIO) && !defined(CPIN_AUDIO)
|
||||
float freq = 0;
|
||||
|
||||
if (playing_note) {
|
||||
@@ -627,10 +662,10 @@ void play_note(float freq, int vol) {
|
||||
}
|
||||
|
||||
if (audio_config.enable && voices < 8) {
|
||||
#ifdef C6_AUDIO
|
||||
#ifdef CPIN_AUDIO
|
||||
DISABLE_AUDIO_COUNTER_3_ISR;
|
||||
#endif
|
||||
#ifdef B5_AUDIO
|
||||
#ifdef BPIN_AUDIO
|
||||
DISABLE_AUDIO_COUNTER_1_ISR;
|
||||
#endif
|
||||
|
||||
@@ -648,12 +683,12 @@ void play_note(float freq, int vol) {
|
||||
voices++;
|
||||
}
|
||||
|
||||
#ifdef C6_AUDIO
|
||||
#ifdef CPIN_AUDIO
|
||||
ENABLE_AUDIO_COUNTER_3_ISR;
|
||||
ENABLE_AUDIO_COUNTER_3_OUTPUT;
|
||||
#endif
|
||||
#ifdef B5_AUDIO
|
||||
#ifdef C6_AUDIO
|
||||
#ifdef BPIN_AUDIO
|
||||
#ifdef CPIN_AUDIO
|
||||
if (voices > 1) {
|
||||
ENABLE_AUDIO_COUNTER_1_ISR;
|
||||
ENABLE_AUDIO_COUNTER_1_OUTPUT;
|
||||
@@ -676,10 +711,10 @@ void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat)
|
||||
|
||||
if (audio_config.enable) {
|
||||
|
||||
#ifdef C6_AUDIO
|
||||
#ifdef CPIN_AUDIO
|
||||
DISABLE_AUDIO_COUNTER_3_ISR;
|
||||
#endif
|
||||
#ifdef B5_AUDIO
|
||||
#ifdef BPIN_AUDIO
|
||||
DISABLE_AUDIO_COUNTER_1_ISR;
|
||||
#endif
|
||||
|
||||
@@ -701,12 +736,12 @@ void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat)
|
||||
note_position = 0;
|
||||
|
||||
|
||||
#ifdef C6_AUDIO
|
||||
#ifdef CPIN_AUDIO
|
||||
ENABLE_AUDIO_COUNTER_3_ISR;
|
||||
ENABLE_AUDIO_COUNTER_3_OUTPUT;
|
||||
#endif
|
||||
#ifdef B5_AUDIO
|
||||
#ifndef C6_AUDIO
|
||||
#ifdef BPIN_AUDIO
|
||||
#ifndef CPIN_AUDIO
|
||||
ENABLE_AUDIO_COUNTER_1_ISR;
|
||||
ENABLE_AUDIO_COUNTER_1_OUTPUT;
|
||||
#endif
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#include "eeprom.h"
|
||||
#include "keymap_steno.h"
|
||||
#include "virtser.h"
|
||||
#include <string.h>
|
||||
|
||||
// TxBolt Codes
|
||||
#define TXB_NUL 0
|
||||
@@ -57,11 +58,12 @@
|
||||
#define GEMINI_STATE_SIZE 6
|
||||
#define MAX_STATE_SIZE GEMINI_STATE_SIZE
|
||||
|
||||
uint8_t state[MAX_STATE_SIZE] = {0};
|
||||
uint8_t pressed = 0;
|
||||
steno_mode_t mode;
|
||||
static uint8_t state[MAX_STATE_SIZE] = {0};
|
||||
static uint8_t chord[MAX_STATE_SIZE] = {0};
|
||||
static int8_t pressed = 0;
|
||||
static steno_mode_t mode;
|
||||
|
||||
uint8_t boltmap[64] = {
|
||||
static const uint8_t boltmap[64] PROGMEM = {
|
||||
TXB_NUL, TXB_NUM, TXB_NUM, TXB_NUM, TXB_NUM, TXB_NUM, TXB_NUM,
|
||||
TXB_S_L, TXB_S_L, TXB_T_L, TXB_K_L, TXB_P_L, TXB_W_L, TXB_H_L,
|
||||
TXB_R_L, TXB_A_L, TXB_O_L, TXB_STR, TXB_STR, TXB_NUL, TXB_NUL,
|
||||
@@ -70,8 +72,17 @@ uint8_t boltmap[64] = {
|
||||
TXB_NUM, TXB_NUM, TXB_NUM, TXB_NUM, TXB_NUM, TXB_NUM, TXB_Z_R
|
||||
};
|
||||
|
||||
void steno_clear_state(void) {
|
||||
__builtin_memset(state, 0, sizeof(state));
|
||||
static void steno_clear_state(void) {
|
||||
memset(state, 0, sizeof(state));
|
||||
memset(chord, 0, sizeof(chord));
|
||||
}
|
||||
|
||||
static void send_steno_state(uint8_t size, bool send_empty) {
|
||||
for (uint8_t i = 0; i < size; ++i) {
|
||||
if (chord[i] || send_empty) {
|
||||
virtser_send(chord[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void steno_init() {
|
||||
@@ -87,79 +98,108 @@ void steno_set_mode(steno_mode_t new_mode) {
|
||||
eeprom_update_byte(EECONFIG_STENOMODE, mode);
|
||||
}
|
||||
|
||||
void send_steno_state(uint8_t size, bool send_empty) {
|
||||
for (uint8_t i = 0; i < size; ++i) {
|
||||
if (state[i] || send_empty) {
|
||||
virtser_send(state[i]);
|
||||
/* override to intercept chords right before they get sent.
|
||||
* return zero to suppress normal sending behavior.
|
||||
*/
|
||||
__attribute__ ((weak))
|
||||
bool send_steno_chord_user(steno_mode_t mode, uint8_t chord[6]) { return true; }
|
||||
|
||||
__attribute__ ((weak))
|
||||
bool postprocess_steno_user(uint16_t keycode, keyrecord_t *record, steno_mode_t mode, uint8_t chord[6], int8_t pressed) { return true; }
|
||||
|
||||
__attribute__ ((weak))
|
||||
bool process_steno_user(uint16_t keycode, keyrecord_t *record) { return true; }
|
||||
|
||||
static void send_steno_chord(void) {
|
||||
if (send_steno_chord_user(mode, chord)) {
|
||||
switch(mode) {
|
||||
case STENO_MODE_BOLT:
|
||||
send_steno_state(BOLT_STATE_SIZE, false);
|
||||
virtser_send(0); // terminating byte
|
||||
break;
|
||||
case STENO_MODE_GEMINI:
|
||||
chord[0] |= 0x80; // Indicate start of packet
|
||||
send_steno_state(GEMINI_STATE_SIZE, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
steno_clear_state();
|
||||
}
|
||||
|
||||
bool update_state_bolt(uint8_t key) {
|
||||
uint8_t boltcode = boltmap[key];
|
||||
state[TXB_GET_GROUP(boltcode)] |= boltcode;
|
||||
uint8_t *steno_get_state(void) {
|
||||
return &state[0];
|
||||
}
|
||||
|
||||
uint8_t *steno_get_chord(void) {
|
||||
return &chord[0];
|
||||
}
|
||||
|
||||
static bool update_state_bolt(uint8_t key, bool press) {
|
||||
uint8_t boltcode = pgm_read_byte(boltmap + key);
|
||||
if (press) {
|
||||
state[TXB_GET_GROUP(boltcode)] |= boltcode;
|
||||
chord[TXB_GET_GROUP(boltcode)] |= boltcode;
|
||||
} else {
|
||||
state[TXB_GET_GROUP(boltcode)] &= ~boltcode;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool send_state_bolt(void) {
|
||||
send_steno_state(BOLT_STATE_SIZE, false);
|
||||
virtser_send(0); // terminating byte
|
||||
return false;
|
||||
}
|
||||
|
||||
bool update_state_gemini(uint8_t key) {
|
||||
state[key / 7] |= 1 << (6 - (key % 7));
|
||||
return false;
|
||||
}
|
||||
|
||||
bool send_state_gemini(void) {
|
||||
state[0] |= 0x80; // Indicate start of packet
|
||||
send_steno_state(GEMINI_STATE_SIZE, true);
|
||||
static bool update_state_gemini(uint8_t key, bool press) {
|
||||
int idx = key / 7;
|
||||
uint8_t bit = 1 << (6 - (key % 7));
|
||||
if (press) {
|
||||
state[idx] |= bit;
|
||||
chord[idx] |= bit;
|
||||
} else {
|
||||
state[idx] &= ~bit;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool process_steno(uint16_t keycode, keyrecord_t *record) {
|
||||
switch (keycode) {
|
||||
case QK_STENO_BOLT:
|
||||
if (!process_steno_user(keycode, record)) {
|
||||
return false;
|
||||
}
|
||||
if (IS_PRESSED(record->event)) {
|
||||
steno_set_mode(STENO_MODE_BOLT);
|
||||
}
|
||||
return false;
|
||||
|
||||
case QK_STENO_GEMINI:
|
||||
if (!process_steno_user(keycode, record)) {
|
||||
return false;
|
||||
}
|
||||
if (IS_PRESSED(record->event)) {
|
||||
steno_set_mode(STENO_MODE_GEMINI);
|
||||
}
|
||||
return false;
|
||||
|
||||
case STN__MIN...STN__MAX:
|
||||
if (IS_PRESSED(record->event)) {
|
||||
uint8_t key = keycode - QK_STENO;
|
||||
++pressed;
|
||||
switch(mode) {
|
||||
case STENO_MODE_BOLT:
|
||||
return update_state_bolt(key);
|
||||
case STENO_MODE_GEMINI:
|
||||
return update_state_gemini(key);
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
--pressed;
|
||||
if (pressed <= 0) {
|
||||
pressed = 0;
|
||||
switch(mode) {
|
||||
case STENO_MODE_BOLT:
|
||||
return send_state_bolt();
|
||||
case STENO_MODE_GEMINI:
|
||||
return send_state_gemini();
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (!process_steno_user(keycode, record)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
switch(mode) {
|
||||
case STENO_MODE_BOLT:
|
||||
update_state_bolt(keycode - QK_STENO, IS_PRESSED(record->event));
|
||||
case STENO_MODE_GEMINI:
|
||||
update_state_gemini(keycode - QK_STENO, IS_PRESSED(record->event));
|
||||
}
|
||||
// allow postprocessing hooks
|
||||
if (postprocess_steno_user(keycode, record, mode, chord, pressed)) {
|
||||
if (IS_PRESSED(record->event)) {
|
||||
++pressed;
|
||||
} else {
|
||||
--pressed;
|
||||
if (pressed <= 0) {
|
||||
pressed = 0;
|
||||
send_steno_chord();
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -27,5 +27,7 @@ typedef enum { STENO_MODE_BOLT, STENO_MODE_GEMINI } steno_mode_t;
|
||||
bool process_steno(uint16_t keycode, keyrecord_t *record);
|
||||
void steno_init(void);
|
||||
void steno_set_mode(steno_mode_t mode);
|
||||
uint8_t *steno_get_state(void);
|
||||
uint8_t *steno_get_chord(void);
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
#include "%KEYBOARD%.h"
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[0] = KEYMAP( /* Base */
|
||||
[0] = LAYOUT( /* Base */
|
||||
KC_A, KC_1, KC_H, \
|
||||
KC_TAB, KC_SPC \
|
||||
),
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
// The following is an example using the Planck MIT layout
|
||||
// The first section contains all of the arguments
|
||||
// The second converts the arguments into a two-dimensional array
|
||||
#define KEYMAP( \
|
||||
#define LAYOUT( \
|
||||
k00, k01, k02, \
|
||||
k10, k11 \
|
||||
) \
|
||||
|
||||
Reference in New Issue
Block a user