commit
						73625a603a
					
				@ -0,0 +1,107 @@
 | 
				
			||||
# Xyverz's Atreus Keymap
 | 
				
			||||
 | 
				
			||||
## About this keymap:
 | 
				
			||||
 | 
				
			||||
This is the second iteration of my Atreus keymap. The first one was as close to the planck as I could get at the
 | 
				
			||||
time, but still very much like the original Atreus keymap. I've managed to get things working better now and have
 | 
				
			||||
implemented (more like copied) the RAISE/LOWER/ADJUST layers. This is a work in progress, but I think I'm closer
 | 
				
			||||
to a final go with this.
 | 
				
			||||
 | 
				
			||||
I'm using MOD_TAP quite a bit in this keymap. On all layers, R4 pinky keys use mod-tap and are SHIFT when held
 | 
				
			||||
and their normal keys when tapped. In addition, ESC and TAB are also set as Ctrl and ALT respectively when held,
 | 
				
			||||
and Enter/ALT on the right thumb key for all layers.
 | 
				
			||||
 | 
				
			||||
I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar to the default Planck layouts.
 | 
				
			||||
 | 
				
			||||
Recently added: Documentation, Formatting, and another Dvorak layer that has Command on the left thumb, instead of
 | 
				
			||||
Control.
 | 
				
			||||
 | 
				
			||||
## Still to do:
 | 
				
			||||
 | 
				
			||||
 * Enjoy this revision; figure out new things later.
 | 
				
			||||
 | 
				
			||||
### Layer 0: Dvorak layer
 | 
				
			||||
 | 
				
			||||
	,----------------------------------.              ,----------------------------------.
 | 
				
			||||
	|   '  |   ,  |   .  |   P  |   Y  |              |   F  |   G  |   C  |   R  |   L  |
 | 
				
			||||
	|------+------+------+------+------|              |------+------+------+------+------|
 | 
				
			||||
	|   A  |   O  |   E  |   U  |   I  |              |   D  |   H  |   T  |   N  |   S  |
 | 
				
			||||
	|------+------+------+------+------|------.,------|------+------+------+------+------|
 | 
				
			||||
	|Shft ;|   Q  |   J  |   K  |   X  | CTRL ||Alt / |   B  |   M  |   W  |   V  |Shft Z|
 | 
				
			||||
	|------+------+------+------+------|      ||Enter |------+------+------+------+------|
 | 
				
			||||
	|  Esc |  Tab |  GUI | LOWER| BkSp |------'`------|  Spc | RAISE|   -  |   /  |   \  |
 | 
				
			||||
	`----------------------------------'              `----------------------------------'
 | 
				
			||||
 | 
				
			||||
### Layer 1: QWERTY layer
 | 
				
			||||
 | 
				
			||||
	,----------------------------------.              ,----------------------------------.
 | 
				
			||||
	|   Q  |   W  |   E  |   R  |   T  |              |   Y  |   U  |   I  |   O  |   P  |
 | 
				
			||||
	|------+------+------+------+------|              |------+------+------+------+------|
 | 
				
			||||
	|   A  |   S  |   D  |   F  |   G  |              |   H  |   J  |   K  |   L  |   ;  |
 | 
				
			||||
	|------+------+------+------+------|------.,------|------+------+------+------+------|
 | 
				
			||||
	|Shft Z|   X  |   C  |   V  |   B  | CTRL ||Alt / |   N  |   M  |   ,  |   .  |Shft /|
 | 
				
			||||
	|------+------+------+------+------|      ||Enter |------+------+------+------+------|
 | 
				
			||||
	|  Esc |  Tab |  GUI | LOWER| BkSp |------'`------|  Spc | RAISE|   -  |   '  |   \  |
 | 
				
			||||
	`----------------------------------'              `----------------------------------'
 | 
				
			||||
	 
 | 
				
			||||
### Keymap 2: Colemak layer
 | 
				
			||||
 | 
				
			||||
	,----------------------------------.              ,----------------------------------.
 | 
				
			||||
	|   Q  |   W  |   F  |   P  |   G  |              |   J  |   L  |   U  |   Y  |   L  |
 | 
				
			||||
	|------+------+------+------+------|              |------+------+------+------+------|
 | 
				
			||||
	|   A  |   R  |   S  |   T  |   D  |              |   H  |   N  |   E  |   I  |   S  |
 | 
				
			||||
	|------+------+------+------+------|------.,------|------+------+------+------+------|
 | 
				
			||||
	|Shft Z|   X  |   C  |   V  |   B  | CTRL ||Alt / |   K  |   M  |   ,  |   .  |Shft /|
 | 
				
			||||
	|------+------+------+------+------|      ||Enter |------+------+------+------+------|
 | 
				
			||||
	|  Esc |  Tab |  GUI | LOWER| BkSp |------'`------|  Spc | RAISE|   -  |   '  |   \  |
 | 
				
			||||
	`----------------------------------'              `----------------------------------'
 | 
				
			||||
 | 
				
			||||
### Keymap 3: Dvorak for Mac layout
 | 
				
			||||
 | 
				
			||||
	,----------------------------------.              ,----------------------------------.
 | 
				
			||||
	|   '  |   ,  |   .  |   P  |   Y  |              |   F  |   G  |   C  |   R  |   L  |
 | 
				
			||||
	|------+------+------+------+------|              |------+------+------+------+------|
 | 
				
			||||
	|   A  |   O  |   E  |   U  |   I  |              |   D  |   H  |   T  |   N  |   S  |
 | 
				
			||||
	|------+------+------+------+------|------.,------|------+------+------+------+------|
 | 
				
			||||
	|SFT/ ;|   Q  |   J  |   K  |   X  | CMD  ||Alt / |   B  |   M  |   W  |   V  |SFT/ Z|
 | 
				
			||||
	|------+------+------+------+------|      ||Enter |------+------+------+------+------|
 | 
				
			||||
	|  Esc |  Tab |  GUI | LOWER| BkSp |------'`------|  Spc | RAISE|   -  |   /  |   \  |
 | 
				
			||||
	`----------------------------------'              `----------------------------------'
 | 
				
			||||
 | 
				
			||||
### Keymap 4: LOWER layer
 | 
				
			||||
 | 
				
			||||
	,----------------------------------.              ,----------------------------------.
 | 
				
			||||
	|   !  |   @  |   #  |   $  |   %  |              |   ^  |   &  |   *  |   (  |   )  |
 | 
				
			||||
	|------+------+------+------+------|              |------+------+------+------+------|
 | 
				
			||||
	| CAPS |      |  UP  |      | Home |              | PgDn |      |   +  |   {  |   }  |
 | 
				
			||||
	|------+------+------+------+------|------.,------|------+------+------+------+------|
 | 
				
			||||
	|      | Left | Down | Right| End  |      ||      | PgUp | Mute | Vol- | Vol+ |      |
 | 
				
			||||
	|------+------+------+------+------|      ||      |------+------+------+------+------|
 | 
				
			||||
	|   ~  |      |      |      | Del  |------'`------| Ins  |      |      |      |      |
 | 
				
			||||
	`----------------------------------'              `----------------------------------'
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
### Keymap 5: RAISE layer
 | 
				
			||||
 | 
				
			||||
	,----------------------------------.              ,----------------------------------.
 | 
				
			||||
	|   1  |   2  |   3  |   4  |   5  |              |   6  |   7  |   8  |   9  |   0  |
 | 
				
			||||
	|------+------+------+------+------|              |------+------+------+------+------|
 | 
				
			||||
	| CAPS |      |  UP  |      | Home |              | PgDn |      |   =  |   [  |   ]  |
 | 
				
			||||
	|------+------+------+------+------|------.,------|------+------+------+------+------|
 | 
				
			||||
	|      | Left | Down | Right| End  |      ||      | PgUp | Prev | Play | Next |      |
 | 
				
			||||
	|------+------+------+------+------|      ||      |------+------+------+------+------|
 | 
				
			||||
	|   `  |      |      |      | Del  |------'`------| Ins  |      |      |      |      |
 | 
				
			||||
	`----------------------------------'              `----------------------------------'
 | 
				
			||||
 | 
				
			||||
### Keymap 6: ADJUST layer
 | 
				
			||||
 | 
				
			||||
	,----------------------------------.              ,----------------------------------.
 | 
				
			||||
	|  F1  |  F2  |  F3  |  F4  |  F5  |              |  F6  |  F7  |  F8  |  F9  | F10  |
 | 
				
			||||
	|------+------+------+------+------|              |------+------+------+------+------|
 | 
				
			||||
	|  F11 |      |      |      |      |              |      | PScr | SLck | Paus | F12  |
 | 
				
			||||
	|------+------+------+------+------|------.,------|------+------+------+------+------|
 | 
				
			||||
	|      |QWERTY|COLEMK|DVORAK|DVORMC|      ||      |      |      |      |      |      |
 | 
				
			||||
	|------+------+------+------+------|      ||      |------+------+------+------+------|
 | 
				
			||||
	|      |      |      |      |      |------'`------|      |      |      |      | RESET|
 | 
				
			||||
	`----------------------------------'              `----------------------------------'
 | 
				
			||||
 | 
				
			||||
@ -1,3 +1,3 @@
 | 
				
			||||
ifndef MAKEFILE_INCLUDED
 | 
				
			||||
	include ../../../Makefile
 | 
				
			||||
endif
 | 
				
			||||
endif
 | 
				
			||||
 | 
				
			||||
@ -0,0 +1,107 @@
 | 
				
			||||
/* Copyright 2017 Fred Sundvik
 | 
				
			||||
 *
 | 
				
			||||
 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||
 * it under the terms of the GNU General Public License as published by
 | 
				
			||||
 * the Free Software Foundation, either version 2 of the License, or
 | 
				
			||||
 * (at your option) any later version.
 | 
				
			||||
 *
 | 
				
			||||
 * This program is distributed in the hope that it will be useful,
 | 
				
			||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||
 * GNU General Public License for more details.
 | 
				
			||||
 *
 | 
				
			||||
 * You should have received a copy of the GNU General Public License
 | 
				
			||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
#if defined(VISUALIZER_ENABLE)
 | 
				
			||||
 | 
				
			||||
#include "animations.h"
 | 
				
			||||
#include "visualizer.h"
 | 
				
			||||
#ifdef LCD_ENABLE
 | 
				
			||||
#include "lcd_keyframes.h"
 | 
				
			||||
#endif
 | 
				
			||||
#ifdef LCD_BACKLIGHT_ENABLE
 | 
				
			||||
#include "lcd_backlight_keyframes.h"
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
#ifdef LED_ENABLE
 | 
				
			||||
#include "led_keyframes.h"
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
#include "visualizer_keyframes.h"
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
#if defined(LCD_ENABLE) && defined(LCD_BACKLIGHT_ENABLE)
 | 
				
			||||
 | 
				
			||||
// Don't worry, if the startup animation is long, you can use the keyboard like normal
 | 
				
			||||
// during that time
 | 
				
			||||
keyframe_animation_t default_startup_animation = {
 | 
				
			||||
    .num_frames = 4,
 | 
				
			||||
    .loop = false,
 | 
				
			||||
    .frame_lengths = {0, 0, 0, gfxMillisecondsToTicks(5000), 0},
 | 
				
			||||
    .frame_functions = {
 | 
				
			||||
            lcd_keyframe_enable,
 | 
				
			||||
            backlight_keyframe_enable,
 | 
				
			||||
            lcd_keyframe_draw_logo,
 | 
				
			||||
            backlight_keyframe_animate_color,
 | 
				
			||||
    },
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
keyframe_animation_t default_suspend_animation = {
 | 
				
			||||
    .num_frames = 4,
 | 
				
			||||
    .loop = false,
 | 
				
			||||
    .frame_lengths = {0, gfxMillisecondsToTicks(1000), 0, 0},
 | 
				
			||||
    .frame_functions = {
 | 
				
			||||
            lcd_keyframe_display_layer_text,
 | 
				
			||||
            backlight_keyframe_animate_color,
 | 
				
			||||
            lcd_keyframe_disable,
 | 
				
			||||
            backlight_keyframe_disable,
 | 
				
			||||
    },
 | 
				
			||||
};
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
#if defined(LED_ENABLE)
 | 
				
			||||
#define CROSSFADE_TIME 1000
 | 
				
			||||
#define GRADIENT_TIME 3000
 | 
				
			||||
 | 
				
			||||
keyframe_animation_t led_test_animation = {
 | 
				
			||||
    .num_frames = 14,
 | 
				
			||||
    .loop = true,
 | 
				
			||||
    .frame_lengths = {
 | 
				
			||||
        gfxMillisecondsToTicks(1000), // fade in
 | 
				
			||||
        gfxMillisecondsToTicks(1000), // no op (leds on)
 | 
				
			||||
        gfxMillisecondsToTicks(1000), // fade out
 | 
				
			||||
        gfxMillisecondsToTicks(CROSSFADE_TIME), // crossfade
 | 
				
			||||
        gfxMillisecondsToTicks(GRADIENT_TIME), // left to rigt (outside in)
 | 
				
			||||
        gfxMillisecondsToTicks(CROSSFADE_TIME), // crossfade
 | 
				
			||||
        gfxMillisecondsToTicks(GRADIENT_TIME), // top_to_bottom
 | 
				
			||||
        0,           // mirror leds
 | 
				
			||||
        gfxMillisecondsToTicks(CROSSFADE_TIME), // crossfade
 | 
				
			||||
        gfxMillisecondsToTicks(GRADIENT_TIME), // left_to_right (mirrored, so inside out)
 | 
				
			||||
        gfxMillisecondsToTicks(CROSSFADE_TIME), // crossfade
 | 
				
			||||
        gfxMillisecondsToTicks(GRADIENT_TIME), // top_to_bottom
 | 
				
			||||
        0,           // normal leds
 | 
				
			||||
        gfxMillisecondsToTicks(CROSSFADE_TIME), // crossfade
 | 
				
			||||
 | 
				
			||||
    },
 | 
				
			||||
    .frame_functions = {
 | 
				
			||||
        led_keyframe_fade_in_all,
 | 
				
			||||
        keyframe_no_operation,
 | 
				
			||||
        led_keyframe_fade_out_all,
 | 
				
			||||
        led_keyframe_crossfade,
 | 
				
			||||
        led_keyframe_left_to_right_gradient,
 | 
				
			||||
        led_keyframe_crossfade,
 | 
				
			||||
        led_keyframe_top_to_bottom_gradient,
 | 
				
			||||
        led_keyframe_mirror_orientation,
 | 
				
			||||
        led_keyframe_crossfade,
 | 
				
			||||
        led_keyframe_left_to_right_gradient,
 | 
				
			||||
        led_keyframe_crossfade,
 | 
				
			||||
        led_keyframe_top_to_bottom_gradient,
 | 
				
			||||
        led_keyframe_normal_orientation,
 | 
				
			||||
        led_keyframe_crossfade,
 | 
				
			||||
    },
 | 
				
			||||
};
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
#endif
 | 
				
			||||
@ -0,0 +1,30 @@
 | 
				
			||||
/* Copyright 2017 Fred Sundvik
 | 
				
			||||
 *
 | 
				
			||||
 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||
 * it under the terms of the GNU General Public License as published by
 | 
				
			||||
 * the Free Software Foundation, either version 2 of the License, or
 | 
				
			||||
 * (at your option) any later version.
 | 
				
			||||
 *
 | 
				
			||||
 * This program is distributed in the hope that it will be useful,
 | 
				
			||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||
 * GNU General Public License for more details.
 | 
				
			||||
 *
 | 
				
			||||
 * You should have received a copy of the GNU General Public License
 | 
				
			||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
#ifndef KEYBOARDS_ERGODOX_INFINITY_ANIMATIONS_H_
 | 
				
			||||
#define KEYBOARDS_ERGODOX_INFINITY_ANIMATIONS_H_
 | 
				
			||||
 | 
				
			||||
#include "visualizer.h"
 | 
				
			||||
 | 
				
			||||
// You can use these default animations, but of course you can also write your own custom ones instead
 | 
				
			||||
extern keyframe_animation_t default_startup_animation;
 | 
				
			||||
extern keyframe_animation_t default_suspend_animation;
 | 
				
			||||
 | 
				
			||||
// An animation for testing and demonstrating the led support, should probably not be used for real world
 | 
				
			||||
// cases
 | 
				
			||||
extern keyframe_animation_t led_test_animation;
 | 
				
			||||
 | 
				
			||||
#endif /* KEYBOARDS_ERGODOX_INFINITY_ANIMATIONS_H_ */
 | 
				
			||||
@ -0,0 +1,123 @@
 | 
				
			||||
/* Copyright 2017 Fred Sundvik
 | 
				
			||||
 *
 | 
				
			||||
 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||
 * it under the terms of the GNU General Public License as published by
 | 
				
			||||
 * the Free Software Foundation, either version 2 of the License, or
 | 
				
			||||
 * (at your option) any later version.
 | 
				
			||||
 *
 | 
				
			||||
 * This program is distributed in the hope that it will be useful,
 | 
				
			||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||
 * GNU General Public License for more details.
 | 
				
			||||
 *
 | 
				
			||||
 * You should have received a copy of the GNU General Public License
 | 
				
			||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
#ifndef KEYBOARDS_ERGODOX_INFINITY_SIMPLE_VISUALIZER_H_
 | 
				
			||||
#define KEYBOARDS_ERGODOX_INFINITY_SIMPLE_VISUALIZER_H_
 | 
				
			||||
 | 
				
			||||
// Currently we are assuming that both the backlight and LCD are enabled
 | 
				
			||||
// But it's entirely possible to write a custom visualizer that use only
 | 
				
			||||
// one of them
 | 
				
			||||
#ifndef LCD_BACKLIGHT_ENABLE
 | 
				
			||||
#error This visualizer needs that LCD backlight is enabled
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
#ifndef LCD_ENABLE
 | 
				
			||||
#error This visualizer needs that LCD is enabled
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
#include "visualizer.h"
 | 
				
			||||
#include "visualizer_keyframes.h"
 | 
				
			||||
#include "lcd_keyframes.h"
 | 
				
			||||
#include "lcd_backlight_keyframes.h"
 | 
				
			||||
#include "system/serial_link.h"
 | 
				
			||||
#include "led.h"
 | 
				
			||||
#include "animations.h"
 | 
				
			||||
 | 
				
			||||
static const uint32_t logo_background_color = LCD_COLOR(0x00, 0x00, 0xFF);
 | 
				
			||||
static const uint32_t initial_color = LCD_COLOR(0, 0, 0);
 | 
				
			||||
 | 
				
			||||
static bool initial_update = true;
 | 
				
			||||
 | 
				
			||||
// Feel free to modify the animations below, or even add new ones if needed
 | 
				
			||||
 | 
				
			||||
static keyframe_animation_t lcd_layer_display = {
 | 
				
			||||
    .num_frames = 1,
 | 
				
			||||
    .loop = false,
 | 
				
			||||
    .frame_lengths = {gfxMillisecondsToTicks(0)},
 | 
				
			||||
    .frame_functions = {lcd_keyframe_display_layer_and_led_states}
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
// The color animation animates the LCD color when you change layers
 | 
				
			||||
static keyframe_animation_t color_animation = {
 | 
				
			||||
    .num_frames = 2,
 | 
				
			||||
    .loop = false,
 | 
				
			||||
    // Note that there's a 200 ms no-operation frame,
 | 
				
			||||
    // this prevents the color from changing when activating the layer
 | 
				
			||||
    // momentarily
 | 
				
			||||
    .frame_lengths = {gfxMillisecondsToTicks(200), gfxMillisecondsToTicks(500)},
 | 
				
			||||
    .frame_functions = {keyframe_no_operation, backlight_keyframe_animate_color},
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
void initialize_user_visualizer(visualizer_state_t* state) {
 | 
				
			||||
    // The brightness will be dynamically adjustable in the future
 | 
				
			||||
    // But for now, change it here.
 | 
				
			||||
    lcd_backlight_brightness(130);
 | 
				
			||||
    state->current_lcd_color = initial_color;
 | 
				
			||||
    state->target_lcd_color = logo_background_color;
 | 
				
			||||
    initial_update = true;
 | 
				
			||||
    start_keyframe_animation(&default_startup_animation);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
// This function should be implemented by the keymap visualizer
 | 
				
			||||
// Don't change anything else than state->target_lcd_color and state->layer_text as that's the only thing
 | 
				
			||||
// that the simple_visualizer assumes that you are updating
 | 
				
			||||
// Also make sure that the buffer passed to state->layer_text remains valid until the previous animation is
 | 
				
			||||
// stopped. This can be done by either double buffering it or by using constant strings
 | 
				
			||||
static void get_visualizer_layer_and_color(visualizer_state_t* state);
 | 
				
			||||
 | 
				
			||||
void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) {
 | 
				
			||||
    // Add more tests, change the colors and layer texts here
 | 
				
			||||
    // Usually you want to check the high bits (higher layers first)
 | 
				
			||||
    // because that's the order layers are processed for keypresses
 | 
				
			||||
    // You can for check for example:
 | 
				
			||||
    // state->status.layer
 | 
				
			||||
    // state->status.default_layer
 | 
				
			||||
    // state->status.leds (see led.h for available statuses)
 | 
				
			||||
 | 
				
			||||
    uint32_t prev_color = state->target_lcd_color;
 | 
				
			||||
    const char* prev_layer_text = state->layer_text;
 | 
				
			||||
 | 
				
			||||
    get_visualizer_layer_and_color(state);
 | 
				
			||||
 | 
				
			||||
    if (initial_update || prev_color != state->target_lcd_color) {
 | 
				
			||||
        start_keyframe_animation(&color_animation);
 | 
				
			||||
    }
 | 
				
			||||
 | 
				
			||||
    if (initial_update || prev_layer_text != state->layer_text) {
 | 
				
			||||
        start_keyframe_animation(&lcd_layer_display);
 | 
				
			||||
    }
 | 
				
			||||
    // You can also stop existing animations, and start your custom ones here
 | 
				
			||||
    // remember that you should normally have only one animation for the LCD
 | 
				
			||||
    // and one for the background. But you can also combine them if you want.
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void user_visualizer_suspend(visualizer_state_t* state) {
 | 
				
			||||
    state->layer_text = "Suspending...";
 | 
				
			||||
    uint8_t hue = LCD_HUE(state->current_lcd_color);
 | 
				
			||||
    uint8_t sat = LCD_SAT(state->current_lcd_color);
 | 
				
			||||
    state->target_lcd_color = LCD_COLOR(hue, sat, 0);
 | 
				
			||||
    start_keyframe_animation(&default_suspend_animation);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void user_visualizer_resume(visualizer_state_t* state) {
 | 
				
			||||
    state->current_lcd_color = initial_color;
 | 
				
			||||
    state->target_lcd_color = logo_background_color;
 | 
				
			||||
    initial_update = true;
 | 
				
			||||
    start_keyframe_animation(&default_startup_animation);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
#endif /* KEYBOARDS_ERGODOX_INFINITY_SIMPLE_VISUALIZER_H_ */
 | 
				
			||||
@ -0,0 +1,329 @@
 | 
				
			||||
/*
 | 
				
			||||
Copyright 2016 Fred Sundvik <fsundvik@gmail.com>
 | 
				
			||||
 | 
				
			||||
This program is free software: you can redistribute it and/or modify
 | 
				
			||||
it under the terms of the GNU General Public License as published by
 | 
				
			||||
the Free Software Foundation, either version 2 of the License, or
 | 
				
			||||
(at your option) any later version.
 | 
				
			||||
 | 
				
			||||
This program is distributed in the hope that it will be useful,
 | 
				
			||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||
GNU General Public License for more details.
 | 
				
			||||
 | 
				
			||||
You should have received a copy of the GNU General Public License
 | 
				
			||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||
*/
 | 
				
			||||
 | 
				
			||||
// Currently we are assuming that both the backlight and LCD are enabled
 | 
				
			||||
// But it's entirely possible to write a custom visualizer that use only
 | 
				
			||||
// one of them
 | 
				
			||||
#ifndef LCD_BACKLIGHT_ENABLE
 | 
				
			||||
#error This visualizer needs that LCD backlight is enabled
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
#ifndef LCD_ENABLE
 | 
				
			||||
#error This visualizer needs that LCD is enabled
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
#include "visualizer.h"
 | 
				
			||||
#include "visualizer_keyframes.h"
 | 
				
			||||
#include "lcd_keyframes.h"
 | 
				
			||||
#include "lcd_backlight_keyframes.h"
 | 
				
			||||
#include "system/serial_link.h"
 | 
				
			||||
#include "animations.h"
 | 
				
			||||
 | 
				
			||||
static const uint32_t logo_background_color = LCD_COLOR(0x00, 0x00, 0xFF);
 | 
				
			||||
static const uint32_t initial_color = LCD_COLOR(0, 0, 0);
 | 
				
			||||
 | 
				
			||||
static const uint32_t led_emulation_colors[4] = {
 | 
				
			||||
    LCD_COLOR(0, 0, 0),
 | 
				
			||||
    LCD_COLOR(255, 255, 255),
 | 
				
			||||
    LCD_COLOR(84, 255, 255),
 | 
				
			||||
    LCD_COLOR(168, 255, 255),
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
static uint32_t next_led_target_color = 0;
 | 
				
			||||
 | 
				
			||||
typedef enum {
 | 
				
			||||
    LCD_STATE_INITIAL,
 | 
				
			||||
    LCD_STATE_LAYER_BITMAP,
 | 
				
			||||
    LCD_STATE_BITMAP_AND_LEDS,
 | 
				
			||||
} lcd_state_t;
 | 
				
			||||
 | 
				
			||||
static lcd_state_t lcd_state = LCD_STATE_INITIAL;
 | 
				
			||||
 | 
				
			||||
typedef struct {
 | 
				
			||||
    uint8_t led_on;
 | 
				
			||||
    uint8_t led1;
 | 
				
			||||
    uint8_t led2;
 | 
				
			||||
    uint8_t led3;
 | 
				
			||||
} visualizer_user_data_t;
 | 
				
			||||
 | 
				
			||||
// Don't access from visualization function, use the visualizer state instead
 | 
				
			||||
static visualizer_user_data_t user_data_keyboard = {
 | 
				
			||||
    .led_on = 0,
 | 
				
			||||
    .led1 = LED_BRIGHTNESS_HI,
 | 
				
			||||
    .led2 = LED_BRIGHTNESS_HI,
 | 
				
			||||
    .led3 = LED_BRIGHTNESS_HI,
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
_Static_assert(sizeof(visualizer_user_data_t) <= VISUALIZER_USER_DATA_SIZE,
 | 
				
			||||
    "Please increase the VISUALIZER_USER_DATA_SIZE");
 | 
				
			||||
 | 
				
			||||
// Feel free to modify the animations below, or even add new ones if needed
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
// The color animation animates the LCD color when you change layers
 | 
				
			||||
static keyframe_animation_t one_led_color = {
 | 
				
			||||
    .num_frames = 1,
 | 
				
			||||
    .loop = false,
 | 
				
			||||
    .frame_lengths = {gfxMillisecondsToTicks(0)},
 | 
				
			||||
    .frame_functions = {backlight_keyframe_set_color},
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
bool swap_led_target_color(keyframe_animation_t* animation, visualizer_state_t* state) {
 | 
				
			||||
    uint32_t temp = next_led_target_color;
 | 
				
			||||
    next_led_target_color = state->target_lcd_color;
 | 
				
			||||
    state->target_lcd_color = temp;
 | 
				
			||||
    return false;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
// The color animation animates the LCD color when you change layers
 | 
				
			||||
static keyframe_animation_t two_led_colors = {
 | 
				
			||||
    .num_frames = 2,
 | 
				
			||||
    .loop = true,
 | 
				
			||||
    .frame_lengths = {gfxMillisecondsToTicks(1000), gfxMillisecondsToTicks(0)},
 | 
				
			||||
    .frame_functions = {backlight_keyframe_set_color, swap_led_target_color},
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
// The LCD animation alternates between the layer name display and a
 | 
				
			||||
// bitmap that displays all active layers
 | 
				
			||||
static keyframe_animation_t lcd_bitmap_animation = {
 | 
				
			||||
    .num_frames = 1,
 | 
				
			||||
    .loop = false,
 | 
				
			||||
    .frame_lengths = {gfxMillisecondsToTicks(0)},
 | 
				
			||||
    .frame_functions = {lcd_keyframe_display_layer_bitmap},
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
static keyframe_animation_t lcd_bitmap_leds_animation = {
 | 
				
			||||
    .num_frames = 2,
 | 
				
			||||
    .loop = true,
 | 
				
			||||
    .frame_lengths = {gfxMillisecondsToTicks(2000), gfxMillisecondsToTicks(2000)},
 | 
				
			||||
    .frame_functions = {lcd_keyframe_display_layer_bitmap, lcd_keyframe_display_led_states},
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
void initialize_user_visualizer(visualizer_state_t* state) {
 | 
				
			||||
    // The brightness will be dynamically adjustable in the future
 | 
				
			||||
    // But for now, change it here.
 | 
				
			||||
    lcd_backlight_brightness(130);
 | 
				
			||||
    state->current_lcd_color = initial_color;
 | 
				
			||||
    state->target_lcd_color = logo_background_color;
 | 
				
			||||
    lcd_state = LCD_STATE_INITIAL;
 | 
				
			||||
    start_keyframe_animation(&default_startup_animation);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
inline bool is_led_on(visualizer_user_data_t* user_data, uint8_t num) {
 | 
				
			||||
    return user_data->led_on & (1u << num);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
static uint8_t get_led_index_master(visualizer_user_data_t* user_data) {
 | 
				
			||||
    for (int i=0; i < 3; i++) {
 | 
				
			||||
        if (is_led_on(user_data, i)) {
 | 
				
			||||
            return i + 1;
 | 
				
			||||
        }
 | 
				
			||||
    }
 | 
				
			||||
    return 0;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
static uint8_t get_led_index_slave(visualizer_user_data_t* user_data) {
 | 
				
			||||
    uint8_t master_index = get_led_index_master(user_data);
 | 
				
			||||
    if (master_index!=0) {
 | 
				
			||||
        for (int i=master_index; i < 3; i++) {
 | 
				
			||||
            if (is_led_on(user_data, i)) {
 | 
				
			||||
                return i + 1;
 | 
				
			||||
            }
 | 
				
			||||
        }
 | 
				
			||||
    }
 | 
				
			||||
 | 
				
			||||
    return 0;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
static uint8_t get_secondary_led_index(visualizer_user_data_t* user_data) {
 | 
				
			||||
    if (is_led_on(user_data, 0) &&
 | 
				
			||||
            is_led_on(user_data, 1) &&
 | 
				
			||||
            is_led_on(user_data, 2)) {
 | 
				
			||||
        return 3;
 | 
				
			||||
    }
 | 
				
			||||
    return 0;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
static uint8_t get_brightness(visualizer_user_data_t* user_data, uint8_t index) {
 | 
				
			||||
    switch (index) {
 | 
				
			||||
    case 1:
 | 
				
			||||
        return user_data->led1;
 | 
				
			||||
    case 2:
 | 
				
			||||
        return user_data->led2;
 | 
				
			||||
    case 3:
 | 
				
			||||
        return user_data->led3;
 | 
				
			||||
    }
 | 
				
			||||
    return 0;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
static void update_emulated_leds(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) {
 | 
				
			||||
    visualizer_user_data_t* user_data_new = (visualizer_user_data_t*)state->status.user_data;
 | 
				
			||||
    visualizer_user_data_t* user_data_old = (visualizer_user_data_t*)prev_status->user_data;
 | 
				
			||||
 | 
				
			||||
    uint8_t new_index;
 | 
				
			||||
    uint8_t old_index;
 | 
				
			||||
 | 
				
			||||
    if (is_serial_link_master()) {
 | 
				
			||||
        new_index = get_led_index_master(user_data_new);
 | 
				
			||||
        old_index = get_led_index_master(user_data_old);
 | 
				
			||||
    }
 | 
				
			||||
    else {
 | 
				
			||||
        new_index = get_led_index_slave(user_data_new);
 | 
				
			||||
        old_index = get_led_index_slave(user_data_old);
 | 
				
			||||
    }
 | 
				
			||||
    uint8_t new_secondary_index = get_secondary_led_index(user_data_new);
 | 
				
			||||
    uint8_t old_secondary_index = get_secondary_led_index(user_data_old);
 | 
				
			||||
 | 
				
			||||
    uint8_t old_brightness = get_brightness(user_data_old, old_index);
 | 
				
			||||
    uint8_t new_brightness = get_brightness(user_data_new, new_index);
 | 
				
			||||
 | 
				
			||||
    uint8_t old_secondary_brightness = get_brightness(user_data_old, old_secondary_index);
 | 
				
			||||
    uint8_t new_secondary_brightness = get_brightness(user_data_new, new_secondary_index);
 | 
				
			||||
 | 
				
			||||
    if (lcd_state == LCD_STATE_INITIAL ||
 | 
				
			||||
            new_index != old_index ||
 | 
				
			||||
            new_secondary_index != old_secondary_index ||
 | 
				
			||||
            new_brightness != old_brightness ||
 | 
				
			||||
            new_secondary_brightness != old_secondary_brightness) {
 | 
				
			||||
 | 
				
			||||
        if (new_secondary_index != 0) {
 | 
				
			||||
            state->target_lcd_color = change_lcd_color_intensity(
 | 
				
			||||
                led_emulation_colors[new_index], new_brightness);
 | 
				
			||||
            next_led_target_color = change_lcd_color_intensity(
 | 
				
			||||
                led_emulation_colors[new_secondary_index], new_secondary_brightness);
 | 
				
			||||
 | 
				
			||||
            stop_keyframe_animation(&one_led_color);
 | 
				
			||||
            start_keyframe_animation(&two_led_colors);
 | 
				
			||||
        } else {
 | 
				
			||||
            state->target_lcd_color = change_lcd_color_intensity(
 | 
				
			||||
                led_emulation_colors[new_index], new_brightness);
 | 
				
			||||
            stop_keyframe_animation(&two_led_colors);
 | 
				
			||||
            start_keyframe_animation(&one_led_color);
 | 
				
			||||
        }
 | 
				
			||||
    }
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
static void update_lcd_text(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) {
 | 
				
			||||
    if (state->status.leds) {
 | 
				
			||||
        if (lcd_state != LCD_STATE_BITMAP_AND_LEDS ||
 | 
				
			||||
                state->status.leds != prev_status->leds ||
 | 
				
			||||
                state->status.layer != prev_status->layer ||
 | 
				
			||||
                state->status.default_layer != prev_status->default_layer) {
 | 
				
			||||
 | 
				
			||||
            // NOTE: that it doesn't matter if the animation isn't playing, stop will do nothing in that case
 | 
				
			||||
            stop_keyframe_animation(&lcd_bitmap_animation);
 | 
				
			||||
 | 
				
			||||
            lcd_state = LCD_STATE_BITMAP_AND_LEDS;
 | 
				
			||||
            // For information:
 | 
				
			||||
            // The logic in this function makes sure that this doesn't happen, but if you call start on an
 | 
				
			||||
            // animation that is already playing it will be restarted.
 | 
				
			||||
            start_keyframe_animation(&lcd_bitmap_leds_animation);
 | 
				
			||||
        }
 | 
				
			||||
    } else {
 | 
				
			||||
        if (lcd_state != LCD_STATE_LAYER_BITMAP ||
 | 
				
			||||
                state->status.layer != prev_status->layer ||
 | 
				
			||||
                state->status.default_layer != prev_status->default_layer) {
 | 
				
			||||
 | 
				
			||||
            stop_keyframe_animation(&lcd_bitmap_leds_animation);
 | 
				
			||||
 | 
				
			||||
            lcd_state = LCD_STATE_LAYER_BITMAP;
 | 
				
			||||
            start_keyframe_animation(&lcd_bitmap_animation);
 | 
				
			||||
        }
 | 
				
			||||
    }
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) {
 | 
				
			||||
    // Check the status here to start and stop animations
 | 
				
			||||
    // You might have to save some state, like the current animation here so that you can start the right
 | 
				
			||||
    // This function is called every time the status changes
 | 
				
			||||
 | 
				
			||||
    // NOTE that this is called from the visualizer thread, so don't access anything else outside the status
 | 
				
			||||
    // This is also important because the slave won't have access to the active layer for example outside the
 | 
				
			||||
    // status.
 | 
				
			||||
 | 
				
			||||
    update_emulated_leds(state, prev_status);
 | 
				
			||||
    update_lcd_text(state, prev_status);
 | 
				
			||||
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void user_visualizer_suspend(visualizer_state_t* state) {
 | 
				
			||||
    state->layer_text = "Suspending...";
 | 
				
			||||
    uint8_t hue = LCD_HUE(state->current_lcd_color);
 | 
				
			||||
    uint8_t sat = LCD_SAT(state->current_lcd_color);
 | 
				
			||||
    state->target_lcd_color = LCD_COLOR(hue, sat, 0);
 | 
				
			||||
    start_keyframe_animation(&default_suspend_animation);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void user_visualizer_resume(visualizer_state_t* state) {
 | 
				
			||||
    state->current_lcd_color = initial_color;
 | 
				
			||||
    state->target_lcd_color = logo_background_color;
 | 
				
			||||
    lcd_state = LCD_STATE_INITIAL;
 | 
				
			||||
    start_keyframe_animation(&default_startup_animation);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void ergodox_board_led_on(void){
 | 
				
			||||
    // No board led support
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void ergodox_right_led_1_on(void){
 | 
				
			||||
    user_data_keyboard.led_on |= (1u << 0);
 | 
				
			||||
    visualizer_set_user_data(&user_data_keyboard);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void ergodox_right_led_2_on(void){
 | 
				
			||||
    user_data_keyboard.led_on |= (1u << 1);
 | 
				
			||||
    visualizer_set_user_data(&user_data_keyboard);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void ergodox_right_led_3_on(void){
 | 
				
			||||
    user_data_keyboard.led_on |= (1u << 2);
 | 
				
			||||
    visualizer_set_user_data(&user_data_keyboard);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void ergodox_board_led_off(void){
 | 
				
			||||
    // No board led support
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void ergodox_right_led_1_off(void){
 | 
				
			||||
    user_data_keyboard.led_on &= ~(1u << 0);
 | 
				
			||||
    visualizer_set_user_data(&user_data_keyboard);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void ergodox_right_led_2_off(void){
 | 
				
			||||
    user_data_keyboard.led_on &= ~(1u << 1);
 | 
				
			||||
    visualizer_set_user_data(&user_data_keyboard);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void ergodox_right_led_3_off(void){
 | 
				
			||||
    user_data_keyboard.led_on &= ~(1u << 2);
 | 
				
			||||
    visualizer_set_user_data(&user_data_keyboard);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void ergodox_right_led_1_set(uint8_t n) {
 | 
				
			||||
    user_data_keyboard.led1 = n;
 | 
				
			||||
    visualizer_set_user_data(&user_data_keyboard);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void ergodox_right_led_2_set(uint8_t n) {
 | 
				
			||||
    user_data_keyboard.led2 = n;
 | 
				
			||||
    visualizer_set_user_data(&user_data_keyboard);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void ergodox_right_led_3_set(uint8_t n) {
 | 
				
			||||
    user_data_keyboard.led3 = n;
 | 
				
			||||
    visualizer_set_user_data(&user_data_keyboard);
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,42 @@
 | 
				
			||||
/*
 | 
				
			||||
Copyright 2017 Fred Sundvik
 | 
				
			||||
 | 
				
			||||
This program is free software: you can redistribute it and/or modify
 | 
				
			||||
it under the terms of the GNU General Public License as published by
 | 
				
			||||
the Free Software Foundation, either version 2 of the License, or
 | 
				
			||||
(at your option) any later version.
 | 
				
			||||
 | 
				
			||||
This program is distributed in the hope that it will be useful,
 | 
				
			||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||
GNU General Public License for more details.
 | 
				
			||||
 | 
				
			||||
You should have received a copy of the GNU General Public License
 | 
				
			||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||
*/
 | 
				
			||||
 | 
				
			||||
#include "simple_visualizer.h"
 | 
				
			||||
 | 
				
			||||
// This function should be implemented by the keymap visualizer
 | 
				
			||||
// Don't change anything else than state->target_lcd_color and state->layer_text as that's the only thing
 | 
				
			||||
// that the simple_visualizer assumes that you are updating
 | 
				
			||||
// Also make sure that the buffer passed to state->layer_text remains valid until the previous animation is
 | 
				
			||||
// stopped. This can be done by either double buffering it or by using constant strings
 | 
				
			||||
static void get_visualizer_layer_and_color(visualizer_state_t* state) {
 | 
				
			||||
    uint8_t saturation = 60;
 | 
				
			||||
    if (state->status.leds & (1u << USB_LED_CAPS_LOCK)) {
 | 
				
			||||
        saturation = 255;
 | 
				
			||||
    }
 | 
				
			||||
    if (state->status.layer & 0x4) {
 | 
				
			||||
        state->target_lcd_color = LCD_COLOR(0, saturation, 0xFF);
 | 
				
			||||
        state->layer_text = "Media & Mouse";
 | 
				
			||||
    }
 | 
				
			||||
    else if (state->status.layer & 0x2) {
 | 
				
			||||
        state->target_lcd_color = LCD_COLOR(168, saturation, 0xFF);
 | 
				
			||||
        state->layer_text = "Symbol";
 | 
				
			||||
    }
 | 
				
			||||
    else {
 | 
				
			||||
        state->target_lcd_color = LCD_COLOR(84, saturation, 0xFF);
 | 
				
			||||
        state->layer_text = "Default";
 | 
				
			||||
    }
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,69 @@
 | 
				
			||||
# ErgoDox Familiar Layout
 | 
				
			||||
Familiar layout for those who regularly switch back and forth from ErgoDox to regular QWERTY.
 | 
				
			||||
 | 
				
			||||
[](../../../../license_GPLv3.md../../../../license_GPLv3.md) [](https://github.com/RichardLitt/standard-readme)
 | 
				
			||||
 | 
				
			||||
## Table of Contents
 | 
				
			||||
 | 
				
			||||
- [Background](#background)
 | 
				
			||||
- [Install](#install)
 | 
				
			||||
- [Usage](#usage)
 | 
				
			||||
    - [Layers](#layers)
 | 
				
			||||
- [Contribute](#contribute)
 | 
				
			||||
    - [Issues](#issues)
 | 
				
			||||
- [License](#license)
 | 
				
			||||
 | 
				
			||||
## Background
 | 
				
			||||
 | 
				
			||||
This layout is built to be as familiar as possible for users coming directly from a default (QWERTY US) keyboard, while gaining as much advantage as possible from the ErgoDox and QMK featureset. I use an ErgoDoxEZ at home, but I don't have a regular office (CS grad student) so I regularly use either my laptop or a default-setup lab computer; I context switch daily so this layout is meant to reduce the mental overhead as much as possible.
 | 
				
			||||
 | 
				
			||||
The default ErgoDoxEZ layout is probably more optimized as a solo daily driver - as are a lot of the others available keymaps. The focus of this layout is to get as much from the 'Dox as possible without overly disrupting long-established muscle memory.
 | 
				
			||||
 | 
				
			||||
Key features of the familiar layout:
 | 
				
			||||
1. QWERTY default layout.
 | 
				
			||||
1. International symbols layer, mapped in the US-International layout default positions, through [UCIS](https://github.com/qmk/qmk_firmware/wiki/Unicode-and-additional-language-support#ucis_enable).
 | 
				
			||||
1. Numpad layer on right hand.
 | 
				
			||||
1. Thumb cluster holds spacebar, ALT, and access to secondary layers.
 | 
				
			||||
1. Function-layer arrow keys in both the first-person-shooter (actually ESDF instead of WASD) and vim (HJKL) locations.
 | 
				
			||||
 | 
				
			||||
## Install
 | 
				
			||||
 | 
				
			||||
If you are on Windows or Mac, choose the proper line in [`keymap.c`](keymap.c) for [unicode/international character support](https://github.com/qmk/qmk_firmware/wiki/Unicode-and-additional-language-support#ucis_enable) (starts at line 235).
 | 
				
			||||
```c
 | 
				
			||||
void matrix_init_user(void) {
 | 
				
			||||
    set_unicode_input_mode(UC_LNX); // Linux
 | 
				
			||||
    //set_unicode_input_mode(UC_OSX); // Mac OSX
 | 
				
			||||
    //set_unicode_input_mode(UC_WIN); // Windows (with registry key, see wiki)
 | 
				
			||||
    //set_unicode_input_mode(UC_WINC); // Windows (with WinCompose, see wiki)
 | 
				
			||||
};
 | 
				
			||||
```
 | 
				
			||||
 | 
				
			||||
For instructions on building and installing this keymap, [go to the wiki](https://github.com/qmk/qmk_firmware/tree/master/keyboards/ergodox#build-dependencies). Below is the command for me; it may be different for you.
 | 
				
			||||
```sh
 | 
				
			||||
$ make ergodox-ez-familiar-teensy
 | 
				
			||||
```
 | 
				
			||||
 | 
				
			||||
## Usage
 | 
				
			||||
 | 
				
			||||
[](http://www.keyboard-layout-editor.com/#/gists/13508a9f99cff381d58b7be6f7dcc644)
 | 
				
			||||
 | 
				
			||||
### Layers
 | 
				
			||||
1. Base Layer: QWERTY, with arrow keys at bottom right.
 | 
				
			||||
1. UCIS Layer: US-International symbols layer, plus —. Accessed by toggling the `INTL` layer using the UCIS key (bottom of left thumb cluster).
 | 
				
			||||
1. UCIS-Shifted Layer: Making shift work for UCIS characters. An ugly workaround. Any ideas? Accessed through holding shift while the UCIS layer is active (toggles the `INSF` layer).
 | 
				
			||||
1. Numpad Layer: Right hand number pad. Accessed by toggling the `NUMP` layer using the NPAD key (bottom of right thumb cluster).
 | 
				
			||||
1. Function Layer: F1-F12, arrows on ESDF and HJKL, media player controls. Accessed by holding either FN key (center key of each thumb cluster), which toggles the `ARRW` layer. I know, I need to work on my naming conventions.
 | 
				
			||||
 | 
				
			||||
## Contribute
 | 
				
			||||
 | 
				
			||||
[Contributor Covenant](http://contributor-covenant.org/)
 | 
				
			||||
 | 
				
			||||
I'm terrible at this; I have no background in human-computer interaction, kinesiology, or keyboard-ology. Please send comments/issues/pull requests/angry tweets/etc. If you think there is a better way to take advantage of the ErgoDox/QMK comination without straying far from 84/101-key QWERTY, I want to know it.
 | 
				
			||||
 | 
				
			||||
### Issues
 | 
				
			||||
1. The top two keys of the right thumb cluster are currently unused. I wanted them for screen brightness, but I haven't found a solution I like.
 | 
				
			||||
1. The `'`, `"`, `[`, and `]` keys are terrible to access; I want to put them somewhere else but I haven't figured out where.
 | 
				
			||||
1. The `INSF` layer is an ugly workaround. I should write a function for doing different things in the `INTL` layer depending on whether SHIFT is being held. Or something. Ideas?
 | 
				
			||||
 | 
				
			||||
## License
 | 
				
			||||
QMK is licensed ([mostly](https://github.com/qmk/qmk_firmware/issues/1038)) under the [GPLv2](blob/master/license_GPLv2.md). Accordingly, to whatever extent applicable, this keymap is licensed under the [GPLv3](../../../../license_GPLv3.md).
 | 
				
			||||
| 
		 After Width: | Height: | Size: 146 KiB  | 
@ -0,0 +1,71 @@
 | 
				
			||||
/*
 | 
				
			||||
Copyright 2017 Fred Sundvik
 | 
				
			||||
 | 
				
			||||
This program is free software: you can redistribute it and/or modify
 | 
				
			||||
it under the terms of the GNU General Public License as published by
 | 
				
			||||
the Free Software Foundation, either version 2 of the License, or
 | 
				
			||||
(at your option) any later version.
 | 
				
			||||
This program is distributed in the hope that it will be useful,
 | 
				
			||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||
GNU General Public License for more details.
 | 
				
			||||
You should have received a copy of the GNU General Public License
 | 
				
			||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||
*/
 | 
				
			||||
 | 
				
			||||
#include "led_tables.h"
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
#ifdef USE_CIE1931_CURVE
 | 
				
			||||
// Lightness curve using the CIE 1931 lightness formula
 | 
				
			||||
//Generated by the python script provided in http://jared.geek.nz/2013/feb/linear-led-pwm
 | 
				
			||||
const uint8_t CIE1931_CURVE[] PROGMEM = {
 | 
				
			||||
    0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
 | 
				
			||||
    1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
 | 
				
			||||
    2, 2, 2, 3, 3, 3, 3, 3, 3, 3,
 | 
				
			||||
    3, 4, 4, 4, 4, 4, 4, 5, 5, 5,
 | 
				
			||||
    5, 5, 6, 6, 6, 6, 6, 7, 7, 7,
 | 
				
			||||
    7, 8, 8, 8, 8, 9, 9, 9, 10, 10,
 | 
				
			||||
    10, 10, 11, 11, 11, 12, 12, 12, 13, 13,
 | 
				
			||||
    13, 14, 14, 15, 15, 15, 16, 16, 17, 17,
 | 
				
			||||
    17, 18, 18, 19, 19, 20, 20, 21, 21, 22,
 | 
				
			||||
    22, 23, 23, 24, 24, 25, 25, 26, 26, 27,
 | 
				
			||||
    28, 28, 29, 29, 30, 31, 31, 32, 32, 33,
 | 
				
			||||
    34, 34, 35, 36, 37, 37, 38, 39, 39, 40,
 | 
				
			||||
    41, 42, 43, 43, 44, 45, 46, 47, 47, 48,
 | 
				
			||||
    49, 50, 51, 52, 53, 54, 54, 55, 56, 57,
 | 
				
			||||
    58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
 | 
				
			||||
    68, 70, 71, 72, 73, 74, 75, 76, 77, 79,
 | 
				
			||||
    80, 81, 82, 83, 85, 86, 87, 88, 90, 91,
 | 
				
			||||
    92, 94, 95, 96, 98, 99, 100, 102, 103, 105,
 | 
				
			||||
    106, 108, 109, 110, 112, 113, 115, 116, 118, 120,
 | 
				
			||||
    121, 123, 124, 126, 128, 129, 131, 132, 134, 136,
 | 
				
			||||
    138, 139, 141, 143, 145, 146, 148, 150, 152, 154,
 | 
				
			||||
    155, 157, 159, 161, 163, 165, 167, 169, 171, 173,
 | 
				
			||||
    175, 177, 179, 181, 183, 185, 187, 189, 191, 193,
 | 
				
			||||
    196, 198, 200, 202, 204, 207, 209, 211, 214, 216,
 | 
				
			||||
    218, 220, 223, 225, 228, 230, 232, 235, 237, 240,
 | 
				
			||||
    242, 245, 247, 250, 252, 255,
 | 
				
			||||
    };
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
#ifdef USE_LED_BREATHING_TABLE
 | 
				
			||||
const uint8_t LED_BREATHING_TABLE[] PROGMEM = {
 | 
				
			||||
  0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 9,
 | 
				
			||||
  10, 11, 12, 14, 15, 17, 18, 20, 21, 23, 25, 27, 29, 31, 33, 35,
 | 
				
			||||
  37, 40, 42, 44, 47, 49, 52, 54, 57, 59, 62, 65, 67, 70, 73, 76,
 | 
				
			||||
  79, 82, 85, 88, 90, 93, 97, 100, 103, 106, 109, 112, 115, 118, 121, 124,
 | 
				
			||||
  127, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 162, 165, 167, 170, 173,
 | 
				
			||||
  176, 179, 182, 185, 188, 190, 193, 196, 198, 201, 203, 206, 208, 211, 213, 215,
 | 
				
			||||
  218, 220, 222, 224, 226, 228, 230, 232, 234, 235, 237, 238, 240, 241, 243, 244,
 | 
				
			||||
  245, 246, 248, 249, 250, 250, 251, 252, 253, 253, 254, 254, 254, 255, 255, 255,
 | 
				
			||||
  255, 255, 255, 255, 254, 254, 254, 253, 253, 252, 251, 250, 250, 249, 248, 246,
 | 
				
			||||
  245, 244, 243, 241, 240, 238, 237, 235, 234, 232, 230, 228, 226, 224, 222, 220,
 | 
				
			||||
  218, 215, 213, 211, 208, 206, 203, 201, 198, 196, 193, 190, 188, 185, 182, 179,
 | 
				
			||||
  176, 173, 170, 167, 165, 162, 158, 155, 152, 149, 146, 143, 140, 137, 134, 131,
 | 
				
			||||
  128, 124, 121, 118, 115, 112, 109, 106, 103, 100, 97, 93, 90, 88, 85, 82,
 | 
				
			||||
  79, 76, 73, 70, 67, 65, 62, 59, 57, 54, 52, 49, 47, 44, 42, 40,
 | 
				
			||||
  37, 35, 33, 31, 29, 27, 25, 23, 21, 20, 18, 17, 15, 14, 12, 11,
 | 
				
			||||
  10, 9, 7, 6, 5, 5, 4, 3, 2, 2, 1, 1, 1, 0, 0, 0
 | 
				
			||||
};
 | 
				
			||||
#endif
 | 
				
			||||
@ -0,0 +1,30 @@
 | 
				
			||||
/*
 | 
				
			||||
Copyright 2017 Fred Sundvik
 | 
				
			||||
 | 
				
			||||
This program is free software: you can redistribute it and/or modify
 | 
				
			||||
it under the terms of the GNU General Public License as published by
 | 
				
			||||
the Free Software Foundation, either version 2 of the License, or
 | 
				
			||||
(at your option) any later version.
 | 
				
			||||
This program is distributed in the hope that it will be useful,
 | 
				
			||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||
GNU General Public License for more details.
 | 
				
			||||
You should have received a copy of the GNU General Public License
 | 
				
			||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||
*/
 | 
				
			||||
 | 
				
			||||
#ifndef LED_TABLES_H
 | 
				
			||||
#define LED_TABLES_H
 | 
				
			||||
 | 
				
			||||
#include "progmem.h"
 | 
				
			||||
#include <stdint.h>
 | 
				
			||||
 | 
				
			||||
#ifdef USE_CIE1931_CURVE
 | 
				
			||||
extern const uint8_t CIE1931_CURVE[] PROGMEM;
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
#ifdef USE_LED_BREATHING_TABLE
 | 
				
			||||
extern const uint8_t LED_BREATHING_TABLE[] PROGMEM;
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
#endif
 | 
				
			||||
@ -1,36 +0,0 @@
 | 
				
			||||
/*
 | 
				
			||||
The MIT License (MIT)
 | 
				
			||||
 | 
				
			||||
Copyright (c) 2016 Fred Sundvik
 | 
				
			||||
 | 
				
			||||
Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
				
			||||
of this software and associated documentation files (the "Software"), to deal
 | 
				
			||||
in the Software without restriction, including without limitation the rights
 | 
				
			||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
				
			||||
copies of the Software, and to permit persons to whom the Software is
 | 
				
			||||
furnished to do so, subject to the following conditions:
 | 
				
			||||
 | 
				
			||||
The above copyright notice and this permission notice shall be included in all
 | 
				
			||||
copies or substantial portions of the Software.
 | 
				
			||||
 | 
				
			||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
				
			||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
				
			||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
				
			||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
				
			||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
				
			||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
				
			||||
SOFTWARE.
 | 
				
			||||
*/
 | 
				
			||||
 | 
				
			||||
#include "keyboard.h"
 | 
				
			||||
#include "action_layer.h"
 | 
				
			||||
#include "visualizer.h"
 | 
				
			||||
#include "host.h"
 | 
				
			||||
 | 
				
			||||
void post_keyboard_init(void) {
 | 
				
			||||
    visualizer_init();
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void post_keyboard_task() {
 | 
				
			||||
    visualizer_set_state(default_layer_state, layer_state, host_keyboard_leds());
 | 
				
			||||
}
 | 
				
			||||
@ -1,325 +0,0 @@
 | 
				
			||||
/**
 | 
				
			||||
 * This file has a different license to the rest of the uGFX system.
 | 
				
			||||
 * You can copy, modify and distribute this file as you see fit.
 | 
				
			||||
 * You do not need to publish your source modifications to this file.
 | 
				
			||||
 * The only thing you are not permitted to do is to relicense it
 | 
				
			||||
 * under a different license.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
/**
 | 
				
			||||
 * Copy this file into your project directory and rename it as gfxconf.h
 | 
				
			||||
 * Edit your copy to turn on the uGFX features you want to use.
 | 
				
			||||
 * The values below are the defaults.
 | 
				
			||||
 *
 | 
				
			||||
 * Only remove the comments from lines where you want to change the
 | 
				
			||||
 * default value. This allows definitions to be included from
 | 
				
			||||
 * driver makefiles when required and provides the best future
 | 
				
			||||
 * compatibility for your project.
 | 
				
			||||
 *
 | 
				
			||||
 * Please use spaces instead of tabs in this file.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
#ifndef _GFXCONF_H
 | 
				
			||||
#define _GFXCONF_H
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
///////////////////////////////////////////////////////////////////////////
 | 
				
			||||
// GOS - One of these must be defined, preferably in your Makefile       //
 | 
				
			||||
///////////////////////////////////////////////////////////////////////////
 | 
				
			||||
#define GFX_USE_OS_CHIBIOS                           TRUE
 | 
				
			||||
//#define GFX_USE_OS_FREERTOS                          FALSE
 | 
				
			||||
//    #define GFX_FREERTOS_USE_TRACE                   FALSE
 | 
				
			||||
//#define GFX_USE_OS_WIN32                             FALSE
 | 
				
			||||
//#define GFX_USE_OS_LINUX                             FALSE
 | 
				
			||||
//#define GFX_USE_OS_OSX                               FALSE
 | 
				
			||||
//#define GFX_USE_OS_ECOS                              FALSE
 | 
				
			||||
//#define GFX_USE_OS_RAWRTOS                           FALSE
 | 
				
			||||
//#define GFX_USE_OS_ARDUINO                           FALSE
 | 
				
			||||
//#define GFX_USE_OS_KEIL                              FALSE
 | 
				
			||||
//#define GFX_USE_OS_CMSIS                             FALSE
 | 
				
			||||
//#define GFX_USE_OS_RAW32                             FALSE
 | 
				
			||||
//    #define INTERRUPTS_OFF()                         optional_code
 | 
				
			||||
//    #define INTERRUPTS_ON()                          optional_code
 | 
				
			||||
// These are not defined by default for some reason
 | 
				
			||||
#define GOS_NEED_X_THREADS	FALSE
 | 
				
			||||
#define GOS_NEED_X_HEAP		FALSE
 | 
				
			||||
 | 
				
			||||
// Options that (should where relevant) apply to all operating systems
 | 
				
			||||
    #define GFX_NO_INLINE                            FALSE
 | 
				
			||||
//    #define GFX_COMPILER                             GFX_COMPILER_UNKNOWN
 | 
				
			||||
//    #define GFX_CPU                                  GFX_CPU_UNKNOWN
 | 
				
			||||
//    #define GFX_OS_HEAP_SIZE                         0
 | 
				
			||||
//    #define GFX_OS_NO_INIT                           FALSE
 | 
				
			||||
//    #define GFX_OS_INIT_NO_WARNING                   FALSE
 | 
				
			||||
//    #define GFX_OS_PRE_INIT_FUNCTION                 myHardwareInitRoutine
 | 
				
			||||
//    #define GFX_OS_EXTRA_INIT_FUNCTION               myOSInitRoutine
 | 
				
			||||
//    #define GFX_OS_EXTRA_DEINIT_FUNCTION             myOSDeInitRoutine
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
///////////////////////////////////////////////////////////////////////////
 | 
				
			||||
// GDISP                                                                 //
 | 
				
			||||
///////////////////////////////////////////////////////////////////////////
 | 
				
			||||
#define GFX_USE_GDISP                                TRUE
 | 
				
			||||
 | 
				
			||||
//#define GDISP_NEED_AUTOFLUSH                         FALSE
 | 
				
			||||
//#define GDISP_NEED_TIMERFLUSH                        FALSE
 | 
				
			||||
//#define GDISP_NEED_VALIDATION                        TRUE
 | 
				
			||||
//#define GDISP_NEED_CLIP                              TRUE
 | 
				
			||||
//#define GDISP_NEED_CIRCLE                            FALSE
 | 
				
			||||
//#define GDISP_NEED_ELLIPSE                           FALSE
 | 
				
			||||
//#define GDISP_NEED_ARC                               FALSE
 | 
				
			||||
//#define GDISP_NEED_ARCSECTORS                        FALSE
 | 
				
			||||
//#define GDISP_NEED_CONVEX_POLYGON                    FALSE
 | 
				
			||||
//#define GDISP_NEED_SCROLL                            FALSE
 | 
				
			||||
//#define GDISP_NEED_PIXELREAD                         FALSE
 | 
				
			||||
//#define GDISP_NEED_CONTROL                           FALSE
 | 
				
			||||
//#define GDISP_NEED_QUERY                             FALSE
 | 
				
			||||
//#define GDISP_NEED_MULTITHREAD                       FALSE
 | 
				
			||||
//#define GDISP_NEED_STREAMING                         FALSE
 | 
				
			||||
#define GDISP_NEED_TEXT                              TRUE
 | 
				
			||||
//    #define GDISP_NEED_TEXT_WORDWRAP                 FALSE
 | 
				
			||||
//    #define GDISP_NEED_ANTIALIAS                     FALSE
 | 
				
			||||
//    #define GDISP_NEED_UTF8                          FALSE
 | 
				
			||||
    #define GDISP_NEED_TEXT_KERNING                  TRUE
 | 
				
			||||
//    #define GDISP_INCLUDE_FONT_UI1                   FALSE
 | 
				
			||||
//    #define GDISP_INCLUDE_FONT_UI2                   FALSE		// The smallest preferred font.
 | 
				
			||||
//    #define GDISP_INCLUDE_FONT_LARGENUMBERS          FALSE
 | 
				
			||||
//    #define GDISP_INCLUDE_FONT_DEJAVUSANS10          FALSE
 | 
				
			||||
//    #define GDISP_INCLUDE_FONT_DEJAVUSANS12          FALSE
 | 
				
			||||
//    #define GDISP_INCLUDE_FONT_DEJAVUSANS16          FALSE
 | 
				
			||||
//    #define GDISP_INCLUDE_FONT_DEJAVUSANS20          FALSE
 | 
				
			||||
//    #define GDISP_INCLUDE_FONT_DEJAVUSANS24          FALSE
 | 
				
			||||
//    #define GDISP_INCLUDE_FONT_DEJAVUSANS32          FALSE
 | 
				
			||||
    #define GDISP_INCLUDE_FONT_DEJAVUSANSBOLD12      TRUE
 | 
				
			||||
//    #define GDISP_INCLUDE_FONT_FIXED_10X20           FALSE
 | 
				
			||||
//    #define GDISP_INCLUDE_FONT_FIXED_7X14            FALSE
 | 
				
			||||
    #define GDISP_INCLUDE_FONT_FIXED_5X8             TRUE
 | 
				
			||||
//    #define GDISP_INCLUDE_FONT_DEJAVUSANS12_AA       FALSE
 | 
				
			||||
//    #define GDISP_INCLUDE_FONT_DEJAVUSANS16_AA       FALSE
 | 
				
			||||
//    #define GDISP_INCLUDE_FONT_DEJAVUSANS20_AA       FALSE
 | 
				
			||||
//    #define GDISP_INCLUDE_FONT_DEJAVUSANS24_AA       FALSE
 | 
				
			||||
//    #define GDISP_INCLUDE_FONT_DEJAVUSANS32_AA       FALSE
 | 
				
			||||
//    #define GDISP_INCLUDE_FONT_DEJAVUSANSBOLD12_AA   FALSE
 | 
				
			||||
//    #define GDISP_INCLUDE_USER_FONTS                 FALSE
 | 
				
			||||
 | 
				
			||||
//#define GDISP_NEED_IMAGE                             FALSE
 | 
				
			||||
//    #define GDISP_NEED_IMAGE_NATIVE                  FALSE
 | 
				
			||||
//    #define GDISP_NEED_IMAGE_GIF                     FALSE
 | 
				
			||||
//    #define GDISP_NEED_IMAGE_BMP                     FALSE
 | 
				
			||||
//        #define GDISP_NEED_IMAGE_BMP_1               FALSE
 | 
				
			||||
//        #define GDISP_NEED_IMAGE_BMP_4               FALSE
 | 
				
			||||
//        #define GDISP_NEED_IMAGE_BMP_4_RLE           FALSE
 | 
				
			||||
//        #define GDISP_NEED_IMAGE_BMP_8               FALSE
 | 
				
			||||
//        #define GDISP_NEED_IMAGE_BMP_8_RLE           FALSE
 | 
				
			||||
//        #define GDISP_NEED_IMAGE_BMP_16              FALSE
 | 
				
			||||
//        #define GDISP_NEED_IMAGE_BMP_24              FALSE
 | 
				
			||||
//        #define GDISP_NEED_IMAGE_BMP_32              FALSE
 | 
				
			||||
//    #define GDISP_NEED_IMAGE_JPG                     FALSE
 | 
				
			||||
//    #define GDISP_NEED_IMAGE_PNG                     FALSE
 | 
				
			||||
//    #define GDISP_NEED_IMAGE_ACCOUNTING              FALSE
 | 
				
			||||
 | 
				
			||||
//#define GDISP_NEED_PIXMAP                            FALSE
 | 
				
			||||
//    #define GDISP_NEED_PIXMAP_IMAGE                  FALSE
 | 
				
			||||
 | 
				
			||||
//#define GDISP_DEFAULT_ORIENTATION                    GDISP_ROTATE_LANDSCAPE    // If not defined the native hardware orientation is used.
 | 
				
			||||
//#define GDISP_LINEBUF_SIZE                           128
 | 
				
			||||
//#define GDISP_STARTUP_COLOR                          Black
 | 
				
			||||
#define GDISP_NEED_STARTUP_LOGO                      FALSE
 | 
				
			||||
 | 
				
			||||
//#define GDISP_TOTAL_DISPLAYS                         1
 | 
				
			||||
 | 
				
			||||
//#define GDISP_DRIVER_LIST                            GDISPVMT_Win32, GDISPVMT_Win32
 | 
				
			||||
//    #ifdef GDISP_DRIVER_LIST
 | 
				
			||||
//        // For code and speed optimization define as TRUE or FALSE if all controllers have the same capability
 | 
				
			||||
//        #define GDISP_HARDWARE_STREAM_WRITE          FALSE
 | 
				
			||||
//        #define GDISP_HARDWARE_STREAM_READ           FALSE
 | 
				
			||||
//        #define GDISP_HARDWARE_STREAM_POS            FALSE
 | 
				
			||||
//        #define GDISP_HARDWARE_DRAWPIXEL             FALSE
 | 
				
			||||
//        #define GDISP_HARDWARE_CLEARS                FALSE
 | 
				
			||||
//        #define GDISP_HARDWARE_FILLS                 FALSE
 | 
				
			||||
//        #define GDISP_HARDWARE_BITFILLS              FALSE
 | 
				
			||||
//        #define GDISP_HARDWARE_SCROLL                FALSE
 | 
				
			||||
//        #define GDISP_HARDWARE_PIXELREAD             FALSE
 | 
				
			||||
//        #define GDISP_HARDWARE_CONTROL               FALSE
 | 
				
			||||
//        #define GDISP_HARDWARE_QUERY                 FALSE
 | 
				
			||||
//        #define GDISP_HARDWARE_CLIP                  FALSE
 | 
				
			||||
 | 
				
			||||
        #define GDISP_PIXELFORMAT                    GDISP_PIXELFORMAT_RGB888
 | 
				
			||||
//    #endif
 | 
				
			||||
 | 
				
			||||
// The custom format is not defined for some reason, so define it as error
 | 
				
			||||
// so we don't get compiler warnings
 | 
				
			||||
#define GDISP_PIXELFORMAT_CUSTOM GDISP_PIXELFORMAT_ERROR
 | 
				
			||||
 | 
				
			||||
#define GDISP_USE_GFXNET                             FALSE
 | 
				
			||||
//    #define GDISP_GFXNET_PORT                        13001
 | 
				
			||||
//    #define GDISP_GFXNET_CUSTOM_LWIP_STARTUP         FALSE
 | 
				
			||||
//    #define GDISP_DONT_WAIT_FOR_NET_DISPLAY          FALSE
 | 
				
			||||
//    #define GDISP_GFXNET_UNSAFE_SOCKETS              FALSE
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
///////////////////////////////////////////////////////////////////////////
 | 
				
			||||
// GWIN                                                                  //
 | 
				
			||||
///////////////////////////////////////////////////////////////////////////
 | 
				
			||||
#define GFX_USE_GWIN                                 FALSE
 | 
				
			||||
 | 
				
			||||
//#define GWIN_NEED_WINDOWMANAGER                      FALSE
 | 
				
			||||
//    #define GWIN_REDRAW_IMMEDIATE                    FALSE
 | 
				
			||||
//    #define GWIN_REDRAW_SINGLEOP                     FALSE
 | 
				
			||||
//    #define GWIN_NEED_FLASHING                       FALSE
 | 
				
			||||
//        #define GWIN_FLASHING_PERIOD                 250
 | 
				
			||||
 | 
				
			||||
//#define GWIN_NEED_CONSOLE                            FALSE
 | 
				
			||||
//    #define GWIN_CONSOLE_USE_HISTORY                 FALSE
 | 
				
			||||
//        #define GWIN_CONSOLE_HISTORY_AVERAGING       FALSE
 | 
				
			||||
//        #define GWIN_CONSOLE_HISTORY_ATCREATE        FALSE
 | 
				
			||||
//    #define GWIN_CONSOLE_ESCSEQ                      FALSE
 | 
				
			||||
//    #define GWIN_CONSOLE_USE_BASESTREAM              FALSE
 | 
				
			||||
//    #define GWIN_CONSOLE_USE_FLOAT                   FALSE
 | 
				
			||||
//#define GWIN_NEED_GRAPH                              FALSE
 | 
				
			||||
//#define GWIN_NEED_GL3D                               FALSE
 | 
				
			||||
 | 
				
			||||
//#define GWIN_NEED_WIDGET                             FALSE
 | 
				
			||||
//#define GWIN_FOCUS_HIGHLIGHT_WIDTH                   1
 | 
				
			||||
//    #define GWIN_NEED_LABEL                          FALSE
 | 
				
			||||
//        #define GWIN_LABEL_ATTRIBUTE                 FALSE
 | 
				
			||||
//    #define GWIN_NEED_BUTTON                         FALSE
 | 
				
			||||
//        #define GWIN_BUTTON_LAZY_RELEASE             FALSE
 | 
				
			||||
//    #define GWIN_NEED_SLIDER                         FALSE
 | 
				
			||||
//        #define GWIN_SLIDER_NOSNAP                   FALSE
 | 
				
			||||
//        #define GWIN_SLIDER_DEAD_BAND                5
 | 
				
			||||
//        #define GWIN_SLIDER_TOGGLE_INC               20
 | 
				
			||||
//    #define GWIN_NEED_CHECKBOX                       FALSE
 | 
				
			||||
//    #define GWIN_NEED_IMAGE                          FALSE
 | 
				
			||||
//        #define GWIN_NEED_IMAGE_ANIMATION            FALSE
 | 
				
			||||
//    #define GWIN_NEED_RADIO                          FALSE
 | 
				
			||||
//    #define GWIN_NEED_LIST                           FALSE
 | 
				
			||||
//        #define GWIN_NEED_LIST_IMAGES                FALSE
 | 
				
			||||
//    #define GWIN_NEED_PROGRESSBAR                    FALSE
 | 
				
			||||
//        #define GWIN_PROGRESSBAR_AUTO                FALSE
 | 
				
			||||
//    #define GWIN_NEED_KEYBOARD                       FALSE
 | 
				
			||||
//        #define GWIN_KEYBOARD_DEFAULT_LAYOUT         VirtualKeyboard_English1
 | 
				
			||||
//        #define GWIN_NEED_KEYBOARD_ENGLISH1          TRUE
 | 
				
			||||
//    #define GWIN_NEED_TEXTEDIT                       FALSE
 | 
				
			||||
//    #define GWIN_FLAT_STYLING                        FALSE
 | 
				
			||||
//    #define GWIN_WIDGET_TAGS                         FALSE
 | 
				
			||||
 | 
				
			||||
//#define GWIN_NEED_CONTAINERS                         FALSE
 | 
				
			||||
//    #define GWIN_NEED_CONTAINER                      FALSE
 | 
				
			||||
//    #define GWIN_NEED_FRAME                          FALSE
 | 
				
			||||
//    #define GWIN_NEED_TABSET                         FALSE
 | 
				
			||||
//        #define GWIN_TABSET_TABHEIGHT                18
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
///////////////////////////////////////////////////////////////////////////
 | 
				
			||||
// GEVENT                                                                //
 | 
				
			||||
///////////////////////////////////////////////////////////////////////////
 | 
				
			||||
#define GFX_USE_GEVENT                               FALSE
 | 
				
			||||
 | 
				
			||||
//#define GEVENT_ASSERT_NO_RESOURCE                    FALSE
 | 
				
			||||
//#define GEVENT_MAXIMUM_SIZE                          32
 | 
				
			||||
//#define GEVENT_MAX_SOURCE_LISTENERS                  32
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
///////////////////////////////////////////////////////////////////////////
 | 
				
			||||
// GTIMER                                                                //
 | 
				
			||||
///////////////////////////////////////////////////////////////////////////
 | 
				
			||||
#define GFX_USE_GTIMER                               FALSE
 | 
				
			||||
 | 
				
			||||
//#define GTIMER_THREAD_PRIORITY                       HIGH_PRIORITY
 | 
				
			||||
//#define GTIMER_THREAD_WORKAREA_SIZE                  2048
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
///////////////////////////////////////////////////////////////////////////
 | 
				
			||||
// GQUEUE                                                                //
 | 
				
			||||
///////////////////////////////////////////////////////////////////////////
 | 
				
			||||
#define GFX_USE_GQUEUE                               FALSE
 | 
				
			||||
 | 
				
			||||
//#define GQUEUE_NEED_ASYNC                            FALSE
 | 
				
			||||
//#define GQUEUE_NEED_GSYNC                            FALSE
 | 
				
			||||
//#define GQUEUE_NEED_FSYNC                            FALSE
 | 
				
			||||
//#define GQUEUE_NEED_BUFFERS                          FALSE
 | 
				
			||||
 | 
				
			||||
///////////////////////////////////////////////////////////////////////////
 | 
				
			||||
// GINPUT                                                                //
 | 
				
			||||
///////////////////////////////////////////////////////////////////////////
 | 
				
			||||
#define GFX_USE_GINPUT                               FALSE
 | 
				
			||||
 | 
				
			||||
//#define GINPUT_NEED_MOUSE                            FALSE
 | 
				
			||||
//    #define GINPUT_TOUCH_STARTRAW                    FALSE
 | 
				
			||||
//    #define GINPUT_TOUCH_NOTOUCH                     FALSE
 | 
				
			||||
//    #define GINPUT_TOUCH_NOCALIBRATE                 FALSE
 | 
				
			||||
//    #define GINPUT_TOUCH_NOCALIBRATE_GUI             FALSE
 | 
				
			||||
//    #define GINPUT_MOUSE_POLL_PERIOD                 25
 | 
				
			||||
//    #define GINPUT_MOUSE_CLICK_TIME                  300
 | 
				
			||||
//    #define GINPUT_TOUCH_CXTCLICK_TIME               700
 | 
				
			||||
//    #define GINPUT_TOUCH_USER_CALIBRATION_LOAD       FALSE
 | 
				
			||||
//    #define GINPUT_TOUCH_USER_CALIBRATION_SAVE       FALSE
 | 
				
			||||
//    #define GMOUSE_DRIVER_LIST                       GMOUSEVMT_Win32, GMOUSEVMT_Win32
 | 
				
			||||
//#define GINPUT_NEED_KEYBOARD                         FALSE
 | 
				
			||||
//    #define GINPUT_KEYBOARD_POLL_PERIOD              200
 | 
				
			||||
//    #define GKEYBOARD_DRIVER_LIST                    GKEYBOARDVMT_Win32, GKEYBOARDVMT_Win32
 | 
				
			||||
//    #define GKEYBOARD_LAYOUT_OFF                     FALSE
 | 
				
			||||
//        #define GKEYBOARD_LAYOUT_SCANCODE2_US        FALSE
 | 
				
			||||
//#define GINPUT_NEED_TOGGLE                           FALSE
 | 
				
			||||
//#define GINPUT_NEED_DIAL                             FALSE
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
///////////////////////////////////////////////////////////////////////////
 | 
				
			||||
// GFILE                                                                 //
 | 
				
			||||
///////////////////////////////////////////////////////////////////////////
 | 
				
			||||
#define GFX_USE_GFILE                                FALSE
 | 
				
			||||
 | 
				
			||||
//#define GFILE_NEED_PRINTG                            FALSE
 | 
				
			||||
//#define GFILE_NEED_SCANG                             FALSE
 | 
				
			||||
//#define GFILE_NEED_STRINGS                           FALSE
 | 
				
			||||
//#define GFILE_NEED_FILELISTS                         FALSE
 | 
				
			||||
//#define GFILE_NEED_STDIO                             FALSE
 | 
				
			||||
//#define GFILE_NEED_NOAUTOMOUNT                       FALSE
 | 
				
			||||
//#define GFILE_NEED_NOAUTOSYNC                        FALSE
 | 
				
			||||
 | 
				
			||||
//#define GFILE_NEED_MEMFS                             FALSE
 | 
				
			||||
//#define GFILE_NEED_ROMFS                             FALSE
 | 
				
			||||
//#define GFILE_NEED_RAMFS                             FALSE
 | 
				
			||||
//#define GFILE_NEED_FATFS                             FALSE
 | 
				
			||||
//#define GFILE_NEED_NATIVEFS                          FALSE
 | 
				
			||||
//#define GFILE_NEED_CHBIOSFS                          FALSE
 | 
				
			||||
 | 
				
			||||
//#define GFILE_ALLOW_FLOATS                           FALSE
 | 
				
			||||
//#define GFILE_ALLOW_DEVICESPECIFIC                   FALSE
 | 
				
			||||
//#define GFILE_MAX_GFILES                             3
 | 
				
			||||
 | 
				
			||||
///////////////////////////////////////////////////////////////////////////
 | 
				
			||||
// GADC                                                                  //
 | 
				
			||||
///////////////////////////////////////////////////////////////////////////
 | 
				
			||||
#define GFX_USE_GADC                                 FALSE
 | 
				
			||||
 | 
				
			||||
//#define GADC_MAX_LOWSPEED_DEVICES                    4
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
///////////////////////////////////////////////////////////////////////////
 | 
				
			||||
// GAUDIO                                                                //
 | 
				
			||||
///////////////////////////////////////////////////////////////////////////
 | 
				
			||||
#define GFX_USE_GAUDIO                               FALSE
 | 
				
			||||
// There seems to be a bug in the ugfx code, the wrong define is used
 | 
				
			||||
// So define it in order to avoid warnings
 | 
				
			||||
#define GFX_USE_GAUDIN                               GFX_USE_GAUDIO
 | 
				
			||||
//    #define GAUDIO_NEED_PLAY                         FALSE
 | 
				
			||||
//    #define GAUDIO_NEED_RECORD                       FALSE
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
///////////////////////////////////////////////////////////////////////////
 | 
				
			||||
// GMISC                                                                 //
 | 
				
			||||
///////////////////////////////////////////////////////////////////////////
 | 
				
			||||
#define GFX_USE_GMISC                                FALSE
 | 
				
			||||
 | 
				
			||||
//#define GMISC_NEED_ARRAYOPS                          FALSE
 | 
				
			||||
//#define GMISC_NEED_FASTTRIG                          FALSE
 | 
				
			||||
//#define GMISC_NEED_FIXEDTRIG                         FALSE
 | 
				
			||||
//#define GMISC_NEED_INVSQRT                           FALSE
 | 
				
			||||
//    #define GMISC_INVSQRT_MIXED_ENDIAN               FALSE
 | 
				
			||||
//    #define GMISC_INVSQRT_REAL_SLOW                  FALSE
 | 
				
			||||
//#define GMISC_NEED_MATRIXFLOAT2D                     FALSE
 | 
				
			||||
//#define GMISC_NEED_MATRIXFIXED2D                     FALSE
 | 
				
			||||
 | 
				
			||||
#endif /* _GFXCONF_H */
 | 
				
			||||
@ -1,91 +0,0 @@
 | 
				
			||||
/*
 | 
				
			||||
The MIT License (MIT)
 | 
				
			||||
 | 
				
			||||
Copyright (c) 2016 Fred Sundvik
 | 
				
			||||
 | 
				
			||||
Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
				
			||||
of this software and associated documentation files (the "Software"), to deal
 | 
				
			||||
in the Software without restriction, including without limitation the rights
 | 
				
			||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
				
			||||
copies of the Software, and to permit persons to whom the Software is
 | 
				
			||||
furnished to do so, subject to the following conditions:
 | 
				
			||||
 | 
				
			||||
The above copyright notice and this permission notice shall be included in all
 | 
				
			||||
copies or substantial portions of the Software.
 | 
				
			||||
 | 
				
			||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
				
			||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
				
			||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
				
			||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
				
			||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
				
			||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
				
			||||
SOFTWARE.
 | 
				
			||||
*/
 | 
				
			||||
 | 
				
			||||
#include "lcd_backlight.h"
 | 
				
			||||
#include "hal.h"
 | 
				
			||||
 | 
				
			||||
#define RED_PIN 1
 | 
				
			||||
#define GREEN_PIN 2
 | 
				
			||||
#define BLUE_PIN 3
 | 
				
			||||
#define CHANNEL_RED FTM0->CHANNEL[0]
 | 
				
			||||
#define CHANNEL_GREEN FTM0->CHANNEL[1]
 | 
				
			||||
#define CHANNEL_BLUE FTM0->CHANNEL[2]
 | 
				
			||||
 | 
				
			||||
#define RGB_PORT PORTC
 | 
				
			||||
#define RGB_PORT_GPIO GPIOC
 | 
				
			||||
 | 
				
			||||
// Base FTM clock selection (72 MHz system clock)
 | 
				
			||||
// @ 0xFFFF period, 72 MHz / (0xFFFF * 2) = Actual period
 | 
				
			||||
// Higher pre-scalar will use the most power (also look the best)
 | 
				
			||||
// Pre-scalar calculations
 | 
				
			||||
// 0 -      72 MHz -> 549 Hz
 | 
				
			||||
// 1 -      36 MHz -> 275 Hz
 | 
				
			||||
// 2 -      18 MHz -> 137 Hz
 | 
				
			||||
// 3 -       9 MHz ->  69 Hz (Slightly visible flicker)
 | 
				
			||||
// 4 -   4 500 kHz ->  34 Hz (Visible flickering)
 | 
				
			||||
// 5 -   2 250 kHz ->  17 Hz
 | 
				
			||||
// 6 -   1 125 kHz ->   9 Hz
 | 
				
			||||
// 7 - 562 500  Hz ->   4 Hz
 | 
				
			||||
// Using a higher pre-scalar without flicker is possible but FTM0_MOD will need to be reduced
 | 
				
			||||
// Which will reduce the brightness range
 | 
				
			||||
#define PRESCALAR_DEFINE 0
 | 
				
			||||
 | 
				
			||||
void lcd_backlight_hal_init(void) {
 | 
				
			||||
	// Setup Backlight
 | 
				
			||||
    SIM->SCGC6 |= SIM_SCGC6_FTM0;
 | 
				
			||||
    FTM0->CNT = 0; // Reset counter
 | 
				
			||||
 | 
				
			||||
	// PWM Period
 | 
				
			||||
	// 16-bit maximum
 | 
				
			||||
	FTM0->MOD = 0xFFFF;
 | 
				
			||||
 | 
				
			||||
	// Set FTM to PWM output - Edge Aligned, Low-true pulses
 | 
				
			||||
#define CNSC_MODE FTM_SC_CPWMS | FTM_SC_PS(4) | FTM_SC_CLKS(0)
 | 
				
			||||
	CHANNEL_RED.CnSC = CNSC_MODE;
 | 
				
			||||
	CHANNEL_GREEN.CnSC = CNSC_MODE;
 | 
				
			||||
	CHANNEL_BLUE.CnSC = CNSC_MODE;
 | 
				
			||||
 | 
				
			||||
	// System clock, /w prescalar setting
 | 
				
			||||
	FTM0->SC = FTM_SC_CLKS(1) | FTM_SC_PS(PRESCALAR_DEFINE);
 | 
				
			||||
 | 
				
			||||
	CHANNEL_RED.CnV = 0;
 | 
				
			||||
	CHANNEL_GREEN.CnV = 0;
 | 
				
			||||
	CHANNEL_BLUE.CnV = 0;
 | 
				
			||||
 | 
				
			||||
	RGB_PORT_GPIO->PDDR |= (1 << RED_PIN);
 | 
				
			||||
	RGB_PORT_GPIO->PDDR |= (1 << GREEN_PIN);
 | 
				
			||||
	RGB_PORT_GPIO->PDDR |= (1 << BLUE_PIN);
 | 
				
			||||
 | 
				
			||||
#define RGB_MODE PORTx_PCRn_SRE | PORTx_PCRn_DSE | PORTx_PCRn_MUX(4)
 | 
				
			||||
    RGB_PORT->PCR[RED_PIN] = RGB_MODE;
 | 
				
			||||
    RGB_PORT->PCR[GREEN_PIN] = RGB_MODE;
 | 
				
			||||
    RGB_PORT->PCR[BLUE_PIN] = RGB_MODE;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void lcd_backlight_hal_color(uint16_t r, uint16_t g, uint16_t b) {
 | 
				
			||||
	CHANNEL_RED.CnV = r;
 | 
				
			||||
	CHANNEL_GREEN.CnV = g;
 | 
				
			||||
	CHANNEL_BLUE.CnV = b;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
@ -1,121 +0,0 @@
 | 
				
			||||
/*
 | 
				
			||||
The MIT License (MIT)
 | 
				
			||||
 | 
				
			||||
Copyright (c) 2016 Fred Sundvik
 | 
				
			||||
 | 
				
			||||
Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
				
			||||
of this software and associated documentation files (the "Software"), to deal
 | 
				
			||||
in the Software without restriction, including without limitation the rights
 | 
				
			||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
				
			||||
copies of the Software, and to permit persons to whom the Software is
 | 
				
			||||
furnished to do so, subject to the following conditions:
 | 
				
			||||
 | 
				
			||||
The above copyright notice and this permission notice shall be included in all
 | 
				
			||||
copies or substantial portions of the Software.
 | 
				
			||||
 | 
				
			||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
				
			||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
				
			||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
				
			||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
				
			||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
				
			||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
				
			||||
SOFTWARE.
 | 
				
			||||
*/
 | 
				
			||||
 | 
				
			||||
// Currently we are assuming that both the backlight and LCD are enabled
 | 
				
			||||
// But it's entirely possible to write a custom visualizer that use only
 | 
				
			||||
// one of them
 | 
				
			||||
#ifndef LCD_BACKLIGHT_ENABLE
 | 
				
			||||
#error This visualizer needs that LCD backlight is enabled
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
#ifndef LCD_ENABLE
 | 
				
			||||
#error This visualizer needs that LCD is enabled
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
#include "visualizer.h"
 | 
				
			||||
 | 
				
			||||
static const char* welcome_text[] = {"TMK", "Infinity Ergodox"};
 | 
				
			||||
 | 
				
			||||
// Just an example how to write custom keyframe functions, we could have moved
 | 
				
			||||
// all this into the init function
 | 
				
			||||
bool display_welcome(keyframe_animation_t* animation, visualizer_state_t* state) {
 | 
				
			||||
    (void)animation;
 | 
				
			||||
    // Read the uGFX documentation for information how to use the displays
 | 
				
			||||
    // http://wiki.ugfx.org/index.php/Main_Page
 | 
				
			||||
    gdispClear(White);
 | 
				
			||||
    // You can use static variables for things that can't be found in the animation
 | 
				
			||||
    // or state structs
 | 
				
			||||
    gdispDrawString(0, 3, welcome_text[0], state->font_dejavusansbold12, Black);
 | 
				
			||||
    gdispDrawString(0, 15, welcome_text[1], state->font_dejavusansbold12, Black);
 | 
				
			||||
    // Always remember to flush the display
 | 
				
			||||
    gdispFlush();
 | 
				
			||||
    // you could set the backlight color as well, but we won't do it here, since
 | 
				
			||||
    // it's part of the following animation
 | 
				
			||||
    // lcd_backlight_color(hue, saturation, intensity);
 | 
				
			||||
    // We don't need constant updates, just drawing the screen once is enough
 | 
				
			||||
    return false;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
// Feel free to modify the animations below, or even add new ones if needed
 | 
				
			||||
 | 
				
			||||
// Don't worry, if the startup animation is long, you can use the keyboard like normal
 | 
				
			||||
// during that time
 | 
				
			||||
static keyframe_animation_t startup_animation = {
 | 
				
			||||
    .num_frames = 4,
 | 
				
			||||
    .loop = false,
 | 
				
			||||
    .frame_lengths = {0, MS2ST(1000), MS2ST(5000), 0},
 | 
				
			||||
    .frame_functions = {display_welcome, keyframe_animate_backlight_color, keyframe_no_operation, enable_visualization},
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
// The color animation animates the LCD color when you change layers
 | 
				
			||||
static keyframe_animation_t color_animation = {
 | 
				
			||||
    .num_frames = 2,
 | 
				
			||||
    .loop = false,
 | 
				
			||||
    // Note that there's a 200 ms no-operation frame,
 | 
				
			||||
    // this prevents the color from changing when activating the layer
 | 
				
			||||
    // momentarily
 | 
				
			||||
    .frame_lengths = {MS2ST(200), MS2ST(500)},
 | 
				
			||||
    .frame_functions = {keyframe_no_operation, keyframe_animate_backlight_color},
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
// The LCD animation alternates between the layer name display and a
 | 
				
			||||
// bitmap that displays all active layers
 | 
				
			||||
static keyframe_animation_t lcd_animation = {
 | 
				
			||||
    .num_frames = 2,
 | 
				
			||||
    .loop = true,
 | 
				
			||||
    .frame_lengths = {MS2ST(2000), MS2ST(2000)},
 | 
				
			||||
    .frame_functions = {keyframe_display_layer_text, keyframe_display_layer_bitmap},
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
void initialize_user_visualizer(visualizer_state_t* state) {
 | 
				
			||||
    // The brightness will be dynamically adjustable in the future
 | 
				
			||||
    // But for now, change it here.
 | 
				
			||||
    lcd_backlight_brightness(0x50);
 | 
				
			||||
    state->current_lcd_color = LCD_COLOR(0x00, 0x00, 0xFF);
 | 
				
			||||
    state->target_lcd_color = LCD_COLOR(0x10, 0xFF, 0xFF);
 | 
				
			||||
    start_keyframe_animation(&startup_animation);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void update_user_visualizer_state(visualizer_state_t* state) {
 | 
				
			||||
    // Add more tests, change the colors and layer texts here
 | 
				
			||||
    // Usually you want to check the high bits (higher layers first)
 | 
				
			||||
    // because that's the order layers are processed for keypresses
 | 
				
			||||
    // You can for check for example:
 | 
				
			||||
    // state->status.layer
 | 
				
			||||
    // state->status.default_layer
 | 
				
			||||
    // state->status.leds (see led.h for available statuses)
 | 
				
			||||
    if (state->status.layer & 0x2) {
 | 
				
			||||
        state->target_lcd_color = LCD_COLOR(0xA0, 0xB0, 0xFF);
 | 
				
			||||
        state->layer_text = "Layer 2";
 | 
				
			||||
    }
 | 
				
			||||
    else {
 | 
				
			||||
        state->target_lcd_color = LCD_COLOR(0x50, 0xB0, 0xFF);
 | 
				
			||||
        state->layer_text = "Layer 1";
 | 
				
			||||
    }
 | 
				
			||||
    // You can also stop existing animations, and start your custom ones here
 | 
				
			||||
    // remember that you should normally have only one animation for the LCD
 | 
				
			||||
    // and one for the background. But you can also combine them if you want.
 | 
				
			||||
    start_keyframe_animation(&lcd_animation);
 | 
				
			||||
    start_keyframe_animation(&color_animation);
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,77 @@
 | 
				
			||||
/* Copyright 2017 Fred Sundvik
 | 
				
			||||
 *
 | 
				
			||||
 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||
 * it under the terms of the GNU General Public License as published by
 | 
				
			||||
 * the Free Software Foundation, either version 2 of the License, or
 | 
				
			||||
 * (at your option) any later version.
 | 
				
			||||
 *
 | 
				
			||||
 * This program is distributed in the hope that it will be useful,
 | 
				
			||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||
 * GNU General Public License for more details.
 | 
				
			||||
 *
 | 
				
			||||
 * You should have received a copy of the GNU General Public License
 | 
				
			||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
#include "lcd_backlight_keyframes.h"
 | 
				
			||||
 | 
				
			||||
bool backlight_keyframe_animate_color(keyframe_animation_t* animation, visualizer_state_t* state) {
 | 
				
			||||
    int frame_length = animation->frame_lengths[animation->current_frame];
 | 
				
			||||
    int current_pos = frame_length - animation->time_left_in_frame;
 | 
				
			||||
    uint8_t t_h = LCD_HUE(state->target_lcd_color);
 | 
				
			||||
    uint8_t t_s = LCD_SAT(state->target_lcd_color);
 | 
				
			||||
    uint8_t t_i = LCD_INT(state->target_lcd_color);
 | 
				
			||||
    uint8_t p_h = LCD_HUE(state->prev_lcd_color);
 | 
				
			||||
    uint8_t p_s = LCD_SAT(state->prev_lcd_color);
 | 
				
			||||
    uint8_t p_i = LCD_INT(state->prev_lcd_color);
 | 
				
			||||
 | 
				
			||||
    uint8_t d_h1 = t_h - p_h; //Modulo arithmetic since we want to wrap around
 | 
				
			||||
    int d_h2 = t_h - p_h;
 | 
				
			||||
    // Chose the shortest way around
 | 
				
			||||
    int d_h = abs(d_h2) < d_h1 ? d_h2 : d_h1;
 | 
				
			||||
    int d_s = t_s - p_s;
 | 
				
			||||
    int d_i = t_i - p_i;
 | 
				
			||||
 | 
				
			||||
    int hue = (d_h * current_pos) / frame_length;
 | 
				
			||||
    int sat = (d_s * current_pos) / frame_length;
 | 
				
			||||
    int intensity = (d_i * current_pos) / frame_length;
 | 
				
			||||
    //dprintf("%X -> %X = %X\n", p_h, t_h, hue);
 | 
				
			||||
    hue += p_h;
 | 
				
			||||
    sat += p_s;
 | 
				
			||||
    intensity += p_i;
 | 
				
			||||
    state->current_lcd_color = LCD_COLOR(hue, sat, intensity);
 | 
				
			||||
    lcd_backlight_color(
 | 
				
			||||
            LCD_HUE(state->current_lcd_color),
 | 
				
			||||
            LCD_SAT(state->current_lcd_color),
 | 
				
			||||
            LCD_INT(state->current_lcd_color));
 | 
				
			||||
 | 
				
			||||
    return true;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
bool backlight_keyframe_set_color(keyframe_animation_t* animation, visualizer_state_t* state) {
 | 
				
			||||
    (void)animation;
 | 
				
			||||
    state->prev_lcd_color = state->target_lcd_color;
 | 
				
			||||
    state->current_lcd_color = state->target_lcd_color;
 | 
				
			||||
    lcd_backlight_color(
 | 
				
			||||
            LCD_HUE(state->current_lcd_color),
 | 
				
			||||
            LCD_SAT(state->current_lcd_color),
 | 
				
			||||
            LCD_INT(state->current_lcd_color));
 | 
				
			||||
    return false;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
bool backlight_keyframe_disable(keyframe_animation_t* animation, visualizer_state_t* state) {
 | 
				
			||||
    (void)animation;
 | 
				
			||||
    (void)state;
 | 
				
			||||
    lcd_backlight_hal_color(0, 0, 0);
 | 
				
			||||
    return false;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
bool backlight_keyframe_enable(keyframe_animation_t* animation, visualizer_state_t* state) {
 | 
				
			||||
    (void)animation;
 | 
				
			||||
    (void)state;
 | 
				
			||||
    lcd_backlight_color(LCD_HUE(state->current_lcd_color),
 | 
				
			||||
        LCD_SAT(state->current_lcd_color),
 | 
				
			||||
        LCD_INT(state->current_lcd_color));
 | 
				
			||||
    return false;
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,30 @@
 | 
				
			||||
/* Copyright 2017 Fred Sundvik
 | 
				
			||||
 *
 | 
				
			||||
 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||
 * it under the terms of the GNU General Public License as published by
 | 
				
			||||
 * the Free Software Foundation, either version 2 of the License, or
 | 
				
			||||
 * (at your option) any later version.
 | 
				
			||||
 *
 | 
				
			||||
 * This program is distributed in the hope that it will be useful,
 | 
				
			||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||
 * GNU General Public License for more details.
 | 
				
			||||
 *
 | 
				
			||||
 * You should have received a copy of the GNU General Public License
 | 
				
			||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
#ifndef QUANTUM_VISUALIZER_LCD_BACKLIGHT_KEYFRAMES_H_
 | 
				
			||||
#define QUANTUM_VISUALIZER_LCD_BACKLIGHT_KEYFRAMES_H_
 | 
				
			||||
 | 
				
			||||
#include "visualizer.h"
 | 
				
			||||
 | 
				
			||||
// Animates the LCD backlight color between the current color and the target color (of the state)
 | 
				
			||||
bool backlight_keyframe_animate_color(keyframe_animation_t* animation, visualizer_state_t* state);
 | 
				
			||||
// Sets the backlight color to the target color
 | 
				
			||||
bool backlight_keyframe_set_color(keyframe_animation_t* animation, visualizer_state_t* state);
 | 
				
			||||
 | 
				
			||||
bool backlight_keyframe_disable(keyframe_animation_t* animation, visualizer_state_t* state);
 | 
				
			||||
bool backlight_keyframe_enable(keyframe_animation_t* animation, visualizer_state_t* state);
 | 
				
			||||
 | 
				
			||||
#endif /* QUANTUM_VISUALIZER_LCD_BACKLIGHT_KEYFRAMES_H_ */
 | 
				
			||||
@ -0,0 +1,188 @@
 | 
				
			||||
/* Copyright 2017 Fred Sundvik
 | 
				
			||||
 *
 | 
				
			||||
 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||
 * it under the terms of the GNU General Public License as published by
 | 
				
			||||
 * the Free Software Foundation, either version 2 of the License, or
 | 
				
			||||
 * (at your option) any later version.
 | 
				
			||||
 *
 | 
				
			||||
 * This program is distributed in the hope that it will be useful,
 | 
				
			||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||
 * GNU General Public License for more details.
 | 
				
			||||
 *
 | 
				
			||||
 * You should have received a copy of the GNU General Public License
 | 
				
			||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
#include "lcd_keyframes.h"
 | 
				
			||||
#include <string.h>
 | 
				
			||||
#include "action_util.h"
 | 
				
			||||
#include "led.h"
 | 
				
			||||
#include "resources/resources.h"
 | 
				
			||||
 | 
				
			||||
bool lcd_keyframe_display_layer_text(keyframe_animation_t* animation, visualizer_state_t* state) {
 | 
				
			||||
    (void)animation;
 | 
				
			||||
    gdispClear(White);
 | 
				
			||||
    gdispDrawString(0, 10, state->layer_text, state->font_dejavusansbold12, Black);
 | 
				
			||||
    return false;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
static void format_layer_bitmap_string(uint16_t default_layer, uint16_t layer, char* buffer) {
 | 
				
			||||
    for (int i=0; i<16;i++)
 | 
				
			||||
    {
 | 
				
			||||
        uint32_t mask = (1u << i);
 | 
				
			||||
        if (default_layer & mask) {
 | 
				
			||||
            if (layer & mask) {
 | 
				
			||||
                *buffer = 'B';
 | 
				
			||||
            } else {
 | 
				
			||||
                *buffer = 'D';
 | 
				
			||||
            }
 | 
				
			||||
        } else if (layer & mask) {
 | 
				
			||||
            *buffer = '1';
 | 
				
			||||
        } else {
 | 
				
			||||
            *buffer = '0';
 | 
				
			||||
        }
 | 
				
			||||
        ++buffer;
 | 
				
			||||
 | 
				
			||||
        if (i==3 || i==7 || i==11) {
 | 
				
			||||
            *buffer = ' ';
 | 
				
			||||
            ++buffer;
 | 
				
			||||
        }
 | 
				
			||||
    }
 | 
				
			||||
    *buffer = 0;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
bool lcd_keyframe_display_layer_bitmap(keyframe_animation_t* animation, visualizer_state_t* state) {
 | 
				
			||||
    (void)animation;
 | 
				
			||||
    const char* layer_help = "1=On D=Default B=Both";
 | 
				
			||||
    char layer_buffer[16 + 4]; // 3 spaces and one null terminator
 | 
				
			||||
    gdispClear(White);
 | 
				
			||||
    gdispDrawString(0, 0, layer_help, state->font_fixed5x8, Black);
 | 
				
			||||
    format_layer_bitmap_string(state->status.default_layer, state->status.layer, layer_buffer);
 | 
				
			||||
    gdispDrawString(0, 10, layer_buffer, state->font_fixed5x8, Black);
 | 
				
			||||
    format_layer_bitmap_string(state->status.default_layer >> 16, state->status.layer >> 16, layer_buffer);
 | 
				
			||||
    gdispDrawString(0, 20, layer_buffer, state->font_fixed5x8, Black);
 | 
				
			||||
    return false;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
static void format_mods_bitmap_string(uint8_t mods, char* buffer) {
 | 
				
			||||
    *buffer = ' ';
 | 
				
			||||
    ++buffer;
 | 
				
			||||
 | 
				
			||||
    for (int i = 0; i<8; i++)
 | 
				
			||||
    {
 | 
				
			||||
        uint32_t mask = (1u << i);
 | 
				
			||||
        if (mods & mask) {
 | 
				
			||||
            *buffer = '1';
 | 
				
			||||
        } else {
 | 
				
			||||
            *buffer = '0';
 | 
				
			||||
        }
 | 
				
			||||
        ++buffer;
 | 
				
			||||
 | 
				
			||||
        if (i==3) {
 | 
				
			||||
            *buffer = ' ';
 | 
				
			||||
            ++buffer;
 | 
				
			||||
        }
 | 
				
			||||
    }
 | 
				
			||||
    *buffer = 0;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
bool lcd_keyframe_display_mods_bitmap(keyframe_animation_t* animation, visualizer_state_t* state) {
 | 
				
			||||
    (void)animation;
 | 
				
			||||
 | 
				
			||||
    const char* title = "Modifier states";
 | 
				
			||||
    const char* mods_header = " CSAG CSAG ";
 | 
				
			||||
    char status_buffer[12];
 | 
				
			||||
 | 
				
			||||
    gdispClear(White);
 | 
				
			||||
    gdispDrawString(0, 0, title, state->font_fixed5x8, Black);
 | 
				
			||||
    gdispDrawString(0, 10, mods_header, state->font_fixed5x8, Black);
 | 
				
			||||
    format_mods_bitmap_string(state->status.mods, status_buffer);
 | 
				
			||||
    gdispDrawString(0, 20, status_buffer, state->font_fixed5x8, Black);
 | 
				
			||||
 | 
				
			||||
    return false;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
#define LED_STATE_STRING_SIZE sizeof("NUM CAPS SCRL COMP KANA")
 | 
				
			||||
 | 
				
			||||
static void get_led_state_string(char* output, visualizer_state_t* state) {
 | 
				
			||||
    uint8_t pos = 0;
 | 
				
			||||
 | 
				
			||||
    if (state->status.leds & (1u << USB_LED_NUM_LOCK)) {
 | 
				
			||||
       memcpy(output + pos, "NUM ", 4);
 | 
				
			||||
       pos += 4;
 | 
				
			||||
    }
 | 
				
			||||
    if (state->status.leds & (1u << USB_LED_CAPS_LOCK)) {
 | 
				
			||||
       memcpy(output + pos, "CAPS ", 5);
 | 
				
			||||
       pos += 5;
 | 
				
			||||
    }
 | 
				
			||||
    if (state->status.leds & (1u << USB_LED_SCROLL_LOCK)) {
 | 
				
			||||
       memcpy(output + pos, "SCRL ", 5);
 | 
				
			||||
       pos += 5;
 | 
				
			||||
    }
 | 
				
			||||
    if (state->status.leds & (1u << USB_LED_COMPOSE)) {
 | 
				
			||||
       memcpy(output + pos, "COMP ", 5);
 | 
				
			||||
       pos += 5;
 | 
				
			||||
    }
 | 
				
			||||
    if (state->status.leds & (1u << USB_LED_KANA)) {
 | 
				
			||||
       memcpy(output + pos, "KANA ", 5);
 | 
				
			||||
       pos += 5;
 | 
				
			||||
    }
 | 
				
			||||
    output[pos] = 0;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
bool lcd_keyframe_display_led_states(keyframe_animation_t* animation, visualizer_state_t* state)
 | 
				
			||||
{
 | 
				
			||||
    (void)animation;
 | 
				
			||||
    char output[LED_STATE_STRING_SIZE];
 | 
				
			||||
    get_led_state_string(output, state);
 | 
				
			||||
    gdispClear(White);
 | 
				
			||||
    gdispDrawString(0, 10, output, state->font_dejavusansbold12, Black);
 | 
				
			||||
    return false;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
bool lcd_keyframe_display_layer_and_led_states(keyframe_animation_t* animation, visualizer_state_t* state) {
 | 
				
			||||
    (void)animation;
 | 
				
			||||
    gdispClear(White);
 | 
				
			||||
    uint8_t y = 10;
 | 
				
			||||
    if (state->status.leds) {
 | 
				
			||||
        char output[LED_STATE_STRING_SIZE];
 | 
				
			||||
        get_led_state_string(output, state);
 | 
				
			||||
        gdispDrawString(0, 1, output, state->font_dejavusansbold12, Black);
 | 
				
			||||
        y = 17;
 | 
				
			||||
    }
 | 
				
			||||
    gdispDrawString(0, y, state->layer_text, state->font_dejavusansbold12, Black);
 | 
				
			||||
    return false;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
bool lcd_keyframe_draw_logo(keyframe_animation_t* animation, visualizer_state_t* state) {
 | 
				
			||||
    (void)state;
 | 
				
			||||
    (void)animation;
 | 
				
			||||
    // Read the uGFX documentation for information how to use the displays
 | 
				
			||||
    // http://wiki.ugfx.org/index.php/Main_Page
 | 
				
			||||
    gdispClear(White);
 | 
				
			||||
 | 
				
			||||
    // You can use static variables for things that can't be found in the animation
 | 
				
			||||
    // or state structs, here we use the image
 | 
				
			||||
 | 
				
			||||
    //gdispGBlitArea is a tricky function to use since it supports blitting part of the image
 | 
				
			||||
    // if you have full screen image, then just use 128 and 32 for both source and target dimensions
 | 
				
			||||
    gdispGBlitArea(GDISP, 0, 0, 128, 32, 0, 0, 128, (pixel_t*)resource_lcd_logo);
 | 
				
			||||
 | 
				
			||||
    return false;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
bool lcd_keyframe_disable(keyframe_animation_t* animation, visualizer_state_t* state) {
 | 
				
			||||
    (void)animation;
 | 
				
			||||
    (void)state;
 | 
				
			||||
    gdispSetPowerMode(powerOff);
 | 
				
			||||
    return false;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
bool lcd_keyframe_enable(keyframe_animation_t* animation, visualizer_state_t* state) {
 | 
				
			||||
    (void)animation;
 | 
				
			||||
    (void)state;
 | 
				
			||||
    gdispSetPowerMode(powerOn);
 | 
				
			||||
    return false;
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,39 @@
 | 
				
			||||
/* Copyright 2017 Fred Sundvik
 | 
				
			||||
 *
 | 
				
			||||
 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||
 * it under the terms of the GNU General Public License as published by
 | 
				
			||||
 * the Free Software Foundation, either version 2 of the License, or
 | 
				
			||||
 * (at your option) any later version.
 | 
				
			||||
 *
 | 
				
			||||
 * This program is distributed in the hope that it will be useful,
 | 
				
			||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||
 * GNU General Public License for more details.
 | 
				
			||||
 *
 | 
				
			||||
 * You should have received a copy of the GNU General Public License
 | 
				
			||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
#ifndef QUANTUM_VISUALIZER_LCD_KEYFRAMES_H_
 | 
				
			||||
#define QUANTUM_VISUALIZER_LCD_KEYFRAMES_H_
 | 
				
			||||
 | 
				
			||||
#include "visualizer.h"
 | 
				
			||||
 | 
				
			||||
// Displays the layer text centered vertically on the screen
 | 
				
			||||
bool lcd_keyframe_display_layer_text(keyframe_animation_t* animation, visualizer_state_t* state);
 | 
				
			||||
// Displays a bitmap (0/1) of all the currently active layers
 | 
				
			||||
bool lcd_keyframe_display_layer_bitmap(keyframe_animation_t* animation, visualizer_state_t* state);
 | 
				
			||||
// Displays a bitmap (0/1) of all the currently active mods
 | 
				
			||||
bool lcd_keyframe_display_mods_bitmap(keyframe_animation_t* animation, visualizer_state_t* state);
 | 
				
			||||
// Displays the keyboard led states (CAPS (Caps lock), NUM (Num lock), SCRL (Scroll lock), COMP (Compose), KANA)
 | 
				
			||||
bool lcd_keyframe_display_led_states(keyframe_animation_t* animation, visualizer_state_t* state);
 | 
				
			||||
// Displays both the layer text and the led states
 | 
				
			||||
bool lcd_keyframe_display_layer_and_led_states(keyframe_animation_t* animation, visualizer_state_t* state);
 | 
				
			||||
// Displays the QMK logo on the LCD screen
 | 
				
			||||
bool lcd_keyframe_draw_logo(keyframe_animation_t* animation, visualizer_state_t* state);
 | 
				
			||||
 | 
				
			||||
bool lcd_keyframe_disable(keyframe_animation_t* animation, visualizer_state_t* state);
 | 
				
			||||
bool lcd_keyframe_enable(keyframe_animation_t* animation, visualizer_state_t* state);
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
#endif /* QUANTUM_VISUALIZER_LCD_KEYFRAMES_H_ */
 | 
				
			||||
@ -0,0 +1,61 @@
 | 
				
			||||
/* Copyright 2017 Fred Sundvik
 | 
				
			||||
 *
 | 
				
			||||
 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||
 * it under the terms of the GNU General Public License as published by
 | 
				
			||||
 * the Free Software Foundation, either version 2 of the License, or
 | 
				
			||||
 * (at your option) any later version.
 | 
				
			||||
 *
 | 
				
			||||
 * This program is distributed in the hope that it will be useful,
 | 
				
			||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||
 * GNU General Public License for more details.
 | 
				
			||||
 *
 | 
				
			||||
 * You should have received a copy of the GNU General Public License
 | 
				
			||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
#include "resources.h"
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
// To generate an image array like this
 | 
				
			||||
// Ensure the image is 128 x 32 or smaller
 | 
				
			||||
// Convert the bitmap to a C array using a program like http://www.riuson.com/lcd-image-converter/
 | 
				
			||||
// Ensure the the conversion process produces a monochrome format array - 1 bit/pixel, left to right, top to bottom
 | 
				
			||||
// Update array in the source code with the C array produced by the conversion program
 | 
				
			||||
 | 
				
			||||
// The image below is generated from lcd_logo.png
 | 
				
			||||
const uint8_t resource_lcd_logo[512] = {
 | 
				
			||||
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||
    0x00, 0xf8, 0xfe, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x38, 0x38, 0x38, 0x06, 0x29, 0x41, 0x24, 0x52, 0x24, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x38, 0x38, 0x38, 0x09, 0x55, 0x42, 0xaa, 0xaa, 0xaa, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x38, 0x38, 0x38, 0x09, 0x55, 0x82, 0x28, 0xaa, 0xae, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x38, 0x38, 0x38, 0x09, 0x55, 0x43, 0x28, 0xaa, 0xaa, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x38, 0x38, 0x38, 0x0a, 0x55, 0x42, 0x28, 0xaa, 0xaa, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x38, 0x38, 0x38, 0x05, 0x45, 0x42, 0x28, 0x89, 0x4a, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x18, 0x38, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x1c, 0x38, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x0e, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x03, 0xff, 0x80, 0x04, 0x45, 0x14, 0xa4, 0x92, 0x83, 0x52, 0x22, 0x22, 0x36, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x00, 0x38, 0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0xba, 0x84, 0x55, 0x55, 0x57, 0x45, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x00, 0x38, 0x00, 0x08, 0xaa, 0xaa, 0xaa, 0x92, 0xb2, 0x55, 0x55, 0x42, 0x65, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x00, 0x38, 0x00, 0x08, 0xaa, 0xaa, 0xaa, 0x92, 0x81, 0x56, 0x65, 0x42, 0x45, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x00, 0x38, 0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0x92, 0x81, 0x54, 0x45, 0x42, 0x45, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x00, 0x38, 0x00, 0x04, 0x48, 0xa2, 0x4a, 0x89, 0x06, 0x24, 0x42, 0x41, 0x36, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
| 
		 After Width: | Height: | Size: 490 B  | 
@ -0,0 +1,27 @@
 | 
				
			||||
/* Copyright 2017 Fred Sundvik
 | 
				
			||||
 *
 | 
				
			||||
 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||
 * it under the terms of the GNU General Public License as published by
 | 
				
			||||
 * the Free Software Foundation, either version 2 of the License, or
 | 
				
			||||
 * (at your option) any later version.
 | 
				
			||||
 *
 | 
				
			||||
 * This program is distributed in the hope that it will be useful,
 | 
				
			||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||
 * GNU General Public License for more details.
 | 
				
			||||
 *
 | 
				
			||||
 * You should have received a copy of the GNU General Public License
 | 
				
			||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
#ifndef QUANTUM_VISUALIZER_RESOURCES_RESOURCES_H_
 | 
				
			||||
#define QUANTUM_VISUALIZER_RESOURCES_RESOURCES_H_
 | 
				
			||||
 | 
				
			||||
#include <stdint.h>
 | 
				
			||||
 | 
				
			||||
#ifdef LCD_ENABLE
 | 
				
			||||
extern const uint8_t resource_lcd_logo[];
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
#endif /* QUANTUM_VISUALIZER_RESOURCES_RESOURCES_H_ */
 | 
				
			||||
@ -0,0 +1,23 @@
 | 
				
			||||
/* Copyright 2017 Fred Sundvik
 | 
				
			||||
 *
 | 
				
			||||
 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||
 * it under the terms of the GNU General Public License as published by
 | 
				
			||||
 * the Free Software Foundation, either version 2 of the License, or
 | 
				
			||||
 * (at your option) any later version.
 | 
				
			||||
 *
 | 
				
			||||
 * This program is distributed in the hope that it will be useful,
 | 
				
			||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||
 * GNU General Public License for more details.
 | 
				
			||||
 *
 | 
				
			||||
 * You should have received a copy of the GNU General Public License
 | 
				
			||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
#include "visualizer_keyframes.h"
 | 
				
			||||
 | 
				
			||||
bool keyframe_no_operation(keyframe_animation_t* animation, visualizer_state_t* state) {
 | 
				
			||||
    (void)animation;
 | 
				
			||||
    (void)state;
 | 
				
			||||
    return false;
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,26 @@
 | 
				
			||||
/* Copyright 2017 Fred Sundvik
 | 
				
			||||
 *
 | 
				
			||||
 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||
 * it under the terms of the GNU General Public License as published by
 | 
				
			||||
 * the Free Software Foundation, either version 2 of the License, or
 | 
				
			||||
 * (at your option) any later version.
 | 
				
			||||
 *
 | 
				
			||||
 * This program is distributed in the hope that it will be useful,
 | 
				
			||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||
 * GNU General Public License for more details.
 | 
				
			||||
 *
 | 
				
			||||
 * You should have received a copy of the GNU General Public License
 | 
				
			||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
#ifndef QUANTUM_VISUALIZER_VISUALIZER_KEYFRAMES_H_
 | 
				
			||||
#define QUANTUM_VISUALIZER_VISUALIZER_KEYFRAMES_H_
 | 
				
			||||
 | 
				
			||||
#include "visualizer.h"
 | 
				
			||||
 | 
				
			||||
// Some predefined keyframe functions that can be used by the user code
 | 
				
			||||
// Does nothing, useful for adding delays
 | 
				
			||||
bool keyframe_no_operation(keyframe_animation_t* animation, visualizer_state_t* state);
 | 
				
			||||
 | 
				
			||||
#endif /* QUANTUM_VISUALIZER_VISUALIZER_KEYFRAMES_H_ */
 | 
				
			||||
					Loading…
					
					
				
		Reference in new issue