diff options
| author | Jack Humbert <jack.humb@gmail.com> | 2016-05-09 13:17:15 -0400 | 
|---|---|---|
| committer | Jack Humbert <jack.humb@gmail.com> | 2016-05-09 13:17:15 -0400 | 
| commit | 3f02637f4dd765803671c2611191beb096d60b36 (patch) | |
| tree | c11714b62494097226253d3951de2472e7954129 | |
| parent | 684793360cdb08ac1e50a6d27e1796fadd527adb (diff) | |
| download | firmware-3f02637f4dd765803671c2611191beb096d60b36.tar.gz firmware-3f02637f4dd765803671c2611191beb096d60b36.tar.bz2 firmware-3f02637f4dd765803671c2611191beb096d60b36.zip  | |
Backlight Breathing for Planck and Atomic
* Updated personal layouts
* tweaked personal
* Nightly - Audio Cleanup
Refactored the LUTs. Abstracted some of the registers out of audio to
use more functional names. Split audio into audio and audio_pwm. WIP
* nightly - collapsed code
* Added check for note playing to LEDs
* Usability tweaks
* TWEAE
* nightly
added extra kcs to keymap common
* turned on Plank audio
* Added backlight breathing to atomic
* reverted accidental merge
* adds backlight pulse to planck
| -rw-r--r-- | keyboard/atomic/atomic.c | 260 | ||||
| -rw-r--r-- | keyboard/atomic/atomic.h | 16 | ||||
| -rw-r--r-- | keyboard/atomic/keymaps/pvc/config.h | 3 | ||||
| -rw-r--r-- | keyboard/atomic/keymaps/pvc/keymap.c | 357 | ||||
| -rw-r--r-- | keyboard/atomic/keymaps/pvc/makefile.mk | 2 | ||||
| -rw-r--r-- | keyboard/planck/keymaps/experimental/README.md | 2 | ||||
| -rw-r--r-- | keyboard/planck/keymaps/experimental/keymap.c | 383 | ||||
| -rw-r--r-- | keyboard/planck/keymaps/experimental/makefile.mk | 2 | ||||
| -rw-r--r-- | keyboard/planck/keymaps/pvc/keymap.c | 13 | ||||
| -rw-r--r-- | keyboard/planck/keymaps/pvc/makefile.mk | 6 | ||||
| -rw-r--r-- | keyboard/planck/planck.c | 221 | ||||
| -rw-r--r-- | keyboard/planck/planck.h | 18 | ||||
| -rw-r--r-- | quantum/audio/audio.c | 4 | ||||
| -rw-r--r-- | quantum/audio/audio.h | 11 | ||||
| -rw-r--r-- | quantum/keymap_common.h | 18 | ||||
| -rw-r--r-- | quantum/keymap_midi.h | 10 | ||||
| -rw-r--r-- | quantum/quantum.mk | 6 | ||||
| -rw-r--r-- | tmk_core/common/backlight.c | 5 | ||||
| -rw-r--r-- | tmk_core/common/backlight.h | 1 | ||||
| -rw-r--r-- | tmk_core/common/command.c | 4 | ||||
| -rw-r--r-- | tmk_core/common/nodebug.h | 12 | 
21 files changed, 1153 insertions, 201 deletions
diff --git a/keyboard/atomic/atomic.c b/keyboard/atomic/atomic.c index 399649716..b4b261457 100644 --- a/keyboard/atomic/atomic.c +++ b/keyboard/atomic/atomic.c @@ -2,27 +2,27 @@  __attribute__ ((weak))  void matrix_init_user(void) { -	// leave this function blank - it can be defined in a keymap file +    // leave this function blank - it can be defined in a keymap file  };  __attribute__ ((weak))  void matrix_scan_user(void) { -	// leave this function blank - it can be defined in a keymap file +    // leave this function blank - it can be defined in a keymap file  }  __attribute__ ((weak))  void process_action_user(keyrecord_t *record) { -	// leave this function blank - it can be defined in a keymap file +    // leave this function blank - it can be defined in a keymap file  }  __attribute__ ((weak))  void led_set_user(uint8_t usb_led) { -	// leave this function blank - it can be defined in a keymap file +    // leave this function blank - it can be defined in a keymap file  }  void matrix_init_kb(void) { -	// put your keyboard start-up code here -	// runs once when the firmware starts up +    // put your keyboard start-up code here +    // runs once when the firmware starts up      MCUCR |= (1<<JTD);      MCUCR |= (1<<JTD); @@ -35,31 +35,39 @@ void matrix_init_kb(void) {      DDRE |= (1<<6);      PORTE |= (1<<6); -	matrix_init_user(); +    matrix_init_user();  }  void matrix_scan_kb(void) { -	// put your looping keyboard code here -	// runs every cycle (a lot) +    // put your looping keyboard code here +    // runs every cycle (a lot) -	matrix_scan_user(); +    matrix_scan_user();  }  void process_action_kb(keyrecord_t *record) { -	// put your per-action keyboard code here -	// runs for every action, just before processing by the firmware +    // put your per-action keyboard code here +    // runs for every action, just before processing by the firmware -	process_action_user(record); +    process_action_user(record);  }  void led_set_kb(uint8_t usb_led) { -	// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here +    // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here -	led_set_user(usb_led); +    led_set_user(usb_led);  }  #ifdef BACKLIGHT_ENABLE  #define CHANNEL OCR1C +#define BREATHING_NO_HALT  0 +#define BREATHING_HALT_OFF 1 +#define BREATHING_HALT_ON  2 + +static uint8_t breath_intensity; +static uint8_t breath_speed; +static uint16_t breathing_index; +static uint8_t breathing_halt;  void backlight_init_ports()  { @@ -67,54 +75,250 @@ void backlight_init_ports()      // Setup PB7 as output and output low.      DDRB |= (1<<7);      PORTB &= ~(1<<7); -     -    // Use full 16-bit resolution.  + +    // Use full 16-bit resolution.      ICR1 = 0xFFFF;      // I could write a wall of text here to explain... but TL;DW      // Go read the ATmega32u4 datasheet.      // And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on -     +      // Pin PB7 = OCR1C (Timer 1, Channel C)      // Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0      // (i.e. start high, go low when counter matches.)      // WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0      // Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1 -     +      TCCR1A = _BV(COM1C1) | _BV(WGM11); // = 0b00001010;      TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;      backlight_init(); +    breathing_defaults();  }  void backlight_set(uint8_t level)  { +    // Prevent backlight blink on lowest level +    PORTB &= ~(_BV(PORTB7)); +      if ( level == 0 )      {          // Turn off PWM control on PB7, revert to output low.          TCCR1A &= ~(_BV(COM1C1)); + +        // Set the brightness to 0          CHANNEL = 0x0; -        // Prevent backlight blink on lowest level -        PORTB &= ~(_BV(PORTB7));      } -    else if ( level == BACKLIGHT_LEVELS ) +    else if ( level >= BACKLIGHT_LEVELS )      { -        // Prevent backlight blink on lowest level -        PORTB &= ~(_BV(PORTB7));          // Turn on PWM control of PB7          TCCR1A |= _BV(COM1C1); -        // Set the brightness + +        // Set the brightness to max          CHANNEL = 0xFFFF;      } -    else         +    else      { -        // Prevent backlight blink on lowest level -        PORTB &= ~(_BV(PORTB7));          // Turn on PWM control of PB7          TCCR1A |= _BV(COM1C1); +          // Set the brightness          CHANNEL = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2));      } +    breathing_intensity_default(); +} + + +void breathing_enable(void) +{ +    if (get_backlight_level() == 0) +    { +        breathing_index = 0; +    } +    else +    { +        // Set breathing_index to be at the midpoint (brightest point) +        breathing_index = 0x20 << breath_speed; +    } + +    breathing_halt = BREATHING_NO_HALT; + +    // Enable breathing interrupt +    TIMSK1 |= _BV(OCIE1A); +} + +void breathing_pulse(void) +{ +    if (get_backlight_level() == 0) +    { +        breathing_index = 0; +    } +    else +    { +        // Set breathing_index to be at the midpoint + 1 (brightest point) +        breathing_index = 0x21 << breath_speed; +    } + +    breathing_halt = BREATHING_HALT_ON; + +    // Enable breathing interrupt +    TIMSK1 |= _BV(OCIE1A); +} + +void breathing_disable(void) +{ +    // Disable breathing interrupt +    TIMSK1 &= ~_BV(OCIE1A); +    backlight_set(get_backlight_level()); +} + +void breathing_self_disable(void) +{ +    if (get_backlight_level() == 0) +    { +        breathing_halt = BREATHING_HALT_OFF; +    } +    else +    { +        breathing_halt = BREATHING_HALT_ON; +    } + +    //backlight_set(get_backlight_level()); +} + +void breathing_toggle(void) +{ +    if (!is_breathing()) +    { +        if (get_backlight_level() == 0) +        { +            breathing_index = 0; +        } +        else +        { +            // Set breathing_index to be at the midpoint + 1 (brightest point) +            breathing_index = 0x21 << breath_speed; +        } + +        breathing_halt = BREATHING_NO_HALT; +    } + +    // Toggle breathing interrupt +    TIMSK1 ^= _BV(OCIE1A); + +    // Restore backlight level +    if (!is_breathing()) +    { +        backlight_set(get_backlight_level()); +    } +} + +bool is_breathing(void) +{ +    return (TIMSK1 && _BV(OCIE1A)); +} + +void breathing_intensity_default(void) +{ +    //breath_intensity = (uint8_t)((uint16_t)100 * (uint16_t)get_backlight_level() / (uint16_t)BACKLIGHT_LEVELS); +    breath_intensity = ((BACKLIGHT_LEVELS - get_backlight_level()) * ((BACKLIGHT_LEVELS + 1) / 2)); +} + +void breathing_intensity_set(uint8_t value) +{ +    breath_intensity = value; +} + +void breathing_speed_default(void) +{ +    breath_speed = 4; +} + +void breathing_speed_set(uint8_t value) +{ +    bool is_breathing_now = is_breathing(); +    uint8_t old_breath_speed = breath_speed; + +    if (is_breathing_now) +    { +        // Disable breathing interrupt +        TIMSK1 &= ~_BV(OCIE1A); +    } + +    breath_speed = value; + +    if (is_breathing_now) +    { +        // Adjust index to account for new speed +        breathing_index = (( (uint8_t)( (breathing_index) >> old_breath_speed ) ) & 0x3F) << breath_speed; + +        // Enable breathing interrupt +        TIMSK1 |= _BV(OCIE1A); +    } + +} + +void breathing_speed_inc(uint8_t value) +{ +    if ((uint16_t)(breath_speed - value) > 10 ) +    { +        breathing_speed_set(0); +    } +    else +    { +        breathing_speed_set(breath_speed - value); +    } +} + +void breathing_speed_dec(uint8_t value) +{ +    if ((uint16_t)(breath_speed + value) > 10 ) +    { +        breathing_speed_set(10); +    } +    else +    { +        breathing_speed_set(breath_speed + value); +    } +} + +void breathing_defaults(void) +{ +    breathing_intensity_default(); +    breathing_speed_default(); +    breathing_halt = BREATHING_NO_HALT; +} + +/* Breathing Sleep LED brighness(PWM On period) table + * (64[steps] * 4[duration]) / 64[PWM periods/s] = 4 second breath cycle + * + * http://www.wolframalpha.com/input/?i=%28sin%28+x%2F64*pi%29**8+*+255%2C+x%3D0+to+63 + * (0..63).each {|x| p ((sin(x/64.0*PI)**8)*255).to_i } + */ +static const uint8_t breathing_table[64] PROGMEM = { +  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   4,   6,  10, + 15,  23,  32,  44,  58,  74,  93, 113, 135, 157, 179, 199, 218, 233, 245, 252, +255, 252, 245, 233, 218, 199, 179, 157, 135, 113,  93,  74,  58,  44,  32,  23, + 15,  10,   6,   4,   2,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, +}; + +ISR(TIMER1_COMPA_vect) +{ +    // CHANNEL = (pgm_read_byte(&breathing_table[ ( (uint8_t)( (breathing_index++) >> breath_speed ) ) & 0x3F ] )) * breath_intensity; + + +    uint8_t local_index = ( (uint8_t)( (breathing_index++) >> breath_speed ) ) & 0x3F; + +    if (((breathing_halt == BREATHING_HALT_ON) && (local_index == 0x20)) || ((breathing_halt == BREATHING_HALT_OFF) && (local_index == 0x3F))) +    { +        // Disable breathing interrupt +        TIMSK1 &= ~_BV(OCIE1A); +    } + +    CHANNEL = (uint16_t)(((uint16_t)pgm_read_byte(&breathing_table[local_index]) * 257)) >> breath_intensity; +  } + +  #endif
\ No newline at end of file diff --git a/keyboard/atomic/atomic.h b/keyboard/atomic/atomic.h index 0c7aeb1cc..845a9043e 100644 --- a/keyboard/atomic/atomic.h +++ b/keyboard/atomic/atomic.h @@ -33,4 +33,20 @@ void process_action_user(keyrecord_t *record);  void led_set_user(uint8_t usb_led);  void backlight_init_ports(void); +void breathing_enable(void); +void breathing_pulse(void); +void breathing_disable(void); +void breathing_self_disable(void); +void breathing_toggle(void); +bool is_breathing(void); + + +void breathing_defaults(void); +void breathing_intensity_default(void); +void breathing_speed_default(void); +void breathing_speed_set(uint8_t value); +void breathing_speed_inc(uint8_t value); +void breathing_speed_dec(uint8_t value); + +  #endif
\ No newline at end of file diff --git a/keyboard/atomic/keymaps/pvc/config.h b/keyboard/atomic/keymaps/pvc/config.h index 034bc5dc5..5e956286b 100644 --- a/keyboard/atomic/keymaps/pvc/config.h +++ b/keyboard/atomic/keymaps/pvc/config.h @@ -22,7 +22,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  /* USB Device descriptor parameter */  #define VENDOR_ID       0xFEED -#define PRODUCT_ID      0x6060 +#define PRODUCT_ID      0x0419  #define DEVICE_VER      0x0001  #define MANUFACTURER    Ortholinear Keyboards  #define PRODUCT         The Atomic Keyboard @@ -162,5 +162,4 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  //#define VIBRATO_ENABLE  //#define VIBRATO_STRENGTH_ENABLE -  #endif diff --git a/keyboard/atomic/keymaps/pvc/keymap.c b/keyboard/atomic/keymaps/pvc/keymap.c index 3d604a868..ff7384268 100644 --- a/keyboard/atomic/keymaps/pvc/keymap.c +++ b/keyboard/atomic/keymaps/pvc/keymap.c @@ -8,41 +8,44 @@      #include "song_list.h"  #endif -#define LAYER_QWERTY         0 -#define LAYER_COLEMAK        1 -#define LAYER_DVORAK         2 -#define LAYER_RAISE          3 -#define LAYER_LOWER          4 -#define LAYER_FUNCTION       5 -#define LAYER_MOUSE          6 -#define LAYER_MUSIC          7 -#define LAYER_ADJUST         8 - -#define MACRO_QWERTY         0 -#define MACRO_COLEMAK        1 -#define MACRO_DVORAK         2 -#define MACRO_RAISE          3 -#define MACRO_LOWER          4 -#define MACRO_FUNCTION       5 -#define MACRO_MOUSE          6 -#define MACRO_TIMBRE_1       7 -#define MACRO_TIMBRE_2       8 -#define MACRO_TIMBRE_3       9 -#define MACRO_TIMBRE_4      10 -#define MACRO_TEMPO_U       11 -#define MACRO_TEMPO_D       12 -#define MACRO_TONE_DEFAULT  13 -#define MACRO_MUSIC_ON      14 -#define MACRO_MUSIC_OFF     15 -#define MACRO_AUDIO_ON      16 -#define MACRO_AUDIO_OFF     17 -#define MACRO_INC_VOICE     18 -#define MACRO_DEC_VOICE     19 +#define LAYER_QWERTY                     0 +#define LAYER_COLEMAK                    1 +#define LAYER_DVORAK                     2 +#define LAYER_UPPER                      3 +#define LAYER_LOWER                      4 +#define LAYER_FUNCTION                   5 +#define LAYER_MOUSE                      6 +#define LAYER_MUSIC                      7 +#define LAYER_ADJUST                     8 + +#define MACRO_QWERTY                     0 +#define MACRO_COLEMAK                    1 +#define MACRO_DVORAK                     2 +#define MACRO_UPPER                      3 +#define MACRO_LOWER                      4 +#define MACRO_FUNCTION                   5 +#define MACRO_MOUSE                      6 +#define MACRO_TIMBRE_1                   7 +#define MACRO_TIMBRE_2                   8 +#define MACRO_TIMBRE_3                   9 +#define MACRO_TIMBRE_4                  10 +#define MACRO_TEMPO_U                   11 +#define MACRO_TEMPO_D                   12 +#define MACRO_TONE_DEFAULT              13 +#define MACRO_MUSIC_TOGGLE              14 +#define MACRO_AUDIO_TOGGLE              16 +#define MACRO_INC_VOICE                 18 +#define MACRO_DEC_VOICE                 19 +#define MACRO_BACKLIGHT                 20 +#define MACRO_BREATH_TOGGLE             21 +#define MACRO_BREATH_SPEED_INC          23 +#define MACRO_BREATH_SPEED_DEC          24 +#define MACRO_BREATH_DEFAULT            25  #define M_QWRTY             M(MACRO_QWERTY)  #define M_COLMK             M(MACRO_COLEMAK)  #define M_DVORK             M(MACRO_DVORAK) -#define M_RAISE             M(MACRO_RAISE) +#define M_UPPER             M(MACRO_UPPER)  #define M_LOWER             M(MACRO_LOWER)  #define M_FUNCT             M(MACRO_FUNCTION)  #define M_MOUSE             M(MACRO_MOUSE) @@ -53,12 +56,15 @@  #define TMPO_UP             M(MACRO_TEMPO_U)  #define TMPO_DN             M(MACRO_TEMPO_D)  #define TMPO_DF             M(MACRO_TONE_DEFAULT) +#define M_BACKL             M(MACRO_BACKLIGHT) +#define M_BRTOG             M(MACRO_BREATH_TOGGLE) +#define M_BSPDU             M(MACRO_BREATH_SPEED_INC) +#define M_BSPDD             M(MACRO_BREATH_SPEED_DEC) +#define M_BDFLT             M(MACRO_BREATH_DEFAULT) -#define MUS_ON              M(MACRO_MUSIC_ON) -#define MUS_OFF             M(MACRO_MUSIC_OFF) -#define AUD_OFF             M(MACRO_AUDIO_OFF) -#define AUD_ON              M(MACRO_AUDIO_ON) +#define MUS_TOG             M(MACRO_MUSIC_TOGGLE) +#define AUD_TOG             M(MACRO_AUDIO_TOGGLE)  #define VC_UP               M(MACRO_INC_VOICE)  #define VC_DOWN             M(MACRO_DEC_VOICE) @@ -74,6 +80,7 @@  #define SC_ACLS             LALT(KC_F4)  #define SC_CCLS             LCTL(KC_F4) +#define OS_SHFT             KC_FN0  #define _______             KC_TRNS  #define XXXXXXX             KC_NO @@ -92,16 +99,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {   * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|   * | LSHIFT | Z      | X      | C      | V      | B      | N      | M      | ,      | .      | /      | XXXXXX . RSHIFT | UP     | PG DN  |   * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------| - * | LCTRL  | LWIN   | FN     | LALT   | RAISE  | XXXXXX . SPACE  | LOWER  | RALT   | RWIN   | MENU   | RCTRL  | LEFT   | DOWN   | RIGHT  | + * | LCTRL  | LWIN   | FN     | LALT   | UPPER  | XXXXXX . SPACE  | LOWER  | SHIFT  | RALT   | APP    | RCTRL  | LEFT   | DOWN   | RIGHT  |   * '--------------------------------------------------------------------------------------------------------------------------------------'   */ - [LAYER_QWERTY]       = { /* QWERTY */ + [LAYER_QWERTY]       = { // QWERTY    { KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC, KC_BSPC  },    { KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL   },    { KC_CAPS, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_ENT,  KC_ENT,  KC_PGUP  },    { KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT, KC_RSFT, KC_UP,   KC_PGDN  }, -  { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC,  KC_SPC,  M_LOWER, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT  }, +  { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_UPPER, KC_SPC,  KC_SPC,  M_LOWER, OS_SHFT, KC_RALT, KC_APP,  KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT  },   },   /* COLEMAK @@ -114,17 +121,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {   * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|   * | LSHIFT | Z      | X      | C      | V      | B      | K      | M      | ,      | .      | /      | XXXXXX . RSHIFT | UP     | PG DN  |   * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------| - * | LCTRL  | LWIN   | FN     | LALT   | RAISE  | XXXXXX . SPACE  | LOWER  | RALT   | RWIN   | MENU   | RCTRL  | LEFT   | DOWN   | RIGHT  | + * | LCTRL  | LWIN   | FN     | LALT   | UPPER  | XXXXXX . SPACE  | LOWER  | SHIFT  | RALT   | APP    | RCTRL  | LEFT   | DOWN   | RIGHT  |   * '--------------------------------------------------------------------------------------------------------------------------------------'   */ - [LAYER_COLEMAK]      = { /* COLEMAK */ + [LAYER_COLEMAK]      = { // COLEMAK    { KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC, KC_BSPC  },    { KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL   },    { KC_BSPC, KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT, KC_ENT,  KC_ENT,  KC_PGUP  },    { KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT, KC_RSFT, KC_UP,   KC_PGDN  }, -  { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC,  KC_SPC,  M_LOWER, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT  }, - }, +  { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_UPPER, KC_SPC,  KC_SPC,  M_LOWER, OS_SHFT, KC_RALT, KC_APP,  KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT  }, +},  /* DVORAK   * .---------------------------------------------------------------------------------------------------------------------- 2u ------------. @@ -136,35 +143,63 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {   * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|   * | LSHIFT | ;      | Q      | J      | K      | X      | B      | M      | W      | V      | Z      | XXXXXX . RSHIFT | UP     | PG DN  |   * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------| - * | LCTRL  | LWIN   | FN     | LALT   | RAISE  | XXXXXX . SPACE  | LOWER  | RALT   | RWIN   | MENU   | RCTRL  | LEFT   | DOWN   | RIGHT  | + * | LCTRL  | LWIN   | FN     | LALT   | UPPER  | XXXXXX . SPACE  | LOWER  | SHIFT  | RALT   | APP    | RCTRL  | LEFT   | DOWN   | RIGHT  |   * '--------------------------------------------------------------------------------------------------------------------------------------'   */ - [LAYER_DVORAK]       = { /* DVORAK */ + [LAYER_DVORAK]       = { // DVORAK    { KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_LBRC, KC_RBRC, KC_BSPC, KC_BSPC  },    { KC_TAB,  KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    KC_SLSH, KC_EQL,  KC_BSLS, KC_DEL   },    { KC_CAPS, KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    KC_MINS, KC_ENT,  KC_ENT,  KC_PGUP  },    { KC_LSFT, KC_SCLN, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    KC_RSFT, KC_RSFT, KC_UP,   KC_PGDN  }, -  { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC,  KC_SPC,  M_LOWER, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT  }, +  { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_UPPER, KC_SPC,  KC_SPC,  M_LOWER, OS_SHFT, KC_RALT, KC_APP,  KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT  },   }, - [LAYER_RAISE]        = { /* RAISED */ -  { KC_TILD, KC_PSCR, KC_PAUS, KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  ________________  }, -  { _______, KC_F1,   KC_F2,   KC_F3,   KC_F4,   _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS   }, -  { _______, KC_F5,   KC_F6,   KC_F7,   KC_F8,   _______, _______, _______, _______, _______, _______, _______, ________________, KC_HOME  }, -  { _______, KC_F9,   KC_F10,  KC_F11,  KC_F12,  _______, _______, _______, _______, _______, _______, ________________, _______, KC_END   }, -  { _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, _______, _______  }, +/* UPPER + * .---------------------------------------------------------------------------------------------------------------------- 2u ------------. + * | PRINT  | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | NUM LK | /      | *      | -      | NUM LK | SCR LK | XXXXXX . PAUSE  | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| + * |        | F1     | F2     | F3     | F4     |        |        | 7      | 8      | 9      | +      | ~      |        |        | INS    | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------| + * | CAP LK | F5     | F6     | F7     | F8     |        |        | 4      | 5      | 6      | +      | `      | XXXXXX .        | HOME   | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------| + * |        | F9     | F10    | F11    | F12    |        |        | 1      | 2      | 3      | ENTER  | XXXXXX .        |        | END    | + * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------| + * |        |        |        |        |        | 0               |        | RALT   | .      | ENTER  |        |        |        |        | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ + + [LAYER_UPPER]        = { // UPPER +  { KC_PSCR, M_BRTOG, M_BSPDU, M_BSPDD, M_BDFLT, XXXXXXX, XXXXXXX, KC_NLCK, KC_PSLS, KC_PAST, XXXXXXX, XXXXXXX, KC_SLCK, KC_PAUS, KC_PAUS  }, +  { _______, KC_F1,   KC_F2,   KC_F3,   KC_F4,   XXXXXXX, XXXXXXX, KC_KP_7, KC_KP_8, KC_KP_9, KC_PMNS, _______, _______, _______, KC_INS   }, +  { KC_CAPS, KC_F5,   KC_F6,   KC_F7,   KC_F8,   XXXXXXX, XXXXXXX, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, _______, ________________, KC_HOME  }, +  { _______, KC_F9,   KC_F10,  KC_F11,  KC_F12,  XXXXXXX, XXXXXXX, KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT, ________________, _______, KC_END   }, +  { _______, _______, _______, _______, _______, KC_KP_0, KC_KP_0, _______, KC_RALT, KC_PDOT, KC_PENT, _______, _______, _______, _______  },   }, - [LAYER_LOWER]        = { /* LOWERED */ -  { KC_GRV,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  ________________  }, -  { _______, KC_F13,  KC_F14,  KC_F15,  KC_F16,  _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS   }, -  { _______, KC_F17,  KC_F18,  KC_F19,  KC_F20,  _______, _______, _______, _______, _______, _______, _______, ________________, KC_HOME  }, -  { _______, KC_F21,  KC_F22,  KC_F23,  KC_F24,  _______, _______, _______, _______, _______, _______, ________________, _______, KC_END   }, -  { _______, _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, _______, _______, _______, _______, _______, _______, _______  }, +/* LOWER + * .---------------------------------------------------------------------------------------------------------------------- 2u ------------. + * |        | F1     | F2     | F3     | F4     | F5     | F6     | F7     | F8     | F9     | F10    | F11    | F12    | XXXXXX . BACKSP | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| + * |        | $      | {      | [      | (      | %      | #      | )      | ]      | }      | @      |        |        |        | INS    | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------| + * |        | ^      | *      | +      | -      | ;      | :      | _      | '      | "      | `      |        | XXXXXX .        | HOME   | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------| + * |        | |      | &      | !      | ~      | /      | \      | =      | <      | >      | ?      | XXXXXX .        |        | END    | + * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------| + * |        |        |        |        |        |                 |        |        |        |        |        |        |        |        | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ + + [LAYER_LOWER]        = { // LOWER +  { _______, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  ________________  }, +  { _______, KC_DLR,  KC_LCBR, KC_LBRC, KC_LPRN, KC_PERC, KC_HASH, KC_RPRN, KC_RBRC, KC_RCBR, KC_AT,   _______, _______, _______, KC_INS   }, +  { _______, KC_CIRC, KC_ASTR, KC_PPLS, KC_PMNS, KC_SCLN, KC_COLN, KC_UNDS, KC_QUOT, KC_DQT,  KC_GRV,  _______, ________________, KC_HOME  }, +  { _______, KC_PIPE, KC_AMPR, KC_EXLM, KC_TILD, KC_SLSH, KC_BSLS, KC_EQL,  KC_LT,   KC_GT,   KC_QUES, ________________, _______, KC_END   }, +  { _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, _______, _______  },   }, - [LAYER_FUNCTION]     = { /* FUNCTION */ + [LAYER_FUNCTION]     = { // FUNCTION    { KC_NLCK, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  ________________  },    { KC_SLCK, KC_F13,  KC_F14,  KC_F15,  KC_F16,  KC_F17,  KC_F18,  KC_F19,  KC_F20,  KC_F21,  KC_F22,  KC_F23,  KC_F24,  _______, KC_PAUS  },    { KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, KC_PSCR  }, @@ -174,7 +209,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {  #ifdef MOUSEKEY_ENABLE - [LAYER_MOUSE]        = { /* MOUSE */ + [LAYER_MOUSE]        = { // MOUSE    { _______, KC_ACL0, KC_ACL1, KC_ACL2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXXXXXXXXXXX  },    { XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX  },    { XXXXXXX, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXXXXXXXXXXX, KC_WH_U  }, @@ -184,25 +219,25 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {  #endif - [LAYER_MUSIC]        = { /* MUSIC */ + [LAYER_MUSIC]        = { // MUSIC    { XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX  },    { XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX  },    { XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX  },    { XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX  }, -  { XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, M_RAISE, XXXXXXX, XXXXXXX, M_LOWER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX  }, +  { XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, M_UPPER, XXXXXXX, XXXXXXX, M_LOWER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX  },   }, - [LAYER_ADJUST]       = { /* ADJUST */ -  { _______, TIMBR_1, TIMBR_2, TIMBR_3, TIMBR_4, TMPO_UP, TMPO_DN, TMPO_DF, _______, MUS_ON,  MUS_OFF, AUD_ON,  AUD_OFF, ________________  }, + [LAYER_ADJUST]       = { // ADJUST +  { _______, TIMBR_1, TIMBR_2, TIMBR_3, TIMBR_4, TMPO_UP, TMPO_DN, TMPO_DF, _______, _______, _______, MUS_TOG, AUD_TOG, ________________  },    { _______, M_QWRTY, M_COLMK, M_DVORK, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______  },    { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, _______  }, -  { _______, _______, _______, _______, _______, RESET,   _______, M_MOUSE, _______, _______, _______, ________________, VC_UP,   _______  }, +  { _______, _______, _______, _______, M_BACKL, RESET,   _______, M_MOUSE, _______, _______, _______, ________________, VC_UP,   _______  },    { _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, VC_DOWN, _______  },   },  /* - [LAYER_EMPTY]        = { + [LAYER_EMPTY]        = { // LAYER    { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________  },    { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______  },    { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, _______  }, @@ -241,6 +276,7 @@ void persistant_default_layer_set(uint16_t default_layer)  }  const uint16_t PROGMEM fn_actions[] = { +    [0] = ACTION_MODS_ONESHOT(MOD_LSFT),  };  const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) @@ -250,13 +286,41 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)      switch(id)      { +        case MACRO_BREATH_TOGGLE: +            if (record->event.pressed) +            { +                breathing_toggle(); +            } +            break; + +        case MACRO_BREATH_SPEED_INC: +            if (record->event.pressed) +            { +                breathing_speed_inc(1); +            } +            break; + +        case MACRO_BREATH_SPEED_DEC: +            if (record->event.pressed) +            { +                breathing_speed_dec(1); +            } +            break; + +        case MACRO_BREATH_DEFAULT: +            if (record->event.pressed) +            { +                breathing_defaults(); +            } +            break; +          case MACRO_QWERTY:              if (record->event.pressed)              {                  persistant_default_layer_set(1UL<<LAYER_QWERTY); -				#ifdef AUDIO_ENABLE -                	PLAY_NOTE_ARRAY(tone_qwerty, false, STACCATO); -				#endif /* AUDIO_ENABLE */ +                #ifdef AUDIO_ENABLE +                    PLAY_NOTE_ARRAY(tone_qwerty, false, STACCATO); +                #endif /* AUDIO_ENABLE */              }              break; @@ -264,9 +328,9 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)              if (record->event.pressed)              {                  persistant_default_layer_set(1UL<<LAYER_COLEMAK); -				#ifdef AUDIO_ENABLE -                	PLAY_NOTE_ARRAY(tone_colemak, false, STACCATO); -				#endif /* AUDIO_ENABLE */ +                #ifdef AUDIO_ENABLE +                    PLAY_NOTE_ARRAY(tone_colemak, false, STACCATO); +                #endif /* AUDIO_ENABLE */              }              break; @@ -274,22 +338,24 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)              if (record->event.pressed)              {                  persistant_default_layer_set(1UL<<LAYER_DVORAK); -				#ifdef AUDIO_ENABLE -    	            PLAY_NOTE_ARRAY(tone_dvorak, false, STACCATO); -				#endif /* AUDIO_ENABLE */ +                #ifdef AUDIO_ENABLE +                    PLAY_NOTE_ARRAY(tone_dvorak, false, STACCATO); +                #endif /* AUDIO_ENABLE */              }              break; -        case MACRO_RAISE: +        case MACRO_UPPER:              if (record->event.pressed)              { -                layer_on(LAYER_RAISE); -                update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST); +                layer_on(LAYER_UPPER); +                breathing_speed_set(2); +                breathing_pulse(); +                update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST);              }              else              { -                layer_off(LAYER_RAISE); -                update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST); +                layer_off(LAYER_UPPER); +                update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST);              }              break; @@ -297,22 +363,28 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)              if (record->event.pressed)              {                  layer_on(LAYER_LOWER); -                update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST); +                breathing_speed_set(2); +                breathing_pulse(); +                update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST);              }              else              {                  layer_off(LAYER_LOWER); -                update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST); +                update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST);              }              break;          case MACRO_FUNCTION:              if (record->event.pressed)              { +                breathing_speed_set(3); +                breathing_enable();                  layer_on(LAYER_FUNCTION);              }              else              { +                breathing_speed_set(1); +                breathing_self_disable();                  layer_off(LAYER_FUNCTION);              }              break; @@ -362,42 +434,34 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)              }              break; -        case MACRO_AUDIO_OFF: -            if (record->event.pressed) -            { -                #ifdef AUDIO_ENABLE -                    audio_off(); -                #endif -            } -            break; - -        case MACRO_AUDIO_ON: +        case MACRO_AUDIO_TOGGLE:              if (record->event.pressed)              { -                #ifdef AUDIO_ENABLE -                    audio_on(); -                PLAY_NOTE_ARRAY(tone_audio_on, false, STACCATO); -                #endif +                    if (is_audio_on()) +                    { +                        audio_off(); +                    } +                    else +                    { +                        audio_on(); +                        PLAY_NOTE_ARRAY(tone_audio_on, false, STACCATO); +                    }              }              break; -        case MACRO_MUSIC_ON: +        case MACRO_MUSIC_TOGGLE:              if (record->event.pressed)              { -                #ifdef AUDIO_ENABLE +                    if (IS_LAYER_ON(LAYER_MUSIC)) +                    { +                        layer_off(LAYER_MUSIC); +                        stop_all_notes(); +                    } +                    else +                    {                      PLAY_NOTE_ARRAY(tone_music_on, false, STACCATO);                      layer_on(LAYER_MUSIC); -                #endif -            } -            break; - -        case MACRO_MUSIC_OFF: -            if (record->event.pressed) -            { -                #ifdef AUDIO_ENABLE -                    layer_off(LAYER_MUSIC); -                    stop_all_notes(); -                #endif +                    }              }              break; @@ -423,6 +487,14 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)  #endif /* AUDIO_ENABLE */ +#ifdef BACKLIGHT_ENABLE +        case MACRO_BACKLIGHT: +            if (record->event.pressed) +            { +                backlight_step(); +            } +#endif +          default:              break; @@ -467,39 +539,39 @@ void led_set_user(uint8_t usb_led)      _delay_ms(10); // gets rid of tick -	if (!is_playing_notes()) -	{ -	    if ((usb_led & (1<<USB_LED_CAPS_LOCK)) && !(old_usb_led & (1<<USB_LED_CAPS_LOCK))) -	    { -	            // If CAPS LK LED is turning on... -	            PLAY_NOTE_ARRAY(tone_caps_on,  false, LEGATO); -	    } -	    else if (!(usb_led & (1<<USB_LED_CAPS_LOCK)) && (old_usb_led & (1<<USB_LED_CAPS_LOCK))) -	    { -	            // If CAPS LK LED is turning off... -	            PLAY_NOTE_ARRAY(tone_caps_off, false, LEGATO); -	    } -	    else if ((usb_led & (1<<USB_LED_NUM_LOCK)) && !(old_usb_led & (1<<USB_LED_NUM_LOCK))) -	    { -	            // If NUM LK LED is turning on... -	            PLAY_NOTE_ARRAY(tone_numlk_on,  false, LEGATO); -	    } -	    else if (!(usb_led & (1<<USB_LED_NUM_LOCK)) && (old_usb_led & (1<<USB_LED_NUM_LOCK))) -	    { -	            // If NUM LED is turning off... -	            PLAY_NOTE_ARRAY(tone_numlk_off, false, LEGATO); -	    } -	    else if ((usb_led & (1<<USB_LED_SCROLL_LOCK)) && !(old_usb_led & (1<<USB_LED_SCROLL_LOCK))) -	    { -	            // If SCROLL LK LED is turning on... -	            PLAY_NOTE_ARRAY(tone_scroll_on,  false, LEGATO); -	    } -	    else if (!(usb_led & (1<<USB_LED_SCROLL_LOCK)) && (old_usb_led & (1<<USB_LED_SCROLL_LOCK))) -	    { -	            // If SCROLL LED is turning off... -	            PLAY_NOTE_ARRAY(tone_scroll_off, false, LEGATO); -	    } -	} +    if (!is_playing_notes()) +    { +        if ((usb_led & (1<<USB_LED_CAPS_LOCK)) && !(old_usb_led & (1<<USB_LED_CAPS_LOCK))) +        { +                // If CAPS LK LED is turning on... +                PLAY_NOTE_ARRAY(tone_caps_on,  false, LEGATO); +        } +        else if (!(usb_led & (1<<USB_LED_CAPS_LOCK)) && (old_usb_led & (1<<USB_LED_CAPS_LOCK))) +        { +                // If CAPS LK LED is turning off... +                PLAY_NOTE_ARRAY(tone_caps_off, false, LEGATO); +        } +        else if ((usb_led & (1<<USB_LED_NUM_LOCK)) && !(old_usb_led & (1<<USB_LED_NUM_LOCK))) +        { +                // If NUM LK LED is turning on... +                PLAY_NOTE_ARRAY(tone_numlk_on,  false, LEGATO); +        } +        else if (!(usb_led & (1<<USB_LED_NUM_LOCK)) && (old_usb_led & (1<<USB_LED_NUM_LOCK))) +        { +                // If NUM LED is turning off... +                PLAY_NOTE_ARRAY(tone_numlk_off, false, LEGATO); +        } +        else if ((usb_led & (1<<USB_LED_SCROLL_LOCK)) && !(old_usb_led & (1<<USB_LED_SCROLL_LOCK))) +        { +                // If SCROLL LK LED is turning on... +                PLAY_NOTE_ARRAY(tone_scroll_on,  false, LEGATO); +        } +        else if (!(usb_led & (1<<USB_LED_SCROLL_LOCK)) && (old_usb_led & (1<<USB_LED_SCROLL_LOCK))) +        { +                // If SCROLL LED is turning off... +                PLAY_NOTE_ARRAY(tone_scroll_off, false, LEGATO); +        } +    }      old_usb_led = usb_led;  } @@ -514,7 +586,8 @@ void play_startup_tone()  void play_goodbye_tone()  {      PLAY_NOTE_ARRAY(tone_my_goodbye, false, STACCATO); -    _delay_ms(1000); +    _delay_ms(2000); +    stop_all_notes();  }  #endif /* AUDIO_ENABLE */
\ No newline at end of file diff --git a/keyboard/atomic/keymaps/pvc/makefile.mk b/keyboard/atomic/keymaps/pvc/makefile.mk index eefa42855..f7798b09d 100644 --- a/keyboard/atomic/keymaps/pvc/makefile.mk +++ b/keyboard/atomic/keymaps/pvc/makefile.mk @@ -4,7 +4,7 @@ EXTRAKEY_ENABLE  = yes # Audio control and System control(+450)  CONSOLE_ENABLE   = no  # Console for debug(+400)  COMMAND_ENABLE   = yes # Commands for debug and configuration  NKRO_ENABLE      = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = no  # Enable keyboard backlight functionality +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality  MIDI_ENABLE      = no  # MIDI controls  AUDIO_ENABLE     = yes # Audio output on port C6  UNICODE_ENABLE   = no  # Unicode diff --git a/keyboard/planck/keymaps/experimental/README.md b/keyboard/planck/keymaps/experimental/README.md new file mode 100644 index 000000000..de9680b49 --- /dev/null +++ b/keyboard/planck/keymaps/experimental/README.md @@ -0,0 +1,2 @@ +# The Default Planck Layout + diff --git a/keyboard/planck/keymaps/experimental/keymap.c b/keyboard/planck/keymaps/experimental/keymap.c new file mode 100644 index 000000000..fc3ac4a97 --- /dev/null +++ b/keyboard/planck/keymaps/experimental/keymap.c @@ -0,0 +1,383 @@ +// This is the canonical layout file for the Quantum project. If you want to add another keyboard, +// this is the style you want to emulate. + +#include "planck.h" +#include "action_layer.h" +#ifdef AUDIO_ENABLE +  #include "audio.h" +#endif +#include "eeconfig.h" + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _MUSIC 5 +#define _PLOVER 6 +#define _ADJUST 16 + +// Macro name shortcuts +#define QWERTY M(_QWERTY) +#define COLEMAK M(_COLEMAK) +#define DVORAK M(_DVORAK) +#define LOWER M(_LOWER) +#define RAISE M(_RAISE) +#define M_BL 5 +#define AUD_OFF M(6) +#define AUD_ON M(7) +#define MUS_OFF M(8) +#define MUS_ON M(9) +#define VC_IN M(10) +#define VC_DE M(11) +#define PLOVER M(12) +#define EXT_PLV M(13) + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  "   | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = { +  {KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC}, +  {KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT}, +  {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT }, +  {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT} +}, + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |  "   | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = { +  {KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_BSPC}, +  {KC_ESC,  KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT}, +  {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT }, +  {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT} +}, + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | Tab  |   "  |   ,  |   .  |   P  |   Y  |   F  |   G  |   C  |   R  |   L  | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc  |   A  |   O  |   E  |   U  |   I  |   D  |   H  |   T  |   N  |   S  |  /   | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift|   ;  |   Q  |   J  |   K  |   X  |   B  |   M  |   W  |   V  |   Z  |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = { +  {KC_TAB,  KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    KC_BSPC}, +  {KC_ESC,  KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    KC_SLSH}, +  {KC_LSFT, KC_SCLN, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    KC_ENT }, +  {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT} +}, + +/* Lower + * ,-----------------------------------------------------------------------------------. + * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |   {  |   }  |  |   | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |      |      |      |      |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = { +  {KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, +  {KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, +  {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  _______, _______, _______, _______, _______}, +  {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, + +/* Raise + * ,-----------------------------------------------------------------------------------. + * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   -  |   =  |   [  |   ]  |  \   | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |      |      |      |      |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = { +  {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC}, +  {KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS}, +  {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  _______, _______, _______, _______, _______}, +  {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, + +/* Music (reserved for process_action_user) + * + */ +[_MUSIC] = { +  {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, +  {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, +  {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, +  {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, LOWER,   XXXXXXX, XXXXXXX, RAISE,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX} +}, + +/* Plover layer (http://opensteno.org) + * ,-----------------------------------------------------------------------------------. + * |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * |      |   S  |   T  |   P  |   H  |   *  |   *  |   F  |   P  |   L  |   T  |   D  | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * |      |   S  |   K  |   W  |   R  |   *  |   *  |   R  |   B  |   G  |   S  |   Z  | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Exit |      |      |   A  |   O  |             |   E  |   U  |      |      |      | + * `-----------------------------------------------------------------------------------' + */ + +[_PLOVER] = { +  {KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1   }, +  {XXXXXXX, KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC}, +  {XXXXXXX, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT}, +  {EXT_PLV, XXXXXXX, XXXXXXX, KC_C,    KC_V,    XXXXXXX, XXXXXXX, KC_N,    KC_M,    XXXXXXX, XXXXXXX, XXXXXXX} +}, + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * |      | Reset|      |      |      |      |      |      |      |      |      |  Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * |      |      |      |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover|      | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * |      |Voice-|Voice+|Mus on|Musoff|      |      |      |      |      |      |      | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |      |      |      |      |      |             |      |      |      |      |      | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = { +  {_______, RESET,   _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, +  {_______, _______, _______, AUD_ON,  AUD_OFF, AG_NORM, AG_SWAP, QWERTY,  COLEMAK, DVORAK,  PLOVER,  _______}, +  {_______, VC_DE,   VC_IN,   MUS_ON,  MUS_OFF, _______, _______, _______, _______, _______, _______, _______}, +  {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} +} + + +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + +#ifdef AUDIO_ENABLE +float tone_startup[][2] = { +  {440.0*pow(2.0,(31)/12.0), 12}, +  {440.0*pow(2.0,(28)/12.0), 8}, +  {440.0*pow(2.0,(19)/12.0), 8}, +  {440.0*pow(2.0,(24)/12.0), 8}, +  {440.0*pow(2.0,(28)/12.0), 20} +}; + +float tone_qwerty[][2]     = SONG(QWERTY_SOUND); +float tone_dvorak[][2]     = SONG(DVORAK_SOUND); +float tone_colemak[][2]    = SONG(COLEMAK_SOUND); +float tone_plover[][2]     = SONG(PLOVER_SOUND); +float tone_plover_gb[][2]  = SONG(PLOVER_GOODBYE_SOUND); + +float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); +float goodbye[][2] = SONG(GOODBYE_SOUND); +#endif + + +void persistant_default_layer_set(uint16_t default_layer) { +  eeconfig_update_default_layer(default_layer); +  default_layer_set(default_layer); +} + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ +      switch(id) { +        case _QWERTY: +          if (record->event.pressed) { +            #ifdef AUDIO_ENABLE +              PLAY_NOTE_ARRAY(tone_qwerty, false, 0); +            #endif +            persistant_default_layer_set(1UL<<_QWERTY); +          } +          break; +        case _COLEMAK: +          if (record->event.pressed) { +            #ifdef AUDIO_ENABLE +              PLAY_NOTE_ARRAY(tone_colemak, false, 0); +            #endif +            persistant_default_layer_set(1UL<<_COLEMAK); +          } +          break; +        case _DVORAK: +          if (record->event.pressed) { +            #ifdef AUDIO_ENABLE +              PLAY_NOTE_ARRAY(tone_dvorak, false, 0); +            #endif +            persistant_default_layer_set(1UL<<_DVORAK); +          } +          break; +        case _LOWER: +          if (record->event.pressed) { +            layer_on(_LOWER); +                breathing_speed_set(2); +                breathing_pulse(); +            update_tri_layer(_LOWER, _RAISE, _ADJUST); +          } else { +            layer_off(_LOWER); +            update_tri_layer(_LOWER, _RAISE, _ADJUST); +          } +          break; +        case _RAISE: +          if (record->event.pressed) { +            layer_on(_RAISE); +                breathing_speed_set(2); +                breathing_pulse(); +            update_tri_layer(_LOWER, _RAISE, _ADJUST); +          } else { +            layer_off(_RAISE); +            update_tri_layer(_LOWER, _RAISE, _ADJUST); +          } +          break; +        case M_BL: +          if (record->event.pressed) { +            register_code(KC_RSFT); +            #ifdef BACKLIGHT_ENABLE +              backlight_step(); +            #endif +          } else { +            unregister_code(KC_RSFT); +          } +        break; +        case 6: +          if (record->event.pressed) { +            #ifdef AUDIO_ENABLE +              audio_off(); +            #endif +          } +        break; +        case 7: +          if (record->event.pressed) { +            #ifdef AUDIO_ENABLE +              audio_on(); +              PLAY_NOTE_ARRAY(tone_startup, false, 0); +            #endif +          } +        break; +        case 8: +          if (record->event.pressed) { +            #ifdef AUDIO_ENABLE +              layer_off(_MUSIC); +              stop_all_notes(); +            #endif +          } +        break; +        case 9: +          if (record->event.pressed) { +            #ifdef AUDIO_ENABLE +              PLAY_NOTE_ARRAY(music_scale, false, 0); +              layer_on(_MUSIC); +            #endif +          } +        break; +        case 10: +          if (record->event.pressed) { +            #ifdef AUDIO_ENABLE +              voice_iterate(); +              PLAY_NOTE_ARRAY(music_scale, false, 0); +            #endif +          } +        break; +        case 11: +          if (record->event.pressed) { +            #ifdef AUDIO_ENABLE +              voice_deiterate(); +              PLAY_NOTE_ARRAY(music_scale, false, 0); +            #endif +          } +        break; +        case 12: +          if (record->event.pressed) { +            #ifdef AUDIO_ENABLE +              stop_all_notes(); +              PLAY_NOTE_ARRAY(tone_plover, false, 0); +            #endif +            layer_off(_RAISE); +            layer_off(_LOWER); +            layer_off(_ADJUST); +            layer_off(_MUSIC); +            layer_on(_PLOVER); +            if (!eeconfig_is_enabled()) { +                eeconfig_init(); +            } +            keymap_config.raw = eeconfig_read_keymap(); +            keymap_config.nkro = 1; +            eeconfig_update_keymap(keymap_config.raw); +          } +        break; +        case 13: +          if (record->event.pressed) { +            #ifdef AUDIO_ENABLE +              PLAY_NOTE_ARRAY(tone_plover_gb, false, 0); +            #endif +            layer_off(_PLOVER); +          } +        break; + +      } +    return MACRO_NONE; +}; + +void matrix_init_user(void) { +  #ifdef AUDIO_ENABLE +    _delay_ms(20); // stops the tick +    PLAY_NOTE_ARRAY(tone_startup, false, 0); +  #endif +} + +#ifdef AUDIO_ENABLE +void play_goodbye_tone() +{ +  PLAY_NOTE_ARRAY(goodbye, false, 0); +  _delay_ms(150); +} + +uint8_t starting_note = 0x0C; +int offset = 0; + +void process_action_user(keyrecord_t *record) { + +  if (IS_LAYER_ON(_MUSIC)) { +    if (record->event.pressed) { +        play_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF); +    } else { +        stop_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row))); +    } +  } + +} +#endif diff --git a/keyboard/planck/keymaps/experimental/makefile.mk b/keyboard/planck/keymaps/experimental/makefile.mk new file mode 100644 index 000000000..99fbfbd0b --- /dev/null +++ b/keyboard/planck/keymaps/experimental/makefile.mk @@ -0,0 +1,2 @@ +AUDIO_ENABLE = yes +NKRO_ENABLE = yes
\ No newline at end of file diff --git a/keyboard/planck/keymaps/pvc/keymap.c b/keyboard/planck/keymaps/pvc/keymap.c index 830b00a4c..177f04484 100644 --- a/keyboard/planck/keymaps/pvc/keymap.c +++ b/keyboard/planck/keymaps/pvc/keymap.c @@ -38,6 +38,7 @@  #define MACRO_AUDIO_OFF     17  #define MACRO_INC_VOICE     18  #define MACRO_DEC_VOICE     19 +#define MACRO_BACKLIGHT     20  #define M_QWRTY             M(MACRO_QWERTY)  #define M_COLMK             M(MACRO_COLEMAK) @@ -53,6 +54,7 @@  #define TMPO_UP             M(MACRO_TEMPO_U)  #define TMPO_DN             M(MACRO_TEMPO_D)  #define TMPO_DF             M(MACRO_TONE_DEFAULT) +#define M_BACKL             M(MACRO_BACKLIGHT)  #define MUS_ON              M(MACRO_MUSIC_ON) @@ -217,7 +219,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {   [LAYER_ADJUST]       = { /* ADJUST */    { _______, TIMBR_1, TIMBR_2, TIMBR_3, TIMBR_4, TMPO_UP, TMPO_DN, TMPO_DF, MUS_ON,  MUS_OFF, AUD_ON,  AUD_OFF  },    { _______, M_QWRTY, M_COLMK, M_DVORK, _______, _______, _______, _______, _______, _______, _______, _______  }, -  { _______, _______, _______, _______, _______, RESET,   _______, M_MOUSE, _______, _______, _______, _______  }, +  { _______, _______, _______, _______, M_BACKL, RESET,   _______, M_MOUSE, _______, _______, _______, _______  },    { _______, _______, _______, _______, _______, _______, _______, _______, VC_UP,   VC_DOWN, _______, _______  },   }, @@ -337,6 +339,15 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)              }              break; + +#ifdef BACKLIGHT_ENABLE +		case MACRO_BACKLIGHT: +			if (record->event.pressed) +			{ +				backlight_step(); +			} +#endif +  #ifdef MOUSEKEY_ENABLE          case MACRO_MOUSE: diff --git a/keyboard/planck/keymaps/pvc/makefile.mk b/keyboard/planck/keymaps/pvc/makefile.mk index b3f1b9e51..f7798b09d 100644 --- a/keyboard/planck/keymaps/pvc/makefile.mk +++ b/keyboard/planck/keymaps/pvc/makefile.mk @@ -1,12 +1,12 @@  BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)  MOUSEKEY_ENABLE  = yes # Mouse keys(+4700)  EXTRAKEY_ENABLE  = yes # Audio control and System control(+450) -CONSOLE_ENABLE   = yes # Console for debug(+400) +CONSOLE_ENABLE   = no  # Console for debug(+400)  COMMAND_ENABLE   = yes # Commands for debug and configuration  NKRO_ENABLE      = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = no  # Enable keyboard backlight functionality +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality  MIDI_ENABLE      = no  # MIDI controls -AUDIO_ENABLE     = no  # Audio output on port C6 +AUDIO_ENABLE     = yes # Audio output on port C6  UNICODE_ENABLE   = no  # Unicode  BLUETOOTH_ENABLE = no  # Enable Bluetooth with the Adafruit EZ-Key HID  RGBLIGHT_ENABLE  = no  # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time. diff --git a/keyboard/planck/planck.c b/keyboard/planck/planck.c index 655850150..446353dbf 100644 --- a/keyboard/planck/planck.c +++ b/keyboard/planck/planck.c @@ -9,6 +9,9 @@ void matrix_scan_user(void) {}  __attribute__ ((weak))  void process_action_user(keyrecord_t *record) {} +__attribute__ ((weak)) +void led_set_user(uint8_t usb_led) {} +  void matrix_init_kb(void) {  #ifdef BACKLIGHT_ENABLE  	backlight_init_ports(); @@ -33,8 +36,22 @@ void process_action_kb(keyrecord_t *record) {  	process_action_user(record);  } +void led_set_kb(uint8_t usb_led) { +    // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + +    led_set_user(usb_led); +} +  #ifdef BACKLIGHT_ENABLE  #define CHANNEL OCR1C +#define BREATHING_NO_HALT  0 +#define BREATHING_HALT_OFF 1 +#define BREATHING_HALT_ON  2 + +static uint8_t breath_intensity; +static uint8_t breath_speed; +static uint16_t breathing_index; +static uint8_t breathing_halt;  void backlight_init_ports()  { @@ -60,22 +77,22 @@ void backlight_init_ports()      TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;      backlight_init(); +    breathing_defaults();  }  void backlight_set(uint8_t level)  { +    // Prevent backlight blink on lowest level +    PORTB &= ~(_BV(PORTB7)); +      if ( level == 0 )      {          // Turn off PWM control on PB7, revert to output low.          TCCR1A &= ~(_BV(COM1C1));          CHANNEL = 0x0; -        // Prevent backlight blink on lowest level -        PORTB &= ~(_BV(PORTB7));      }      else if ( level == BACKLIGHT_LEVELS )      { -        // Prevent backlight blink on lowest level -        PORTB &= ~(_BV(PORTB7));          // Turn on PWM control of PB7          TCCR1A |= _BV(COM1C1);          // Set the brightness @@ -83,13 +100,205 @@ void backlight_set(uint8_t level)      }      else              { -        // Prevent backlight blink on lowest level -        PORTB &= ~(_BV(PORTB7));          // Turn on PWM control of PB7          TCCR1A |= _BV(COM1C1);          // Set the brightness          CHANNEL = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2));      } +    breathing_intensity_default(); +} + + +void breathing_enable(void) +{ +    if (get_backlight_level() == 0) +    { +        breathing_index = 0; +    } +    else +    { +        // Set breathing_index to be at the midpoint (brightest point) +        breathing_index = 0x20 << breath_speed; +    } + +    breathing_halt = BREATHING_NO_HALT; + +    // Enable breathing interrupt +    TIMSK1 |= _BV(OCIE1A); +} + +void breathing_pulse(void) +{ +    if (get_backlight_level() == 0) +    { +        breathing_index = 0; +    } +    else +    { +        // Set breathing_index to be at the midpoint + 1 (brightest point) +        breathing_index = 0x21 << breath_speed; +    } + +    breathing_halt = BREATHING_HALT_ON; + +    // Enable breathing interrupt +    TIMSK1 |= _BV(OCIE1A);  } +void breathing_disable(void) +{ +    // Disable breathing interrupt +    TIMSK1 &= ~_BV(OCIE1A); +    backlight_set(get_backlight_level()); +} + +void breathing_self_disable(void) +{ +    if (get_backlight_level() == 0) +    { +        breathing_halt = BREATHING_HALT_OFF; +    } +    else +    { +        breathing_halt = BREATHING_HALT_ON; +    } + +    //backlight_set(get_backlight_level()); +} + +void breathing_toggle(void) +{ +    if (!is_breathing()) +    { +        if (get_backlight_level() == 0) +        { +            breathing_index = 0; +        } +        else +        { +            // Set breathing_index to be at the midpoint + 1 (brightest point) +            breathing_index = 0x21 << breath_speed; +        } + +        breathing_halt = BREATHING_NO_HALT; +    } + +    // Toggle breathing interrupt +    TIMSK1 ^= _BV(OCIE1A); + +    // Restore backlight level +    if (!is_breathing()) +    { +        backlight_set(get_backlight_level()); +    } +} + +bool is_breathing(void) +{ +    return (TIMSK1 && _BV(OCIE1A)); +} + +void breathing_intensity_default(void) +{ +    //breath_intensity = (uint8_t)((uint16_t)100 * (uint16_t)get_backlight_level() / (uint16_t)BACKLIGHT_LEVELS); +    breath_intensity = ((BACKLIGHT_LEVELS - get_backlight_level()) * ((BACKLIGHT_LEVELS + 1) / 2)); +} + +void breathing_intensity_set(uint8_t value) +{ +    breath_intensity = value; +} + +void breathing_speed_default(void) +{ +    breath_speed = 4; +} + +void breathing_speed_set(uint8_t value) +{ +    bool is_breathing_now = is_breathing(); +    uint8_t old_breath_speed = breath_speed; + +    if (is_breathing_now) +    { +        // Disable breathing interrupt +        TIMSK1 &= ~_BV(OCIE1A); +    } + +    breath_speed = value; + +    if (is_breathing_now) +    { +        // Adjust index to account for new speed +        breathing_index = (( (uint8_t)( (breathing_index) >> old_breath_speed ) ) & 0x3F) << breath_speed; + +        // Enable breathing interrupt +        TIMSK1 |= _BV(OCIE1A); +    } + +} + +void breathing_speed_inc(uint8_t value) +{ +    if ((uint16_t)(breath_speed - value) > 10 ) +    { +        breathing_speed_set(0); +    } +    else +    { +        breathing_speed_set(breath_speed - value); +    } +} + +void breathing_speed_dec(uint8_t value) +{ +    if ((uint16_t)(breath_speed + value) > 10 ) +    { +        breathing_speed_set(10); +    } +    else +    { +        breathing_speed_set(breath_speed + value); +    } +} + +void breathing_defaults(void) +{ +    breathing_intensity_default(); +    breathing_speed_default(); +    breathing_halt = BREATHING_NO_HALT; +} + +/* Breathing Sleep LED brighness(PWM On period) table + * (64[steps] * 4[duration]) / 64[PWM periods/s] = 4 second breath cycle + * + * http://www.wolframalpha.com/input/?i=%28sin%28+x%2F64*pi%29**8+*+255%2C+x%3D0+to+63 + * (0..63).each {|x| p ((sin(x/64.0*PI)**8)*255).to_i } + */ +static const uint8_t breathing_table[64] PROGMEM = { +  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   4,   6,  10, + 15,  23,  32,  44,  58,  74,  93, 113, 135, 157, 179, 199, 218, 233, 245, 252, +255, 252, 245, 233, 218, 199, 179, 157, 135, 113,  93,  74,  58,  44,  32,  23, + 15,  10,   6,   4,   2,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, +}; + +ISR(TIMER1_COMPA_vect) +{ +    // CHANNEL = (pgm_read_byte(&breathing_table[ ( (uint8_t)( (breathing_index++) >> breath_speed ) ) & 0x3F ] )) * breath_intensity; + + +    uint8_t local_index = ( (uint8_t)( (breathing_index++) >> breath_speed ) ) & 0x3F; + +    if (((breathing_halt == BREATHING_HALT_ON) && (local_index == 0x20)) || ((breathing_halt == BREATHING_HALT_OFF) && (local_index == 0x3F))) +    { +        // Disable breathing interrupt +        TIMSK1 &= ~_BV(OCIE1A); +    } + +    CHANNEL = (uint16_t)(((uint16_t)pgm_read_byte(&breathing_table[local_index]) * 257)) >> breath_intensity; + +} + + +  #endif
\ No newline at end of file diff --git a/keyboard/planck/planck.h b/keyboard/planck/planck.h index c5b59d999..cfd4956bf 100644 --- a/keyboard/planck/planck.h +++ b/keyboard/planck/planck.h @@ -45,4 +45,22 @@ void matrix_init_user(void);  void matrix_scan_user(void);  void process_action_user(keyrecord_t *record); +void led_set_user(uint8_t usb_led); +void backlight_init_ports(void); + +void breathing_enable(void); +void breathing_pulse(void); +void breathing_disable(void); +void breathing_self_disable(void); +void breathing_toggle(void); +bool is_breathing(void); + + +void breathing_defaults(void); +void breathing_intensity_default(void); +void breathing_speed_default(void); +void breathing_speed_set(uint8_t value); +void breathing_speed_inc(uint8_t value); +void breathing_speed_dec(uint8_t value); +  #endif diff --git a/quantum/audio/audio.c b/quantum/audio/audio.c index 3a7f0f556..27b64f8c9 100644 --- a/quantum/audio/audio.c +++ b/quantum/audio/audio.c @@ -374,6 +374,10 @@ bool is_playing_notes(void) {  	return playing_notes;  } +bool is_audio_on(void) { +    return (audio_config.enable != 0); +} +  void audio_toggle(void) {      audio_config.enable ^= 1;      eeconfig_update_audio(audio_config.raw); diff --git a/quantum/audio/audio.h b/quantum/audio/audio.h index 3d706587a..4ba879bbb 100644 --- a/quantum/audio/audio.h +++ b/quantum/audio/audio.h @@ -25,6 +25,7 @@ typedef union {      };  } audio_config_t; +bool is_audio_on(void);  void audio_toggle(void);  void audio_on(void);  void audio_off(void); @@ -71,11 +72,11 @@ void stop_note(float freq);  void stop_all_notes(void);  void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest); -#define SCALE (int []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \ -						0 + (12*1), 2 + (12*1), 4 + (12*1), 5 + (12*1), 7 + (12*1), 9 + (12*1), 11 + (12*1), \ -						0 + (12*2), 2 + (12*2), 4 + (12*2), 5 + (12*2), 7 + (12*2), 9 + (12*2), 11 + (12*2), \ -						0 + (12*3), 2 + (12*3), 4 + (12*3), 5 + (12*3), 7 + (12*3), 9 + (12*3), 11 + (12*3), \ -						0 + (12*4), 2 + (12*4), 4 + (12*4), 5 + (12*4), 7 + (12*4), 9 + (12*4), 11 + (12*4), } +#define SCALE (int8_t []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \ +                           0 + (12*1), 2 + (12*1), 4 + (12*1), 5 + (12*1), 7 + (12*1), 9 + (12*1), 11 + (12*1), \ +                           0 + (12*2), 2 + (12*2), 4 + (12*2), 5 + (12*2), 7 + (12*2), 9 + (12*2), 11 + (12*2), \ +                           0 + (12*3), 2 + (12*3), 4 + (12*3), 5 + (12*3), 7 + (12*3), 9 + (12*3), 11 + (12*3), \ +                           0 + (12*4), 2 + (12*4), 4 + (12*4), 5 + (12*4), 7 + (12*4), 9 + (12*4), 11 + (12*4), }  // These macros are used to allow play_notes to play an array of indeterminate  // length. This works around the limitation of C's sizeof operation on pointers. diff --git a/quantum/keymap_common.h b/quantum/keymap_common.h index 8c27e9035..322fda498 100644 --- a/quantum/keymap_common.h +++ b/quantum/keymap_common.h @@ -87,8 +87,11 @@ extern const uint16_t fn_actions[];  #define KC_EXCLAIM  KC_EXLM  #define KC_AT   LSFT(KC_2)      // @ + +  #define KC_HASH LSFT(KC_3)      // # +  #define KC_DLR  LSFT(KC_4)      // $  #define KC_DOLLAR   KC_DLR @@ -110,11 +113,13 @@ extern const uint16_t fn_actions[];  #define KC_RPRN LSFT(KC_0)      // )  #define KC_RIGHT_PAREN  KC_RPRN +  #define KC_UNDS LSFT(KC_MINS)   // _  #define KC_UNDERSCORE   KC_UNDS  #define KC_PLUS LSFT(KC_EQL)    // + +  #define KC_LCBR LSFT(KC_LBRC)   // {  #define KC_LEFT_CURLY_BRACE KC_LCBR @@ -132,6 +137,19 @@ extern const uint16_t fn_actions[];  #define KC_PIPE LSFT(KC_BSLS)   // | +#define KC_LT LSFT(KC_COMM)     // < + + +#define KC_GT LSFT(KC_DOT)      // > + + +#define KC_QUES LSFT(KC_SLSH)   // ? +#define KC_QUESTION KC_QUES + + +#define KC_DQT LSFT(KC_QUOT)   // " +#define KC_DOUBLE_QUOTE KC_DQT +  #define KC_DELT KC_DELETE // Del key (four letter code)  // Alias for function layers than expand past FN31 diff --git a/quantum/keymap_midi.h b/quantum/keymap_midi.h index 795f26380..3a2bf3aff 100644 --- a/quantum/keymap_midi.h +++ b/quantum/keymap_midi.h @@ -25,11 +25,11 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #define CHNL(note, channel) (note + (channel << 8)) -#define SCALE (int []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \ -						0 + (12*1), 2 + (12*1), 4 + (12*1), 5 + (12*1), 7 + (12*1), 9 + (12*1), 11 + (12*1), \ -						0 + (12*2), 2 + (12*2), 4 + (12*2), 5 + (12*2), 7 + (12*2), 9 + (12*2), 11 + (12*2), \ -						0 + (12*3), 2 + (12*3), 4 + (12*3), 5 + (12*3), 7 + (12*3), 9 + (12*3), 11 + (12*3), \ -						0 + (12*4), 2 + (12*4), 4 + (12*4), 5 + (12*4), 7 + (12*4), 9 + (12*4), 11 + (12*4), } +#define SCALE (int8_t []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \ +                           0 + (12*1), 2 + (12*1), 4 + (12*1), 5 + (12*1), 7 + (12*1), 9 + (12*1), 11 + (12*1), \ +                           0 + (12*2), 2 + (12*2), 4 + (12*2), 5 + (12*2), 7 + (12*2), 9 + (12*2), 11 + (12*2), \ +                           0 + (12*3), 2 + (12*3), 4 + (12*3), 5 + (12*3), 7 + (12*3), 9 + (12*3), 11 + (12*3), \ +                           0 + (12*4), 2 + (12*4), 4 + (12*4), 5 + (12*4), 7 + (12*4), 9 + (12*4), 11 + (12*4), }  #define N_CN1  (0x600C + (12 * -1) + 0 )  #define N_CN1S (0x600C + (12 * -1) + 1 ) diff --git a/quantum/quantum.mk b/quantum/quantum.mk index ff34c463a..5f4c2f045 100644 --- a/quantum/quantum.mk +++ b/quantum/quantum.mk @@ -28,9 +28,9 @@ ifeq ($(strip $(MIDI_ENABLE)), yes)  endif  ifeq ($(strip $(AUDIO_ENABLE)), yes) -	SRC += $(QUANTUM_DIR)/audio/audio.c -	SRC += $(QUANTUM_DIR)/audio/voices.c -	SRC += $(QUANTUM_DIR)/audio/luts.c +    SRC += $(QUANTUM_DIR)/audio/audio.c +    SRC += $(QUANTUM_DIR)/audio/voices.c +    SRC += $(QUANTUM_DIR)/audio/luts.c  endif  ifeq ($(strip $(UNICODE_ENABLE)), yes) diff --git a/tmk_core/common/backlight.c b/tmk_core/common/backlight.c index 2f6fc1cd6..c9e8fd3fd 100644 --- a/tmk_core/common/backlight.c +++ b/tmk_core/common/backlight.c @@ -83,3 +83,8 @@ void backlight_level(uint8_t level)      eeconfig_update_backlight(backlight_config.raw);      backlight_set(backlight_config.level);  } + +uint8_t get_backlight_level(void) +{ +    return backlight_config.level; +}
\ No newline at end of file diff --git a/tmk_core/common/backlight.h b/tmk_core/common/backlight.h index 525ec8bbe..f57309267 100644 --- a/tmk_core/common/backlight.h +++ b/tmk_core/common/backlight.h @@ -36,5 +36,6 @@ void backlight_toggle(void);  void backlight_step(void);  void backlight_set(uint8_t level);  void backlight_level(uint8_t level); +uint8_t get_backlight_level(void);  #endif diff --git a/tmk_core/common/command.c b/tmk_core/common/command.c index f06abaf7f..9edcc42a0 100644 --- a/tmk_core/common/command.c +++ b/tmk_core/common/command.c @@ -357,9 +357,11 @@ static bool command_common(uint8_t code)              clear_keyboard(); // clear to prevent stuck keys              print("\n\nJumping to bootloader... ");              #ifdef AUDIO_ENABLE +	            stop_all_notes();                  play_goodbye_tone(); +            #else +	            _delay_ms(1000);              #endif -            _delay_ms(1000);              bootloader_jump(); // not return              break; diff --git a/tmk_core/common/nodebug.h b/tmk_core/common/nodebug.h index 93309ada4..5e18656e5 100644 --- a/tmk_core/common/nodebug.h +++ b/tmk_core/common/nodebug.h @@ -16,10 +16,14 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  */  #ifndef NODEBUG_H -#define NODEBUG_H 1 +#define NODEBUG_H -#define NO_DEBUG -#include "debug.h" -#undef NO_DEBUG +#ifndef NO_DEBUG +	#define NO_DEBUG +	#include "debug.h" +	#undef NO_DEBUG +#else +	#include "debug.h" +#endif  #endif  | 
