Browse Source

first version for malrichtig ergodox layout

master
MaxMalRichtig 6 years ago
commit
f388493694
  1. BIN
      assets/L0_LEFT.bmp
  2. BIN
      assets/L0_RIGHT.bmp
  3. BIN
      assets/L1_LEFT.bmp
  4. BIN
      assets/L1_RIGHT.bmp
  5. BIN
      assets/L2_LEFT.bmp
  6. BIN
      assets/L2_RIGHT.bmp
  7. BIN
      assets/L2_RIGHT_NLK_OFF.bmp
  8. BIN
      assets/L2_RIGHT_NLK_ON.bmp
  9. BIN
      assets/LEFT_MAP.xcf
  10. BIN
      assets/RIGHT_MAP.xcf
  11. 102
      config.h
  12. 185
      custom_visualizer.h
  13. 366
      keymap.c
  14. 32
      readme.md
  15. 272
      res/bitmaps.c
  16. 35
      res/bitmaps.h
  17. 1
      rules.mk
  18. 55
      visualizer.c

BIN
assets/L0_LEFT.bmp

BIN
assets/L0_RIGHT.bmp

BIN
assets/L1_LEFT.bmp

BIN
assets/L1_RIGHT.bmp

BIN
assets/L2_LEFT.bmp

BIN
assets/L2_RIGHT.bmp

BIN
assets/L2_RIGHT_NLK_OFF.bmp

BIN
assets/L2_RIGHT_NLK_ON.bmp

BIN
assets/LEFT_MAP.xcf

BIN
assets/RIGHT_MAP.xcf

102
config.h

@ -0,0 +1,102 @@
/*
Copyright 2015 Jun Wako <wakojun@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/>.
*/
#ifndef INFINITY_ERGODOX_CONFIG_H
#define INFINITY_ERGODOX_CONFIG_H
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x6464
#define DEVICE_VER 0x0001
/* in python2: list(u"whatever".encode('utf-16-le')) */
/* at most 32 characters or the ugly hack in usb_main.c borks */
#define MANUFACTURER "TMK"
#define USBSTR_MANUFACTURER 'T', '\x00', 'M', '\x00', 'K', '\x00', ' ', '\x00'
#define PRODUCT "Infinity keyboard/TMK"
#define USBSTR_PRODUCT 'I', '\x00', 'n', '\x00', 'f', '\x00', 'i', '\x00', 'n', '\x00', 'i', '\x00', 't', '\x00', 'y', '\x00', ' ', '\x00', 'k', '\x00', 'e', '\x00', 'y', '\x00', 'b', '\x00', 'o', '\x00', 'a', '\x00', 'r', '\x00', 'd', '\x00', '/', '\x00', 'T', '\x00', 'M', '\x00', 'K', '\x00'
#define MOUSEKEY_INTERVAL 20
#define MOUSEKEY_DELAY 0
#define MOUSEKEY_TIME_TO_MAX 60
#define MOUSEKEY_MAX_SPEED 7
#define MOUSEKEY_WHEEL_MAX_SPEED 10
#define MOUSEKEY_WHEEL_TIME_TO_MAX 60
#define TAPPING_TOGGLE 2
/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST
#define PERMISSIVE_HOLD
#define TAPPING_TERM 200
#define IGNORE_MOD_TAP_INTERRUPT // this makes it possible to do rolling combos (zx) with keys that convert to other keys on hold (z becomes ctrl when you hold it, and when this option isn't enabled, z rapidly followed by x actually sends Ctrl-x. That's bad.)
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/* key combination for command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL)) || \
keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)) \
)
/* key matrix size */
#define MATRIX_ROWS 18
#define MATRIX_COLS 5
#define LOCAL_MATRIX_ROWS 9
/* number of backlight levels */
#define BACKLIGHT_LEVELS 5
#define LED_BRIGHTNESS_LO 100
#define LED_BRIGHTNESS_HI 255
/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST
/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 2
#define SERIAL_LINK_BAUD 562500
#define SERIAL_LINK_THREAD_PRIORITY (NORMALPRIO - 1)
#define VISUALIZER_USER_DATA_SIZE 16
//#define FORCE_NKRO
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
#endif

185
custom_visualizer.h

@ -0,0 +1,185 @@
/* 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 MALRICHTIG_CUSTOM_VISUALIZER_H_
#define MALRICHTIG_CUSTOM_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 "default_animations.h"
#include "res/bitmaps.h"
#include <string.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;
bool custom_lcd_keyframe_draw_layer(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, here we use the image
if (state->status.layer & 0x8) {
// TODO: make some nice image
}
else if (state->status.layer & 0x4) {
if (is_serial_link_master()) {
gdispGBlitArea(GDISP, 0, 0, LCD_WIDTH, LCD_HEIGHT, 0, 0, LCD_WIDTH, (pixel_t*)image_data_L2_LEFT);
}
else {
if (state->status.leds & (1u << USB_LED_NUM_LOCK)) {
gdispGBlitArea(GDISP, 0, 0, LCD_WIDTH, LCD_HEIGHT, 0, 0, LCD_WIDTH, (pixel_t*)image_data_L2_RIGHT_NLK_ON);
}
else {
gdispGBlitArea(GDISP, 0, 0, LCD_WIDTH, LCD_HEIGHT, 0, 0, LCD_WIDTH, (pixel_t*)image_data_L2_RIGHT_NLK_OFF);
}
}
}
else if (state->status.layer & 0x2) {
if (is_serial_link_master()) {
gdispGBlitArea(GDISP, 0, 0, LCD_WIDTH, LCD_HEIGHT, 0, 0, LCD_WIDTH, (pixel_t*)image_data_L1_LEFT);
}
else {
gdispGBlitArea(GDISP, 0, 0, LCD_WIDTH, LCD_HEIGHT, 0, 0, LCD_WIDTH, (pixel_t*)image_data_L1_RIGHT);
}
}
else {
if (is_serial_link_master()) {
gdispGBlitArea(GDISP, 0, 0, LCD_WIDTH, LCD_HEIGHT, 0, 0, LCD_WIDTH, (pixel_t*)image_data_L0_LEFT);
}
else {
gdispGBlitArea(GDISP, 0, 0, LCD_WIDTH, LCD_HEIGHT, 0, 0, LCD_WIDTH, (pixel_t*)image_data_L0_RIGHT);
}
}
return false;
}
// 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(50), gfxMillisecondsToTicks(500)},
.frame_functions = {keyframe_no_operation, lcd_backlight_keyframe_animate_color},
};
// Don't worry, if the startup animation is long, you can use the keyboard like normal
// during that time
static keyframe_animation_t custom_bitmap_layer_change = {
.num_frames = 1,
.loop = false,
.frame_lengths = {gfxMillisecondsToTicks(500)},
.frame_functions = {custom_lcd_keyframe_draw_layer},
};
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 (strcmp(state->layer_text, "") == 0) {
start_keyframe_animation(&custom_bitmap_layer_change);
}
else {
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 /* MALRICHTIG_CUSTOM_VISUALIZER_H_ */

366
keymap.c

@ -0,0 +1,366 @@
// German keymap derived from "german", but more closely resembling the German layout of the Kinesis Ergo Elan.
//
// chschmitz, 2016-01-27
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#include "keymap_german.h"
#include "lcd_backlight.h"
// Layer names
#define XBASE 0 // default layer
#define SYMB 1 // symbol layer
#define MOUS 2 // mouse and numbers
#define MDIA 3 // media keys
#define _STEP 25 // increase / decrease stepsize
/*
#define COUNT(x) (sizeof (x) / sizeof (*(x)))
const uint16_t PROGMEM auto_tap_keys[] = {
DE_LESS,
DE_MORE,
};
*/
//Tap Dance Declarations
enum {
TD_L_SHLCK = 0,
TD_R_SHLCK,
TD_ESCCLS,
TD_ALTTAB
};
enum custom_layers {
_BASE,
_LOWER,
_RAISE,
_NUMS
};
enum custom_keycodes {
CK_CUT = SAFE_RANGE,
CK_COPY,
CK_PASTE,
DIS_COL,
DIS_IDEC,
DIS_IINC,
DIS_SDEC,
DIS_SINC,
DIS_TOG,
BASE,
LOWER,
RAISE,
NUMS
};
uint8_t _hue = 0;
uint8_t _saturation = 0;
uint8_t _intensity = 0;
uint8_t _enable = 0;
static bool alttab_sequence_start = true;
void td_alttab_sequence (qk_tap_dance_state_t *state, void *user_data) {
if (state->count <= 2) {
if (alttab_sequence_start) {
register_code(KC_LALT);
alttab_sequence_start = false;
}
SEND_STRING(SS_TAP(X_TAB));
}
else {
unregister_code(KC_LALT);
alttab_sequence_start = true;
reset_tap_dance (state);
}
}
void td_escape_close (qk_tap_dance_state_t *state, void *user_data) {
if (state->count <= 2) {
register_code(KC_ESC);
unregister_code(KC_ESC);
}
else {
SEND_STRING(SS_DOWN(X_LALT)SS_TAP(X_F4)SS_UP(X_LALT));
}
}
//Tap Dance Definitions
qk_tap_dance_action_t tap_dance_actions[] = {
//Tap once for Esc, twice for Caps Lock
[TD_L_SHLCK] = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, KC_CAPS),
[TD_R_SHLCK] = ACTION_TAP_DANCE_DOUBLE(KC_RSFT, KC_CAPS),
[TD_ESCCLS] = ACTION_TAP_DANCE_FN(td_escape_close),
[TD_ALTTAB] = ACTION_TAP_DANCE_FN(td_alttab_sequence)
// Other declarations would go here, separated by commas, if you have them
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* X'es mark the spots where this is different from the "german" layout which it is based on.
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* |X Esc X| 1 | 2 | 3 | 4 | 5 |X ` X| |XPRSCX| 6 | 7 | 8 | 9 | 0 | ß |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* |X Tab X| Q | W | E | R | T |X L1 X| |X L1 X| Z | U | I | O | P | Ü |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Caps | A | S | D | F | G |------| |------| H | J | K | L | Ö | Ä/L2 |
* |--------+------+------+------+------+------|X L2 X| |X L2 X|------+------+------+------+------+--------|
* | LShift | Y | X | C | V | B | | | | N | M | , | . |X - X| RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |XLGuiX|X ^ X|X < X|XLEFTX|XRIGHT| |XDownX|X Up X|X # X|X + X|XRGuiX|
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* |XCTRLX|XALTX | | Alt |Ctrl/Esc|
* ,------+------+------| |------+--------+------.
* |XXX |XXX | Home | | PgUp |XXX |XXX |
* | Bkspc|Del |------| |------| Enter | Space|
* | | | End | | PgDn | | |
* `--------------------' `----------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[_BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
TD(TD_ESCCLS),KC_1, KC_2, KC_3, KC_4, KC_5, CK_CUT,
TD(TD_ALTTAB),KC_Q, KC_W, KC_E, KC_R, KC_T, CK_COPY,
KC_LCTRL, KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LALT, DE_Y, KC_X, KC_C, KC_V, KC_B, CK_PASTE,
KC_LGUI, KC_DEL, KC_PGDN, KC_PGUP, LOWER,
KC_LEFT, KC_RGHT,
KC_HOME,
KC_SPC,TD(TD_L_SHLCK),KC_TAB,
// right hand
KC_PSCR, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DOT,
KC_PGUP, DE_Z, KC_U, KC_I, KC_O, KC_P, DE_SS,
KC_H, KC_J, KC_K, KC_L, DE_OE, RCTL_T(DE_UE),
KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, DE_MINS, RALT_T(DE_AE),
RAISE, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT,
KC_DOWN, KC_UP,
KC_END,
KC_ENT, TD(TD_R_SHLCK), KC_BSPC
),
// [BASE] = LAYOUT_ergodox( // layer 0 : default
// // left hand
// KC_CIRC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MPLY,
// KC_DELT, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(1),
// KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G,
// KC_LSFT, DE_Y, KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO),
// LT(SYMB,DE_LESS),CTL_T(DE_HASH), DE_ACUT, DE_MINS, DE_PLUS,
// ALT_T(KC_APP), KC_LGUI,
// KC_HOME,
// KC_SPC,KC_BSPC,KC_END,
// // right hand
// KC_MNXT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
// TG(2), DE_Z, KC_U, KC_I, KC_O, KC_P, DE_UE,
// KC_H, KC_J, KC_K, KC_L, DE_OE, LT(MDIA,DE_AE),
// MEH_T(KC_NO),KC_N, KC_M, KC_COMM, KC_DOT, CTL_T(DE_MINS), KC_RSFT,
// KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_FN1,
// KC_LALT,CTL_T(KC_ESC),
// KC_PGUP,
// KC_PGDN,KC_TAB, KC_ENT
// ),
/* Keymap 1: Symbol Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | @ | | [ | ] | # | | | | * | \ | / | ` | ´ | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | & | | | ( | ) | $ |------| |------| + | ! | ? | " | ' | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | ~ | ^ | { | } | % | | | | = | < | > | § | ° | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// SYMBOLS
[_LOWER] = LAYOUT_ergodox(
// left hand
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, DE_AT, DE_EURO, DE_LBRC, DE_RBRC, DE_HASH, KC_TRNS,
KC_TRNS, DE_AMPR, DE_PIPE, DE_LPRN, DE_RPRN, DE_DLR,
KC_TRNS, DE_TILD, DE_CIRC, DE_LCBR, DE_RCBR, DE_PERC, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS,KC_TRNS,
KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,
// right hand
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, DE_ASTR, DE_BSLS, DE_SLSH, DE_GRV, DE_ACUT, KC_TRNS,
DE_PLUS, DE_EXLM, DE_QST, DE_DQOT, DE_QUOT, KC_TRNS,
KC_TRNS, DE_EQL, DE_LESS, DE_MORE, DE_PARA, DE_RING, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 2: Media and mouse keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | Lclk | MsUp | Rclk | | | | | |VolDwn| Mute |VolUp | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | Btn4 |MsLeft|MsDown|MsRght| Btn5 |------| |------| | Prev | Stop | Play | Next | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | |WhRght|WhDown| WhUp |WhLeft|WhClk | | | |BwSrch|BwBack|BwHome|BwRefr|BwFwd | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | |MsAcl0|MsAcl1|MsAcl2| | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | |Brwser|Brwser|
* | Lclk | Rclk |------| |------|Back |Forwd |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// MOUSE AND NUMBERS
[_RAISE] = LAYOUT_ergodox(
KC_TRNS, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F11,
KC_TRNS, KC_NO, KC_BTN1, KC_MS_U, KC_BTN2, KC_NO , KC_TRNS,
KC_TRNS, KC_BTN4, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN5,
KC_TRNS, KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R, KC_BTN3, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_BTN1, KC_BTN2, KC_TRNS,
// right hand
KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_NLCK,
KC_TRNS, KC_PCMM, KC_P7, KC_P8, KC_P9, KC_PPLS, KC_PAST,
KC_PDOT, KC_P4, KC_P5, KC_P6, KC_PMNS, KC_PSLS,
KC_TRNS, KC_P0, KC_P1, KC_P2, KC_P3, KC_PENT, KC_PEQL,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
// MEDIA AND KEYBOARD
[_NUMS] = LAYOUT_ergodox(
// left hand
KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET,
KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, RESET,
KC_TRNS,KC_1, KC_2, KC_3, KC_4, KC_5,
KC_TRNS,DIS_SDEC, DIS_SINC, KC_NO, KC_NO, KC_NO, DEBUG,
KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_NO, KC_NO,
KC_NO,
KC_NO, KC_NO, KC_NO,
// right hand
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO,
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12,
KC_6, KC_7, KC_8, KC_9, KC_0, KC_NO,
KC_TRNS, KC_WSCH, KC_WBAK, KC_WHOM, KC_WREF, KC_WFWD, KC_NO,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_WBAK, KC_WFWD
),
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch(keycode) {
case LOWER:
if (record->event.pressed) {
layer_on(_LOWER);
update_tri_layer(_LOWER, _RAISE, _NUMS);
} else {
layer_off(_LOWER);
update_tri_layer(_LOWER, _RAISE, _NUMS);
}
return false;
break;
case RAISE:
if (record->event.pressed) {
layer_on(_RAISE);
update_tri_layer(_LOWER, _RAISE, _NUMS);
} else {
layer_off(_RAISE);
update_tri_layer(_LOWER, _RAISE, _NUMS);
}
return false;
break;
case CK_CUT:
if (record->event.pressed) {
SEND_STRING(SS_LCTRL("x"));
}
return false; break;
case CK_COPY:
if (record->event.pressed) {
SEND_STRING(SS_LCTRL("c"));
}
return false; break;
case CK_PASTE:
if (record->event.pressed) {
SEND_STRING(SS_LCTRL("v"));
}
return false; break;
case DIS_TOG:
_enable = !_enable;
return false; break;
case DIS_COL:
_hue = _hue - _STEP;
return false; break;
case DIS_IDEC:
_intensity = _intensity - _STEP < 0 ? 0 : _intensity - _STEP;
return false; break;
case DIS_IINC:
_intensity = _intensity + _STEP > 255 ? 255 : _intensity + _STEP;
return false; break;
case DIS_SDEC:
_saturation = _saturation - _STEP < 0 ? 0 : _saturation - _STEP;
return false; break;
case DIS_SINC:
_saturation = _saturation + _STEP > 255 ? 255 : _saturation + _STEP;
return false; break;
}
return true;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
switch (layer) {
case SYMB:
//ergodox_right_led_1_on();
break;
case MOUS:
//ergodox_right_led_2_on();
break;
case MDIA:
//ergodox_right_led_3_on();
break;
default:
if(_enable) {
//lcd_backlight_color(_hue, _saturation, _intensity);
//ergodox_right_led_2_set(200);
}
break;
}
};

32
readme.md

@ -0,0 +1,32 @@
# German Layout for the ErgoDox
Based on 'german-kinergo' by Christoph Schmitz, as well as the "german" layout from the
[qmk_firmware](https://github.com/qmk/qmk_firmware).
### Default Layer
A basic QWERTZ layout with some nice tweaks and SHIFT on the thumbs
### Code & Symbol Layer
All the symbols in one layer
TODO: QKM has some problems with rapid shifted/non-shifted keystrokes (like '<> , +* , .: , etc.')
### Mouse & Number Layer
Mouse control and some 10key
### Keyboard & Media Layer
Controls for the ergodox and some basic media-keys
# Compile & Build
Build the layout:
`make ergodox_infinity:malrichtig MASTER=right`
Flash it onto the keyboard(s):
`sudo make ergodox_infinity:malrichtig:dfu-util MASTER=right`

272
res/bitmaps.c

@ -0,0 +1,272 @@
/*******************************************************************************
* image
* filename: unsaved
* name: RIGHT_MAP
*
* preset name: Monochrome
* data block size: 8 bit(s), uint8_t
* RLE compression enabled: no
* conversion type: Monochrome, Edge 114
* bits per pixel: 1
*
* preprocess:
* main scan direction: top_to_bottom
* line scan direction: forward
* inverse: no
*******************************************************************************/
/*
typedef struct {
const uint8_t *data;
uint16_t width;
uint16_t height;
uint8_t dataSize;
} tImage;
*/
#include "bitmaps.h"
const uint8_t image_data_L0_LEFT[512] = {
0x80, 0xff, 0xff, 0xf3, 0x8f, 0x1f, 0x9c, 0x1f, 0xef, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xbf, 0xff, 0xff, 0xfb, 0x76, 0xef, 0x5d, 0xff, 0xef, 0xee, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
0xbf, 0xc3, 0x1f, 0xfb, 0xf7, 0xee, 0xdc, 0x3f, 0xef, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
0x87, 0xbe, 0xef, 0xfb, 0xef, 0x9d, 0xdf, 0xdf, 0xef, 0xf9, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
0xbf, 0xc6, 0xff, 0xfb, 0x9f, 0xec, 0x0f, 0xdf, 0xef, 0xfe, 0xfe, 0xf7, 0xf0, 0x1f, 0x03, 0x07,
0xbf, 0xfa, 0xef, 0xfb, 0x7e, 0xef, 0xdd, 0xdf, 0xef, 0xee, 0xfe, 0xf7, 0xf7, 0xff, 0x7d, 0xdf,
0x80, 0x87, 0x1f, 0xfb, 0x07, 0x1f, 0xde, 0x3f, 0xe0, 0x31, 0xff, 0xf7, 0xf7, 0xff, 0x7d, 0xdf,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xf0, 0xff, 0x03, 0xdf,
0xf7, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfe, 0xf7, 0xf7, 0xff, 0x77, 0xdf,
0xeb, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfe, 0xf7, 0xf7, 0xff, 0x7b, 0xdf,
0xeb, 0xbe, 0xff, 0xc3, 0x77, 0x1d, 0x3b, 0xff, 0x87, 0xff, 0xfe, 0xf0, 0x10, 0x1f, 0x7d, 0x07,
0xdd, 0x8e, 0x1f, 0xbb, 0x76, 0xec, 0xd8, 0xff, 0x7b, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
0xc1, 0xbe, 0xef, 0xbb, 0x76, 0x0d, 0xfb, 0xfe, 0xfe, 0x1b, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff,
0xbe, 0xba, 0xef, 0xc3, 0x56, 0xfd, 0xfb, 0xbe, 0xfe, 0xeb, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff,
0xbe, 0xc6, 0x1f, 0xfb, 0x27, 0x0d, 0xfc, 0x7e, 0xfe, 0xec, 0x3e, 0xf8, 0x37, 0xdf, 0x7d, 0xc7,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7a, 0x1f, 0xbf, 0xf7, 0xd7, 0xdf, 0x7d, 0xbb,
0xe1, 0xbe, 0xff, 0xff, 0xff, 0xee, 0x3f, 0xff, 0x86, 0xf8, 0x7f, 0xf7, 0xf7, 0xdf, 0x7d, 0x7d,
0xde, 0xbe, 0xff, 0xff, 0xff, 0xed, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0xf8, 0x30, 0x1f, 0x01, 0x7d,
0xbf, 0xbe, 0xff, 0xc7, 0x87, 0xed, 0xfc, 0x3f, 0xff, 0xff, 0xfe, 0xff, 0xd7, 0xdf, 0x7d, 0x7d,
0xbf, 0x8e, 0xff, 0xb7, 0x7f, 0x0c, 0x7b, 0xbf, 0xff, 0xff, 0xfe, 0xf7, 0xd7, 0xdf, 0x7d, 0xbb,
0xbf, 0xbe, 0xff, 0xb7, 0x8e, 0xed, 0xf8, 0x3e, 0x07, 0xfb, 0xfe, 0xf8, 0x37, 0xdf, 0x7d, 0xc7,
0xde, 0xba, 0xff, 0xb7, 0xf6, 0xed, 0xff, 0xbe, 0xfb, 0xfb, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
0xe1, 0xc6, 0xff, 0xc3, 0x0f, 0x0d, 0xf8, 0x7e, 0xfb, 0x0b, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfa, 0xf8, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf7, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfe, 0x07, 0x1b, 0xff, 0xff, 0xff, 0xff, 0x01, 0x0f,
0xeb, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfe, 0xff, 0xeb, 0xbf, 0xff, 0xff, 0xff, 0xef, 0x77,
0xeb, 0xaf, 0xff, 0xbb, 0x77, 0x1d, 0xdb, 0xfe, 0xfe, 0x1c, 0x7e, 0xff, 0xff, 0xff, 0xef, 0x77,
0xdd, 0xa3, 0xff, 0xbb, 0xae, 0xed, 0xd8, 0x7f, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xef, 0x03,
0xc1, 0xaf, 0xff, 0xc3, 0xde, 0xfe, 0xbb, 0xbf, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xef, 0x7d,
0xbe, 0xae, 0xff, 0xfb, 0xae, 0xee, 0xbb, 0xbf, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xef, 0x7d,
0xbe, 0xb1, 0xff, 0x87, 0x77, 0x1f, 0x78, 0x7f, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xef, 0x03,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
const uint8_t image_data_L0_RIGHT[512] = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xfe, 0x38, 0x38, 0xf1, 0xf3, 0xfc, 0x3f, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xef, 0xff, 0xfd, 0xdf, 0xb7, 0x6e, 0xed, 0xfd, 0xdf, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xec, 0x31, 0xfd, 0xff, 0x77, 0x6e, 0xde, 0xfd, 0xdf, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xeb, 0xee, 0xfc, 0x3f, 0x78, 0xf0, 0xde, 0xfd, 0x8f, 0xff,
0x83, 0xbe, 0xfb, 0xe8, 0x1f, 0x78, 0x1c, 0x6f, 0xfd, 0xde, 0xf7, 0x7e, 0xde, 0xfd, 0xf7, 0xff,
0xbd, 0x9e, 0xfb, 0xeb, 0xef, 0x7b, 0xff, 0xae, 0xfd, 0xde, 0xf7, 0x7e, 0xed, 0xfd, 0x77, 0xff,
0xbe, 0xae, 0xfb, 0xeb, 0xef, 0xfb, 0xf8, 0x71, 0xfe, 0x3d, 0xf8, 0xfe, 0xf3, 0xfd, 0x8f, 0xff,
0xbe, 0xb6, 0xfb, 0xeb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xbe, 0xba, 0xfb, 0xe8, 0x1f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xbf, 0xff,
0xbd, 0xbc, 0xfd, 0xdb, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff,
0x83, 0xbe, 0xfe, 0x3b, 0xff, 0x78, 0x1f, 0xff, 0xfc, 0x1b, 0xbf, 0xf1, 0xc3, 0xfd, 0xdf, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xef, 0xff, 0xff, 0xbb, 0xbd, 0xee, 0xdd, 0xfd, 0xdf, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xec, 0x2e, 0xff, 0x7b, 0xbd, 0xee, 0xdd, 0xfd, 0xdf, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xeb, 0xae, 0xfe, 0xfb, 0xbd, 0xee, 0xc3, 0xfd, 0xdf, 0xff,
0x80, 0x83, 0xfc, 0x1b, 0xef, 0x78, 0x18, 0x2e, 0xfc, 0x1c, 0x7d, 0xf1, 0xdf, 0xfe, 0x3f, 0xff,
0xbf, 0xbd, 0xfb, 0xeb, 0xef, 0xfb, 0xff, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xbf, 0xbe, 0xfb, 0xfb, 0xef, 0xfb, 0xf8, 0x71, 0xfd, 0xff, 0xf7, 0xfb, 0xeb, 0xfe, 0xbf, 0xff,
0x87, 0xbe, 0xfc, 0x18, 0x0f, 0x7f, 0xff, 0xff, 0xfd, 0xff, 0xb7, 0xfb, 0xff, 0xff, 0xff, 0xff,
0xbf, 0xbe, 0xff, 0xeb, 0xef, 0x7f, 0xff, 0xff, 0xfd, 0xff, 0xf7, 0x7b, 0xe3, 0xfe, 0x3f, 0xff,
0xbf, 0xbd, 0xfb, 0xeb, 0xef, 0x7f, 0xff, 0xff, 0xfc, 0x3f, 0xb6, 0xfb, 0xdd, 0xfd, 0xbf, 0xff,
0x80, 0x83, 0xfc, 0x1b, 0xef, 0x78, 0x1f, 0xbf, 0xfd, 0xdf, 0xb1, 0xfb, 0xdd, 0xfd, 0xbf, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xef, 0xbf, 0xfd, 0xdb, 0xb6, 0xfb, 0xdd, 0xfd, 0xbf, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xef, 0xa1, 0xfd, 0xdc, 0x77, 0x7b, 0xe3, 0xfe, 0x1f, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xec, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x80, 0xbe, 0xf8, 0x7c, 0x1f, 0xf8, 0x1b, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xdf,
0xbf, 0x9e, 0xfb, 0xbb, 0xef, 0xfb, 0xfb, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5e, 0xdf,
0xbf, 0xae, 0xfb, 0xbb, 0xff, 0x7b, 0xfc, 0x2e, 0xfc, 0x39, 0x3f, 0xff, 0xff, 0xff, 0x5e, 0xdf,
0x87, 0xb6, 0xf8, 0x1c, 0x1f, 0x7f, 0xff, 0xff, 0xfd, 0xda, 0xbf, 0xff, 0xc1, 0xfe, 0xee, 0xc7,
0xbf, 0xba, 0xfb, 0xef, 0xef, 0x7f, 0xff, 0xff, 0xfd, 0xda, 0xbf, 0xff, 0xff, 0xfe, 0x0e, 0xdf,
0xbf, 0xbc, 0xfb, 0xeb, 0xef, 0x7f, 0xff, 0xff, 0xfd, 0xda, 0xbf, 0xff, 0xff, 0xfd, 0xf6, 0xdd,
0x80, 0xbe, 0xf8, 0x1c, 0x1f, 0x7f, 0xff, 0xff, 0xfd, 0xdb, 0xbc, 0xf3, 0xff, 0xfd, 0xf6, 0xe3,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff
};
const uint8_t image_data_L1_LEFT[512] = {
0x80, 0xff, 0xff, 0xf3, 0xe3, 0x8f, 0x98, 0x3f, 0x87, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xbf, 0xff, 0xff, 0xfb, 0xdd, 0x77, 0x5b, 0xff, 0x7b, 0xfb, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
0xbf, 0xc3, 0x1f, 0xfb, 0xfd, 0xf6, 0xd8, 0x7e, 0xfe, 0xeb, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
0x87, 0xbe, 0xef, 0xfb, 0xfb, 0xcd, 0xdf, 0xbe, 0xfe, 0xe8, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
0xbf, 0xc6, 0xff, 0xfb, 0xe7, 0xf4, 0x0f, 0xbe, 0xfe, 0xeb, 0xfe, 0xf7, 0xf0, 0x1f, 0x03, 0x07,
0xbf, 0xfa, 0xef, 0xfb, 0xdf, 0x77, 0xdb, 0xbf, 0x7a, 0xeb, 0xbe, 0xf7, 0xf7, 0xff, 0x7d, 0xdf,
0x80, 0x87, 0x1f, 0xfb, 0xc1, 0x8f, 0xdc, 0x7f, 0x87, 0x1c, 0x7f, 0xf7, 0xf7, 0xff, 0x7d, 0xdf,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xf0, 0xff, 0x03, 0xdf,
0xf7, 0xbe, 0xff, 0xe3, 0xf1, 0x8e, 0x3a, 0xff, 0xff, 0xff, 0xfe, 0xf7, 0xf7, 0xff, 0x77, 0xdf,
0xeb, 0xbe, 0xff, 0xdd, 0xee, 0xbf, 0xba, 0xff, 0xff, 0xff, 0xfe, 0xf7, 0xf7, 0xff, 0x7b, 0xdf,
0xeb, 0xbe, 0xff, 0xb2, 0x87, 0xbf, 0xa0, 0x3f, 0x87, 0xff, 0xfe, 0xf0, 0x10, 0x1f, 0x7d, 0x07,
0xdd, 0x8e, 0x1f, 0xaa, 0xdf, 0xbf, 0xba, 0xff, 0x7b, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
0xc1, 0xbe, 0xef, 0xa1, 0x87, 0xbf, 0xa0, 0x3e, 0xfe, 0x1b, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff,
0xbe, 0xba, 0xef, 0xdf, 0xee, 0xbf, 0xba, 0xfe, 0xfe, 0xeb, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff,
0xbe, 0xc6, 0x1f, 0xe7, 0xf1, 0x8e, 0x3a, 0xfe, 0xfe, 0xec, 0x3e, 0xf8, 0x37, 0xdf, 0x7d, 0xc7,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7a, 0x1f, 0xbf, 0xf7, 0xd7, 0xdf, 0x7d, 0xbb,
0xe1, 0xbe, 0xff, 0xcf, 0xf7, 0xe4, 0xfd, 0xff, 0x86, 0xf8, 0x7f, 0xf7, 0xf7, 0xdf, 0x7d, 0x7d,
0xde, 0xbe, 0xff, 0xb6, 0xf7, 0xdf, 0x70, 0x3f, 0xff, 0xff, 0xfe, 0xf8, 0x30, 0x1f, 0x01, 0x7d,
0xbf, 0xbe, 0xff, 0xb5, 0xf7, 0xbf, 0xad, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xd7, 0xdf, 0x7d, 0x7d,
0xbf, 0x8e, 0xff, 0xc3, 0xf7, 0xbf, 0xb0, 0x7f, 0xff, 0xff, 0xfe, 0xf7, 0xd7, 0xdf, 0x7d, 0xbb,
0xbf, 0xbe, 0xff, 0xbb, 0xf7, 0xbf, 0xbd, 0xbe, 0x07, 0xfb, 0xfe, 0xf8, 0x37, 0xdf, 0x7d, 0xc7,
0xde, 0xba, 0xff, 0xb9, 0xf7, 0xdf, 0x60, 0x7e, 0xfb, 0xfb, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
0xe1, 0xc6, 0xff, 0xc6, 0xf7, 0xe4, 0xfd, 0xfe, 0xfb, 0x0b, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfa, 0xf8, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf7, 0xaf, 0xff, 0xff, 0xf7, 0xe4, 0xf7, 0xbe, 0x07, 0x1b, 0xff, 0xff, 0xff, 0xff, 0x01, 0x0f,
0xeb, 0xaf, 0xff, 0xff, 0xeb, 0xdf, 0x6b, 0x7e, 0xff, 0xeb, 0xbf, 0xff, 0xff, 0xff, 0xef, 0x77,
0xeb, 0xaf, 0xff, 0xce, 0xdd, 0xdf, 0x76, 0xfe, 0xfe, 0x1c, 0x7e, 0xff, 0xff, 0xff, 0xef, 0x77,
0xdd, 0xa3, 0xff, 0xb6, 0xbe, 0xbf, 0xbd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xef, 0x03,
0xc1, 0xaf, 0xff, 0xb9, 0xbe, 0xdf, 0x7b, 0x7f, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xef, 0x7d,
0xbe, 0xae, 0xff, 0xff, 0xff, 0xdf, 0x76, 0xbf, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xef, 0x7d,
0xbe, 0xb1, 0xff, 0xff, 0xff, 0xe4, 0xef, 0x7f, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xef, 0x03,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
const uint8_t image_data_L1_RIGHT[512] = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0x1e, 0x0f, 0x1e, 0x3e, 0x7c, 0x3f, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xef, 0xff, 0xfe, 0xef, 0xee, 0xed, 0xdd, 0xbd, 0xdf, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xec, 0x31, 0xfe, 0xff, 0xde, 0xed, 0xdb, 0xdd, 0xdf, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xeb, 0xee, 0xfe, 0x1f, 0xdf, 0x1e, 0x1b, 0xdd, 0x8f, 0xff,
0x83, 0xbe, 0xfb, 0xe8, 0x1f, 0x78, 0x1c, 0x6f, 0xfe, 0xef, 0xbe, 0xef, 0xdb, 0xdd, 0xf7, 0xff,
0xbd, 0x9e, 0xfb, 0xeb, 0xef, 0x7b, 0xff, 0xae, 0xfe, 0xef, 0xbe, 0xef, 0xdd, 0xbd, 0x77, 0xff,
0xbe, 0xae, 0xfb, 0xeb, 0xef, 0xfb, 0xf8, 0x71, 0xff, 0x1f, 0x7f, 0x1f, 0xde, 0x7d, 0x8f, 0xff,
0xbe, 0xb6, 0xfb, 0xeb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xbe, 0xba, 0xfb, 0xe8, 0x1f, 0x7f, 0xff, 0xff, 0xff, 0xbd, 0xff, 0xfb, 0x3f, 0x7e, 0xbf, 0xff,
0xbd, 0xbc, 0xfd, 0xdb, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xbe, 0xff, 0xf7, 0xbe, 0xff, 0xff, 0xff,
0x83, 0xbe, 0xfe, 0x3b, 0xff, 0x78, 0x1f, 0xff, 0xfe, 0x0f, 0x7f, 0xef, 0xff, 0xfd, 0xdf, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xef, 0xff, 0xff, 0xbf, 0xbf, 0xdf, 0xff, 0xfd, 0xdf, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xec, 0x2e, 0xff, 0x5f, 0xdf, 0xbf, 0xff, 0xfd, 0xdf, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xeb, 0xae, 0xfe, 0xef, 0xef, 0x7f, 0xff, 0xfd, 0xdf, 0xff,
0x80, 0x83, 0xfc, 0x1b, 0xef, 0x78, 0x18, 0x2e, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xfe, 0x3f, 0xff,
0xbf, 0xbd, 0xfb, 0xeb, 0xef, 0xfb, 0xff, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xbf, 0xbe, 0xfb, 0xfb, 0xef, 0xfb, 0xf8, 0x71, 0xff, 0xff, 0xbf, 0x07, 0x5e, 0xfe, 0xbf, 0xff,
0x87, 0xbe, 0xfc, 0x18, 0x0f, 0x7f, 0xff, 0xff, 0xff, 0xbf, 0xbe, 0xfb, 0x5e, 0xff, 0xff, 0xff,
0xbf, 0xbe, 0xff, 0xeb, 0xef, 0x7f, 0xff, 0xff, 0xff, 0xbf, 0xbf, 0xfb, 0xff, 0xfe, 0x3f, 0xff,
0xbf, 0xbd, 0xfb, 0xeb, 0xef, 0x7f, 0xff, 0xff, 0xfe, 0x0f, 0xbf, 0xc7, 0xff, 0xfd, 0xbf, 0xff,
0x80, 0x83, 0xfc, 0x1b, 0xef, 0x78, 0x1f, 0xbf, 0xff, 0xbf, 0xbf, 0xbf, 0xff, 0xfd, 0xbf, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xef, 0xbf, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0xbf, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xef, 0xa1, 0xff, 0xff, 0xbf, 0xbf, 0xff, 0xfe, 0x1f, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xec, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x80, 0xbe, 0xf8, 0x7c, 0x1f, 0xf8, 0x1b, 0xae, 0xff, 0xff, 0xe6, 0x7f, 0x83, 0x8f, 0xbe, 0xdf,
0xbf, 0x9e, 0xfb, 0xbb, 0xef, 0xfb, 0xfb, 0xae, 0xff, 0xff, 0x9f, 0x9f, 0x7d, 0xaf, 0x5e, 0xdf,
0xbf, 0xae, 0xfb, 0xbb, 0xff, 0x7b, 0xfc, 0x2e, 0xfe, 0x0e, 0x7f, 0xe7, 0x07, 0x8f, 0x5e, 0xdf,
0x87, 0xb6, 0xf8, 0x1c, 0x1f, 0x7f, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfb, 0xbb, 0xfe, 0xee, 0xc7,
0xbf, 0xba, 0xfb, 0xef, 0xef, 0x7f, 0xff, 0xff, 0xfe, 0x0e, 0x7f, 0xe7, 0xc1, 0xfe, 0x0e, 0xdf,
0xbf, 0xbc, 0xfb, 0xeb, 0xef, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x9f, 0x7d, 0xfd, 0xf6, 0xdd,
0x80, 0xbe, 0xf8, 0x1c, 0x1f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x7f, 0x83, 0xfd, 0xf6, 0xe3,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
const uint8_t image_data_L2_LEFT[512] = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf1, 0x9f, 0x1c, 0x7c, 0x71, 0xf1, 0xf3, 0xe3, 0x07, 0x8c, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff,
0xee, 0xde, 0xeb, 0xbb, 0xae, 0xee, 0xeb, 0xdd, 0x7f, 0x76, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff,
0xef, 0xde, 0xff, 0xbb, 0xfe, 0xef, 0xdb, 0xdf, 0x0f, 0x7e, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff,
0xe3, 0xde, 0x3f, 0x78, 0xf9, 0xe3, 0xbb, 0xc7, 0xf7, 0x1e, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff,
0xef, 0xde, 0xfc, 0xfb, 0xfe, 0xef, 0x81, 0xdf, 0xf7, 0x7e, 0xdf, 0xff, 0xff, 0xfe, 0x77, 0xff,
0xef, 0xde, 0xfb, 0xfb, 0xee, 0xef, 0xfb, 0xdf, 0x77, 0x7e, 0xdf, 0xff, 0xf0, 0x1d, 0xb7, 0xff,
0xef, 0xde, 0xf8, 0x3b, 0xf1, 0xef, 0xfb, 0xdf, 0x8f, 0x7e, 0xde, 0xff, 0xf7, 0xfd, 0xd7, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfd, 0xd7, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xe7, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xfc, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf0, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xef, 0xff,
0xff, 0xff, 0xfe, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xdf, 0xf7, 0xff,
0xff, 0xfe, 0x3c, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xdf, 0xb7, 0xff,
0xff, 0xfe, 0x10, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xdf, 0xb7, 0xff,
0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xf0, 0x3c, 0x0f, 0xff,
0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x8f, 0xfe, 0xff, 0xff, 0x3f, 0xcf, 0xff,
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x8f, 0xfe, 0xff, 0xfe, 0xdf, 0xb7, 0xff,
0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xf8, 0xde, 0x37, 0xff,
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x1f, 0xff, 0xff, 0xf6, 0xdd, 0xb7, 0xff,
0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfe, 0xff, 0xf6, 0xdd, 0xb7, 0xff,
0xff, 0xfc, 0x00, 0x00, 0x00, 0x01, 0xff, 0x80, 0x00, 0x7f, 0xfe, 0xff, 0xf6, 0xdd, 0xb7, 0xff,
0xff, 0xf8, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf8, 0x01, 0xff, 0xfe, 0xff, 0xf0, 0x1c, 0x07, 0xff,
0xff, 0xf0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xf0, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
const uint8_t image_data_L2_RIGHT_NLK_OFF[512] = {
0xff, 0xfe, 0x33, 0x1f, 0xc7, 0x1f, 0x18, 0x3c, 0x71, 0xf1, 0xc7, 0xc6, 0x73, 0xff, 0xff, 0x87,
0xff, 0xfd, 0xda, 0xef, 0xba, 0xee, 0xef, 0xbb, 0xae, 0xee, 0xbb, 0xbb, 0x6d, 0xff, 0xff, 0x33,
0xff, 0xfd, 0xfb, 0xef, 0xbe, 0xfe, 0xff, 0x7b, 0xee, 0xef, 0xbb, 0xbf, 0x5e, 0xff, 0xff, 0x7b,
0xff, 0xfc, 0x7b, 0xdf, 0x8e, 0x1e, 0x3f, 0x78, 0xf1, 0xe3, 0xc3, 0x8f, 0x5e, 0xff, 0xff, 0x7b,
0xff, 0xfd, 0xfb, 0x3f, 0xbe, 0xee, 0xfe, 0xfb, 0xee, 0xef, 0xfb, 0xbf, 0x5e, 0xff, 0xc0, 0x3f,
0xff, 0xfd, 0xfa, 0xff, 0xbe, 0xee, 0xfe, 0xfb, 0xee, 0xef, 0xfb, 0xbf, 0x6d, 0xff, 0xc6, 0x3f,
0xff, 0xfd, 0xfa, 0x0f, 0xbf, 0x1e, 0xfd, 0xfb, 0xf1, 0xef, 0xfb, 0xbf, 0x73, 0xff, 0xc0, 0x3f,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdf, 0xff, 0xdf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xbf, 0xff, 0x8f, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xfb, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x07, 0xff, 0x57, 0xfa, 0xbf, 0xff, 0xff, 0xff, 0xe0, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xbf, 0xff, 0xdf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdf, 0xff, 0xdf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xbf,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x7f,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xfe, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xfb, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xff, 0xdf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0xff, 0xdf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xff, 0x57, 0xfa, 0xbf, 0xff, 0xff, 0xff, 0xe0, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0xff, 0x8f, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xff, 0xdf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
const uint8_t image_data_L2_RIGHT_NLK_ON[512] = {
0xff, 0xfe, 0x33, 0x1f, 0xc7, 0x1f, 0x18, 0x3c, 0x71, 0xf1, 0xc7, 0xc6, 0x73, 0xff, 0xf0, 0xff,
0xff, 0xfd, 0xda, 0xef, 0xba, 0xee, 0xef, 0xbb, 0xae, 0xee, 0xbb, 0xbb, 0x6d, 0xff, 0xe6, 0x7f,
0xff, 0xfd, 0xfb, 0xef, 0xbe, 0xfe, 0xff, 0x7b, 0xee, 0xef, 0xbb, 0xbf, 0x5e, 0xff, 0xef, 0x7f,
0xff, 0xfc, 0x7b, 0xdf, 0x8e, 0x1e, 0x3f, 0x78, 0xf1, 0xe3, 0xc3, 0x8f, 0x5e, 0xff, 0xef, 0x7f,
0xff, 0xfd, 0xfb, 0x3f, 0xbe, 0xee, 0xfe, 0xfb, 0xee, 0xef, 0xfb, 0xbf, 0x5e, 0xff, 0xc0, 0x3f,
0xff, 0xfd, 0xfa, 0xff, 0xbe, 0xee, 0xfe, 0xfb, 0xee, 0xef, 0xfb, 0xbf, 0x6d, 0xff, 0xc0, 0x3f,
0xff, 0xfd, 0xfa, 0x0f, 0xbf, 0x1e, 0xfd, 0xfb, 0xf1, 0xef, 0xfb, 0xbf, 0x73, 0xff, 0xc0, 0x3f,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0x8f, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x77, 0xfd, 0xdf, 0xfd, 0xff, 0xff, 0xfb, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0x77, 0xfd, 0xdf, 0xfd, 0xff, 0xff, 0xfb, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0x8f, 0xfe, 0x1f, 0xf0, 0x7f, 0xff, 0xe0, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x77, 0xff, 0xdf, 0xfd, 0xff, 0xff, 0xfb, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x77, 0xff, 0xdf, 0xfd, 0xff, 0xff, 0xf5, 0xff,
0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xbf, 0xff, 0x8f, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xee, 0xff,
0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xff, 0x07, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0xff, 0x7f, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xbf,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xff, 0x0f, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0xff, 0xf7, 0xfc, 0x3f, 0xf0, 0x7f, 0xff, 0xfe, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xff, 0xf7, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x77, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0xff,
0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xf7, 0xff, 0x8f, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xf7, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff,
0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xcf, 0xff, 0x8f, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xef, 0xff, 0x77, 0xfd, 0xdf, 0xf7, 0x7f, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xef, 0x7f, 0xef, 0xff, 0xf7, 0xff, 0xdf, 0xf7, 0x3f, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xef, 0x7f, 0xef, 0xff, 0xef, 0xff, 0x3f, 0xf0, 0x1f, 0xff, 0xe0, 0xff,
0xff, 0xff, 0xff, 0xff, 0xef, 0x7f, 0xef, 0xff, 0x9f, 0xff, 0xdf, 0xff, 0x3f, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xef, 0xff, 0x7f, 0xfd, 0xdf, 0xff, 0x7f, 0xff, 0xe0, 0xff,
0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xef, 0xff, 0x07, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};

35
res/bitmaps.h

@ -0,0 +1,35 @@
/* 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 MALRICHTIG_VISUALIZER_RES_BITMAPS_H_
#define MALRICHTIG_VISUALIZER_RES_BITMAPS_H_
#include <stdint.h>
#ifdef LCD_ENABLE
extern const uint8_t image_data_L0_LEFT[];
extern const uint8_t image_data_L0_RIGHT[];
extern const uint8_t image_data_L1_LEFT[];
extern const uint8_t image_data_L1_RIGHT[];
extern const uint8_t image_data_L2_LEFT[];
extern const uint8_t image_data_L2_RIGHT_NLK_ON[];
extern const uint8_t image_data_L2_RIGHT_NLK_OFF[];
#endif
#endif /* MALRICHTIG_VISUALIZER_RES_BITMAPS_H_ */

1
rules.mk

@ -0,0 +1 @@
SRC += res/bitmaps.c

55
visualizer.c

@ -0,0 +1,55 @@
/*
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/>.
*/
// 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 "custom_visualizer.h"
static void get_visualizer_layer_and_color(visualizer_state_t* state) {
uint8_t saturation = 175;
if (state->status.leds & (1u << USB_LED_CAPS_LOCK)) {
saturation = 255;
}
if (state->status.layer & 0x8) {
state->target_lcd_color = LCD_COLOR(255, saturation, 0xFF);
state->layer_text = "3: KB & Media";
}
else if (state->status.layer & 0x4) {
state->target_lcd_color = LCD_COLOR(150, saturation, 0xFF);
state->layer_text = "";
}
else if (state->status.layer & 0x2) {
state->target_lcd_color = LCD_COLOR(60, saturation, 0xFF);
state->layer_text = "";
}
else {
state->target_lcd_color = LCD_COLOR(20, saturation, 0xFF);
state->layer_text = "";
}
}
Loading…
Cancel
Save