Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
23df3016e8 | ||
|
|
9019d65b3c | ||
|
|
2c171b3e5f | ||
|
|
33a271b8e3 | ||
|
|
e71b3c6572 | ||
|
|
f169c715eb | ||
|
|
2ffcf47793 | ||
|
|
7ce056cad7 | ||
|
|
3e7bb19612 | ||
|
|
e951317acb | ||
|
|
f71c990215 | ||
|
|
1aa0be4cf1 | ||
|
|
0f163c0028 | ||
|
|
fb9b8dadb9 | ||
|
|
43d8fa5bf1 | ||
|
|
36f820be7e | ||
|
|
e85b185796 | ||
|
|
6a76192fa4 | ||
|
|
bd1729d5be | ||
|
|
fb95d86b39 | ||
|
|
017458a07b | ||
|
|
c38589d861 | ||
|
|
3bb0586acc | ||
|
|
617578399c | ||
|
|
c588fca06c | ||
|
|
a72e8f0865 | ||
|
|
1c0fe956ac | ||
|
|
d29906cb64 | ||
|
|
f646f00b93 | ||
|
|
83509adc3a | ||
|
|
26eb97a4a8 | ||
|
|
fdfd48e8c8 | ||
|
|
efaf0e830b | ||
|
|
585d646128 | ||
|
|
8674f9c466 | ||
|
|
7424261dae | ||
|
|
30f22d450d | ||
|
|
621ae42a6c | ||
|
|
4217cb5bbc | ||
|
|
517f75d893 | ||
|
|
dd73e14c9b | ||
|
|
66e2d6a063 | ||
|
|
f2e1609801 | ||
|
|
74d752b531 | ||
|
|
3ab0f4d9e5 | ||
|
|
1a8042ae91 | ||
|
|
a284245f77 | ||
|
|
85d688e92c | ||
|
|
4c2f04986a | ||
|
|
3007d01718 | ||
|
|
3b9fabb9aa | ||
|
|
a8992a2cfe | ||
|
|
7837d96b6e | ||
|
|
56026dd4df | ||
|
|
1552fd6ae1 | ||
|
|
133908da74 | ||
|
|
3c2c489768 | ||
|
|
b236e51b69 | ||
|
|
17e81baab3 | ||
|
|
f9eb11a674 | ||
|
|
bb99d7117c | ||
|
|
a5ba30338f | ||
|
|
9af272e4bb | ||
|
|
ac97870801 | ||
|
|
083267680d | ||
|
|
e6c9b07e1c | ||
|
|
2dcd6c38fa | ||
|
|
f54b4771eb | ||
|
|
164a6c994b | ||
|
|
a144968807 | ||
|
|
16774333ad | ||
|
|
5fc5661147 | ||
|
|
d1ff2bb9db | ||
|
|
821f72eae9 | ||
|
|
b5675e2025 | ||
|
|
967cf0f6d4 | ||
|
|
5df74f3ba7 | ||
|
|
f1d81d2cc6 | ||
|
|
2c5b551970 | ||
|
|
52f671c23e | ||
|
|
b27fb216ef | ||
|
|
ff6beeb7a3 | ||
|
|
b3945c103c | ||
|
|
046f1baf30 | ||
|
|
c0ec1756af | ||
|
|
ec1e936dfb | ||
|
|
1b1adf35bb | ||
|
|
15635817b5 | ||
|
|
0881f2dbfa | ||
|
|
d8e9c183be | ||
|
|
dda858c437 | ||
|
|
a2ac883779 | ||
|
|
af13e9a12d | ||
|
|
d89114400c | ||
|
|
56be300757 | ||
|
|
91f2e9fb5e | ||
|
|
02ef122cbb | ||
|
|
f66361d678 | ||
|
|
da4c2d2e3e | ||
|
|
b73c935d36 | ||
|
|
dfb0a512a0 |
No files matched your search
@@ -419,7 +419,7 @@ define BUILD_TEST
|
|||||||
MAKE_TARGET := $2
|
MAKE_TARGET := $2
|
||||||
COMMAND := $1
|
COMMAND := $1
|
||||||
MAKE_CMD := $$(MAKE) -r -R -C $(ROOT_DIR) -f build_test.mk $$(MAKE_TARGET)
|
MAKE_CMD := $$(MAKE) -r -R -C $(ROOT_DIR) -f build_test.mk $$(MAKE_TARGET)
|
||||||
MAKE_VARS := TEST=$$(TEST_NAME)
|
MAKE_VARS := TEST=$$(TEST_NAME) FULL_TESTS=$$(FULL_TESTS)
|
||||||
MAKE_MSG := $$(MSG_MAKE_TEST)
|
MAKE_MSG := $$(MSG_MAKE_TEST)
|
||||||
$$(eval $$(call BUILD))
|
$$(eval $$(call BUILD))
|
||||||
ifneq ($$(MAKE_TARGET),clean)
|
ifneq ($$(MAKE_TARGET),clean)
|
||||||
|
|||||||
@@ -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/>.
|
||||||
|
|
||||||
|
#include $(TMK_PATH)/protocol.mk
|
||||||
|
|
||||||
|
TEST_PATH=tests/$(TEST)
|
||||||
|
|
||||||
|
$(TEST)_SRC= \
|
||||||
|
$(TEST_PATH)/test.cpp \
|
||||||
|
$(TMK_COMMON_SRC) \
|
||||||
|
$(QUANTUM_SRC) \
|
||||||
|
tests/test_common/matrix.c \
|
||||||
|
tests/test_common/test_driver.cpp \
|
||||||
|
tests/test_common/keyboard_report_util.cpp \
|
||||||
|
tests/test_common/test_fixture.cpp
|
||||||
|
$(TEST)_DEFS=$(TMK_COMMON_DEFS)
|
||||||
|
$(TEST)_CONFIG=$(TEST_PATH)/config.h
|
||||||
|
VPATH+=$(TOP_DIR)/tests/test_common
|
||||||
+3
-134
@@ -31,8 +31,6 @@ $(error MASTER does not have a valid value(left/right))
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
KEYBOARD_PATH := keyboards/$(KEYBOARD)
|
KEYBOARD_PATH := keyboards/$(KEYBOARD)
|
||||||
KEYBOARD_C := $(KEYBOARD_PATH)/$(KEYBOARD).c
|
KEYBOARD_C := $(KEYBOARD_PATH)/$(KEYBOARD).c
|
||||||
|
|
||||||
@@ -42,7 +40,6 @@ else
|
|||||||
$(error "$(KEYBOARD_C)" does not exist)
|
$(error "$(KEYBOARD_C)" does not exist)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
ifneq ($(SUBPROJECT),)
|
ifneq ($(SUBPROJECT),)
|
||||||
SUBPROJECT_PATH := keyboards/$(KEYBOARD)/$(SUBPROJECT)
|
SUBPROJECT_PATH := keyboards/$(KEYBOARD)/$(SUBPROJECT)
|
||||||
SUBPROJECT_C := $(SUBPROJECT_PATH)/$(SUBPROJECT).c
|
SUBPROJECT_C := $(SUBPROJECT_PATH)/$(SUBPROJECT).c
|
||||||
@@ -118,141 +115,12 @@ endif
|
|||||||
# # project specific files
|
# # project specific files
|
||||||
SRC += $(KEYBOARD_C) \
|
SRC += $(KEYBOARD_C) \
|
||||||
$(KEYMAP_C) \
|
$(KEYMAP_C) \
|
||||||
$(QUANTUM_DIR)/quantum.c \
|
$(QUANTUM_SRC)
|
||||||
$(QUANTUM_DIR)/keymap_common.c \
|
|
||||||
$(QUANTUM_DIR)/keycode_config.c \
|
|
||||||
$(QUANTUM_DIR)/process_keycode/process_leader.c
|
|
||||||
|
|
||||||
ifneq ($(SUBPROJECT),)
|
ifneq ($(SUBPROJECT),)
|
||||||
SRC += $(SUBPROJECT_C)
|
SRC += $(SUBPROJECT_C)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifndef CUSTOM_MATRIX
|
|
||||||
SRC += $(QUANTUM_DIR)/matrix.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(API_SYSEX_ENABLE)), yes)
|
|
||||||
OPT_DEFS += -DAPI_SYSEX_ENABLE
|
|
||||||
SRC += $(QUANTUM_DIR)/api/api_sysex.c
|
|
||||||
OPT_DEFS += -DAPI_ENABLE
|
|
||||||
SRC += $(QUANTUM_DIR)/api.c
|
|
||||||
MIDI_ENABLE=yes
|
|
||||||
endif
|
|
||||||
|
|
||||||
MUSIC_ENABLE := 0
|
|
||||||
|
|
||||||
ifeq ($(strip $(AUDIO_ENABLE)), yes)
|
|
||||||
OPT_DEFS += -DAUDIO_ENABLE
|
|
||||||
MUSIC_ENABLE := 1
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_audio.c
|
|
||||||
SRC += $(QUANTUM_DIR)/audio/audio.c
|
|
||||||
SRC += $(QUANTUM_DIR)/audio/voices.c
|
|
||||||
SRC += $(QUANTUM_DIR)/audio/luts.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(MIDI_ENABLE)), yes)
|
|
||||||
OPT_DEFS += -DMIDI_ENABLE
|
|
||||||
MUSIC_ENABLE := 1
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_midi.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(MUSIC_ENABLE), 1)
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_music.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(COMBO_ENABLE)), yes)
|
|
||||||
OPT_DEFS += -DCOMBO_ENABLE
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_combo.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(VIRTSER_ENABLE)), yes)
|
|
||||||
OPT_DEFS += -DVIRTSER_ENABLE
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(FAUXCLICKY_ENABLE)), yes)
|
|
||||||
OPT_DEFS += -DFAUXCLICKY_ENABLE
|
|
||||||
SRC += $(QUANTUM_DIR)/fauxclicky.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(UCIS_ENABLE)), yes)
|
|
||||||
OPT_DEFS += -DUCIS_ENABLE
|
|
||||||
UNICODE_COMMON = yes
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_ucis.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(UNICODEMAP_ENABLE)), yes)
|
|
||||||
OPT_DEFS += -DUNICODEMAP_ENABLE
|
|
||||||
UNICODE_COMMON = yes
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_unicodemap.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(UNICODE_ENABLE)), yes)
|
|
||||||
OPT_DEFS += -DUNICODE_ENABLE
|
|
||||||
UNICODE_COMMON = yes
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_unicode.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(UNICODE_COMMON)), yes)
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
|
|
||||||
OPT_DEFS += -DRGBLIGHT_ENABLE
|
|
||||||
SRC += $(QUANTUM_DIR)/light_ws2812.c
|
|
||||||
SRC += $(QUANTUM_DIR)/rgblight.c
|
|
||||||
CIE1931_CURVE = yes
|
|
||||||
LED_BREATHING_TABLE = yes
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
|
|
||||||
OPT_DEFS += -DTAP_DANCE_ENABLE
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_tap_dance.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(PRINTING_ENABLE)), yes)
|
|
||||||
OPT_DEFS += -DPRINTING_ENABLE
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_printer.c
|
|
||||||
SRC += $(TMK_DIR)/protocol/serial_uart.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(SERIAL_LINK_ENABLE)), yes)
|
|
||||||
SRC += $(patsubst $(QUANTUM_PATH)/%,%,$(SERIAL_SRC))
|
|
||||||
OPT_DEFS += $(SERIAL_DEFS)
|
|
||||||
VAPTH += $(SERIAL_PATH)
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifneq ($(strip $(VARIABLE_TRACE)),)
|
|
||||||
SRC += $(QUANTUM_DIR)/variable_trace.c
|
|
||||||
OPT_DEFS += -DNUM_TRACED_VARIABLES=$(strip $(VARIABLE_TRACE))
|
|
||||||
ifneq ($(strip $(MAX_VARIABLE_TRACE_SIZE)),)
|
|
||||||
OPT_DEFS += -DMAX_VARIABLE_TRACE_SIZE=$(strip $(MAX_VARIABLE_TRACE_SIZE))
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(LCD_ENABLE)), yes)
|
|
||||||
CIE1931_CURVE = yes
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
|
|
||||||
ifeq ($(strip $(VISUALIZER_ENABLE)), yes)
|
|
||||||
CIE1931_CURVE = yes
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(CIE1931_CURVE)), yes)
|
|
||||||
OPT_DEFS += -DUSE_CIE1931_CURVE
|
|
||||||
LED_TABLES = yes
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(LED_BREATHING_TABLE)), yes)
|
|
||||||
OPT_DEFS += -DUSE_LED_BREATHING_TABLE
|
|
||||||
LED_TABLES = yes
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(LED_TABLES)), yes)
|
|
||||||
SRC += $(QUANTUM_DIR)/led_tables.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Optimize size but this may cause error "relocation truncated to fit"
|
# Optimize size but this may cause error "relocation truncated to fit"
|
||||||
#EXTRALDFLAGS = -Wl,--relax
|
#EXTRALDFLAGS = -Wl,--relax
|
||||||
|
|
||||||
@@ -264,9 +132,10 @@ endif
|
|||||||
VPATH += $(KEYBOARD_PATH)
|
VPATH += $(KEYBOARD_PATH)
|
||||||
VPATH += $(COMMON_VPATH)
|
VPATH += $(COMMON_VPATH)
|
||||||
|
|
||||||
|
include common_features.mk
|
||||||
include $(TMK_PATH)/protocol.mk
|
include $(TMK_PATH)/protocol.mk
|
||||||
|
|
||||||
include $(TMK_PATH)/common.mk
|
include $(TMK_PATH)/common.mk
|
||||||
|
|
||||||
SRC += $(TMK_COMMON_SRC)
|
SRC += $(TMK_COMMON_SRC)
|
||||||
OPT_DEFS += $(TMK_COMMON_DEFS)
|
OPT_DEFS += $(TMK_COMMON_DEFS)
|
||||||
EXTRALDFLAGS += $(TMK_COMMON_LDFLAGS)
|
EXTRALDFLAGS += $(TMK_COMMON_LDFLAGS)
|
||||||
|
|||||||
@@ -40,13 +40,23 @@ VPATH +=\
|
|||||||
all: elf
|
all: elf
|
||||||
|
|
||||||
VPATH += $(COMMON_VPATH)
|
VPATH += $(COMMON_VPATH)
|
||||||
|
PLATFORM:=TEST
|
||||||
|
|
||||||
|
ifneq ($(filter $(FULL_TESTS),$(TEST)),)
|
||||||
|
include tests/$(TEST)/rules.mk
|
||||||
|
endif
|
||||||
|
|
||||||
|
include common_features.mk
|
||||||
include $(TMK_PATH)/common.mk
|
include $(TMK_PATH)/common.mk
|
||||||
include $(QUANTUM_PATH)/serial_link/tests/rules.mk
|
include $(QUANTUM_PATH)/serial_link/tests/rules.mk
|
||||||
|
ifneq ($(filter $(FULL_TESTS),$(TEST)),)
|
||||||
|
include build_full_test.mk
|
||||||
|
endif
|
||||||
|
|
||||||
$(TEST_OBJ)/$(TEST)_SRC := $($(TEST)_SRC)
|
$(TEST_OBJ)/$(TEST)_SRC := $($(TEST)_SRC)
|
||||||
$(TEST_OBJ)/$(TEST)_INC := $($(TEST)_INC) $(VPATH) $(GTEST_INC)
|
$(TEST_OBJ)/$(TEST)_INC := $($(TEST)_INC) $(VPATH) $(GTEST_INC)
|
||||||
$(TEST_OBJ)/$(TEST)_DEFS := $($(TEST)_DEFS)
|
$(TEST_OBJ)/$(TEST)_DEFS := $($(TEST)_DEFS)
|
||||||
|
$(TEST_OBJ)/$(TEST)_CONFIG := $($(TEST)_CONFIG)
|
||||||
|
|
||||||
include $(TMK_PATH)/native.mk
|
include $(TMK_PATH)/native.mk
|
||||||
include $(TMK_PATH)/rules.mk
|
include $(TMK_PATH)/rules.mk
|
||||||
|
|||||||
@@ -11,12 +11,6 @@ QUANTUM_PATH = $(TOP_DIR)/$(QUANTUM_DIR)
|
|||||||
|
|
||||||
BUILD_DIR := $(TOP_DIR)/.build
|
BUILD_DIR := $(TOP_DIR)/.build
|
||||||
|
|
||||||
SERIAL_DIR := $(QUANTUM_DIR)/serial_link
|
|
||||||
SERIAL_PATH := $(QUANTUM_PATH)/serial_link
|
|
||||||
SERIAL_SRC := $(wildcard $(SERIAL_PATH)/protocol/*.c)
|
|
||||||
SERIAL_SRC += $(wildcard $(SERIAL_PATH)/system/*.c)
|
|
||||||
SERIAL_DEFS += -DSERIAL_LINK_ENABLE
|
|
||||||
|
|
||||||
COMMON_VPATH := $(TOP_DIR)
|
COMMON_VPATH := $(TOP_DIR)
|
||||||
COMMON_VPATH += $(TMK_PATH)
|
COMMON_VPATH += $(TMK_PATH)
|
||||||
COMMON_VPATH += $(QUANTUM_PATH)
|
COMMON_VPATH += $(QUANTUM_PATH)
|
||||||
@@ -24,4 +18,3 @@ COMMON_VPATH += $(QUANTUM_PATH)/keymap_extras
|
|||||||
COMMON_VPATH += $(QUANTUM_PATH)/audio
|
COMMON_VPATH += $(QUANTUM_PATH)/audio
|
||||||
COMMON_VPATH += $(QUANTUM_PATH)/process_keycode
|
COMMON_VPATH += $(QUANTUM_PATH)/process_keycode
|
||||||
COMMON_VPATH += $(QUANTUM_PATH)/api
|
COMMON_VPATH += $(QUANTUM_PATH)/api
|
||||||
COMMON_VPATH += $(SERIAL_PATH)
|
|
||||||
@@ -0,0 +1,153 @@
|
|||||||
|
# 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/>.
|
||||||
|
|
||||||
|
SERIAL_DIR := $(QUANTUM_DIR)/serial_link
|
||||||
|
SERIAL_PATH := $(QUANTUM_PATH)/serial_link
|
||||||
|
SERIAL_SRC := $(wildcard $(SERIAL_PATH)/protocol/*.c)
|
||||||
|
SERIAL_SRC += $(wildcard $(SERIAL_PATH)/system/*.c)
|
||||||
|
SERIAL_DEFS += -DSERIAL_LINK_ENABLE
|
||||||
|
COMMON_VPATH += $(SERIAL_PATH)
|
||||||
|
|
||||||
|
ifeq ($(strip $(API_SYSEX_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DAPI_SYSEX_ENABLE
|
||||||
|
SRC += $(QUANTUM_DIR)/api/api_sysex.c
|
||||||
|
OPT_DEFS += -DAPI_ENABLE
|
||||||
|
SRC += $(QUANTUM_DIR)/api.c
|
||||||
|
MIDI_ENABLE=yes
|
||||||
|
endif
|
||||||
|
|
||||||
|
MUSIC_ENABLE := 0
|
||||||
|
|
||||||
|
ifeq ($(strip $(AUDIO_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DAUDIO_ENABLE
|
||||||
|
MUSIC_ENABLE := 1
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_audio.c
|
||||||
|
SRC += $(QUANTUM_DIR)/audio/audio.c
|
||||||
|
SRC += $(QUANTUM_DIR)/audio/voices.c
|
||||||
|
SRC += $(QUANTUM_DIR)/audio/luts.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(MIDI_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DMIDI_ENABLE
|
||||||
|
MUSIC_ENABLE := 1
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_midi.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(MUSIC_ENABLE), 1)
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_music.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(COMBO_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DCOMBO_ENABLE
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_combo.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(VIRTSER_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DVIRTSER_ENABLE
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(FAUXCLICKY_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DFAUXCLICKY_ENABLE
|
||||||
|
SRC += $(QUANTUM_DIR)/fauxclicky.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(UCIS_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DUCIS_ENABLE
|
||||||
|
UNICODE_COMMON = yes
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_ucis.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(UNICODEMAP_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DUNICODEMAP_ENABLE
|
||||||
|
UNICODE_COMMON = yes
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_unicodemap.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(UNICODE_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DUNICODE_ENABLE
|
||||||
|
UNICODE_COMMON = yes
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_unicode.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(UNICODE_COMMON)), yes)
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DRGBLIGHT_ENABLE
|
||||||
|
SRC += $(QUANTUM_DIR)/light_ws2812.c
|
||||||
|
SRC += $(QUANTUM_DIR)/rgblight.c
|
||||||
|
CIE1931_CURVE = yes
|
||||||
|
LED_BREATHING_TABLE = yes
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DTAP_DANCE_ENABLE
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_tap_dance.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(PRINTING_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DPRINTING_ENABLE
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_printer.c
|
||||||
|
SRC += $(TMK_DIR)/protocol/serial_uart.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(SERIAL_LINK_ENABLE)), yes)
|
||||||
|
SRC += $(patsubst $(QUANTUM_PATH)/%,%,$(SERIAL_SRC))
|
||||||
|
OPT_DEFS += $(SERIAL_DEFS)
|
||||||
|
VAPTH += $(SERIAL_PATH)
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq ($(strip $(VARIABLE_TRACE)),)
|
||||||
|
SRC += $(QUANTUM_DIR)/variable_trace.c
|
||||||
|
OPT_DEFS += -DNUM_TRACED_VARIABLES=$(strip $(VARIABLE_TRACE))
|
||||||
|
ifneq ($(strip $(MAX_VARIABLE_TRACE_SIZE)),)
|
||||||
|
OPT_DEFS += -DMAX_VARIABLE_TRACE_SIZE=$(strip $(MAX_VARIABLE_TRACE_SIZE))
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(LCD_ENABLE)), yes)
|
||||||
|
CIE1931_CURVE = yes
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
|
||||||
|
ifeq ($(strip $(VISUALIZER_ENABLE)), yes)
|
||||||
|
CIE1931_CURVE = yes
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(CIE1931_CURVE)), yes)
|
||||||
|
OPT_DEFS += -DUSE_CIE1931_CURVE
|
||||||
|
LED_TABLES = yes
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(LED_BREATHING_TABLE)), yes)
|
||||||
|
OPT_DEFS += -DUSE_LED_BREATHING_TABLE
|
||||||
|
LED_TABLES = yes
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(LED_TABLES)), yes)
|
||||||
|
SRC += $(QUANTUM_DIR)/led_tables.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
QUANTUM_SRC:= \
|
||||||
|
$(QUANTUM_DIR)/quantum.c \
|
||||||
|
$(QUANTUM_DIR)/keymap_common.c \
|
||||||
|
$(QUANTUM_DIR)/keycode_config.c \
|
||||||
|
$(QUANTUM_DIR)/process_keycode/process_leader.c
|
||||||
|
|
||||||
|
ifndef CUSTOM_MATRIX
|
||||||
|
QUANTUM_SRC += $(QUANTUM_DIR)/matrix.c
|
||||||
|
endif
|
||||||
@@ -35,8 +35,8 @@ void promicro_bootloader_jmp(bool program);
|
|||||||
{ KC_##k00, KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05, KC_NO, KC_##k06, KC_##k07, KC_##k08, KC_##k09, KC_##k0a, KC_##k0b }, \
|
{ KC_##k00, KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05, KC_NO, KC_##k06, KC_##k07, KC_##k08, KC_##k09, KC_##k0a, KC_##k0b }, \
|
||||||
{ KC_##k10, KC_##k11, KC_##k12, KC_##k13, KC_##k14, KC_##k15, KC_NO, KC_##k16, KC_##k17, KC_##k18, KC_##k19, KC_##k1a, KC_##k1b }, \
|
{ KC_##k10, KC_##k11, KC_##k12, KC_##k13, KC_##k14, KC_##k15, KC_NO, KC_##k16, KC_##k17, KC_##k18, KC_##k19, KC_##k1a, KC_##k1b }, \
|
||||||
{ KC_##k20, KC_##k21, KC_##k22, KC_##k23, KC_##k24, KC_##k25, KC_NO, KC_##k26, KC_##k27, KC_##k28, KC_##k29, KC_##k2a, KC_##k2b }, \
|
{ KC_##k20, KC_##k21, KC_##k22, KC_##k23, KC_##k24, KC_##k25, KC_NO, KC_##k26, KC_##k27, KC_##k28, KC_##k29, KC_##k2a, KC_##k2b }, \
|
||||||
{ KC_##k30, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k35, KC_##k46, KC_##k36, KC_##k37, KC_##k38, KC_##k39, KC_##k3a, KC_##k3b }, \
|
{ KC_##k30, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k35, KC_##k47, KC_##k36, KC_##k37, KC_##k38, KC_##k39, KC_##k3a, KC_##k3b }, \
|
||||||
{ KC_##k40, KC_##k41, KC_##k42, KC_##k43, KC_##k44, KC_##k45, KC_##k47, KC_##k48, KC_##k49, KC_##k4a, KC_##k4b, KC_##k4c, KC_##k4d } \
|
{ KC_##k40, KC_##k41, KC_##k42, KC_##k43, KC_##k44, KC_##k45, KC_##k46, KC_##k48, KC_##k49, KC_##k4a, KC_##k4b, KC_##k4c, KC_##k4d } \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
NKRO_ENABLE = true
|
||||||
|
MOUSEKEY_ENABLE = no
|
||||||
|
EXTRAKEY_ENABLE = yes
|
||||||
|
CONSOLE_ENABLE = no
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<!-- -*- mode: markdown; fill-column: 8192 -*- -->
|
||||||
|
|
||||||
|
Atreus52 Modification
|
||||||
|
=======================
|
||||||
|
|
||||||
|
Firmware for my custom keyboard based on the Atreus layout, but with 5 rows and only 5 columns per hand.
|
||||||
|
More documentation coming soon.
|
||||||
|
|
||||||
|
# License
|
||||||
|
GPL-3+
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
#include "../../config.h"
|
||||||
|
|
||||||
|
#undef MANUFACTURER
|
||||||
|
#undef PRODUCT
|
||||||
|
#undef DESCRIPTION
|
||||||
|
#undef MATRIX_ROW_PINS
|
||||||
|
#undef MATRIX_COL_PINS
|
||||||
|
#undef DIODE_DIRECTION
|
||||||
|
|
||||||
|
/* USB Device descriptor parameter */
|
||||||
|
#define MANUFACTURER Mesh Industries
|
||||||
|
#define PRODUCT Atreus52 Treeboard
|
||||||
|
#define DESCRIPTION q.m.k. keyboard firmware for Atreus52
|
||||||
|
|
||||||
|
#define MATRIX_ROW_PINS { C6, D7, E6, B4, B5 }
|
||||||
|
#define MATRIX_COL_PINS { B2, B1, F7, F6, F5, F4, B6, D3, D2, D1, D0, D4, B3 }
|
||||||
|
|
||||||
|
#define DIODE_DIRECTION COL2ROW
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
#include "atreus62.h"
|
||||||
|
|
||||||
|
// Layers
|
||||||
|
#define DVORAK 0
|
||||||
|
#define QWERTY 1
|
||||||
|
#define RAISE 2
|
||||||
|
#define LOWER 3
|
||||||
|
#define BDO 4
|
||||||
|
#define RESETL 5
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
[DVORAK] = KC_KEYMAP(
|
||||||
|
NO, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, NO, \
|
||||||
|
NO, QUOT, COMM, DOT, P, Y, F, G, C, R, L, NO, \
|
||||||
|
NO, A, O, E, U, I, D, H, T, N, S, NO, \
|
||||||
|
NO, SCLN, Q, J, K, X, B, M, W, V, Z, NO, \
|
||||||
|
NO, FN2, LALT, LCTL, FN1, LSFT, BSPC, ENT, SPC, FN0, LGUI, LEFT, RGHT, NO ),
|
||||||
|
|
||||||
|
[QWERTY] = KC_KEYMAP(
|
||||||
|
NO, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, NO, \
|
||||||
|
NO, Q, W, E, R, T, Y, U, I, O, P, NO, \
|
||||||
|
NO, A, S, D, F, G, H, J, K, L, SCLN, NO, \
|
||||||
|
NO, Z, X, C, V, B, N, M, COMM, DOT, SLSH, NO, \
|
||||||
|
NO, FN2, LALT, LCTL, FN1, LSFT, BSPC, ENT, SPC, FN0, LGUI, LEFT, RGHT, NO ),
|
||||||
|
|
||||||
|
[RAISE] = KC_KEYMAP(
|
||||||
|
NO, MRWD, MPRV, MPLY, MNXT, MFFD, TRNS, MUTE, VOLD, VOLU, DEL, NO, \
|
||||||
|
NO, TILD, GRV, LCBR, RCBR, DQUO, QUOT, EQL, PLUS, MINS, QUES, NO, \
|
||||||
|
NO, ESC, TAB, LPRN, RPRN, BSLS, SLSH, LEFT, DOWN, UP, RGHT, NO, \
|
||||||
|
NO, TRNS, TRNS, LBRC, RBRC, TRNS, INS, PIPE, UNDS, TRNS, TRNS, NO, \
|
||||||
|
NO, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN3, NO ),
|
||||||
|
|
||||||
|
[LOWER] = KC_KEYMAP(
|
||||||
|
NO, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, NO, \
|
||||||
|
NO, EXLM, AT, HASH, DLR, PERC, CIRC, AMPR, ASTR, LPRN, RPRN, NO, \
|
||||||
|
NO, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, NO, \
|
||||||
|
NO, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, DOT, TRNS, TRNS, TRNS, NO, \
|
||||||
|
NO, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, NO ),
|
||||||
|
|
||||||
|
[BDO] = KC_KEYMAP(
|
||||||
|
NO, ESC, 1, 2, 3, 4, 5, 0, SLSH, U, C, NO, \
|
||||||
|
NO, TAB, Q, W, E, R, 6, Y, I, O, P, NO, \
|
||||||
|
NO, LSFT, A, S, D, F, 7, G, H, J, K, NO, \
|
||||||
|
NO, T, Z, X, C, V, 8, B, N, M, L, NO, \
|
||||||
|
NO, LCTL, SPC, SPC, SPC, SPC, COMM, ENT, 9, NO, NO, NO, FN2, NO ),
|
||||||
|
|
||||||
|
[RESETL] = KEYMAP(
|
||||||
|
KC_NO, RESET, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_FN3,KC_NO )
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM fn_actions[] = {
|
||||||
|
[0] = ACTION_LAYER_MOMENTARY(RAISE), // Raise layer
|
||||||
|
[1] = ACTION_LAYER_MOMENTARY(LOWER), // Lower layer
|
||||||
|
[2] = ACTION_LAYER_TOGGLE(BDO), // BDO layer
|
||||||
|
[3] = ACTION_LAYER_TOGGLE(RESETL) // RESET layer
|
||||||
|
};
|
||||||
|
|
||||||
|
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||||
|
{
|
||||||
|
// MACRODOWN only works in this function
|
||||||
|
switch (id) {
|
||||||
|
case 0:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
register_code(KC_RSFT);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
unregister_code(KC_RSFT);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return MACRO_NONE;
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint8_t qw_dv_swap_state = 0;
|
||||||
|
|
||||||
|
bool process_record_user (uint16_t keycode, keyrecord_t *record) {
|
||||||
|
if (keycode == KC_LGUI) {
|
||||||
|
if (record->event.pressed)
|
||||||
|
qw_dv_swap_state |= 0b00000001;
|
||||||
|
else
|
||||||
|
qw_dv_swap_state &= ~(0b00000001);
|
||||||
|
}
|
||||||
|
if (keycode == KC_LCTL) {
|
||||||
|
if (record->event.pressed)
|
||||||
|
qw_dv_swap_state |= 0b00000010;
|
||||||
|
else
|
||||||
|
qw_dv_swap_state &= ~(0b00000010);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qw_dv_swap_state == 0b00000011) {
|
||||||
|
layer_invert(DVORAK);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -54,7 +54,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
//#define INFINITY_PROTOTYPE
|
//#define INFINITY_PROTOTYPE
|
||||||
|
|
||||||
/* Keymap for Infinity 1.1a (first revision with LED support) */
|
/* Keymap for Infinity 1.1a (first revision with LED support) */
|
||||||
//#define INFINITY_LED
|
#define INFINITY_LED
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Feature disable options
|
* Feature disable options
|
||||||
|
|||||||
@@ -76,7 +76,7 @@
|
|||||||
* @brief Enables the I2C subsystem.
|
* @brief Enables the I2C subsystem.
|
||||||
*/
|
*/
|
||||||
#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__)
|
#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__)
|
||||||
#define HAL_USE_I2C FALSE
|
#define HAL_USE_I2C TRUE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -139,7 +139,7 @@
|
|||||||
* @brief Enables the SERIAL over USB subsystem.
|
* @brief Enables the SERIAL over USB subsystem.
|
||||||
*/
|
*/
|
||||||
#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__)
|
#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__)
|
||||||
#define HAL_USE_SERIAL_USB TRUE
|
#define HAL_USE_SERIAL_USB FALSE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
ifndef QUANTUM_DIR
|
||||||
|
include ../../../../Makefile
|
||||||
|
endif
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
#ifndef CONFIG_USER_H
|
||||||
|
#define CONFIG_USER_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "../../config.h"
|
||||||
|
|
||||||
|
//overrides
|
||||||
|
#undef TAPPING_TOGGLE
|
||||||
|
#define TAPPING_TOGGLE 2
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,304 @@
|
|||||||
|
#include "infinity60.h"
|
||||||
|
#include "led_controller.h"
|
||||||
|
|
||||||
|
//Helpful Defines
|
||||||
|
#define _______ KC_TRNS
|
||||||
|
|
||||||
|
//Define Layer Names
|
||||||
|
#define _BASE 0
|
||||||
|
#define _NUMPAD 1
|
||||||
|
#define _FNAV 2
|
||||||
|
#define _MEDIA 3
|
||||||
|
#define _TILDE 4
|
||||||
|
|
||||||
|
//IS31 chip has 8 available led pages, using 0 for all leds and 7 for single toggles
|
||||||
|
#define max_pages 6
|
||||||
|
|
||||||
|
enum ic60_keycodes {
|
||||||
|
NUMPAD,
|
||||||
|
FNAV,
|
||||||
|
MEDIA,
|
||||||
|
TILDE,
|
||||||
|
CTLALTDEL,
|
||||||
|
BACKLIGHT,
|
||||||
|
BRIGHT,
|
||||||
|
DIM,
|
||||||
|
ALL,
|
||||||
|
GAME,
|
||||||
|
MODE_SINGLE,
|
||||||
|
MODE_PAGE,
|
||||||
|
MODE_FLASH
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t current_layer_global = 0;
|
||||||
|
uint8_t led_mode_global = MODE_SINGLE;
|
||||||
|
uint8_t backlight_status_global = 1; //init on/off state of backlight
|
||||||
|
uint32_t led_layer_state = 0;
|
||||||
|
|
||||||
|
/* ==================================
|
||||||
|
* KEYMAPS
|
||||||
|
* ==================================*/
|
||||||
|
|
||||||
|
const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
/* Layer 0: Default Layer
|
||||||
|
* ,-----------------------------------------------------------.
|
||||||
|
* |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| Backs|
|
||||||
|
* |-----------------------------------------------------------|
|
||||||
|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \|
|
||||||
|
* |-----------------------------------------------------------|
|
||||||
|
* |CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Enter |
|
||||||
|
* |-----------------------------------------------------------|
|
||||||
|
* |Shif| | Z| X| C| V| B| N| M| ,| .| /|Shift |
|
||||||
|
* |-----------------------------------------------------------|
|
||||||
|
* |Ctrl|Gui |Alt | Space |Alt |Gui | FN | Ctrl |
|
||||||
|
* `-----------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
/* default */
|
||||||
|
[_BASE] = KEYMAP( \
|
||||||
|
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSLS,KC_NO,\
|
||||||
|
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC,KC_BSPC, \
|
||||||
|
TT(_FNAV), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT,KC_ENT, \
|
||||||
|
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,F(TILDE),KC_NO, \
|
||||||
|
KC_LCTL, KC_LGUI,KC_LALT, LT(_FNAV, KC_SPC), KC_RALT,TG(_NUMPAD),MO(_MEDIA), KC_RCTL \
|
||||||
|
),
|
||||||
|
|
||||||
|
/* numpad */
|
||||||
|
[_NUMPAD] = KEYMAP( \
|
||||||
|
_______,_______,_______,_______,_______,_______,_______, KC_P7, KC_P8, KC_P9, KC_PSLS, _______,_______,_______,KC_NO,\
|
||||||
|
_______,_______,_______,_______,_______,_______,_______, KC_P4, KC_P5, KC_P6, KC_PAST, _______,_______,_______, \
|
||||||
|
MO(_FNAV),_______,_______,_______,_______,_______,_______, KC_P1, KC_P2, KC_P3, KC_PMNS, _______,_______, \
|
||||||
|
_______,_______,_______,_______,_______,_______,_______, KC_P0,KC_COMM,KC_PDOT,KC_PPLS, _______,KC_NO, \
|
||||||
|
_______,_______,_______, TO(_BASE), _______,_______,_______,_______ \
|
||||||
|
),
|
||||||
|
|
||||||
|
/* F-, arrow, and media keys */
|
||||||
|
[_FNAV] = KEYMAP( \
|
||||||
|
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______,KC_NO,\
|
||||||
|
KC_CAPS,_______,_______,_______,_______,_______,_______,KC_PGUP,KC_UP,KC_PGDN,KC_PSCR,_______,_______,KC_DEL, \
|
||||||
|
_______,_______,KC_BTN2,_______,_______,_______,KC_HOME,KC_LEFT,KC_DOWN,KC_RGHT,KC_INS,_______,_______, \
|
||||||
|
_______,KC_APP,KC_BTN1,KC_CALC,_______,_______,KC_END,_______,_______,_______,_______,_______,KC_NO, \
|
||||||
|
_______,_______,_______, _______, F(CTLALTDEL),KC_NLCK,_______,_______ \
|
||||||
|
),
|
||||||
|
|
||||||
|
/* media */
|
||||||
|
[_MEDIA] = KEYMAP( \
|
||||||
|
_______,F(MODE_SINGLE),F(MODE_PAGE),F(MODE_FLASH),_______,_______,_______, _______, _______, _______,KC_MUTE, KC_VOLD, KC_VOLU,_______,KC_NO,\
|
||||||
|
_______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,\
|
||||||
|
_______,_______,_______,_______,_______,F(GAME),_______, _______, _______, _______,_______, _______,_______, \
|
||||||
|
_______,_______,F(ALL) ,F(BRIGHT),F(DIM),F(BACKLIGHT),_______, _______, KC_MPRV, KC_MNXT,KC_MSTP, _______,KC_NO, \
|
||||||
|
_______,_______,_______, KC_MPLY, _______,_______, _______,_______ \
|
||||||
|
),
|
||||||
|
/* ~ */
|
||||||
|
[_TILDE] = KEYMAP( \
|
||||||
|
KC_GRV,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,KC_NO,\
|
||||||
|
_______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,\
|
||||||
|
_______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______, \
|
||||||
|
_______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,KC_NO, \
|
||||||
|
_______,_______,_______, _______, _______,_______, _______,_______ \
|
||||||
|
),
|
||||||
|
/* template */
|
||||||
|
[5] = KEYMAP( \
|
||||||
|
_______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,KC_NO,\
|
||||||
|
_______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,\
|
||||||
|
_______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______, \
|
||||||
|
_______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,KC_NO, \
|
||||||
|
_______,_______,_______, _______, _______,_______, _______,_______ \
|
||||||
|
),
|
||||||
|
};
|
||||||
|
|
||||||
|
//id for user defined functions and macros
|
||||||
|
enum function_id {
|
||||||
|
NONE,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum macro_id {
|
||||||
|
ACTION_LEDS_ALL,
|
||||||
|
ACTION_LEDS_GAME,
|
||||||
|
ACTION_LEDS_BACKLIGHT,
|
||||||
|
ACTION_LEDS_BRIGHT,
|
||||||
|
ACTION_LEDS_DIM,
|
||||||
|
ACTION_LEDS_SINGLE,
|
||||||
|
ACTION_LEDS_PAGE,
|
||||||
|
ACTION_LEDS_FLASH
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ==================================
|
||||||
|
* LED MAPPING
|
||||||
|
* ==================================*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Infinity60 LED MAP
|
||||||
|
11 12 13 14 15 16 17 18 21 22 23 24 25 26 27*
|
||||||
|
28 31 32 33 34 35 36 37 38 41 42 43 44 45
|
||||||
|
46 47 48 51 52 53 54 55 56 57 58 61 62
|
||||||
|
63 64 65 66 67 68 71 72 73 74 75 76 77*
|
||||||
|
78 81 82 83 84 85 86 87
|
||||||
|
*Unused in Alphabet Layout
|
||||||
|
*/
|
||||||
|
|
||||||
|
//======== full page arrays =========
|
||||||
|
//any change in array size needs to be mirrored in matrix_init_user
|
||||||
|
uint8_t led_numpad[16] = {
|
||||||
|
18,21,22,23,
|
||||||
|
37,38,41,42,
|
||||||
|
55,56,57,58,
|
||||||
|
72,73,74,75
|
||||||
|
};
|
||||||
|
//LED Page 2 - _Nav
|
||||||
|
uint8_t led_nav[12] = {
|
||||||
|
38,
|
||||||
|
47,48, 55,56,57,
|
||||||
|
64,65,66
|
||||||
|
};
|
||||||
|
//LED Page 3 - _Media
|
||||||
|
uint8_t led_media[15] = {
|
||||||
|
12,13,14, 23,24,25,
|
||||||
|
65,66,67,68, 73,74,75,
|
||||||
|
83, 86
|
||||||
|
};
|
||||||
|
//LED Page 4 - _Game "WASD"
|
||||||
|
uint8_t led_game[5] = {
|
||||||
|
11,
|
||||||
|
32,
|
||||||
|
47,48,51
|
||||||
|
};
|
||||||
|
|
||||||
|
//======== qmk functions =========
|
||||||
|
const uint16_t fn_actions[] = {
|
||||||
|
[CTLALTDEL] = ACTION_KEY(LALT(LCTL(KC_DEL))),
|
||||||
|
[TILDE] = ACTION_LAYER_MODS(_TILDE, MOD_LSFT),
|
||||||
|
[ALL] = ACTION_FUNCTION(ACTION_LEDS_ALL),
|
||||||
|
[GAME] = ACTION_FUNCTION(ACTION_LEDS_GAME),
|
||||||
|
[BACKLIGHT] = ACTION_FUNCTION(ACTION_LEDS_BACKLIGHT),
|
||||||
|
[BRIGHT] = ACTION_FUNCTION(ACTION_LEDS_BRIGHT),
|
||||||
|
[DIM] = ACTION_FUNCTION(ACTION_LEDS_DIM),
|
||||||
|
[MODE_SINGLE] = ACTION_FUNCTION(ACTION_LEDS_SINGLE),
|
||||||
|
[MODE_PAGE] = ACTION_FUNCTION(ACTION_LEDS_PAGE),
|
||||||
|
[MODE_FLASH] = ACTION_FUNCTION(ACTION_LEDS_FLASH),
|
||||||
|
};
|
||||||
|
|
||||||
|
/* custom action function */
|
||||||
|
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||||
|
msg_t msg;
|
||||||
|
|
||||||
|
switch(id) {
|
||||||
|
case ACTION_LEDS_ALL:
|
||||||
|
if(record->event.pressed) {
|
||||||
|
led_mode_global = led_mode_global == ALL ? MODE_SINGLE : ALL;
|
||||||
|
msg=TOGGLE_ALL;
|
||||||
|
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ACTION_LEDS_BACKLIGHT:
|
||||||
|
if(record->event.pressed) {
|
||||||
|
backlight_status_global ^= 1;
|
||||||
|
msg=(backlight_status_global << 8) | TOGGLE_BACKLIGHT;
|
||||||
|
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ACTION_LEDS_GAME:
|
||||||
|
if(record->event.pressed) {
|
||||||
|
led_mode_global = led_mode_global == GAME ? MODE_SINGLE : GAME;
|
||||||
|
|
||||||
|
msg=(4 << 8) | DISPLAY_PAGE;
|
||||||
|
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ACTION_LEDS_BRIGHT:
|
||||||
|
if(record->event.pressed) {
|
||||||
|
msg=(1 << 8) | STEP_BRIGHTNESS;
|
||||||
|
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ACTION_LEDS_DIM:
|
||||||
|
if(record->event.pressed) {
|
||||||
|
msg=(0 << 8) | STEP_BRIGHTNESS;
|
||||||
|
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
//set led_mode for matrix_scan to toggle leds
|
||||||
|
case ACTION_LEDS_SINGLE:
|
||||||
|
led_mode_global = MODE_SINGLE;
|
||||||
|
break;
|
||||||
|
case ACTION_LEDS_PAGE:
|
||||||
|
led_mode_global = MODE_PAGE;
|
||||||
|
break;
|
||||||
|
case ACTION_LEDS_FLASH:
|
||||||
|
led_mode_global = MODE_FLASH;
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||||
|
{
|
||||||
|
return MACRO_NONE;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
bool process_record_user (uint16_t keycode, keyrecord_t *record) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Runs just one time when the keyboard initializes.
|
||||||
|
void matrix_init_user(void) {
|
||||||
|
|
||||||
|
led_controller_init();
|
||||||
|
|
||||||
|
// Write predefined led pages.
|
||||||
|
write_led_page(_NUMPAD, led_numpad, 16);
|
||||||
|
chThdSleepMilliseconds(10);
|
||||||
|
|
||||||
|
write_led_page(_FNAV, led_nav, 12);
|
||||||
|
chThdSleepMilliseconds(10);
|
||||||
|
|
||||||
|
write_led_page(_MEDIA, led_media, 15);
|
||||||
|
chThdSleepMilliseconds(10);
|
||||||
|
|
||||||
|
write_led_page(4, led_game, 5);
|
||||||
|
chThdSleepMilliseconds(1000);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Loops constantly in the background.
|
||||||
|
void matrix_scan_user(void) {
|
||||||
|
uint8_t page;
|
||||||
|
uint8_t led_pin_byte;
|
||||||
|
msg_t msg;
|
||||||
|
|
||||||
|
if (backlight_status_global == 0) {//backlight is off, skip the rest
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (led_layer_state != layer_state && led_mode_global != GAME && led_mode_global != ALL) {
|
||||||
|
//check mode
|
||||||
|
//Turn on layer indicator or page depending on mode
|
||||||
|
switch(led_mode_global) {
|
||||||
|
case MODE_FLASH: //flash preset page leds then single indicator
|
||||||
|
page = biton32(layer_state) > max_pages ? 7 : biton32(layer_state);
|
||||||
|
msg=(page << 8) | DISPLAY_PAGE;
|
||||||
|
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
||||||
|
chThdSleepMilliseconds(500);
|
||||||
|
//flow to display single layer leds
|
||||||
|
|
||||||
|
case MODE_SINGLE: //light layer indicators for all active layers
|
||||||
|
led_pin_byte = layer_state & 0xFF;
|
||||||
|
msg=(7 << 8) | DISPLAY_PAGE;
|
||||||
|
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
||||||
|
msg=(1 << 16) | (led_pin_byte << 8) | SET_FULL_ROW;
|
||||||
|
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MODE_PAGE: //display pre-defined led page
|
||||||
|
page = biton32(layer_state) > max_pages ? 7 : biton32(layer_state);
|
||||||
|
msg=(page << 8) | DISPLAY_PAGE;
|
||||||
|
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
led_layer_state = layer_state;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
Backlight for Infinity60
|
||||||
|
========================
|
||||||
|
|
||||||
|
## Led Controller Specs
|
||||||
|
|
||||||
|
The Infinity60 (revision 1.1a) pcb uses the IS31FL3731C matrix LED driver from ISSI [(datasheet)](http://www.issi.com/WW/pdf/31FL3731C.pdf). The IS31 has the ability to control two led matrices (A & B), each matrix controlling 9 pins, each pin controlling 8 leds. The Infinity only utilizes matrix A.
|
||||||
|
|
||||||
|
Infinity60 LED Map:
|
||||||
|
digits mean "row" and "col", i.e. 45 means pin 4, column 5 in the IS31 datasheet
|
||||||
|
```c
|
||||||
|
11 12 13 14 15 16 17 18 21 22 23 24 25 26 27*
|
||||||
|
28 31 32 33 34 35 36 37 38 41 42 43 44 45
|
||||||
|
46 47 48 51 52 53 54 55 56 57 58 61 62
|
||||||
|
63 64 65 66 67 68 71 72 73 74 75 76 77*
|
||||||
|
78 81 82 83 84 85 86 87
|
||||||
|
```
|
||||||
|
*Unused in Alphabet Layout
|
||||||
|
|
||||||
|
The IS31 includes 8 led pages (or frames) 0-7 than can be displayed, and each page consists of 144 bytes.
|
||||||
|
- **bytes 0 - 17** - LED control (on/off).
|
||||||
|
* 18 pins which alternate between A and B matrices (A1, B1, A2, B2, ..).
|
||||||
|
* Each byte controls the 8 leds on that pin with bits (8 to 1).
|
||||||
|
- **bytes 8 - 35** - Blink control.
|
||||||
|
* Same as LED control above, but sets blink on/off.
|
||||||
|
- **bytes 36 - 143** - PWM control.
|
||||||
|
* One byte per LED, sets PWM from 0 to 255.
|
||||||
|
* Same as above, the register alternates, every 8 *bytes* (not bits) between the A & B matrices.
|
||||||
|
|
||||||
|
## Led Controller Code
|
||||||
|
In the Infinity60 project folder, led_controller.c sets up ability to write led layers at startup or control leds on demand as part of fn_actions. By default led_controller.c assumes page 0 will be used for full on/off. The remaining 7 pages (1-7) are free for preset led maps or single led actions at init or on demand. Communication with the IS31 is primarily done through the led_mailbox using chMBPost described further below under "Sending messages in Keymap.c". This code is based on work matt3o and flabbergast did for tmk firmware on the [whitefox](https://github.com/tmk/whitefox).
|
||||||
|
|
||||||
|
One function is available to directly set leds without the mailbox:
|
||||||
|
```
|
||||||
|
write_led_page(page#, array of leds by address, # of addresses in array)
|
||||||
|
```
|
||||||
|
This function saves a full page to the controller using a supplied array of led locations such as:
|
||||||
|
```c
|
||||||
|
uint8_t led_numpad[16] = {
|
||||||
|
18,21,22,23,
|
||||||
|
37,38,41,42,
|
||||||
|
55,56,57,58,
|
||||||
|
72,73,74,75
|
||||||
|
}
|
||||||
|
write_led_page(5, led_numpad, 16);
|
||||||
|
```
|
||||||
|
|
||||||
|
Remaining led control is done through the led mailbox using these message types:
|
||||||
|
- **SET_FULL_ROW** (3 bytes) - message type, 8-bit mask, and row#. Sets all leds on one pin per the bit mask.
|
||||||
|
- **OFF_LED, ON_LED, TOGGLE_LED** (3 bytes) - message type, led address, and page#. Off/on/toggle specific led.
|
||||||
|
- **BLINK_OFF_LED, BLINK_ON_LED, BLINK_OFF_LED** (3 bytes) - message type, led address, and page#. Set blink Off/on/toggle for specific led.
|
||||||
|
- **TOGGLE_ALL** (1 byte) - Turn on/off full backlight.
|
||||||
|
- **TOGGLE_BACKLIGHT** (2 bytes) - message type, on/off. Sets backlight completely off, no leds will display.
|
||||||
|
- **DISPLAY_PAGE** (2 bytes) - message type, page to display. Switch to specific pre-set page.
|
||||||
|
- **RESET_PAGE** (2 bytes) - message type, page to reset. Reset/erase specific page.
|
||||||
|
- **TOGGLE_NUM_LOCK** (2 bytes) - message type, on/off (NUM_LOCK_LED_ADDRESS). Toggle numlock on/off. Usually run with the `set_leds` function to check state of numlock or capslock. If all leds are on (e.i. TOGGLE_ALL) then this sets numlock to blink instead (this is still a little buggy if toggling on/off quickly).
|
||||||
|
- **TOGGLE_CAPS_LOCK** (2 bytes) - message type, on/off (CAPS_LOCK_LED_ADDRESS). Same as numlock.
|
||||||
|
- **STEP_BRIGHTNESS** (2 bytes) - message type, and step up (1) or step down (0). Increase or decrease led brightness.
|
||||||
|
|
||||||
|
## Sending messages in Keymap.c
|
||||||
|
Sending an action to the led mailbox is done using chMBPost:
|
||||||
|
```
|
||||||
|
chMBPost(&led_mailbox, message, timeout);
|
||||||
|
```
|
||||||
|
- &led_mailbox - pointer to led mailbox
|
||||||
|
- message - up to 4 bytes but most messages use only 2. First byte (LSB) is the message type, the remaining three bytes are the message to process.
|
||||||
|
- timeout is TIME_IMMEDIATE
|
||||||
|
|
||||||
|
An example:
|
||||||
|
```c
|
||||||
|
//set the message to be sent. First byte (LSB) is the led address, and second is the message type
|
||||||
|
msg=(42 << 8) | ON_LED;
|
||||||
|
|
||||||
|
//send msg to the led mailbox
|
||||||
|
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
||||||
|
```
|
||||||
|
|
||||||
|
Another:
|
||||||
|
```c
|
||||||
|
msg=(46 << 8) | BLINK_TOGGLE_LED;
|
||||||
|
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
||||||
|
```
|
||||||
|
|
||||||
|
Finally, SET_FULL_ROW requires an extra byte with row information in the message so sending this message looks like:
|
||||||
|
```c
|
||||||
|
msg=(row<<16) | (led_pin_byte << 8) | SET_FULL_ROW;
|
||||||
|
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
||||||
|
```
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2012 Jun Wako <[email protected]>
|
Copyright 2015 Jun Wako <[email protected]>
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -19,6 +19,35 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
|
|
||||||
#include "led.h"
|
#include "led.h"
|
||||||
|
|
||||||
|
#include "led_controller.h"
|
||||||
|
|
||||||
|
/* WARNING! This function needs to be callable from
|
||||||
|
* both regular threads and ISRs, unlocked (during resume-from-sleep).
|
||||||
|
* In particular, I2C functions (interrupt-driven) should NOT be called from here.
|
||||||
|
*/
|
||||||
void led_set(uint8_t usb_led) {
|
void led_set(uint8_t usb_led) {
|
||||||
|
msg_t msg;
|
||||||
|
|
||||||
|
if (usb_led & (1<<USB_LED_NUM_LOCK)) {
|
||||||
|
chSysUnconditionalLock();
|
||||||
|
msg=(1 << 8) | TOGGLE_NUM_LOCK;
|
||||||
|
chMBPostI(&led_mailbox, msg);
|
||||||
|
chSysUnconditionalUnlock();
|
||||||
|
} else {
|
||||||
|
chSysUnconditionalLock();
|
||||||
|
msg=(0 << 8) | TOGGLE_NUM_LOCK;
|
||||||
|
chMBPostI(&led_mailbox, msg);
|
||||||
|
chSysUnconditionalUnlock();
|
||||||
|
}
|
||||||
|
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
|
||||||
|
chSysUnconditionalLock();
|
||||||
|
msg=(1 << 8) | TOGGLE_CAPS_LOCK;
|
||||||
|
chMBPostI(&led_mailbox, msg);
|
||||||
|
chSysUnconditionalUnlock();
|
||||||
|
} else {
|
||||||
|
chSysUnconditionalLock();
|
||||||
|
msg=(0 << 8) | TOGGLE_CAPS_LOCK;
|
||||||
|
chMBPostI(&led_mailbox, msg);
|
||||||
|
chSysUnconditionalUnlock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,486 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2016 flabbergast <[email protected]>
|
||||||
|
|
||||||
|
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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* LED controller code
|
||||||
|
* IS31FL3731C matrix LED driver from ISSI
|
||||||
|
* datasheet: http://www.issi.com/WW/pdf/31FL3731C.pdf
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ch.h"
|
||||||
|
#include "hal.h"
|
||||||
|
#include "print.h"
|
||||||
|
#include "led.h"
|
||||||
|
#include "host.h"
|
||||||
|
|
||||||
|
#include "led_controller.h"
|
||||||
|
|
||||||
|
#include "suspend.h"
|
||||||
|
|
||||||
|
#include "usb_main.h"
|
||||||
|
|
||||||
|
/* Infinity60 LED MAP
|
||||||
|
- digits mean "row" and "col", i.e. 45 means C4-5 in the IS31 datasheet, matrix A
|
||||||
|
|
||||||
|
11 12 13 14 15 16 17 18 21 22 23 24 25 26 27*
|
||||||
|
28 31 32 33 34 35 36 37 38 41 42 43 44 45
|
||||||
|
46 47 48 51 52 53 54 55 56 57 58 61 62
|
||||||
|
63 64 65 66 67 68 71 72 73 74 75 76 77*
|
||||||
|
78 81 82 83 84 85 86 87
|
||||||
|
|
||||||
|
*Unused in Alphabet Layout
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
each page has 0xB4 bytes
|
||||||
|
0 - 0x11: LED control (on/off):
|
||||||
|
order: CA1, CB1, CA2, CB2, .... (CA - matrix A, CB - matrix B)
|
||||||
|
CAn controls Cn-8 .. Cn-1 (LSbit)
|
||||||
|
0x12 - 0x23: blink control (like "LED control")
|
||||||
|
0x24 - 0xB3: PWM control: byte per LED, 0xFF max on
|
||||||
|
order same as above (CA 1st row (8bytes), CB 1st row (8bytes), ...)
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Which LED should be used for CAPS LOCK indicator
|
||||||
|
#if !defined(CAPS_LOCK_LED_ADDRESS)
|
||||||
|
#define CAPS_LOCK_LED_ADDRESS 46
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(NUM_LOCK_LED_ADDRESS)
|
||||||
|
#define NUM_LOCK_LED_ADDRESS 85
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Which LED should breathe during sleep */
|
||||||
|
#if !defined(BREATHE_LED_ADDRESS)
|
||||||
|
#define BREATHE_LED_ADDRESS CAPS_LOCK_LED_ADDRESS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* =================
|
||||||
|
* ChibiOS I2C setup
|
||||||
|
* ================= */
|
||||||
|
static const I2CConfig i2ccfg = {
|
||||||
|
400000 // clock speed (Hz); 400kHz max for IS31
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ==============
|
||||||
|
* variables
|
||||||
|
* ============== */
|
||||||
|
// internal communication buffers
|
||||||
|
uint8_t tx[2] __attribute__((aligned(2)));
|
||||||
|
uint8_t rx[1] __attribute__((aligned(2)));
|
||||||
|
|
||||||
|
// buffer for sending the whole page at once (used also as a temp buffer)
|
||||||
|
uint8_t full_page[0xB4+1] = {0};
|
||||||
|
|
||||||
|
// LED mask (which LEDs are present, selected by bits)
|
||||||
|
// IC60 pcb uses only CA matrix.
|
||||||
|
// Each byte is a control pin for 8 leds ordered 8-1
|
||||||
|
const uint8_t all_on_leds_mask[0x12] = {
|
||||||
|
0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF,
|
||||||
|
0x00, 0xFF, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x00, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
// array to hold brightness pwm steps
|
||||||
|
const uint8_t pwm_levels[5] = {
|
||||||
|
0x00, 0x16, 0x4E, 0xA1, 0xFF
|
||||||
|
};
|
||||||
|
|
||||||
|
// array to write to pwm register
|
||||||
|
uint8_t pwm_register_array[9] = {0};
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================
|
||||||
|
* communication functions
|
||||||
|
* ============================ */
|
||||||
|
msg_t is31_select_page(uint8_t page) {
|
||||||
|
tx[0] = IS31_COMMANDREGISTER;
|
||||||
|
tx[1] = page;
|
||||||
|
return i2cMasterTransmitTimeout(&I2CD1, IS31_ADDR_DEFAULT, tx, 2, NULL, 0, US2ST(IS31_TIMEOUT));
|
||||||
|
}
|
||||||
|
|
||||||
|
msg_t is31_write_data(uint8_t page, uint8_t *buffer, uint8_t size) {
|
||||||
|
is31_select_page(page);
|
||||||
|
return i2cMasterTransmitTimeout(&I2CD1, IS31_ADDR_DEFAULT, buffer, size, NULL, 0, US2ST(IS31_TIMEOUT));
|
||||||
|
}
|
||||||
|
|
||||||
|
msg_t is31_write_register(uint8_t page, uint8_t reg, uint8_t data) {
|
||||||
|
is31_select_page(page);
|
||||||
|
tx[0] = reg;
|
||||||
|
tx[1] = data;
|
||||||
|
return i2cMasterTransmitTimeout(&I2CD1, IS31_ADDR_DEFAULT, tx, 2, NULL, 0, US2ST(IS31_TIMEOUT));
|
||||||
|
}
|
||||||
|
|
||||||
|
msg_t is31_read_register(uint8_t page, uint8_t reg, uint8_t *result) {
|
||||||
|
is31_select_page(page);
|
||||||
|
|
||||||
|
tx[0] = reg;
|
||||||
|
return i2cMasterTransmitTimeout(&I2CD1, IS31_ADDR_DEFAULT, tx, 1, result, 1, US2ST(IS31_TIMEOUT));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================
|
||||||
|
* initialise the IS31 chip
|
||||||
|
* ======================== */
|
||||||
|
void is31_init(void) {
|
||||||
|
// just to be sure that it's all zeroes
|
||||||
|
__builtin_memset(full_page,0,0xB4+1);
|
||||||
|
// zero function page, all registers (assuming full_page is all zeroes)
|
||||||
|
is31_write_data(IS31_FUNCTIONREG, full_page, 0xD + 1);
|
||||||
|
// disable hardware shutdown
|
||||||
|
palSetPadMode(GPIOB, 16, PAL_MODE_OUTPUT_PUSHPULL);
|
||||||
|
palSetPad(GPIOB, 16);
|
||||||
|
chThdSleepMilliseconds(10);
|
||||||
|
// software shutdown
|
||||||
|
is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_ON);
|
||||||
|
chThdSleepMilliseconds(10);
|
||||||
|
// zero function page, all registers
|
||||||
|
is31_write_data(IS31_FUNCTIONREG, full_page, 0xD + 1);
|
||||||
|
chThdSleepMilliseconds(10);
|
||||||
|
// software shutdown disable (i.e. turn stuff on)
|
||||||
|
is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_OFF);
|
||||||
|
chThdSleepMilliseconds(10);
|
||||||
|
// zero all LED registers on all 8 pages
|
||||||
|
uint8_t i;
|
||||||
|
for(i=0; i<8; i++) {
|
||||||
|
is31_write_data(i, full_page, 0xB4 + 1);
|
||||||
|
chThdSleepMilliseconds(5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ==================
|
||||||
|
* LED control thread
|
||||||
|
* ================== */
|
||||||
|
#define LED_MAILBOX_NUM_MSGS 5
|
||||||
|
static msg_t led_mailbox_queue[LED_MAILBOX_NUM_MSGS];
|
||||||
|
mailbox_t led_mailbox;
|
||||||
|
static THD_WORKING_AREA(waLEDthread, 256);
|
||||||
|
static THD_FUNCTION(LEDthread, arg) {
|
||||||
|
(void)arg;
|
||||||
|
chRegSetThreadName("LEDthread");
|
||||||
|
|
||||||
|
uint8_t i;
|
||||||
|
uint8_t control_register_word[2] = {0};//2 bytes: register address, byte to write
|
||||||
|
uint8_t led_control_reg[0x13] = {0};//led control register start address + 0x12 bytes
|
||||||
|
|
||||||
|
//persistent status variables
|
||||||
|
uint8_t pwm_step_status, page_status, capslock_status, numlock_status;
|
||||||
|
|
||||||
|
//mailbox variables
|
||||||
|
uint8_t temp, msg_type;
|
||||||
|
uint8_t msg_args[3];
|
||||||
|
msg_t msg;
|
||||||
|
|
||||||
|
// initialize persistent variables
|
||||||
|
pwm_step_status = 4; //full brightness
|
||||||
|
page_status = 0; //start frame 0 (all off/on)
|
||||||
|
numlock_status = (host_keyboard_leds() & (1<<USB_LED_NUM_LOCK)) ? 1 : 0;
|
||||||
|
capslock_status = (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) ? 1 : 0;
|
||||||
|
|
||||||
|
while(true) {
|
||||||
|
// wait for a message (asynchronous)
|
||||||
|
// (messages are queued (up to LED_MAILBOX_NUM_MSGS) if they can't
|
||||||
|
// be processed right away
|
||||||
|
chMBFetch(&led_mailbox, &msg, TIME_INFINITE);
|
||||||
|
msg_type = msg & 0xFF; //first byte is action information
|
||||||
|
msg_args[0] = (msg >> 8) & 0xFF;
|
||||||
|
msg_args[1] = (msg >> 16) & 0XFF;
|
||||||
|
msg_args[2] = (msg >> 24) & 0xFF;
|
||||||
|
|
||||||
|
|
||||||
|
switch (msg_type){
|
||||||
|
case SET_FULL_ROW:
|
||||||
|
//write full byte to pin address, msg_args[1] = pin #, msg_args[0] = 8 bits to write
|
||||||
|
//writes only to currently displayed page
|
||||||
|
write_led_byte(page_status, msg_args[1], msg_args[0]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OFF_LED:
|
||||||
|
//on/off/toggle single led, msg_args[0] = row/col of led, msg_args[1] = page
|
||||||
|
set_led_bit(msg_args[1], control_register_word, msg_args[0], 0);
|
||||||
|
break;
|
||||||
|
case ON_LED:
|
||||||
|
set_led_bit(msg_args[1], control_register_word, msg_args[0], 1);
|
||||||
|
break;
|
||||||
|
case TOGGLE_LED:
|
||||||
|
set_led_bit(msg_args[1], control_register_word, msg_args[0], 2);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BLINK_OFF_LED:
|
||||||
|
//on/off/toggle single led, msg_args[0] = row/col of led
|
||||||
|
set_led_bit(msg_args[1], control_register_word, msg_args[0], 4);
|
||||||
|
break;
|
||||||
|
case BLINK_ON_LED:
|
||||||
|
set_led_bit(msg_args[1], control_register_word, msg_args[0], 5);
|
||||||
|
break;
|
||||||
|
case BLINK_TOGGLE_LED:
|
||||||
|
set_led_bit(msg_args[1], control_register_word, msg_args[0], 6);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TOGGLE_ALL:
|
||||||
|
//turn on/off all leds, msg_args = unused
|
||||||
|
is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_ON);
|
||||||
|
chThdSleepMilliseconds(5);
|
||||||
|
is31_read_register(0, 0x00, &temp);
|
||||||
|
is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_OFF);
|
||||||
|
|
||||||
|
led_control_reg[0] = 0;
|
||||||
|
|
||||||
|
//toggle led mask based on current state (temp)
|
||||||
|
if (temp==0 || page_status > 0) {
|
||||||
|
__builtin_memcpy(led_control_reg+1, all_on_leds_mask, 0x12);
|
||||||
|
} else {
|
||||||
|
__builtin_memset(led_control_reg+1, 0, 0x12);
|
||||||
|
}
|
||||||
|
is31_write_data(0, led_control_reg, 0x13);
|
||||||
|
|
||||||
|
if (page_status > 0) {
|
||||||
|
is31_write_register(IS31_FUNCTIONREG, IS31_REG_PICTDISP, 0);
|
||||||
|
|
||||||
|
page_status=0;
|
||||||
|
|
||||||
|
//maintain lock leds, reset to off and force recheck to blink of all leds toggled on
|
||||||
|
numlock_status = 0;
|
||||||
|
capslock_status = 0;
|
||||||
|
led_set(host_keyboard_leds());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TOGGLE_BACKLIGHT:
|
||||||
|
//msg_args[0] = on/off
|
||||||
|
|
||||||
|
//populate 9 byte rows to be written to each pin, first byte is register (pin) address
|
||||||
|
if (msg_args[0] == 1) {
|
||||||
|
__builtin_memset(pwm_register_array+1, pwm_levels[pwm_step_status], 8);
|
||||||
|
} else {
|
||||||
|
__builtin_memset(pwm_register_array+1, 0, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i=0; i<8; i++) {
|
||||||
|
//first byte is register address, every 0x10 9 bytes is A-matrix pwm pins
|
||||||
|
pwm_register_array[0] = 0x24 + (i * 0x10);
|
||||||
|
is31_write_data(0,pwm_register_array,9);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DISPLAY_PAGE:
|
||||||
|
//msg_args[0] = page to toggle on
|
||||||
|
if (page_status != msg_args[0]) {
|
||||||
|
is31_write_register(IS31_FUNCTIONREG, IS31_REG_PICTDISP, msg_args[0]);
|
||||||
|
page_status = msg_args[0];
|
||||||
|
|
||||||
|
//maintain lock leds, reset to off and force recheck for new page
|
||||||
|
numlock_status = 0;
|
||||||
|
capslock_status = 0;
|
||||||
|
led_set(host_keyboard_leds());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RESET_PAGE:
|
||||||
|
//led_args[0] = page to reset
|
||||||
|
led_control_reg[0] = 0;
|
||||||
|
__builtin_memset(led_control_reg+1, 0, 0x12);
|
||||||
|
is31_write_data(msg_args[0], led_control_reg, 0x13);
|
||||||
|
|
||||||
|
//repeat for blink register
|
||||||
|
led_control_reg[0] = 0x12;
|
||||||
|
is31_write_data(msg_args[0], led_control_reg, 0x13);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TOGGLE_NUM_LOCK:
|
||||||
|
//msg_args[0] = 0 or 1, off/on
|
||||||
|
if (numlock_status != msg_args[0]) {
|
||||||
|
set_lock_leds(NUM_LOCK_LED_ADDRESS, msg_args[0], page_status);
|
||||||
|
numlock_status = msg_args[0];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TOGGLE_CAPS_LOCK:
|
||||||
|
//msg_args[0] = 0 or 1, off/on
|
||||||
|
if (capslock_status != msg_args[0]) {
|
||||||
|
set_lock_leds(CAPS_LOCK_LED_ADDRESS, msg_args[0], page_status);
|
||||||
|
capslock_status = msg_args[0];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STEP_BRIGHTNESS:
|
||||||
|
//led_args[0] = step up (1) or down (0)
|
||||||
|
switch (msg_args[0]) {
|
||||||
|
case 0:
|
||||||
|
if (pwm_step_status == 0) {
|
||||||
|
pwm_step_status = 4;
|
||||||
|
} else {
|
||||||
|
pwm_step_status--;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
if (pwm_step_status == 4) {
|
||||||
|
pwm_step_status = 0;
|
||||||
|
} else {
|
||||||
|
pwm_step_status++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//populate 8 byte arrays to write on each pin
|
||||||
|
//first byte is register address, every 0x10 9 bytes are A-matrix pwm pins
|
||||||
|
__builtin_memset(pwm_register_array+1, pwm_levels[pwm_step_status], 8);
|
||||||
|
|
||||||
|
for(i=0; i<8; i++) {
|
||||||
|
pwm_register_array[0] = 0x24 + (i * 0x10);
|
||||||
|
is31_write_data(0,pwm_register_array,9);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ==============================
|
||||||
|
* led processing functions
|
||||||
|
* ============================== */
|
||||||
|
|
||||||
|
void set_led_bit (uint8_t page, uint8_t *led_control_word, uint8_t led_addr, uint8_t action) {
|
||||||
|
//returns 2 bytes: led control register address and byte to write
|
||||||
|
//action: 0 - off, 1 - on, 2 - toggle, 4 - blink on, 5 - blink off, 6 - toggle blink
|
||||||
|
|
||||||
|
uint8_t control_reg_addr, column_bit, column_byte, temp, blink_bit;
|
||||||
|
|
||||||
|
//check for valid led address
|
||||||
|
if (led_addr < 0 || led_addr > 87 || led_addr % 10 > 8) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
blink_bit = action>>2;//check for blink bit
|
||||||
|
action &= ~(1<<2); //strip blink bit
|
||||||
|
|
||||||
|
//led_addr tens column is pin#, ones column is bit position in 8-bit mask
|
||||||
|
control_reg_addr = ((led_addr / 10) % 10 - 1 ) * 0x02;// A-matrix is every other byte
|
||||||
|
control_reg_addr += blink_bit == 1 ? 0x12 : 0x00;//if blink_bit, shift 12 bytes to blink register
|
||||||
|
|
||||||
|
is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_ON);
|
||||||
|
chThdSleepMilliseconds(5);
|
||||||
|
is31_read_register(page, control_reg_addr, &temp);//maintain status of leds on this byte
|
||||||
|
is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_OFF);
|
||||||
|
|
||||||
|
column_bit = 1<<(led_addr % 10 - 1);
|
||||||
|
column_byte = temp;
|
||||||
|
|
||||||
|
switch(action) {
|
||||||
|
case 0:
|
||||||
|
column_byte &= ~column_bit;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
column_byte |= column_bit;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
column_byte ^= column_bit;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//return word to be written in register
|
||||||
|
led_control_word[0] = control_reg_addr;
|
||||||
|
led_control_word[1] = column_byte;
|
||||||
|
is31_write_data (page, led_control_word, 0x02);
|
||||||
|
}
|
||||||
|
|
||||||
|
void write_led_byte (uint8_t page, uint8_t row, uint8_t led_byte) {
|
||||||
|
uint8_t led_control_word[2] = {0};//register address and on/off byte
|
||||||
|
|
||||||
|
led_control_word[0] = (row - 1 ) * 0x02;// A-matrix is every other byte
|
||||||
|
led_control_word[1] = led_byte;
|
||||||
|
is31_write_data(page, led_control_word, 0x02);
|
||||||
|
}
|
||||||
|
|
||||||
|
void write_led_page (uint8_t page, uint8_t *user_led_array, uint8_t led_count) {
|
||||||
|
uint8_t i;
|
||||||
|
uint8_t pin, col;
|
||||||
|
uint8_t led_control_register[0x13] = {0};
|
||||||
|
|
||||||
|
__builtin_memset(led_control_register,0,13);
|
||||||
|
|
||||||
|
for(i=0;i<led_count;i++){
|
||||||
|
//shift pin by 1 for led register 0x00 address
|
||||||
|
pin = ((user_led_array[i] / 10) % 10 - 1 ) * 2 + 1;
|
||||||
|
col = user_led_array[i] % 10 - 1;
|
||||||
|
led_control_register[pin] |= 1<<(col);
|
||||||
|
}
|
||||||
|
|
||||||
|
is31_write_data(page, led_control_register, 0x13);
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_lock_leds(uint8_t led_addr, uint8_t led_action, uint8_t page) {
|
||||||
|
uint8_t temp;
|
||||||
|
uint8_t led_control_word[2] = {0};
|
||||||
|
|
||||||
|
//blink if all leds are on
|
||||||
|
if (page == 0) {
|
||||||
|
is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_ON);
|
||||||
|
chThdSleepMilliseconds(5);
|
||||||
|
is31_read_register(0, 0x00, &temp);
|
||||||
|
is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_OFF);
|
||||||
|
|
||||||
|
if (temp == 0xFF) {
|
||||||
|
led_action |= (1<<2); //set blink bit
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
set_led_bit(page,led_control_word,led_addr,led_action);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =====================
|
||||||
|
* hook into user keymap
|
||||||
|
* ===================== */
|
||||||
|
void led_controller_init(void) {
|
||||||
|
uint8_t i;
|
||||||
|
|
||||||
|
/* initialise I2C */
|
||||||
|
/* I2C pins */
|
||||||
|
palSetPadMode(GPIOB, 0, PAL_MODE_ALTERNATIVE_2); // PTB0/I2C0/SCL
|
||||||
|
palSetPadMode(GPIOB, 1, PAL_MODE_ALTERNATIVE_2); // PTB1/I2C0/SDA
|
||||||
|
/* start I2C */
|
||||||
|
i2cStart(&I2CD1, &i2ccfg);
|
||||||
|
// try high drive (from kiibohd)
|
||||||
|
I2CD1.i2c->C2 |= I2Cx_C2_HDRS;
|
||||||
|
// try glitch fixing (from kiibohd)
|
||||||
|
I2CD1.i2c->FLT = 4;
|
||||||
|
|
||||||
|
chThdSleepMilliseconds(10);
|
||||||
|
|
||||||
|
/* initialise IS31 chip */
|
||||||
|
is31_init();
|
||||||
|
|
||||||
|
//set Display Option Register so all pwm intensity is controlled from page 0
|
||||||
|
//enable blink and set blink period to 0.27s x rate
|
||||||
|
is31_write_register(IS31_FUNCTIONREG, IS31_REG_DISPLAYOPT, IS31_REG_DISPLAYOPT_INTENSITY_SAME + IS31_REG_DISPLAYOPT_BLINK_ENABLE + 4);
|
||||||
|
|
||||||
|
/* set full pwm on page 1 */
|
||||||
|
pwm_register_array[0] = 0;
|
||||||
|
__builtin_memset(pwm_register_array+1, 0xFF, 8);
|
||||||
|
for(i=0; i<8; i++) {
|
||||||
|
pwm_register_array[0] = 0x24 + (i * 0x10);//first byte of 9 bytes must be register address
|
||||||
|
is31_write_data(0, pwm_register_array, 9);
|
||||||
|
chThdSleepMilliseconds(5);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* enable breathing when the displayed page changes */
|
||||||
|
// Fade-in Fade-out, time = 26ms * 2^N, N=3
|
||||||
|
is31_write_register(IS31_FUNCTIONREG, IS31_REG_BREATHCTRL1, (3<<4)|3);
|
||||||
|
is31_write_register(IS31_FUNCTIONREG, IS31_REG_BREATHCTRL2, IS31_REG_BREATHCTRL2_ENABLE|3);
|
||||||
|
|
||||||
|
/* more time consuming LED processing should be offloaded into
|
||||||
|
* a thread, with asynchronous messaging. */
|
||||||
|
chMBObjectInit(&led_mailbox, led_mailbox_queue, LED_MAILBOX_NUM_MSGS);
|
||||||
|
chThdCreateStatic(waLEDthread, sizeof(waLEDthread), LOWPRIO, LEDthread, NULL);
|
||||||
|
}
|
||||||
@@ -0,0 +1,120 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2016 flabbergast <[email protected]>
|
||||||
|
|
||||||
|
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_CONTROLLER_H_
|
||||||
|
#define _LED_CONTROLLER_H_
|
||||||
|
|
||||||
|
/* =========================
|
||||||
|
* communication functions
|
||||||
|
* ========================= */
|
||||||
|
|
||||||
|
msg_t is31_write_data(uint8_t page, uint8_t *buffer, uint8_t size);
|
||||||
|
msg_t is31_write_register(uint8_t page, uint8_t reg, uint8_t data);
|
||||||
|
msg_t is31_read_register(uint8_t page, uint8_t reg, uint8_t *result);
|
||||||
|
|
||||||
|
/* ============================
|
||||||
|
* init functions/definitions
|
||||||
|
* ============================*/
|
||||||
|
|
||||||
|
void led_controller_init(void);
|
||||||
|
|
||||||
|
#define CAPS_LOCK_LED_ADDRESS 46 //pin matrix location
|
||||||
|
#define NUM_LOCK_LED_ADDRESS 85
|
||||||
|
|
||||||
|
/* =============================
|
||||||
|
* IS31 chip related definitions
|
||||||
|
* ============================= */
|
||||||
|
|
||||||
|
#define IS31_ADDR_DEFAULT 0x74
|
||||||
|
|
||||||
|
#define IS31_REG_CONFIG 0x00
|
||||||
|
// bits in reg
|
||||||
|
#define IS31_REG_CONFIG_PICTUREMODE 0x00
|
||||||
|
#define IS31_REG_CONFIG_AUTOPLAYMODE 0x08
|
||||||
|
#define IS31_REG_CONFIG_AUDIOPLAYMODE 0x18
|
||||||
|
// D2:D0 bits are starting frame for autoplay mode
|
||||||
|
|
||||||
|
#define IS31_REG_PICTDISP 0x01 // D2:D0 frame select for picture mode
|
||||||
|
|
||||||
|
#define IS31_REG_AUTOPLAYCTRL1 0x02
|
||||||
|
// D6:D4 number of loops (000=infty)
|
||||||
|
// D2:D0 number of frames to be used
|
||||||
|
|
||||||
|
#define IS31_REG_AUTOPLAYCTRL2 0x03 // D5:D0 delay time (*11ms)
|
||||||
|
|
||||||
|
#define IS31_REG_DISPLAYOPT 0x05
|
||||||
|
#define IS31_REG_DISPLAYOPT_INTENSITY_SAME 0x20 // same intensity for all frames
|
||||||
|
#define IS31_REG_DISPLAYOPT_BLINK_ENABLE 0x08
|
||||||
|
// D2:D0 bits blink period time (*0.27s)
|
||||||
|
|
||||||
|
#define IS31_REG_AUDIOSYNC 0x06
|
||||||
|
#define IS31_REG_AUDIOSYNC_ENABLE 0x1
|
||||||
|
|
||||||
|
#define IS31_REG_FRAMESTATE 0x07
|
||||||
|
|
||||||
|
#define IS31_REG_BREATHCTRL1 0x08
|
||||||
|
// D6:D4 fade out time (26ms*2^i)
|
||||||
|
// D2:D0 fade in time (26ms*2^i)
|
||||||
|
|
||||||
|
#define IS31_REG_BREATHCTRL2 0x09
|
||||||
|
#define IS31_REG_BREATHCTRL2_ENABLE 0x10
|
||||||
|
// D2:D0 extinguish time (3.5ms*2^i)
|
||||||
|
|
||||||
|
#define IS31_REG_SHUTDOWN 0x0A
|
||||||
|
#define IS31_REG_SHUTDOWN_OFF 0x1
|
||||||
|
#define IS31_REG_SHUTDOWN_ON 0x0
|
||||||
|
|
||||||
|
#define IS31_REG_AGCCTRL 0x0B
|
||||||
|
#define IS31_REG_ADCRATE 0x0C
|
||||||
|
|
||||||
|
#define IS31_COMMANDREGISTER 0xFD
|
||||||
|
#define IS31_FUNCTIONREG 0x0B // helpfully called 'page nine'
|
||||||
|
|
||||||
|
#define IS31_TIMEOUT 10000 // needs to be long enough to write a whole page
|
||||||
|
|
||||||
|
/* ========================================
|
||||||
|
* LED Thread related items
|
||||||
|
* ========================================*/
|
||||||
|
|
||||||
|
extern mailbox_t led_mailbox;
|
||||||
|
|
||||||
|
void set_led_bit (uint8_t page, uint8_t *led_control_reg, uint8_t led_addr, uint8_t action);
|
||||||
|
void set_lock_leds (uint8_t led_addr, uint8_t led_action, uint8_t page);
|
||||||
|
void write_led_byte (uint8_t page, uint8_t row, uint8_t led_byte);
|
||||||
|
void write_led_page (uint8_t page, uint8_t *led_array, uint8_t led_count);
|
||||||
|
|
||||||
|
// constants for signaling the LED controller thread
|
||||||
|
enum led_msg_t {
|
||||||
|
KEY_LIGHT,
|
||||||
|
SET_FULL_ROW,
|
||||||
|
OFF_LED,
|
||||||
|
ON_LED,
|
||||||
|
TOGGLE_LED,
|
||||||
|
BLINK_OFF_LED,
|
||||||
|
BLINK_ON_LED,
|
||||||
|
BLINK_TOGGLE_LED,
|
||||||
|
TOGGLE_ALL,
|
||||||
|
TOGGLE_BACKLIGHT,
|
||||||
|
DISPLAY_PAGE,
|
||||||
|
RESET_PAGE,
|
||||||
|
TOGGLE_NUM_LOCK,
|
||||||
|
TOGGLE_CAPS_LOCK,
|
||||||
|
TOGGLE_BREATH,
|
||||||
|
STEP_BRIGHTNESS
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* _LED_CONTROLLER_H_ */
|
||||||
@@ -47,9 +47,12 @@
|
|||||||
* USB driver settings
|
* USB driver settings
|
||||||
*/
|
*/
|
||||||
#define KINETIS_USB_USE_USB0 TRUE
|
#define KINETIS_USB_USE_USB0 TRUE
|
||||||
/* Need to redefine this, since the default is for K20x */
|
#define KINETIS_USB_USB0_IRQ_PRIORITY 5
|
||||||
/* This is for Teensy LC; you should comment it out (or change to 5)
|
|
||||||
* for Teensy 3.x */
|
/*
|
||||||
#define KINETIS_USB_USB0_IRQ_PRIORITY 2
|
* I2C driver settings
|
||||||
|
*/
|
||||||
|
#define KINETIS_I2C_USE_I2C0 TRUE
|
||||||
|
#define KINETIS_I2C_I2C0_PRIORITY 4
|
||||||
|
|
||||||
#endif /* _MCUCONF_H_ */
|
#endif /* _MCUCONF_H_ */
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
# project specific files
|
# project specific files
|
||||||
SRC = matrix.c \
|
SRC = matrix.c \
|
||||||
led.c
|
led.c \
|
||||||
|
led_controller.c
|
||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
@@ -55,7 +56,7 @@ OPT_DEFS = -DCORTEX_VTOR_INIT=0x00001000
|
|||||||
# Build Options
|
# Build Options
|
||||||
# comment out to disable the options.
|
# comment out to disable the options.
|
||||||
#
|
#
|
||||||
BOOTMAGIC_ENABLE ?= yes # Virtual DIP switch configuration
|
BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration
|
||||||
## (Note that for BOOTMAGIC on Teensy LC you have to use a custom .ld script.)
|
## (Note that for BOOTMAGIC on Teensy LC you have to use a custom .ld script.)
|
||||||
MOUSEKEY_ENABLE ?= yes # Mouse keys
|
MOUSEKEY_ENABLE ?= yes # Mouse keys
|
||||||
EXTRAKEY_ENABLE ?= yes # Audio control and System control
|
EXTRAKEY_ENABLE ?= yes # Audio control and System control
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
ifndef MAKEFILE_INCLUDED
|
||||||
|
include ../../Makefile
|
||||||
|
endif
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
#ifndef CONFIG_H
|
||||||
|
#define CONFIG_H
|
||||||
|
|
||||||
|
#include "config_common.h"
|
||||||
|
|
||||||
|
/* USB Device descriptor parameter */
|
||||||
|
#define VENDOR_ID 0xFEED
|
||||||
|
#define PRODUCT_ID 0x6060
|
||||||
|
#define DEVICE_VER 0x0001
|
||||||
|
#define MANUFACTURER qmkbuilder
|
||||||
|
#define PRODUCT KBD75
|
||||||
|
#define DESCRIPTION QMK keyboard firmware for KBD75 R3 or later
|
||||||
|
|
||||||
|
/* key matrix size */
|
||||||
|
#define MATRIX_ROWS 6
|
||||||
|
#define MATRIX_COLS 16
|
||||||
|
|
||||||
|
/* key matrix pins */
|
||||||
|
#define MATRIX_ROW_PINS { D0, D1, D2, D3, D5, B7 }
|
||||||
|
#define MATRIX_COL_PINS { F0, F1, E6, C7, C6, F5, D4, B1, B0, B5, B4, D7, D6, B3, F4, F6 }
|
||||||
|
#define UNUSED_PINS
|
||||||
|
|
||||||
|
/* COL2ROW or ROW2COL */
|
||||||
|
#define DIODE_DIRECTION COL2ROW
|
||||||
|
|
||||||
|
/* number of backlight levels */
|
||||||
|
#define BACKLIGHT_PIN B6
|
||||||
|
#ifdef BACKLIGHT_PIN
|
||||||
|
#define BACKLIGHT_LEVELS 5
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Set 0 if debouncing isn't needed */
|
||||||
|
#define DEBOUNCING_DELAY 5
|
||||||
|
|
||||||
|
/* 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_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
|
||||||
|
)
|
||||||
|
|
||||||
|
/* prevent stuck modifiers */
|
||||||
|
#define PREVENT_STUCK_MODIFIERS
|
||||||
|
|
||||||
|
#define RGB_DI_PIN E2
|
||||||
|
#ifdef RGB_DI_PIN
|
||||||
|
#define RGBLIGHT_ANIMATIONS
|
||||||
|
#define RGBLED_NUM 16
|
||||||
|
#define RGBLIGHT_HUE_STEP 8
|
||||||
|
#define RGBLIGHT_SAT_STEP 8
|
||||||
|
#define RGBLIGHT_VAL_STEP 8
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
#include "kbd75.h"
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
#ifndef KB_H
|
||||||
|
#define KB_H
|
||||||
|
|
||||||
|
#include "quantum.h"
|
||||||
|
|
||||||
|
#define KEYMAP( \
|
||||||
|
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015, \
|
||||||
|
K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \
|
||||||
|
K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, \
|
||||||
|
K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K315, \
|
||||||
|
K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K413, K414, K415, \
|
||||||
|
K500, K501, K503, K504, K506, K508, K510, K511, K512, K513, K514, K515 \
|
||||||
|
) { \
|
||||||
|
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \
|
||||||
|
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \
|
||||||
|
{ K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \
|
||||||
|
{ K300, KC_NO, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, KC_NO, K315 }, \
|
||||||
|
{ K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, KC_NO, K413, K414, K415 }, \
|
||||||
|
{ K500, K501, KC_NO, K503, K504, KC_NO, K506, KC_NO, K508, KC_NO, K510, K511, K512, K513, K514, K515 } \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,220 @@
|
|||||||
|
#include "kbd75.h"
|
||||||
|
#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
|
||||||
|
KEYMAP(
|
||||||
|
LT(2, KC_ESC), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, MO(1), KC_DEL,
|
||||||
|
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_DEL, KC_BSPC, KC_HOME,
|
||||||
|
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
|
||||||
|
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
|
||||||
|
KC_LSFT, MO(1), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
|
||||||
|
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
|
||||||
|
|
||||||
|
KEYMAP(
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS,
|
||||||
|
KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BL_DEC, BL_TOGG, BL_INC, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
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(
|
||||||
|
KC_TRNS, M(1), M(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
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(
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
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(
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
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(
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
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(
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
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(
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
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(
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
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(
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
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(
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
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(
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
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(
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
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(
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
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(
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
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(
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS)
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||||
|
|
||||||
|
|
||||||
|
switch (id) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return MACRO_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_init_user(void) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_scan_user(void) {
|
||||||
|
}
|
||||||
|
|
||||||
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void led_set_user(uint8_t usb_led) {
|
||||||
|
|
||||||
|
if (usb_led & (1 << USB_LED_NUM_LOCK)) {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (usb_led & (1 << USB_LED_CAPS_LOCK)) {
|
||||||
|
DDRB |= (1 << 2); PORTB &= ~(1 << 2);
|
||||||
|
} else {
|
||||||
|
DDRB &= ~(1 << 2); PORTB &= ~(1 << 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (usb_led & (1 << USB_LED_SCROLL_LOCK)) {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (usb_led & (1 << USB_LED_COMPOSE)) {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (usb_led & (1 << USB_LED_KANA)) {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
enum function_id {
|
||||||
|
SHIFT_ESC,
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM fn_actions[] = {
|
||||||
|
[0] = ACTION_FUNCTION(SHIFT_ESC),
|
||||||
|
};
|
||||||
|
|
||||||
|
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||||
|
static uint8_t shift_esc_shift_mask;
|
||||||
|
switch (id) {
|
||||||
|
case SHIFT_ESC:
|
||||||
|
shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK;
|
||||||
|
if (record->event.pressed) {
|
||||||
|
if (shift_esc_shift_mask) {
|
||||||
|
add_key(KC_GRV);
|
||||||
|
send_keyboard_report();
|
||||||
|
} else {
|
||||||
|
add_key(KC_ESC);
|
||||||
|
send_keyboard_report();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (shift_esc_shift_mask) {
|
||||||
|
del_key(KC_GRV);
|
||||||
|
send_keyboard_report();
|
||||||
|
} else {
|
||||||
|
del_key(KC_ESC);
|
||||||
|
send_keyboard_report();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
# MCU name
|
||||||
|
MCU = atmega32u4
|
||||||
|
|
||||||
|
# Processor frequency.
|
||||||
|
# This will define a symbol, F_CPU, in all source code files equal to the
|
||||||
|
# processor frequency in Hz. You can then use this symbol in your source code to
|
||||||
|
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
|
||||||
|
# automatically to create a 32-bit value in your source code.
|
||||||
|
#
|
||||||
|
# This will be an integer division of F_USB below, as it is sourced by
|
||||||
|
# F_USB after it has run through any CPU prescalers. Note that this value
|
||||||
|
# does not *change* the processor frequency - it should merely be updated to
|
||||||
|
# reflect the processor speed set externally so that the code can use accurate
|
||||||
|
# software delays.
|
||||||
|
F_CPU = 16000000
|
||||||
|
|
||||||
|
#
|
||||||
|
# LUFA specific
|
||||||
|
#
|
||||||
|
# Target architecture (see library "Board Types" documentation).
|
||||||
|
ARCH = AVR8
|
||||||
|
|
||||||
|
# Input clock frequency.
|
||||||
|
# This will define a symbol, F_USB, in all source code files equal to the
|
||||||
|
# input clock frequency (before any prescaling is performed) in Hz. This value may
|
||||||
|
# differ from F_CPU if prescaling is used on the latter, and is required as the
|
||||||
|
# raw input clock is fed directly to the PLL sections of the AVR for high speed
|
||||||
|
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
|
||||||
|
# at the end, this will be done automatically to create a 32-bit value in your
|
||||||
|
# source code.
|
||||||
|
#
|
||||||
|
# If no clock division is performed on the input clock inside the AVR (via the
|
||||||
|
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
|
||||||
|
F_USB = $(F_CPU)
|
||||||
|
|
||||||
|
# Interrupt driven control endpoint task(+60)
|
||||||
|
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
|
||||||
|
|
||||||
|
|
||||||
|
# Boot Section Size in *bytes*
|
||||||
|
OPT_DEFS += -DBOOTLOADER_SIZE=4096
|
||||||
|
|
||||||
|
|
||||||
|
# Build Options
|
||||||
|
# comment out to disable the options.
|
||||||
|
#
|
||||||
|
BOOTMAGIC_ENABLE ?= yes # Virtual DIP switch configuration(+1000)
|
||||||
|
MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700)
|
||||||
|
EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450)
|
||||||
|
CONSOLE_ENABLE ?= no # Console for debug(+400)
|
||||||
|
COMMAND_ENABLE ?= no # Commands for debug and configuration
|
||||||
|
SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend
|
||||||
|
NKRO_ENABLE ?= yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||||
|
BACKLIGHT_ENABLE ?= yes # Enable keyboard backlight functionality
|
||||||
|
AUDIO_ENABLE ?= no
|
||||||
|
RGBLIGHT_ENABLE ?= yes
|
||||||
Binary file not shown.
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
|
Before Width: | Height: | Size: 753 KiB |
Binary file not shown.
Binary file not shown.
@@ -6,6 +6,7 @@ This readme and most of the code are from https://github.com/ahtn/tmk_keyboard/
|
|||||||
Split keyboard firmware for Arduino Pro Micro or other ATmega32u4
|
Split keyboard firmware for Arduino Pro Micro or other ATmega32u4
|
||||||
based boards.
|
based boards.
|
||||||
|
|
||||||
|
**Hardware files for the Let's Split are now stored at http://qmk.fm/lets_split/**
|
||||||
|
|
||||||
## Build Guide
|
## Build Guide
|
||||||
|
|
||||||
|
|||||||
@@ -1,26 +1,12 @@
|
|||||||
# Please remove if no longer applicable
|
# This gets included at the beginning of the Planck's Makefile.
|
||||||
$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD)
|
# Alternatively, you can run make from the keymap directory
|
||||||
$(warning Please disable some options in the Makefile to resolve)
|
# and the main Makefile will be included after.
|
||||||
|
|
||||||
# Build Options
|
COMMAND_ENABLE = no # Disable shift combination, which conflicts with shift-parens
|
||||||
# change to "no" to disable the options, or define them in the Makefile in
|
NKRO_ENABLE = yes # N-key rollover required for use as a steno board
|
||||||
# the appropriate keymap folder that will get included automatically
|
AUDIO_ENABLE = no # Audio output on port C6
|
||||||
#
|
TAP_DANCE_ENABLE = yes
|
||||||
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
|
MOUSEKEY_ENABLE = yes
|
||||||
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
|
|
||||||
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
|
||||||
CONSOLE_ENABLE = no # Console for debug(+400)
|
|
||||||
COMMAND_ENABLE = yes # Commands for debug and configuration
|
|
||||||
NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
|
||||||
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
|
|
||||||
MIDI_ENABLE = no # MIDI controls
|
|
||||||
AUDIO_ENABLE = yes # Audio output on port C6
|
|
||||||
UNICODE_ENABLE = no # Unicode
|
|
||||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
|
||||||
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
|
|
||||||
|
|
||||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
|
||||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
|
||||||
|
|
||||||
ifndef QUANTUM_DIR
|
ifndef QUANTUM_DIR
|
||||||
include ../../../../Makefile
|
include ../../../../Makefile
|
||||||
|
|||||||
@@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2012 Jun Wako <[email protected]>
|
||||||
|
|
||||||
|
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 CONFIG_H
|
||||||
|
#define CONFIG_H
|
||||||
|
|
||||||
|
#define TAPPING_TERM 200
|
||||||
|
|
||||||
|
#include "config_common.h"
|
||||||
|
|
||||||
|
/* USB Device descriptor parameter */
|
||||||
|
#define VENDOR_ID 0xFEED
|
||||||
|
#define PRODUCT_ID 0x6060
|
||||||
|
#define MANUFACTURER Ortholinear Keyboards
|
||||||
|
#define PRODUCT The Planck Keyboard
|
||||||
|
#define DESCRIPTION A compact ortholinear keyboard
|
||||||
|
|
||||||
|
/* key matrix size */
|
||||||
|
#define MATRIX_ROWS 4
|
||||||
|
#define MATRIX_COLS 12
|
||||||
|
|
||||||
|
/* Planck PCB default pin-out */
|
||||||
|
#define MATRIX_ROW_PINS { D0, D5, B5, B6 }
|
||||||
|
#define MATRIX_COL_PINS { F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 }
|
||||||
|
#define UNUSED_PINS
|
||||||
|
|
||||||
|
#define AUDIO_VOICES
|
||||||
|
|
||||||
|
#define BACKLIGHT_PIN B7
|
||||||
|
|
||||||
|
/* COL2ROW or ROW2COL */
|
||||||
|
#define DIODE_DIRECTION COL2ROW
|
||||||
|
|
||||||
|
/* define if matrix has ghost */
|
||||||
|
//#define MATRIX_HAS_GHOST
|
||||||
|
|
||||||
|
/* number of backlight levels */
|
||||||
|
#define BACKLIGHT_LEVELS 3
|
||||||
|
|
||||||
|
/* Set 0 if debouncing isn't needed */
|
||||||
|
#define DEBOUNCING_DELAY 5
|
||||||
|
|
||||||
|
/* 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_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define MOUSEKEY_INTERVAL 20
|
||||||
|
#define MOUSEKEY_DELAY 0
|
||||||
|
#define MOUSEKEY_TIME_TO_MAX 60
|
||||||
|
#define MOUSEKEY_MAX_SPEED 7
|
||||||
|
#define MOUSEKEY_WHEEL_DELAY 0
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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
|
||||||
|
|
||||||
|
#ifdef SUBPROJECT_rev3
|
||||||
|
#include "rev3/config.h"
|
||||||
|
#endif
|
||||||
|
#ifdef SUBPROJECT_rev4
|
||||||
|
#include "rev4/config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,134 +1,406 @@
|
|||||||
// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
|
|
||||||
// this is the style you want to emulate.
|
|
||||||
|
|
||||||
#include "planck.h"
|
#include "planck.h"
|
||||||
#ifdef BACKLIGHT_ENABLE
|
#include "action_layer.h"
|
||||||
#include "backlight.h"
|
#include "eeconfig.h"
|
||||||
#endif
|
#include "keymap_plover.h"
|
||||||
|
#include "action_tapping.h"
|
||||||
|
|
||||||
// Each layer gets a name for readability, which is then used in the keymap matrix below.
|
extern keymap_config_t keymap_config;
|
||||||
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
|
|
||||||
// Layer names don't all need to be of the same length, obviously, and you can also skip them
|
// Keymap layers
|
||||||
// entirely and just use numbers.
|
enum planck_layers {
|
||||||
#define _QW 0
|
BASE_QWERTY_LAYER,
|
||||||
#define _CM 1
|
BASE_COLEMAK_LAYER,
|
||||||
#define _TK 2
|
BASE_STENO_LAYER,
|
||||||
#define _LW 3
|
LOWER_LAYER,
|
||||||
#define _RS 4
|
RAISE_LAYER,
|
||||||
|
NAVIGATION_LAYER,
|
||||||
|
GUI_LAYER,
|
||||||
|
KEYBOARD_LAYER
|
||||||
|
};
|
||||||
|
|
||||||
|
// Key aliases for legibility
|
||||||
|
#define _______ KC_TRNS
|
||||||
|
#define ___x___ KC_NO
|
||||||
|
|
||||||
|
// Macros
|
||||||
|
enum planck_macros {
|
||||||
|
LALT_BRACE,
|
||||||
|
RALT_BRACE
|
||||||
|
};
|
||||||
|
|
||||||
|
// Dashes (macOS)
|
||||||
|
#define KC_NDSH LALT(KC_MINS)
|
||||||
|
#define KC_MDSH S(LALT(KC_MINS))
|
||||||
|
|
||||||
|
// Window manager keys
|
||||||
|
#define WM_FULL LALT(LGUI(KC_F))
|
||||||
|
#define WM_NEXT LCTL(LALT(LGUI(KC_RGHT)))
|
||||||
|
#define WM_PREV LCTL(LALT(LGUI(KC_LEFT)))
|
||||||
|
#define WM_NW LCTL(LGUI(KC_LEFT))
|
||||||
|
#define WM_N LALT(LGUI(KC_UP))
|
||||||
|
#define WM_NE LCTL(LGUI(KC_RGHT))
|
||||||
|
#define WM_E LALT(LGUI(KC_RGHT))
|
||||||
|
#define WM_SE S(LCTL(LGUI(KC_RGHT)))
|
||||||
|
#define WM_S LALT(LGUI(KC_DOWN))
|
||||||
|
#define WM_SW S(LCTL(LGUI(KC_LEFT)))
|
||||||
|
#define WM_W LALT(LGUI(KC_LEFT))
|
||||||
|
#define WM_CNTR LALT(LGUI(KC_C))
|
||||||
|
|
||||||
|
// Special key codes
|
||||||
|
enum planck_keycodes {
|
||||||
|
QWERTY = SAFE_RANGE,
|
||||||
|
COLEMAK,
|
||||||
|
STENO,
|
||||||
|
LOWER,
|
||||||
|
RAISE,
|
||||||
|
PV_EXIT,
|
||||||
|
PV_LOOK
|
||||||
|
};
|
||||||
|
|
||||||
|
//Tap Dance Declarations
|
||||||
|
enum {
|
||||||
|
TD_ESC_GRV = 0
|
||||||
|
};
|
||||||
|
|
||||||
|
// Tap Dance Definitions
|
||||||
|
qk_tap_dance_action_t tap_dance_actions[] = {
|
||||||
|
// Tap once for Esc, twice for Backspace
|
||||||
|
[TD_ESC_GRV] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_GRV)
|
||||||
|
// Other declarations would go here, separated by commas, if you have them
|
||||||
|
};
|
||||||
|
|
||||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
[_QW] = { /* Qwerty */
|
/* Base layer (Qwerty)
|
||||||
/* MIT Layout (QWERTY layer)
|
* ,-----------------------------------------------------------------------.
|
||||||
*
|
* Double tap 4 ~ | ESC | Q | W | E | R | T | Y | U | I | O | P | ' |
|
||||||
* ,-----------------------------------------------------------------------.
|
* |-----------------------------------------------------------------------|
|
||||||
* | esc | q | w | e | r | t | y | u | i | o | p | bspc|
|
* Tap for Tab -- |Ctrl | A | S | D | F | G | H | J | K | L |; Fn4|Ctrl | -- Tap for Enter
|
||||||
* |-----------------------------------------------------------------------|
|
* |-----------------------------------------------------------------------|
|
||||||
* | tab | a | s | d | f | g | h | j | k | l | ; | ' |
|
* Tap for ( -- |Shift| Z | X | C | V | B | N | M | , | . | / |Shift| -- Tap for )
|
||||||
* |-----------------------------------------------------------------------|
|
* |-----------------------------------------------------------------------|
|
||||||
* |shift| z | x | c | v | b | n | m | , | . | / |enter|
|
* Tap for [ -- | Fn3 |Hyper| Alt |Super| Fn1 | Space | Fn2 |Super| Alt |Hyper| Fn3 | -- Tap for ]
|
||||||
* |-----------------------------------------------------------------------|
|
* `-----------------------------------------------------------------------'
|
||||||
* | ctl | alt | win | TK |lower| spc |raise|left |down | up |right|
|
* / /
|
||||||
* `-----------------------------------------------------------------------'
|
* Tap for ] [ --------'-----------------------------------------------------'
|
||||||
*/
|
*/
|
||||||
{KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
|
[BASE_QWERTY_LAYER] = {
|
||||||
{KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
|
{TD(TD_ESC_GRV), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_QUOT},
|
||||||
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MT(MOD_LSFT, KC_ENT) },
|
{F(5), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, F(1), F(6)},
|
||||||
{KC_LCTL, KC_LALT, KC_LGUI, TG(_TK), MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
|
{KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC},
|
||||||
},
|
{F(3), ALL_T(KC_RBRC), M(LALT_BRACE), KC_LGUI, LOWER, KC_SPC, KC_BSPC, RAISE, KC_RGUI, M(RALT_BRACE), ALL_T(KC_LBRC), F(4)}
|
||||||
[_CM] = { /* Colemak */
|
},
|
||||||
/* MIT Layout (Colemak layer)
|
|
||||||
*
|
|
||||||
* ,-----------------------------------------------------------------------.
|
|
||||||
* | esc | q | w | f | p | g | j | l | u | y | ; | bspc|
|
|
||||||
* |-----------------------------------------------------------------------|
|
|
||||||
* | tab | a | r | s | t | d | h | n | e | i | o | ' |
|
|
||||||
* |-----------------------------------------------------------------------|
|
|
||||||
* |shift| z | x | c | v | b | k | m | , | . | / |enter|
|
|
||||||
* |-----------------------------------------------------------------------|
|
|
||||||
* | ctl | alt | win | TK |lower| spc |raise|left |down | up |right|
|
|
||||||
* `-----------------------------------------------------------------------'
|
|
||||||
*/
|
|
||||||
{KC_ESC, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
|
|
||||||
{KC_TAB, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
|
|
||||||
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, MT(MOD_LSFT, KC_ENT)},
|
|
||||||
{KC_LCTL, KC_LALT, KC_LGUI, TG(_TK), MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
|
|
||||||
},
|
|
||||||
[_RS] = { /* RAISE */
|
|
||||||
/* MIT Layout (RAISE layer)
|
|
||||||
*
|
|
||||||
* ,-----------------------------------------------------------------------.
|
|
||||||
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | bspc|
|
|
||||||
* |-----------------------------------------------------------------------|
|
|
||||||
* | tab | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
|
|
||||||
* |-----------------------------------------------------------------------|
|
|
||||||
* |shift| F7 | F8 | F9 | F10 | F11 | F12 | QW | CM | BL | RST |enter|
|
|
||||||
* |-----------------------------------------------------------------------|
|
|
||||||
* | ctl | alt | win | del |lower| spc |raise|next |vold |volu |PLAY |
|
|
||||||
* `-----------------------------------------------------------------------'
|
|
||||||
*/
|
|
||||||
|
|
||||||
{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
|
/* Base layer (Colemak)
|
||||||
{KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
|
* ,-----------------------------------------------------------------------.
|
||||||
{KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), M(0), RESET, KC_TRNS},
|
* | | Q | W | F | P | G | J | L | U | Y | ; | |
|
||||||
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
|
* |-----------------------------------------------------------------------|
|
||||||
},
|
* | | A | R | S | T | D | H | N | E | I |O Fn4| |
|
||||||
[_LW] = { /* LOWER */
|
* |-----------------------------------------------------------------------|
|
||||||
/* MIT Layout (Colemak layer)
|
* | | Z | X | C | V | B | K | M | | | | |
|
||||||
*
|
* |-----------------------------------------------------------------------|
|
||||||
* ,-----------------------------------------------------------------------.
|
* | | | | | | | | | | | |
|
||||||
* | esc | q | w | f | p | g | j | l | u | y | ; | bspc|
|
* `-----------------------------------------------------------------------'
|
||||||
* |-----------------------------------------------------------------------|
|
*/
|
||||||
* | tab | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
|
[BASE_COLEMAK_LAYER] = {
|
||||||
* |-----------------------------------------------------------------------|
|
{_______, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, _______},
|
||||||
* |shift| F7 | F8 | F9 | F10 | F11 | F12 | QW | CM | BL | RST |enter|
|
{_______, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, F(2), _______},
|
||||||
* |-----------------------------------------------------------------------|
|
{_______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, _______, _______, _______, _______},
|
||||||
* | ctl | alt | win | TK |lower| spc |raise|next |vold |volu |PLAY |
|
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
|
||||||
* `-----------------------------------------------------------------------'
|
},
|
||||||
*/
|
|
||||||
{KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
|
|
||||||
{KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
|
|
||||||
{KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), M(0), RESET, KC_TRNS},
|
|
||||||
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
|
|
||||||
},
|
|
||||||
[_TK] = { /* Ten Key*/
|
|
||||||
/* MIT Layout (Ten Key layer)
|
|
||||||
*
|
|
||||||
* ,-----------------------------------------------------------------------.
|
|
||||||
* | esc | F9 | F10 | F11 | F12 | PGUP| % | / | 7 | 8 | 9 | bspc|
|
|
||||||
* |-----------------------------------------------------------------------|
|
|
||||||
* | tab | F5 | F6 | F7 | F8 | PGDN| HOME| * | 4 | 5 | 6 | \ |
|
|
||||||
* |-----------------------------------------------------------------------|
|
|
||||||
* |shift| F1 | F2 | F3 | F4 | DEL | END | 0 | 1 | 2 | 3 |enter|
|
|
||||||
* |-----------------------------------------------------------------------|
|
|
||||||
* | ctl | alt | win | TK |lower| spc |raise|left |down | up |right|
|
|
||||||
* `-----------------------------------------------------------------------'
|
|
||||||
*/
|
|
||||||
{KC_TRNS, KC_F9, KC_F10, KC_F11, KC_F12, KC_PGUP, KC_PERC, KC_SLSH, KC_7, KC_8, KC_9, KC_BSPC},
|
|
||||||
{KC_TRNS, KC_F5, KC_F6, KC_F7, KC_F8, KC_PGDN, KC_HOME, KC_ASTR, KC_4, KC_5, KC_6, KC_PIPE},
|
|
||||||
{KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_DEL, KC_END, KC_0, KC_1, KC_2, KC_3, KC_TRNS},
|
|
||||||
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
/* Base layer (Qwerty-Steno)
|
||||||
|
* ,-----------------------------------------------------------------------.
|
||||||
|
* | # | # | # | # | # | # | # | # | # | # | # | # |
|
||||||
|
* |-----------------------------------------------------------------------|
|
||||||
|
* |Look | | T | P | H | | F | P | L | T | D |
|
||||||
|
* | -up | S |-----+-----+-----| * |-----+-----+-----+-----+-----|
|
||||||
|
* | | | K | W | R | | R | B | G | S | Z |
|
||||||
|
* |-----------------------------------------------------------------------|
|
||||||
|
* |Exit | | | A | O | | E | U | | | |
|
||||||
|
* `-----------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[BASE_STENO_LAYER] = {
|
||||||
|
{PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM},
|
||||||
|
{PV_LOOK, PV_LS, PV_LT, PV_LP, PV_LH, PV_STAR, PV_STAR, PV_RF, PV_RP, PV_RL, PV_RT, PV_RD},
|
||||||
|
{PV_LOOK, PV_LS, PV_LK, PV_LW, PV_LR, PV_STAR, PV_STAR, PV_RR, PV_RB, PV_RG, PV_RS, PV_RZ},
|
||||||
|
{PV_EXIT, ___x___, ___x___, PV_A, PV_O, _______, _______, PV_E, PV_U, ___x___, ___x___, ___x___}
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Numeric layer
|
||||||
|
* ,-----------------------------------------------------------------------.
|
||||||
|
* Application -- |D-Grv| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | # |
|
||||||
|
* window |-----------------------------------------------------------------------|
|
||||||
|
* switcher | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | |
|
||||||
|
* |-----------------------------------------------------------------------|
|
||||||
|
* | | - | = | ` | \ | |ndash|mdash| , | . | / | |
|
||||||
|
* |-----------------------------------------------------------------------|
|
||||||
|
* | | | | | | Backspace | | | | | |
|
||||||
|
* `-----------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[LOWER_LAYER] = {
|
||||||
|
{LGUI(KC_GRV), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, S(KC_3)},
|
||||||
|
{F(5), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, F(6)},
|
||||||
|
{KC_LSPO, KC_MINS, KC_EQL, KC_GRV, KC_BSLS, ___x___, KC_NDSH, KC_MDSH, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC},
|
||||||
|
{F(3), ALL_T(KC_LBRC), M(LALT_BRACE), KC_LGUI, LOWER, KC_BSPC, KC_BSPC, RAISE, KC_RGUI, M(RALT_BRACE), ALL_T(KC_RBRC), F(4)}
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Symbol layer
|
||||||
|
* ,-----------------------------------------------------------------------.
|
||||||
|
* | | F11 | F12 | F13 | F14 | F15 | F16 | F17 | F18 | F19 | F20 | # |
|
||||||
|
* |-----------------------------------------------------------------------|
|
||||||
|
* | | ! | @ | # | $ | % | ^ | & | * | ' | " | | \
|
||||||
|
* |-----------------------------------------------------------------------| |-- Mostly shifted version
|
||||||
|
* | | _ | + | ~ | | | |ndash|mdash| , | . | / | | / of lower layer
|
||||||
|
* |-----------------------------------------------------------------------|
|
||||||
|
* | | | | | | Delete | | | | | |
|
||||||
|
* `-----------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[RAISE_LAYER] = {
|
||||||
|
{_______, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, S(KC_3)},
|
||||||
|
{_______, S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), KC_QUOT, S(KC_QUOT), _______},
|
||||||
|
{_______, KC_UNDS, KC_PLUS, KC_TILD, KC_PIPE, ___x___, KC_NDSH, KC_MDSH, KC_COMM, KC_DOT, KC_SLSH, _______},
|
||||||
|
{_______, _______, _______, _______, _______, KC_DEL, KC_DEL, _______, _______, _______, _______, _______}
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Directional navigation layer
|
||||||
|
*
|
||||||
|
* Large movements -----/```````````````````\ /```````````````````\----- Vim-style arrow keys
|
||||||
|
* ,-----------------------------------------------------------------------.
|
||||||
|
* | | | | | | | | | | | | |
|
||||||
|
* |-----------------------------------------------------------------------|
|
||||||
|
* | | |Home |PgUp |PgDn | End |Left |Down | Up |Right| | |
|
||||||
|
* |-----------------------------------------------------------------------|
|
||||||
|
* | | | | | | | | | | | | |
|
||||||
|
* |-----------------------------------------------------------------------|
|
||||||
|
* | | | | | | | | | | | |
|
||||||
|
* `-----------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[NAVIGATION_LAYER] = {
|
||||||
|
{___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___},
|
||||||
|
{_______, ___x___, KC_HOME, KC_PGUP, KC_PGDN, KC_END, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, F(1), _______},
|
||||||
|
{_______, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, _______},
|
||||||
|
{_______, _______, _______, _______, ___x___, ___x___, ___x___, ___x___, _______, _______, _______, _______}
|
||||||
|
},
|
||||||
|
|
||||||
|
/* GUI (window management/mouse/media controls) layer
|
||||||
|
*
|
||||||
|
* Mouse keys -----/```````````````````\ /```````````````````\----- Window manager
|
||||||
|
* ,-----------------------------------------------------------------------.
|
||||||
|
* | |Ms B2|Ms Up|Ms B1|Ms WD| | |Prev | NW | N | NE | |
|
||||||
|
* |-----------------------------------------------------------------------|
|
||||||
|
* | |Ms L |Ms Dn|Ms R |Ms WU| | |Full | W |Centr| E | |
|
||||||
|
* |-----------------------------------------------------------------------|
|
||||||
|
* | |Ms WL|Ms B3|Ms WR| | | |Next | SW | S | SE | |
|
||||||
|
* |-----------------------------------------------------------------------|
|
||||||
|
* | |Prev |Play |Next |Brig-| Sleep |Brig+|Mute |Vol- |Vol+ | |
|
||||||
|
* `-----------------------------------------------------------------------'
|
||||||
|
* \___ Media ___/ \___ Screen/sleep __/ \___ Volume __/
|
||||||
|
*/
|
||||||
|
[GUI_LAYER] = {
|
||||||
|
{_______, KC_BTN2, KC_MS_U, KC_BTN1, KC_WH_D, ___x___, ___x___, WM_PREV, WM_NW, WM_N, WM_NE, _______},
|
||||||
|
{_______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_U, ___x___, ___x___, WM_FULL, WM_W, WM_CNTR, WM_E, _______},
|
||||||
|
{_______, KC_WH_L, KC_BTN3, KC_WH_R, ___x___, ___x___, ___x___, WM_NEXT, WM_SW, WM_S, WM_SE, _______},
|
||||||
|
{_______, KC_MPRV, KC_MPLY, KC_MNXT, KC_SLCK, KC_SLEP, KC_SLEP, KC_PAUS, KC_MUTE, KC_VOLD, KC_VOLU, _______}
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Keyboard settings layer
|
||||||
|
* ,-----------------------------------------------------------------------.
|
||||||
|
* Firmware -- | |Reset| | | | | | | | | | |
|
||||||
|
* |-----------------------------------------------------------------------|
|
||||||
|
* Set layer -- | |Qwert|Colem|Steno| ... | | | | | | | |
|
||||||
|
* |-----------------------------------------------------------------------|
|
||||||
|
* Audio -- | |Voic-|Voic+|Mus +|Mus -|MIDI+|MIDI-| | |Aud +|Aud -| |
|
||||||
|
* |-----------------------------------------------------------------------|
|
||||||
|
* | | | | | | Toggle | |Toggl| BL- | BL+ | |
|
||||||
|
* `-----------------------------------------------------------------------'
|
||||||
|
* \_____________\_ Backlight _/
|
||||||
|
*/
|
||||||
|
[KEYBOARD_LAYER] = {
|
||||||
|
{___x___, RESET, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___},
|
||||||
|
{___x___, QWERTY, COLEMAK, STENO, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___},
|
||||||
|
{___x___, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, ___x___, ___x___, AU_ON, AU_OFF, ___x___},
|
||||||
|
{___x___, ___x___, ___x___, ___x___, LOWER, BL_TOGG, BL_TOGG, RAISE, BL_TOGG, BL_DEC, BL_INC, ___x___}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint16_t PROGMEM fn_actions[] = {
|
const uint16_t PROGMEM fn_actions[] = {
|
||||||
|
// Layer switching
|
||||||
|
[1] = ACTION_LAYER_TAP_KEY(NAVIGATION_LAYER, KC_SCOLON),
|
||||||
|
[2] = ACTION_LAYER_TAP_KEY(NAVIGATION_LAYER, KC_O),
|
||||||
|
[3] = ACTION_LAYER_TAP_KEY(GUI_LAYER, KC_LBRACKET),
|
||||||
|
[4] = ACTION_LAYER_TAP_KEY(GUI_LAYER, KC_RBRACKET),
|
||||||
|
|
||||||
|
// Modifiers
|
||||||
|
[5] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_TAB),
|
||||||
|
[6] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENT),
|
||||||
};
|
};
|
||||||
|
|
||||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||||
{
|
{
|
||||||
// MACRODOWN only works in this function
|
switch(id) {
|
||||||
switch(id) {
|
case LALT_BRACE:
|
||||||
case 0:
|
if (record->event.pressed) {
|
||||||
if (record->event.pressed) {
|
register_mods(MOD_LALT);
|
||||||
register_code(KC_RSFT);
|
record->tap.interrupted = 0;
|
||||||
#ifdef BACKLIGHT_ENABLE
|
} else {
|
||||||
backlight_step();
|
unregister_mods(MOD_LALT);
|
||||||
#endif
|
|
||||||
} else {
|
if (record->tap.count && !record->tap.interrupted) {
|
||||||
unregister_code(KC_RSFT);
|
add_weak_mods(MOD_LSFT);
|
||||||
}
|
register_code(KC_LBRACKET);
|
||||||
break;
|
unregister_code(KC_LBRACKET);
|
||||||
|
del_weak_mods(MOD_LSFT);
|
||||||
|
}
|
||||||
|
|
||||||
|
record->tap.count = 0;
|
||||||
}
|
}
|
||||||
return MACRO_NONE;
|
break;
|
||||||
};
|
case RALT_BRACE:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
register_mods(MOD_RALT);
|
||||||
|
record->tap.interrupted = 0;
|
||||||
|
} else {
|
||||||
|
unregister_mods(MOD_RALT);
|
||||||
|
|
||||||
|
if (record->tap.count && !record->tap.interrupted) {
|
||||||
|
add_weak_mods(MOD_LSFT);
|
||||||
|
register_code(KC_RBRACKET);
|
||||||
|
unregister_code(KC_RBRACKET);
|
||||||
|
del_weak_mods(MOD_LSFT);
|
||||||
|
}
|
||||||
|
|
||||||
|
record->tap.count = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return MACRO_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
|
||||||
|
float tone_startup[][2] = SONG(STARTUP_SOUND);
|
||||||
|
float tone_qwerty[][2] = SONG(QWERTY_SOUND);
|
||||||
|
float tone_colemak[][2] = SONG(COLEMAK_SOUND);
|
||||||
|
float tone_plover[][2] = SONG(PLOVER_SOUND);
|
||||||
|
float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND);
|
||||||
|
float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
|
||||||
|
float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void persistant_default_layer_set(uint16_t default_layer) {
|
||||||
|
eeconfig_update_default_layer(default_layer);
|
||||||
|
default_layer_set(default_layer);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send PHROPB ({PLOVER:RESUME}).
|
||||||
|
void plover_resume(void) {
|
||||||
|
register_code(PV_LP);
|
||||||
|
register_code(PV_LH);
|
||||||
|
register_code(PV_LR);
|
||||||
|
register_code(PV_O);
|
||||||
|
register_code(PV_RP);
|
||||||
|
register_code(PV_RB);
|
||||||
|
unregister_code(PV_LP);
|
||||||
|
unregister_code(PV_LH);
|
||||||
|
unregister_code(PV_LR);
|
||||||
|
unregister_code(PV_O);
|
||||||
|
unregister_code(PV_RP);
|
||||||
|
unregister_code(PV_RB);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send PHROF ({PLOVER:SUSPEND}).
|
||||||
|
void plover_suspend(void) {
|
||||||
|
register_code(PV_LP);
|
||||||
|
register_code(PV_LH);
|
||||||
|
register_code(PV_LR);
|
||||||
|
register_code(PV_O);
|
||||||
|
register_code(PV_RF);
|
||||||
|
unregister_code(PV_LP);
|
||||||
|
unregister_code(PV_LH);
|
||||||
|
unregister_code(PV_LR);
|
||||||
|
unregister_code(PV_O);
|
||||||
|
unregister_code(PV_RF);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send PHROBG ({PLOVER:LOOKUP}).
|
||||||
|
void plover_lookup(void) {
|
||||||
|
register_code(PV_LP);
|
||||||
|
register_code(PV_LH);
|
||||||
|
register_code(PV_LR);
|
||||||
|
register_code(PV_O);
|
||||||
|
register_code(PV_RB);
|
||||||
|
register_code(PV_RG);
|
||||||
|
unregister_code(PV_LP);
|
||||||
|
unregister_code(PV_LH);
|
||||||
|
unregister_code(PV_LR);
|
||||||
|
unregister_code(PV_O);
|
||||||
|
unregister_code(PV_RB);
|
||||||
|
unregister_code(PV_RG);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
switch (keycode) {
|
||||||
|
case QWERTY:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
persistant_default_layer_set(1UL<<BASE_QWERTY_LAYER);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
case COLEMAK:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
persistant_default_layer_set(1UL<<BASE_COLEMAK_LAYER);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
case LOWER:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
layer_on(LOWER_LAYER);
|
||||||
|
update_tri_layer(LOWER_LAYER, RAISE_LAYER, KEYBOARD_LAYER);
|
||||||
|
} else {
|
||||||
|
layer_off(LOWER_LAYER);
|
||||||
|
update_tri_layer(LOWER_LAYER, RAISE_LAYER, KEYBOARD_LAYER);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
case RAISE:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
layer_on(RAISE_LAYER);
|
||||||
|
update_tri_layer(LOWER_LAYER, RAISE_LAYER, KEYBOARD_LAYER);
|
||||||
|
} else {
|
||||||
|
layer_off(RAISE_LAYER);
|
||||||
|
update_tri_layer(LOWER_LAYER, RAISE_LAYER, KEYBOARD_LAYER);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
case STENO:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
layer_off(RAISE_LAYER);
|
||||||
|
layer_off(LOWER_LAYER);
|
||||||
|
layer_off(KEYBOARD_LAYER);
|
||||||
|
layer_on(BASE_STENO_LAYER);
|
||||||
|
if (!eeconfig_is_enabled()) {
|
||||||
|
eeconfig_init();
|
||||||
|
}
|
||||||
|
keymap_config.raw = eeconfig_read_keymap();
|
||||||
|
keymap_config.nkro = 1;
|
||||||
|
eeconfig_update_keymap(keymap_config.raw);
|
||||||
|
plover_resume();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
case PV_EXIT:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
plover_suspend();
|
||||||
|
layer_off(BASE_STENO_LAYER);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
case PV_LOOK:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
plover_lookup();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_init_user(void) {
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
startup_user();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
|
||||||
|
AUDIO_ENABLE = no
|
||||||
|
|
||||||
|
ifndef QUANTUM_DIR
|
||||||
|
include ../../../../Makefile
|
||||||
|
endif
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
#ifndef CONFIG_USER_H
|
||||||
|
#define CONFIG_USER_H
|
||||||
|
|
||||||
|
#include "../../config.h"
|
||||||
|
|
||||||
|
#define TAPPING_TERM 165
|
||||||
|
|
||||||
|
/* ws2812 RGB LED */
|
||||||
|
#define RGB_DI_PIN D3
|
||||||
|
#define RGBLIGHT_ANIMATIONS
|
||||||
|
#define RGBLED_NUM 10 // Number of LEDs
|
||||||
|
#define RGBLIGHT_HUE_STEP 10
|
||||||
|
#define RGBLIGHT_SAT_STEP 17
|
||||||
|
#define RGBLIGHT_VAL_STEP 17
|
||||||
|
//#define BACKLIGHT_ENABLE
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,386 @@
|
|||||||
|
// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
|
||||||
|
// this is the style you want to emulate.
|
||||||
|
|
||||||
|
#include "planck.h"
|
||||||
|
#include "action_layer.h"
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
#include "audio.h"
|
||||||
|
#endif
|
||||||
|
#ifdef BACKLIGHT_ENABLE
|
||||||
|
#include "backlight.h"
|
||||||
|
#endif
|
||||||
|
#include "eeconfig.h"
|
||||||
|
|
||||||
|
extern keymap_config_t keymap_config;
|
||||||
|
|
||||||
|
// Each layer gets a name for readability, which is then used in the keymap matrix below.
|
||||||
|
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
|
||||||
|
// Layer names don't all need to be of the same length, obviously, and you can also skip them
|
||||||
|
// entirely and just use numbers.
|
||||||
|
#define _QWERTY 0
|
||||||
|
#define _COLEMAK 1
|
||||||
|
#define _DVORAK 2
|
||||||
|
#define _LOWER 3
|
||||||
|
#define _RAISE 4
|
||||||
|
#define _PLOVER 5
|
||||||
|
#define _NUMPAD 6
|
||||||
|
#define _ADJUST 16
|
||||||
|
|
||||||
|
enum planck_keycodes {
|
||||||
|
QWERTY = SAFE_RANGE,
|
||||||
|
NUMPAD,
|
||||||
|
EXT_NUM,
|
||||||
|
COLEMAK,
|
||||||
|
DVORAK,
|
||||||
|
PLOVER,
|
||||||
|
LOWER,
|
||||||
|
RAISE,
|
||||||
|
BACKLIT,
|
||||||
|
EXT_PLV
|
||||||
|
};
|
||||||
|
|
||||||
|
// Fillers to make layering more clear
|
||||||
|
#define _______ KC_TRNS
|
||||||
|
#define XXXXXXX KC_NO
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
|
||||||
|
/* Qwerty
|
||||||
|
* ,-----------------------------------------------------------------------------------.
|
||||||
|
* | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp |
|
||||||
|
* |------+------+------+------+------+-------------+------+------+------+------+------|
|
||||||
|
* | Esc | A | S | D | F | G | H | J | K | L | ; | " |
|
||||||
|
* |------+------+------+------+------+------|------+------+------+------+------+------|
|
||||||
|
* | Shift| Z | X | C | V | B | N | M | , | . | / |En/sh |
|
||||||
|
* |------+------+------+------+------+------+------+------+------+------+------+------|
|
||||||
|
* | Ctrl | Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
|
||||||
|
* `-----------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[_QWERTY] = {
|
||||||
|
{KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
|
||||||
|
{KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
|
||||||
|
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, F(0) },
|
||||||
|
{KC_LCTRL,KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Colemak
|
||||||
|
* ,-----------------------------------------------------------------------------------.
|
||||||
|
* | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp |
|
||||||
|
* |------+------+------+------+------+-------------+------+------+------+------+------|
|
||||||
|
* | Esc | A | R | S | T | D | H | N | E | I | O | " |
|
||||||
|
* |------+------+------+------+------+------|------+------+------+------+------+------|
|
||||||
|
* | Shift| Z | X | C | V | B | K | M | , | . | / |Enter |
|
||||||
|
* |------+------+------+------+------+------+------+------+------+------+------+------|
|
||||||
|
* | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
|
||||||
|
* `-----------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[_COLEMAK] = {
|
||||||
|
{KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
|
||||||
|
{KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
|
||||||
|
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
|
||||||
|
{BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Dvorak
|
||||||
|
* ,-----------------------------------------------------------------------------------.
|
||||||
|
* | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp |
|
||||||
|
* |------+------+------+------+------+-------------+------+------+------+------+------|
|
||||||
|
* | Esc | A | O | E | U | I | D | H | T | N | S | / |
|
||||||
|
* |------+------+------+------+------+------|------+------+------+------+------+------|
|
||||||
|
* | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter |
|
||||||
|
* |------+------+------+------+------+------+------+------+------+------+------+------|
|
||||||
|
* | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
|
||||||
|
* `-----------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[_DVORAK] = {
|
||||||
|
{KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC},
|
||||||
|
{KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
|
||||||
|
{KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
|
||||||
|
{BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Lower
|
||||||
|
* ,-----------------------------------------------------------------------------------.
|
||||||
|
* | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
|
||||||
|
* |------+------+------+------+------+-------------+------+------+------+------+------|
|
||||||
|
* | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
|
||||||
|
* |------+------+------+------+------+------|------+------+------+------+------+------|
|
||||||
|
* | Shift | F7 | F8 | F9 | F10 | F11 | F12 | | | Home | End |Enter |
|
||||||
|
* |------+------+------+------+------+------+------+------+------+------+------+------|
|
||||||
|
* | Brite| | | | | | | Play | Vol- | Vol+ | Next |
|
||||||
|
* `-----------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[_LOWER] = {
|
||||||
|
{KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
|
||||||
|
{KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
|
||||||
|
{_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______,KC_HOME, KC_END, _______},
|
||||||
|
{BACKLIT, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_VOLD, KC_VOLU, KC_MNXT}
|
||||||
|
},
|
||||||
|
\
|
||||||
|
/* Raise
|
||||||
|
* ,-----------------------------------------------------------------------------------.
|
||||||
|
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
|
||||||
|
* |------+------+------+------+------+-------------+------+------+------+------+------|
|
||||||
|
* | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
|
||||||
|
* |------+------+------+------+------+------|------+------+------+------+------+------|
|
||||||
|
* | Shift | F7 | F8 | F9 | F10 | F11 | F12 | | | PgUp | PgDn |Enter |
|
||||||
|
* |------+------+------+------+------+------+------+------+------+------+------+------|
|
||||||
|
* | Brite| | | | | | | Play | Vol- | Vol+ | Next |
|
||||||
|
* `-----------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[_RAISE] = {
|
||||||
|
{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
|
||||||
|
{KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
|
||||||
|
{_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, KC_PGUP, KC_PGDN, _______},
|
||||||
|
{BACKLIT, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_VOLD, KC_VOLU, KC_MNXT}
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Plover layer (http://opensteno.org)
|
||||||
|
* ,-----------------------------------------------------------------------------------.
|
||||||
|
* | # | # | # | # | # | # | # | # | # | # | # | # |
|
||||||
|
* |------+------+------+------+------+-------------+------+------+------+------+------|
|
||||||
|
* | | S | T | P | H | * | * | F | P | L | T | D |
|
||||||
|
* |------+------+------+------+------+------|------+------+------+------+------+------|
|
||||||
|
* |TogOut| S | K | W | R | * | * | R | B | G | S | Z |
|
||||||
|
* |------+------+------+------+------+------+------+------+------+------+------+------|
|
||||||
|
* | Exit | | | A | O | | E | U | | | |
|
||||||
|
* `-----------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
|
||||||
|
[_PLOVER] = {
|
||||||
|
{KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1 },
|
||||||
|
{XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC},
|
||||||
|
{XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
|
||||||
|
{EXT_PLV, XXXXXXX, XXXXXXX, KC_C, KC_V, XXXXXXX, XXXXXXX, KC_N, KC_M, XXXXXXX, XXXXXXX, XXXXXXX}
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Numpad
|
||||||
|
* ,-----------------------------------------------------------------------------------.
|
||||||
|
* | Tab | | | ^ | / | 7 | 8 | 9 | - | = | | Bksp |
|
||||||
|
* |------+------+------+------+------+-------------+------+------+------+------+------|
|
||||||
|
* | Esc | | | % | * | 4 | 5 | 6 | + | ( | ) | |
|
||||||
|
* |------+------+------+------+------+------|------+------+------+------+------+------|
|
||||||
|
* | Shft | | | $ | Del | 1 | 2 | 3 |Enter | [ | ] |Enter |
|
||||||
|
* |------+------+------+------+------+------+------+------+------+------+------+------|
|
||||||
|
* | Exit | Ctrl | Alt | Gui | | 0 | . | Left | Down | Up |Right |
|
||||||
|
* `-----------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[_NUMPAD] = {
|
||||||
|
{KC_TAB, XXXXXXX, XXXXXXX, KC_CIRC, KC_PSLS, KC_P7, KC_P8, KC_P9, KC_PMNS, KC_EQL, XXXXXXX, KC_BSPC},
|
||||||
|
{KC_ESC, XXXXXXX, XXXXXXX, KC_PERC, KC_PAST, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_LPRN, KC_RPRN, XXXXXXX},
|
||||||
|
{KC_LSFT, XXXXXXX, XXXXXXX, KC_DLR, KC_DEL, KC_P1, KC_P2, KC_P3, KC_PENT, KC_LBRC, KC_RBRC, KC_ENT },
|
||||||
|
{EXT_NUM, KC_LCTL, KC_LALT, KC_LGUI, XXXXXXX, KC_P0, KC_P0, KC_PDOT, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Adjust (Lower + Raise)
|
||||||
|
* ,-----------------------------------------------------------------------------------.
|
||||||
|
* | | Reset| | | | | | | | | | Del |
|
||||||
|
* |------+------+------+------+------+-------------+------+------+------+------+------|
|
||||||
|
* | Login| | | | | | Num |Qwerty|Colemk|Dvorak|Plover| |
|
||||||
|
* |------+------+------+------+------+------|------+------+------+------+------+------|
|
||||||
|
* | Caps |RGBTOG|RGBMOD| Hue+ | Hue- | Sat+ | Sat- | Val+ | Val- | | | |
|
||||||
|
* |------+------+------+------+------+------+------+------+------+------+------+------|
|
||||||
|
* | | | | | | | | | | | |
|
||||||
|
* `-----------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[_ADJUST] = {
|
||||||
|
{_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL },
|
||||||
|
{ M(1) , _______, _______, _______, _______, _______, NUMPAD, QWERTY, COLEMAK, DVORAK, PLOVER, _______},
|
||||||
|
{KC_CAPS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______},
|
||||||
|
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM fn_actions[] = {
|
||||||
|
[0] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT),
|
||||||
|
};
|
||||||
|
|
||||||
|
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||||
|
{
|
||||||
|
// MACRODOWN only works in this function
|
||||||
|
switch(id) {
|
||||||
|
case 0:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
register_code(KC_RSFT);
|
||||||
|
register_code(KC_RCTL);
|
||||||
|
register_code(KC_ESC);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
clear_keyboard();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
register_code(KC_LCTL);
|
||||||
|
register_code(KC_LALT);
|
||||||
|
register_code(KC_DEL);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
clear_keyboard();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return MACRO_NONE;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
|
||||||
|
float tone_startup[][2] = SONG(STARTUP_SOUND);
|
||||||
|
float tone_qwerty[][2] = SONG(QWERTY_SOUND);
|
||||||
|
float tone_dvorak[][2] = SONG(DVORAK_SOUND);
|
||||||
|
float tone_colemak[][2] = SONG(COLEMAK_SOUND);
|
||||||
|
float tone_plover[][2] = SONG(PLOVER_SOUND);
|
||||||
|
float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND);
|
||||||
|
float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
|
||||||
|
|
||||||
|
float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
void persistant_default_layer_set(uint16_t default_layer) {
|
||||||
|
eeconfig_update_default_layer(default_layer);
|
||||||
|
default_layer_set(default_layer);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
switch (keycode) {
|
||||||
|
case QWERTY:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
|
||||||
|
#endif
|
||||||
|
persistant_default_layer_set(1UL<<_QWERTY);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
case NUMPAD:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
layer_off(_RAISE);
|
||||||
|
layer_off(_LOWER);
|
||||||
|
layer_off(_ADJUST);
|
||||||
|
layer_on(_NUMPAD);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
case EXT_NUM:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
layer_off(_NUMPAD);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
case COLEMAK:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
PLAY_NOTE_ARRAY(tone_colemak, false, 0);
|
||||||
|
#endif
|
||||||
|
persistant_default_layer_set(1UL<<_COLEMAK);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
case DVORAK:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
PLAY_NOTE_ARRAY(tone_dvorak, false, 0);
|
||||||
|
#endif
|
||||||
|
persistant_default_layer_set(1UL<<_DVORAK);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
case LOWER:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
layer_on(_LOWER);
|
||||||
|
update_tri_layer(_LOWER, _RAISE, _ADJUST);
|
||||||
|
} else {
|
||||||
|
layer_off(_LOWER);
|
||||||
|
update_tri_layer(_LOWER, _RAISE, _ADJUST);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
case RAISE:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
layer_on(_RAISE);
|
||||||
|
update_tri_layer(_LOWER, _RAISE, _ADJUST);
|
||||||
|
} else {
|
||||||
|
layer_off(_RAISE);
|
||||||
|
update_tri_layer(_LOWER, _RAISE, _ADJUST);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
case BACKLIT:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
register_code(KC_RSFT);
|
||||||
|
#ifdef BACKLIGHT_ENABLE
|
||||||
|
backlight_step();
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
unregister_code(KC_RSFT);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
case PLOVER:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
stop_all_notes();
|
||||||
|
PLAY_NOTE_ARRAY(tone_plover, false, 0);
|
||||||
|
#endif
|
||||||
|
layer_off(_RAISE);
|
||||||
|
layer_off(_LOWER);
|
||||||
|
layer_off(_ADJUST);
|
||||||
|
layer_on(_PLOVER);
|
||||||
|
if (!eeconfig_is_enabled()) {
|
||||||
|
eeconfig_init();
|
||||||
|
}
|
||||||
|
keymap_config.raw = eeconfig_read_keymap();
|
||||||
|
keymap_config.nkro = 1;
|
||||||
|
eeconfig_update_keymap(keymap_config.raw);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
case EXT_PLV:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
PLAY_NOTE_ARRAY(tone_plover_gb, false, 0);
|
||||||
|
#endif
|
||||||
|
layer_off(_PLOVER);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_init_user(void) {
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
startup_user();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef AUDIO_ENABLE
|
||||||
|
|
||||||
|
void startup_user()
|
||||||
|
{
|
||||||
|
_delay_ms(20); // gets rid of tick
|
||||||
|
PLAY_NOTE_ARRAY(tone_startup, false, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void shutdown_user()
|
||||||
|
{
|
||||||
|
PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
|
||||||
|
_delay_ms(150);
|
||||||
|
stop_all_notes();
|
||||||
|
}
|
||||||
|
|
||||||
|
void music_on_user(void)
|
||||||
|
{
|
||||||
|
music_scale_user();
|
||||||
|
}
|
||||||
|
|
||||||
|
void music_scale_user(void)
|
||||||
|
{
|
||||||
|
PLAY_NOTE_ARRAY(music_scale, false, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -43,6 +43,7 @@ These keyboards are part of the QMK repository, but their manufacturers are not
|
|||||||
* [Happy Hacking Keyboard](/keyboards/hhkb) — The Happy Hacking keyboard can be hacked with a custom controller to run QMK.
|
* [Happy Hacking Keyboard](/keyboards/hhkb) — The Happy Hacking keyboard can be hacked with a custom controller to run QMK.
|
||||||
* [Infinity 60%](/keyboards/infinity60) - — Compact community keyboard by Input Club.
|
* [Infinity 60%](/keyboards/infinity60) - — Compact community keyboard by Input Club.
|
||||||
* [JD45](/keyboards/jd45) — Another Geekhack community project, designed by jdcarpe.
|
* [JD45](/keyboards/jd45) — Another Geekhack community project, designed by jdcarpe.
|
||||||
|
* [KBD75](/keyboards/kbd75) — A 75% keyboard made by made by KBDFans.
|
||||||
* [KC60](/keyboards/kc60) — A programmable Chinese-made keyboard, lost in the mists of time.
|
* [KC60](/keyboards/kc60) — A programmable Chinese-made keyboard, lost in the mists of time.
|
||||||
* [Kinesis Advantage](/keyboards/kinesis) — Contoured ergonomic keyboard by Kinesis Computer Ergonomics.
|
* [Kinesis Advantage](/keyboards/kinesis) — Contoured ergonomic keyboard by Kinesis Computer Ergonomics.
|
||||||
* [KMAC](/keyboards/kmac) — Korean custom keyboard.
|
* [KMAC](/keyboards/kmac) — Korean custom keyboard.
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
#define RGBLIGHT_HUE_STEP 8
|
#define RGBLIGHT_HUE_STEP 8
|
||||||
#define RGBLIGHT_SAT_STEP 8
|
#define RGBLIGHT_SAT_STEP 8
|
||||||
#define RGBLIGHT_VAL_STEP 8
|
#define RGBLIGHT_VAL_STEP 8
|
||||||
|
#define RGBLIGHT_EFFECT_KNIGHT_OFFSET 20
|
||||||
|
|
||||||
/* COL2ROW or ROW2COL */
|
/* COL2ROW or ROW2COL */
|
||||||
#define DIODE_DIRECTION COL2ROW
|
#define DIODE_DIRECTION COL2ROW
|
||||||
|
|||||||
@@ -0,0 +1,167 @@
|
|||||||
|
#include "s65_x.h"
|
||||||
|
#include "action_layer.h"
|
||||||
|
|
||||||
|
#define _BL 0
|
||||||
|
#define _AL 1
|
||||||
|
#define _FL 2
|
||||||
|
#define _UL 3
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
/* 0: Main layer, swapped alt and GUI for Mac
|
||||||
|
* ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
|
||||||
|
* │ ESC │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │▒▒▒▒▒│BKSPC│DEL │
|
||||||
|
* ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
|
||||||
|
* │ TAB │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │█████│END │
|
||||||
|
* ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
|
||||||
|
* │CAPSL│ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │▒▒▒▒▒│ENTER│█████│PG_UP│
|
||||||
|
* ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
|
||||||
|
* │LSHFT│▒▒▒▒▒│ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │▒▒▒▒▒│RSHFT│ UP │PG_DN│
|
||||||
|
* ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
|
||||||
|
* │LCTRL│L_ALT│L_GUI│█████│█████│█████│ SPC │█████│█████│█████│R_ALT│ FN0 │ APP │LEFT │DOWN │RIGHT│
|
||||||
|
* └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* 0: ANSI qwerty */
|
||||||
|
[_BL] = ANSI_KEYMAP(
|
||||||
|
F(4), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, \
|
||||||
|
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_END, \
|
||||||
|
F(2), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP, \
|
||||||
|
KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, KC_UP, KC_PGDN, \
|
||||||
|
KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RALT, MO(_FL), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT),
|
||||||
|
|
||||||
|
|
||||||
|
/* 1: Locking arrow keys to WASD for when you need dedicated arrow keys
|
||||||
|
* ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
|
||||||
|
* │ │ │ │ │ │ │ │ │ │ │ │ │ │▒▒▒▒▒│▒▒▒▒▒│ │
|
||||||
|
* ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
|
||||||
|
* │ │ │ Up │ │ │ │ │ │ │ │ │ │ │ │▒▒▒▒▒│ │
|
||||||
|
* ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
|
||||||
|
* │ │Left │Down │Right│ │ │ │ │ │ │ │ │▒▒▒▒▒│ │▒▒▒▒▒│ │
|
||||||
|
* ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
|
||||||
|
* │ │▒▒▒▒▒│ │ │ │ │ │ │ │ │ │ │▒▒▒▒▒│ │ │ │
|
||||||
|
* ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
|
||||||
|
* │ │ │ │█████│█████│█████│ │█████│█████│█████│ │ │ │ │ │ │
|
||||||
|
* └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
|
||||||
|
*/
|
||||||
|
|
||||||
|
[_AL] = ANSI_KEYMAP(
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
|
||||||
|
|
||||||
|
/* 2: Fn layer
|
||||||
|
* ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
|
||||||
|
* │GRAVE│ F1 │ F2 │ F3 │ F4 │ F5 │ F6 │ F7 │ F8 │ F9 │ F10 │ F11 │ F12 │▒▒▒▒▒│▒▒▒▒▒│ │
|
||||||
|
* ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
|
||||||
|
* │ │ _AL │ Up │ │ │ │ │ │PGUP │PGDWN│PRTSC│SCLCK│PAUSE│ │▒▒▒▒▒│ │
|
||||||
|
* ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
|
||||||
|
* │ │Left │Down │Right│ │ │Left │Down │ Up │Right│ │ │▒▒▒▒▒│ │▒▒▒▒▒│ │
|
||||||
|
* ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
|
||||||
|
* │ │▒▒▒▒▒│_UL │ │ │ │ │ │ │ │Home │End │▒▒▒▒▒│ │Vol+ │ │
|
||||||
|
* ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
|
||||||
|
* │ │ │ │█████│█████│█████│ │█████│█████│█████│ │ │ │Mute │Vol- │Play │
|
||||||
|
* └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
|
||||||
|
*/
|
||||||
|
|
||||||
|
[_FL] = ANSI_KEYMAP(
|
||||||
|
KC_GRAVE, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS, F(1), KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_PGDN, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS, F(3), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_END, KC_TRNS, KC_TRNS, KC_VOLU, KC_TRNS, \
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_MPLY),
|
||||||
|
|
||||||
|
/* 3: Locking layer for controlling the underglow
|
||||||
|
* ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
|
||||||
|
* │ │ │ │ │ │ │ │ │ │ │ │ │ │▒▒▒▒▒│▒▒▒▒▒│ │
|
||||||
|
* ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
|
||||||
|
* │ │BL On│BL St│ │ │ │ │ │ │ │ │ │ │ │▒▒▒▒▒│ │
|
||||||
|
* ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
|
||||||
|
* │ │ On │Mode │ │ │ │ │ │ │ │ │ │▒▒▒▒▒│ │▒▒▒▒▒│ │
|
||||||
|
* ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
|
||||||
|
* │ │▒▒▒▒▒│ │Hue+ │Hue- │Sat+ │Sat- │Val+ │Val- │ │ │ │▒▒▒▒▒│ │▒▒▒▒▒│ │
|
||||||
|
* ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
|
||||||
|
* │ │ │ │█████│█████│█████│ │█████│█████│█████│ │ │ │ │ │ │
|
||||||
|
* └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
|
||||||
|
*/
|
||||||
|
|
||||||
|
[_UL] = ANSI_KEYMAP(
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS, BL_TOGG, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS, RGB_TOG, RGB_MOD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS, KC_TRNS, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
|
||||||
|
};
|
||||||
|
|
||||||
|
enum function_id {
|
||||||
|
SHIFT_ESC,
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM fn_actions[] = {
|
||||||
|
[0] = ACTION_LAYER_MOMENTARY(_FL), // Momentary Fn overlay
|
||||||
|
[1] = ACTION_LAYER_TOGGLE(_AL), // Toggle Arrow Layer overlay
|
||||||
|
[2] = ACTION_LAYER_TAP_KEY(_FL, KC_CAPS),// Tap to toggle caps lock and hold to activate function layer
|
||||||
|
[3] = ACTION_LAYER_TOGGLE(_UL), // Toggle Underglow Layer overlay
|
||||||
|
[4] = ACTION_FUNCTION(SHIFT_ESC),
|
||||||
|
};
|
||||||
|
|
||||||
|
void matrix_scan_user(void) {
|
||||||
|
|
||||||
|
// Would like to do something like this, that would be cool
|
||||||
|
// Turn off all the LEDs on except for the ones mapped on the UL layer, for example
|
||||||
|
/* uint32_t layer = layer_state; */
|
||||||
|
/* if (layer & (1<<1)) { */
|
||||||
|
/* gh60_wasd_leds_on(); */
|
||||||
|
/* } else { */
|
||||||
|
/* gh60_wasd_leds_off(); */
|
||||||
|
/* } */
|
||||||
|
/* */
|
||||||
|
/* if (layer & (1<<2)) { */
|
||||||
|
/* gh60_esc_led_on(); */
|
||||||
|
/* } else { */
|
||||||
|
/* gh60_esc_led_off(); */
|
||||||
|
/* } */
|
||||||
|
};
|
||||||
|
|
||||||
|
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||||
|
// MACRODOWN only works in this function
|
||||||
|
switch(id) {
|
||||||
|
case 0:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
register_code(KC_RSFT);
|
||||||
|
} else {
|
||||||
|
unregister_code(KC_RSFT);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return MACRO_NONE;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
|
||||||
|
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||||
|
switch (id) {
|
||||||
|
static uint8_t shift_esc_shift_mask;
|
||||||
|
// Shift + ESC = ~
|
||||||
|
case SHIFT_ESC:
|
||||||
|
shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK;
|
||||||
|
if (record->event.pressed) {
|
||||||
|
if (shift_esc_shift_mask) {
|
||||||
|
add_key(KC_GRV);
|
||||||
|
send_keyboard_report();
|
||||||
|
} else {
|
||||||
|
add_key(KC_ESC);
|
||||||
|
send_keyboard_report();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (shift_esc_shift_mask) {
|
||||||
|
del_key(KC_GRV);
|
||||||
|
send_keyboard_report();
|
||||||
|
} else {
|
||||||
|
del_key(KC_ESC);
|
||||||
|
send_keyboard_report();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
ifndef QUANTUM_DIR
|
||||||
|
include ../../../../Makefile
|
||||||
|
endif
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
#include "tv44.h"
|
||||||
|
#include "action_layer.h"
|
||||||
|
#include "eeconfig.h"
|
||||||
|
|
||||||
|
#define _QW 0
|
||||||
|
#define _L1 1
|
||||||
|
#define _L2 2
|
||||||
|
|
||||||
|
// Fillers to make layering more clear
|
||||||
|
#define _______ KC_TRNS
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
[_QW] = KEYMAP( /* Qwerty */
|
||||||
|
KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
|
||||||
|
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT,
|
||||||
|
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_RSFT, MO(_L2),
|
||||||
|
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, MO(_L1), KC_RALT, KC_RCTL
|
||||||
|
),
|
||||||
|
[_L1] = KEYMAP( /* LAYER 1 */
|
||||||
|
KC_GRV, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, KC_CALC, KC_PGUP, KC_UP, KC_PGDN, KC_PSCR, KC_PAUS,
|
||||||
|
KC_TAB, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_INS, _______,
|
||||||
|
_______, _______, _______, _______, _______, _______, KC_END, _______, _______, _______, _______, _______,
|
||||||
|
_______, _______, _______, _______, _______, _______, _______, _______
|
||||||
|
),
|
||||||
|
[_L2] = KEYMAP( /* LAYER 2 */
|
||||||
|
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
|
||||||
|
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_UNDS, KC_PLUS,
|
||||||
|
_______, _______, _______, _______, _______, KC_COMM, KC_SLSH, KC_RBRC, KC_LBRC, KC_BSLS, _______, _______,
|
||||||
|
_______, _______, _______, _______, _______, _______, _______, _______
|
||||||
|
),
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM fn_actions[] = {
|
||||||
|
};
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# A minivan keymap based off the Vertex Core
|
||||||
|
|
||||||
|
## Main differences
|
||||||
|
|
||||||
|
* There are only 3 keys on the bottom right, so menu was dropped
|
||||||
|
* There are only 3 keys on the bottom left, so Pn was dropped because there is
|
||||||
|
no programmable layer.
|
||||||
|
* There are only 12 keys in the first row, so the delete key (along with scroll
|
||||||
|
lock) has been dropped.
|
||||||
|
* The F1-F12 keys have been shifted by 1 so they all fit in the first row of
|
||||||
|
layer 2.
|
||||||
|
* Moved the grave/tilde to layer 1 (because in layer 2 it's now taken up by F1).
|
||||||
|
* Keys relating to speed have been removed
|
||||||
|
* The `L_Win + L_Alt + R_spacebar = R_Shift, R_Alt, Menu and R_Ctrl as arrow
|
||||||
|
keys` as mentioned in the manual does not work.
|
||||||
|
* The layer 2 plus shift should have support for symbols in the first row (where
|
||||||
|
the F1-F12 keys are) but this has not been implemented, so you need to use the
|
||||||
|
second row (where the numbers are).
|
||||||
@@ -1,3 +1,6 @@
|
|||||||
|
TEST_LIST = $(notdir $(patsubst %/rules.mk,%,$(wildcard $(ROOT_DIR)/tests/*/rules.mk)))
|
||||||
|
FULL_TESTS := $(TEST_LIST)
|
||||||
|
|
||||||
include $(ROOT_DIR)/quantum/serial_link/tests/testlist.mk
|
include $(ROOT_DIR)/quantum/serial_link/tests/testlist.mk
|
||||||
|
|
||||||
define VALIDATE_TEST_LIST
|
define VALIDATE_TEST_LIST
|
||||||
@@ -10,4 +13,5 @@ define VALIDATE_TEST_LIST
|
|||||||
endif
|
endif
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
|
||||||
$(eval $(call VALIDATE_TEST_LIST,$(firstword $(TEST_LIST)),$(wordlist 2,9999,$(TEST_LIST))))
|
$(eval $(call VALIDATE_TEST_LIST,$(firstword $(TEST_LIST)),$(wordlist 2,9999,$(TEST_LIST))))
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
/* 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 TESTS_BASIC_CONFIG_H_
|
||||||
|
#define TESTS_BASIC_CONFIG_H_
|
||||||
|
|
||||||
|
#define MATRIX_ROWS 2
|
||||||
|
#define MATRIX_COLS 2
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* TESTS_BASIC_CONFIG_H_ */
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
# 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/>.
|
||||||
|
|
||||||
|
CUSTOM_MATRIX=yes
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
/* 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 "gtest/gtest.h"
|
||||||
|
#include "gmock/gmock.h"
|
||||||
|
|
||||||
|
#include "quantum.h"
|
||||||
|
#include "test_driver.h"
|
||||||
|
#include "test_matrix.h"
|
||||||
|
#include "keyboard_report_util.h"
|
||||||
|
#include "test_fixture.h"
|
||||||
|
|
||||||
|
using testing::_;
|
||||||
|
using testing::Return;
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
[0] = {
|
||||||
|
{KC_A, KC_B},
|
||||||
|
{KC_C, KC_D}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
class KeyPress : public TestFixture {};
|
||||||
|
|
||||||
|
TEST_F(KeyPress, SendKeyboardIsNotCalledWhenNoKeyIsPressed) {
|
||||||
|
TestDriver driver;
|
||||||
|
EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);
|
||||||
|
keyboard_task();
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(KeyPress, CorrectKeyIsReportedWhenPressed) {
|
||||||
|
TestDriver driver;
|
||||||
|
press_key(0, 0);
|
||||||
|
EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_A)));
|
||||||
|
keyboard_task();
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(KeyPress, CorrectKeysAreReportedWhenTwoKeysArePressed) {
|
||||||
|
TestDriver driver;
|
||||||
|
press_key(1, 0);
|
||||||
|
press_key(0, 1);
|
||||||
|
//Note that QMK only processes one key at a time
|
||||||
|
EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_B)));
|
||||||
|
keyboard_task();
|
||||||
|
EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_B, KC_C)));
|
||||||
|
keyboard_task();
|
||||||
|
}
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
/* 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 "keyboard_report_util.h"
|
||||||
|
#include <vector>
|
||||||
|
#include <algorithm>
|
||||||
|
using namespace testing;
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
std::vector<uint8_t> get_keys(const report_keyboard_t& report) {
|
||||||
|
std::vector<uint8_t> result;
|
||||||
|
#if defined(NKRO_ENABLE)
|
||||||
|
#error NKRO support not implemented yet
|
||||||
|
#elif defined(USB_6KRO_ENABLE)
|
||||||
|
#error 6KRO support not implemented yet
|
||||||
|
#else
|
||||||
|
for(size_t i=0; i<KEYBOARD_REPORT_KEYS; i++) {
|
||||||
|
if (report.keys[i]) {
|
||||||
|
result.emplace_back(report.keys[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
std::sort(result.begin(), result.end());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator==(const report_keyboard_t& lhs, const report_keyboard_t& rhs) {
|
||||||
|
auto lhskeys = get_keys(lhs);
|
||||||
|
auto rhskeys = get_keys(rhs);
|
||||||
|
return lhs.mods == rhs.mods && lhskeys == rhskeys;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ostream& operator<<(std::ostream& stream, const report_keyboard_t& value) {
|
||||||
|
stream << "Keyboard report:" << std::endl;
|
||||||
|
stream << "Mods: " << value.mods << std::endl;
|
||||||
|
// TODO: This should probably print friendly names for the keys
|
||||||
|
for (uint32_t k: get_keys(value)) {
|
||||||
|
stream << k << std::endl;
|
||||||
|
}
|
||||||
|
return stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
KeyboardReportMatcher::KeyboardReportMatcher(const std::vector<uint8_t>& keys) {
|
||||||
|
// TODO: Support modifiers
|
||||||
|
memset(m_report.raw, 0, sizeof(m_report.raw));
|
||||||
|
for (auto k: keys) {
|
||||||
|
add_key_to_report(&m_report, k);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool KeyboardReportMatcher::MatchAndExplain(report_keyboard_t& report, MatchResultListener* listener) const {
|
||||||
|
return m_report == report;
|
||||||
|
}
|
||||||
|
|
||||||
|
void KeyboardReportMatcher::DescribeTo(::std::ostream* os) const {
|
||||||
|
*os << "is equal to " << m_report;
|
||||||
|
}
|
||||||
|
|
||||||
|
void KeyboardReportMatcher::DescribeNegationTo(::std::ostream* os) const {
|
||||||
|
*os << "is not equal to " << m_report;
|
||||||
|
}
|
||||||
@@ -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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include "report.h"
|
||||||
|
#include <ostream>
|
||||||
|
#include "gmock/gmock.h"
|
||||||
|
|
||||||
|
bool operator==(const report_keyboard_t& lhs, const report_keyboard_t& rhs);
|
||||||
|
std::ostream& operator<<(std::ostream& stream, const report_keyboard_t& value);
|
||||||
|
|
||||||
|
class KeyboardReportMatcher : public testing::MatcherInterface<report_keyboard_t&> {
|
||||||
|
public:
|
||||||
|
KeyboardReportMatcher(const std::vector<uint8_t>& keys);
|
||||||
|
virtual bool MatchAndExplain(report_keyboard_t& report, testing::MatchResultListener* listener) const override;
|
||||||
|
virtual void DescribeTo(::std::ostream* os) const override;
|
||||||
|
virtual void DescribeNegationTo(::std::ostream* os) const override;
|
||||||
|
private:
|
||||||
|
report_keyboard_t m_report;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template<typename... Ts>
|
||||||
|
inline testing::Matcher<report_keyboard_t&> KeyboardReport(Ts... keys) {
|
||||||
|
return testing::MakeMatcher(new KeyboardReportMatcher(std::vector<uint8_t>({keys...})));
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
/* 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 "matrix.h"
|
||||||
|
#include "test_matrix.h"
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
static matrix_row_t matrix[MATRIX_ROWS] = {};
|
||||||
|
|
||||||
|
void matrix_init(void) {
|
||||||
|
clear_all_keys();
|
||||||
|
matrix_init_quantum();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t matrix_scan(void) {
|
||||||
|
matrix_scan_quantum();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
matrix_row_t matrix_get_row(uint8_t row) {
|
||||||
|
return matrix[row];
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_print(void) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_init_kb(void) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_scan_kb(void) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void press_key(uint8_t col, uint8_t row) {
|
||||||
|
matrix[row] |= 1 << col;
|
||||||
|
}
|
||||||
|
|
||||||
|
void release_key(uint8_t col, uint8_t row) {
|
||||||
|
matrix[row] &= ~(1 << col);
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear_all_keys(void) {
|
||||||
|
memset(matrix, 0, sizeof(matrix));
|
||||||
|
}
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
/* 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 "test_driver.h"
|
||||||
|
|
||||||
|
TestDriver* TestDriver::m_this = nullptr;
|
||||||
|
|
||||||
|
TestDriver::TestDriver()
|
||||||
|
: m_driver{
|
||||||
|
&TestDriver::keyboard_leds,
|
||||||
|
&TestDriver::send_keyboard,
|
||||||
|
&TestDriver::send_mouse,
|
||||||
|
&TestDriver::send_system,
|
||||||
|
&TestDriver::send_consumer
|
||||||
|
}
|
||||||
|
{
|
||||||
|
host_set_driver(&m_driver);
|
||||||
|
m_this = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
TestDriver::~TestDriver() {
|
||||||
|
m_this = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t TestDriver::keyboard_leds(void) {
|
||||||
|
return m_this->m_leds;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestDriver::send_keyboard(report_keyboard_t* report) {
|
||||||
|
m_this->send_keyboard_mock(*report);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestDriver::send_mouse(report_mouse_t* report) {
|
||||||
|
m_this->send_mouse_mock(*report);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestDriver::send_system(uint16_t data) {
|
||||||
|
m_this->send_system_mock(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestDriver::send_consumer(uint16_t data) {
|
||||||
|
m_this->send_consumer(data);
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
/* 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 TESTS_TEST_COMMON_TEST_DRIVER_H_
|
||||||
|
#define TESTS_TEST_COMMON_TEST_DRIVER_H_
|
||||||
|
|
||||||
|
#include "gmock/gmock.h"
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "host.h"
|
||||||
|
#include "keyboard_report_util.h"
|
||||||
|
|
||||||
|
|
||||||
|
class TestDriver {
|
||||||
|
public:
|
||||||
|
TestDriver();
|
||||||
|
~TestDriver();
|
||||||
|
void set_leds(uint8_t leds) { m_leds = leds; }
|
||||||
|
|
||||||
|
MOCK_METHOD1(send_keyboard_mock, void (report_keyboard_t&));
|
||||||
|
MOCK_METHOD1(send_mouse_mock, void (report_mouse_t&));
|
||||||
|
MOCK_METHOD1(send_system_mock, void (uint16_t));
|
||||||
|
MOCK_METHOD1(send_consumer_mock, void (uint16_t));
|
||||||
|
private:
|
||||||
|
static uint8_t keyboard_leds(void);
|
||||||
|
static void send_keyboard(report_keyboard_t *report);
|
||||||
|
static void send_mouse(report_mouse_t* report);
|
||||||
|
static void send_system(uint16_t data);
|
||||||
|
static void send_consumer(uint16_t data);
|
||||||
|
host_driver_t m_driver;
|
||||||
|
uint8_t m_leds = 0;
|
||||||
|
static TestDriver* m_this;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* TESTS_TEST_COMMON_TEST_DRIVER_H_ */
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
#include "test_fixture.h"
|
||||||
|
#include "gmock/gmock.h"
|
||||||
|
#include "test_driver.h"
|
||||||
|
#include "test_matrix.h"
|
||||||
|
#include "keyboard.h"
|
||||||
|
|
||||||
|
using testing::_;
|
||||||
|
using testing::AnyNumber;
|
||||||
|
using testing::Return;
|
||||||
|
using testing::Between;
|
||||||
|
|
||||||
|
void TestFixture::SetUpTestCase() {
|
||||||
|
TestDriver driver;
|
||||||
|
EXPECT_CALL(driver, send_keyboard_mock(_));
|
||||||
|
keyboard_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestFixture::TearDownTestCase() {
|
||||||
|
}
|
||||||
|
|
||||||
|
TestFixture::TestFixture() {
|
||||||
|
}
|
||||||
|
|
||||||
|
TestFixture::~TestFixture() {
|
||||||
|
TestDriver driver;
|
||||||
|
clear_all_keys();
|
||||||
|
// Run for a while to make sure all keys are completely released
|
||||||
|
// Should probably wait until tapping term etc, has timed out
|
||||||
|
EXPECT_CALL(driver, send_keyboard_mock(_)).Times(AnyNumber());
|
||||||
|
for (int i=0; i<100; i++) {
|
||||||
|
keyboard_task();
|
||||||
|
}
|
||||||
|
testing::Mock::VerifyAndClearExpectations(&driver);
|
||||||
|
// Verify that the matrix really is cleared
|
||||||
|
EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(Between(0, 1));
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
/* 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
|
class TestFixture : public testing::Test {
|
||||||
|
public:
|
||||||
|
TestFixture();
|
||||||
|
~TestFixture();
|
||||||
|
static void SetUpTestCase();
|
||||||
|
static void TearDownTestCase();
|
||||||
|
|
||||||
|
};
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
/* 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 TESTS_TEST_COMMON_TEST_MATRIX_H_
|
||||||
|
#define TESTS_TEST_COMMON_TEST_MATRIX_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void press_key(uint8_t col, uint8_t row);
|
||||||
|
void release_key(uint8_t col, uint8_t row);
|
||||||
|
void clear_all_keys(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* TESTS_TEST_COMMON_TEST_MATRIX_H_ */
|
||||||
@@ -3,6 +3,8 @@ ifeq ($(PLATFORM),AVR)
|
|||||||
PLATFORM_COMMON_DIR = $(COMMON_DIR)/avr
|
PLATFORM_COMMON_DIR = $(COMMON_DIR)/avr
|
||||||
else ifeq ($(PLATFORM),CHIBIOS)
|
else ifeq ($(PLATFORM),CHIBIOS)
|
||||||
PLATFORM_COMMON_DIR = $(COMMON_DIR)/chibios
|
PLATFORM_COMMON_DIR = $(COMMON_DIR)/chibios
|
||||||
|
else
|
||||||
|
PLATFORM_COMMON_DIR = $(COMMON_DIR)/test
|
||||||
endif
|
endif
|
||||||
|
|
||||||
TMK_COMMON_SRC += $(COMMON_DIR)/host.c \
|
TMK_COMMON_SRC += $(COMMON_DIR)/host.c \
|
||||||
@@ -16,6 +18,7 @@ TMK_COMMON_SRC += $(COMMON_DIR)/host.c \
|
|||||||
$(COMMON_DIR)/debug.c \
|
$(COMMON_DIR)/debug.c \
|
||||||
$(COMMON_DIR)/util.c \
|
$(COMMON_DIR)/util.c \
|
||||||
$(COMMON_DIR)/eeconfig.c \
|
$(COMMON_DIR)/eeconfig.c \
|
||||||
|
$(COMMON_DIR)/report.c \
|
||||||
$(PLATFORM_COMMON_DIR)/suspend.c \
|
$(PLATFORM_COMMON_DIR)/suspend.c \
|
||||||
$(PLATFORM_COMMON_DIR)/timer.c \
|
$(PLATFORM_COMMON_DIR)/timer.c \
|
||||||
$(PLATFORM_COMMON_DIR)/bootloader.c \
|
$(PLATFORM_COMMON_DIR)/bootloader.c \
|
||||||
@@ -29,6 +32,10 @@ ifeq ($(PLATFORM),CHIBIOS)
|
|||||||
TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom.c
|
TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(PLATFORM),TEST)
|
||||||
|
TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Option modules
|
# Option modules
|
||||||
|
|||||||
@@ -67,9 +67,11 @@ void action_exec(keyevent_t event)
|
|||||||
|
|
||||||
#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
|
#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
|
||||||
if (has_oneshot_layer_timed_out()) {
|
if (has_oneshot_layer_timed_out()) {
|
||||||
dprintf("Oneshot layer: timeout\n");
|
|
||||||
clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
|
clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
|
||||||
}
|
}
|
||||||
|
if (has_oneshot_mods_timed_out()) {
|
||||||
|
clear_oneshot_mods();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef NO_ACTION_TAPPING
|
#ifndef NO_ACTION_TAPPING
|
||||||
|
|||||||
@@ -25,13 +25,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
extern keymap_config_t keymap_config;
|
extern keymap_config_t keymap_config;
|
||||||
|
|
||||||
|
|
||||||
static inline void add_key_byte(uint8_t code);
|
|
||||||
static inline void del_key_byte(uint8_t code);
|
|
||||||
#ifdef NKRO_ENABLE
|
|
||||||
static inline void add_key_bit(uint8_t code);
|
|
||||||
static inline void del_key_bit(uint8_t code);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static uint8_t real_mods = 0;
|
static uint8_t real_mods = 0;
|
||||||
static uint8_t weak_mods = 0;
|
static uint8_t weak_mods = 0;
|
||||||
static uint8_t macro_mods = 0;
|
static uint8_t macro_mods = 0;
|
||||||
@@ -50,6 +43,10 @@ static int8_t cb_count = 0;
|
|||||||
//report_keyboard_t keyboard_report = {};
|
//report_keyboard_t keyboard_report = {};
|
||||||
report_keyboard_t *keyboard_report = &(report_keyboard_t){};
|
report_keyboard_t *keyboard_report = &(report_keyboard_t){};
|
||||||
|
|
||||||
|
extern inline void add_key(uint8_t key);
|
||||||
|
extern inline void del_key(uint8_t key);
|
||||||
|
extern inline void clear_keys(void);
|
||||||
|
|
||||||
#ifndef NO_ACTION_ONESHOT
|
#ifndef NO_ACTION_ONESHOT
|
||||||
static int8_t oneshot_mods = 0;
|
static int8_t oneshot_mods = 0;
|
||||||
static int8_t oneshot_locked_mods = 0;
|
static int8_t oneshot_locked_mods = 0;
|
||||||
@@ -134,7 +131,7 @@ void send_keyboard_report(void) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
keyboard_report->mods |= oneshot_mods;
|
keyboard_report->mods |= oneshot_mods;
|
||||||
if (has_anykey()) {
|
if (has_anykey(keyboard_report)) {
|
||||||
clear_oneshot_mods();
|
clear_oneshot_mods();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -143,38 +140,6 @@ void send_keyboard_report(void) {
|
|||||||
host_keyboard_send(keyboard_report);
|
host_keyboard_send(keyboard_report);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* key */
|
|
||||||
void add_key(uint8_t key)
|
|
||||||
{
|
|
||||||
#ifdef NKRO_ENABLE
|
|
||||||
if (keyboard_protocol && keymap_config.nkro) {
|
|
||||||
add_key_bit(key);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
add_key_byte(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
void del_key(uint8_t key)
|
|
||||||
{
|
|
||||||
#ifdef NKRO_ENABLE
|
|
||||||
if (keyboard_protocol && keymap_config.nkro) {
|
|
||||||
del_key_bit(key);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
del_key_byte(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
void clear_keys(void)
|
|
||||||
{
|
|
||||||
// not clear mods
|
|
||||||
for (int8_t i = 1; i < KEYBOARD_REPORT_SIZE; i++) {
|
|
||||||
keyboard_report->raw[i] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* modifier */
|
/* modifier */
|
||||||
uint8_t get_mods(void) { return real_mods; }
|
uint8_t get_mods(void) { return real_mods; }
|
||||||
void add_mods(uint8_t mods) { real_mods |= mods; }
|
void add_mods(uint8_t mods) { real_mods |= mods; }
|
||||||
@@ -221,166 +186,7 @@ uint8_t get_oneshot_mods(void)
|
|||||||
/*
|
/*
|
||||||
* inspect keyboard state
|
* inspect keyboard state
|
||||||
*/
|
*/
|
||||||
uint8_t has_anykey(void)
|
|
||||||
{
|
|
||||||
uint8_t cnt = 0;
|
|
||||||
for (uint8_t i = 1; i < KEYBOARD_REPORT_SIZE; i++) {
|
|
||||||
if (keyboard_report->raw[i])
|
|
||||||
cnt++;
|
|
||||||
}
|
|
||||||
return cnt;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t has_anymod(void)
|
uint8_t has_anymod(void)
|
||||||
{
|
{
|
||||||
return bitpop(real_mods);
|
return bitpop(real_mods);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t get_first_key(void)
|
|
||||||
{
|
|
||||||
#ifdef NKRO_ENABLE
|
|
||||||
if (keyboard_protocol && keymap_config.nkro) {
|
|
||||||
uint8_t i = 0;
|
|
||||||
for (; i < KEYBOARD_REPORT_BITS && !keyboard_report->nkro.bits[i]; i++)
|
|
||||||
;
|
|
||||||
return i<<3 | biton(keyboard_report->nkro.bits[i]);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USB_6KRO_ENABLE
|
|
||||||
uint8_t i = cb_head;
|
|
||||||
do {
|
|
||||||
if (keyboard_report->keys[i] != 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
i = RO_INC(i);
|
|
||||||
} while (i != cb_tail);
|
|
||||||
return keyboard_report->keys[i];
|
|
||||||
#else
|
|
||||||
return keyboard_report->keys[0];
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* local functions */
|
|
||||||
static inline void add_key_byte(uint8_t code)
|
|
||||||
{
|
|
||||||
#ifdef USB_6KRO_ENABLE
|
|
||||||
int8_t i = cb_head;
|
|
||||||
int8_t empty = -1;
|
|
||||||
if (cb_count) {
|
|
||||||
do {
|
|
||||||
if (keyboard_report->keys[i] == code) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (empty == -1 && keyboard_report->keys[i] == 0) {
|
|
||||||
empty = i;
|
|
||||||
}
|
|
||||||
i = RO_INC(i);
|
|
||||||
} while (i != cb_tail);
|
|
||||||
if (i == cb_tail) {
|
|
||||||
if (cb_tail == cb_head) {
|
|
||||||
// buffer is full
|
|
||||||
if (empty == -1) {
|
|
||||||
// pop head when has no empty space
|
|
||||||
cb_head = RO_INC(cb_head);
|
|
||||||
cb_count--;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// left shift when has empty space
|
|
||||||
uint8_t offset = 1;
|
|
||||||
i = RO_INC(empty);
|
|
||||||
do {
|
|
||||||
if (keyboard_report->keys[i] != 0) {
|
|
||||||
keyboard_report->keys[empty] = keyboard_report->keys[i];
|
|
||||||
keyboard_report->keys[i] = 0;
|
|
||||||
empty = RO_INC(empty);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
offset++;
|
|
||||||
}
|
|
||||||
i = RO_INC(i);
|
|
||||||
} while (i != cb_tail);
|
|
||||||
cb_tail = RO_SUB(cb_tail, offset);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// add to tail
|
|
||||||
keyboard_report->keys[cb_tail] = code;
|
|
||||||
cb_tail = RO_INC(cb_tail);
|
|
||||||
cb_count++;
|
|
||||||
#else
|
|
||||||
int8_t i = 0;
|
|
||||||
int8_t empty = -1;
|
|
||||||
for (; i < KEYBOARD_REPORT_KEYS; i++) {
|
|
||||||
if (keyboard_report->keys[i] == code) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (empty == -1 && keyboard_report->keys[i] == 0) {
|
|
||||||
empty = i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (i == KEYBOARD_REPORT_KEYS) {
|
|
||||||
if (empty != -1) {
|
|
||||||
keyboard_report->keys[empty] = code;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void del_key_byte(uint8_t code)
|
|
||||||
{
|
|
||||||
#ifdef USB_6KRO_ENABLE
|
|
||||||
uint8_t i = cb_head;
|
|
||||||
if (cb_count) {
|
|
||||||
do {
|
|
||||||
if (keyboard_report->keys[i] == code) {
|
|
||||||
keyboard_report->keys[i] = 0;
|
|
||||||
cb_count--;
|
|
||||||
if (cb_count == 0) {
|
|
||||||
// reset head and tail
|
|
||||||
cb_tail = cb_head = 0;
|
|
||||||
}
|
|
||||||
if (i == RO_DEC(cb_tail)) {
|
|
||||||
// left shift when next to tail
|
|
||||||
do {
|
|
||||||
cb_tail = RO_DEC(cb_tail);
|
|
||||||
if (keyboard_report->keys[RO_DEC(cb_tail)] != 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} while (cb_tail != cb_head);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
i = RO_INC(i);
|
|
||||||
} while (i != cb_tail);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) {
|
|
||||||
if (keyboard_report->keys[i] == code) {
|
|
||||||
keyboard_report->keys[i] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef NKRO_ENABLE
|
|
||||||
static inline void add_key_bit(uint8_t code)
|
|
||||||
{
|
|
||||||
if ((code>>3) < KEYBOARD_REPORT_BITS) {
|
|
||||||
keyboard_report->nkro.bits[code>>3] |= 1<<(code&7);
|
|
||||||
} else {
|
|
||||||
dprintf("add_key_bit: can't add: %02X\n", code);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void del_key_bit(uint8_t code)
|
|
||||||
{
|
|
||||||
if ((code>>3) < KEYBOARD_REPORT_BITS) {
|
|
||||||
keyboard_report->nkro.bits[code>>3] &= ~(1<<(code&7));
|
|
||||||
} else {
|
|
||||||
dprintf("del_key_bit: can't del: %02X\n", code);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
@@ -29,9 +29,17 @@ extern report_keyboard_t *keyboard_report;
|
|||||||
void send_keyboard_report(void);
|
void send_keyboard_report(void);
|
||||||
|
|
||||||
/* key */
|
/* key */
|
||||||
void add_key(uint8_t key);
|
inline void add_key(uint8_t key) {
|
||||||
void del_key(uint8_t key);
|
add_key_to_report(keyboard_report, key);
|
||||||
void clear_keys(void);
|
}
|
||||||
|
|
||||||
|
inline void del_key(uint8_t key) {
|
||||||
|
del_key_from_report(keyboard_report, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void clear_keys(void) {
|
||||||
|
clear_keys_from_report(keyboard_report);
|
||||||
|
}
|
||||||
|
|
||||||
/* modifier */
|
/* modifier */
|
||||||
uint8_t get_mods(void);
|
uint8_t get_mods(void);
|
||||||
@@ -82,9 +90,7 @@ uint8_t get_oneshot_layer_state(void);
|
|||||||
bool has_oneshot_layer_timed_out(void);
|
bool has_oneshot_layer_timed_out(void);
|
||||||
|
|
||||||
/* inspect */
|
/* inspect */
|
||||||
uint8_t has_anykey(void);
|
|
||||||
uint8_t has_anymod(void);
|
uint8_t has_anymod(void);
|
||||||
uint8_t get_first_key(void);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
#if defined(__AVR__)
|
#if defined(__AVR__)
|
||||||
#include <avr/eeprom.h>
|
#include <avr/eeprom.h>
|
||||||
#else
|
#else
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
uint8_t eeprom_read_byte (const uint8_t *__p);
|
uint8_t eeprom_read_byte (const uint8_t *__p);
|
||||||
uint16_t eeprom_read_word (const uint16_t *__p);
|
uint16_t eeprom_read_word (const uint16_t *__p);
|
||||||
uint32_t eeprom_read_dword (const uint32_t *__p);
|
uint32_t eeprom_read_dword (const uint32_t *__p);
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
#if defined(__AVR__)
|
#if defined(__AVR__)
|
||||||
# include <avr/pgmspace.h>
|
# include <avr/pgmspace.h>
|
||||||
#elif defined(__arm__)
|
#else
|
||||||
# define PROGMEM
|
# define PROGMEM
|
||||||
# define pgm_read_byte(p) *((unsigned char*)p)
|
# define pgm_read_byte(p) *((unsigned char*)p)
|
||||||
# define pgm_read_word(p) *((uint16_t*)p)
|
# define pgm_read_word(p) *((uint16_t*)p)
|
||||||
|
|||||||
@@ -0,0 +1,207 @@
|
|||||||
|
/* 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 "report.h"
|
||||||
|
#include "host.h"
|
||||||
|
#include "keycode_config.h"
|
||||||
|
#include "debug.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
uint8_t has_anykey(report_keyboard_t* keyboard_report)
|
||||||
|
{
|
||||||
|
uint8_t cnt = 0;
|
||||||
|
for (uint8_t i = 1; i < KEYBOARD_REPORT_SIZE; i++) {
|
||||||
|
if (keyboard_report->raw[i])
|
||||||
|
cnt++;
|
||||||
|
}
|
||||||
|
return cnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t get_first_key(report_keyboard_t* keyboard_report)
|
||||||
|
{
|
||||||
|
#ifdef NKRO_ENABLE
|
||||||
|
if (keyboard_protocol && keymap_config.nkro) {
|
||||||
|
uint8_t i = 0;
|
||||||
|
for (; i < KEYBOARD_REPORT_BITS && !keyboard_report->nkro.bits[i]; i++)
|
||||||
|
;
|
||||||
|
return i<<3 | biton(keyboard_report->nkro.bits[i]);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef USB_6KRO_ENABLE
|
||||||
|
uint8_t i = cb_head;
|
||||||
|
do {
|
||||||
|
if (keyboard_report->keys[i] != 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i = RO_INC(i);
|
||||||
|
} while (i != cb_tail);
|
||||||
|
return keyboard_report->keys[i];
|
||||||
|
#else
|
||||||
|
return keyboard_report->keys[0];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void add_key_byte(report_keyboard_t* keyboard_report, uint8_t code)
|
||||||
|
{
|
||||||
|
#ifdef USB_6KRO_ENABLE
|
||||||
|
int8_t i = cb_head;
|
||||||
|
int8_t empty = -1;
|
||||||
|
if (cb_count) {
|
||||||
|
do {
|
||||||
|
if (keyboard_report->keys[i] == code) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (empty == -1 && keyboard_report->keys[i] == 0) {
|
||||||
|
empty = i;
|
||||||
|
}
|
||||||
|
i = RO_INC(i);
|
||||||
|
} while (i != cb_tail);
|
||||||
|
if (i == cb_tail) {
|
||||||
|
if (cb_tail == cb_head) {
|
||||||
|
// buffer is full
|
||||||
|
if (empty == -1) {
|
||||||
|
// pop head when has no empty space
|
||||||
|
cb_head = RO_INC(cb_head);
|
||||||
|
cb_count--;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// left shift when has empty space
|
||||||
|
uint8_t offset = 1;
|
||||||
|
i = RO_INC(empty);
|
||||||
|
do {
|
||||||
|
if (keyboard_report->keys[i] != 0) {
|
||||||
|
keyboard_report->keys[empty] = keyboard_report->keys[i];
|
||||||
|
keyboard_report->keys[i] = 0;
|
||||||
|
empty = RO_INC(empty);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
offset++;
|
||||||
|
}
|
||||||
|
i = RO_INC(i);
|
||||||
|
} while (i != cb_tail);
|
||||||
|
cb_tail = RO_SUB(cb_tail, offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// add to tail
|
||||||
|
keyboard_report->keys[cb_tail] = code;
|
||||||
|
cb_tail = RO_INC(cb_tail);
|
||||||
|
cb_count++;
|
||||||
|
#else
|
||||||
|
int8_t i = 0;
|
||||||
|
int8_t empty = -1;
|
||||||
|
for (; i < KEYBOARD_REPORT_KEYS; i++) {
|
||||||
|
if (keyboard_report->keys[i] == code) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (empty == -1 && keyboard_report->keys[i] == 0) {
|
||||||
|
empty = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (i == KEYBOARD_REPORT_KEYS) {
|
||||||
|
if (empty != -1) {
|
||||||
|
keyboard_report->keys[empty] = code;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void del_key_byte(report_keyboard_t* keyboard_report, uint8_t code)
|
||||||
|
{
|
||||||
|
#ifdef USB_6KRO_ENABLE
|
||||||
|
uint8_t i = cb_head;
|
||||||
|
if (cb_count) {
|
||||||
|
do {
|
||||||
|
if (keyboard_report->keys[i] == code) {
|
||||||
|
keyboard_report->keys[i] = 0;
|
||||||
|
cb_count--;
|
||||||
|
if (cb_count == 0) {
|
||||||
|
// reset head and tail
|
||||||
|
cb_tail = cb_head = 0;
|
||||||
|
}
|
||||||
|
if (i == RO_DEC(cb_tail)) {
|
||||||
|
// left shift when next to tail
|
||||||
|
do {
|
||||||
|
cb_tail = RO_DEC(cb_tail);
|
||||||
|
if (keyboard_report->keys[RO_DEC(cb_tail)] != 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} while (cb_tail != cb_head);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i = RO_INC(i);
|
||||||
|
} while (i != cb_tail);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) {
|
||||||
|
if (keyboard_report->keys[i] == code) {
|
||||||
|
keyboard_report->keys[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef NKRO_ENABLE
|
||||||
|
void add_key_bit(report_keyboard_t* keyboard_report, uint8_t code)
|
||||||
|
{
|
||||||
|
if ((code>>3) < KEYBOARD_REPORT_BITS) {
|
||||||
|
keyboard_report->nkro.bits[code>>3] |= 1<<(code&7);
|
||||||
|
} else {
|
||||||
|
dprintf("add_key_bit: can't add: %02X\n", code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void del_key_bit(report_keyboard_t* keyboard_report, uint8_t code)
|
||||||
|
{
|
||||||
|
if ((code>>3) < KEYBOARD_REPORT_BITS) {
|
||||||
|
keyboard_report->nkro.bits[code>>3] &= ~(1<<(code&7));
|
||||||
|
} else {
|
||||||
|
dprintf("del_key_bit: can't del: %02X\n", code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void add_key_to_report(report_keyboard_t* keyboard_report, int8_t key)
|
||||||
|
{
|
||||||
|
#ifdef NKRO_ENABLE
|
||||||
|
if (keyboard_protocol && keymap_config.nkro) {
|
||||||
|
add_key_bit(keyboard_report, key);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
add_key_byte(keyboard_report, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
void del_key_from_report(report_keyboard_t* keyboard_report, uint8_t key)
|
||||||
|
{
|
||||||
|
#ifdef NKRO_ENABLE
|
||||||
|
if (keyboard_protocol && keymap_config.nkro) {
|
||||||
|
del_key_bit(keyboard_report, key);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
del_key_byte(keyboard_report, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear_keys_from_report(report_keyboard_t* keyboard_report)
|
||||||
|
{
|
||||||
|
// not clear mods
|
||||||
|
for (int8_t i = 1; i < KEYBOARD_REPORT_SIZE; i++) {
|
||||||
|
keyboard_report->raw[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -174,6 +174,20 @@ typedef struct {
|
|||||||
(key == KC_WWW_REFRESH ? AC_REFRESH : \
|
(key == KC_WWW_REFRESH ? AC_REFRESH : \
|
||||||
(key == KC_WWW_FAVORITES ? AC_BOOKMARKS : 0)))))))))))))))))))))
|
(key == KC_WWW_FAVORITES ? AC_BOOKMARKS : 0)))))))))))))))))))))
|
||||||
|
|
||||||
|
uint8_t has_anykey(report_keyboard_t* keyboard_report);
|
||||||
|
uint8_t get_first_key(report_keyboard_t* keyboard_report);
|
||||||
|
|
||||||
|
void add_key_byte(report_keyboard_t* keyboard_report, uint8_t code);
|
||||||
|
void del_key_byte(report_keyboard_t* keyboard_report, uint8_t code);
|
||||||
|
#ifdef NKRO_ENABLE
|
||||||
|
void add_key_bit(report_keyboard_t* keyboard_report, uint8_t code);
|
||||||
|
void del_key_bit(report_keyboard_t* keyboard_report, uint8_t code);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void add_key_to_report(report_keyboard_t* keyboard_report, int8_t key);
|
||||||
|
void del_key_from_report(report_keyboard_t* keyboard_report, uint8_t key);
|
||||||
|
void clear_keys_from_report(report_keyboard_t* keyboard_report);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
/* 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 "bootloader.h"
|
||||||
|
|
||||||
|
void bootloader_jump(void) {}
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
/* 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 "eeprom.h"
|
||||||
|
|
||||||
|
#define EEPROM_SIZE 32
|
||||||
|
|
||||||
|
static uint8_t buffer[EEPROM_SIZE];
|
||||||
|
|
||||||
|
uint8_t eeprom_read_byte(const uint8_t *addr) {
|
||||||
|
uintptr_t offset = (uintptr_t)addr;
|
||||||
|
return buffer[offset];
|
||||||
|
}
|
||||||
|
|
||||||
|
void eeprom_write_byte(uint8_t *addr, uint8_t value) {
|
||||||
|
uintptr_t offset = (uintptr_t)addr;
|
||||||
|
buffer[offset] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t eeprom_read_word(const uint16_t *addr) {
|
||||||
|
const uint8_t *p = (const uint8_t *)addr;
|
||||||
|
return eeprom_read_byte(p) | (eeprom_read_byte(p+1) << 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t eeprom_read_dword(const uint32_t *addr) {
|
||||||
|
const uint8_t *p = (const uint8_t *)addr;
|
||||||
|
return eeprom_read_byte(p) | (eeprom_read_byte(p+1) << 8)
|
||||||
|
| (eeprom_read_byte(p+2) << 16) | (eeprom_read_byte(p+3) << 24);
|
||||||
|
}
|
||||||
|
|
||||||
|
void eeprom_read_block(void *buf, const void *addr, uint32_t len) {
|
||||||
|
const uint8_t *p = (const uint8_t *)addr;
|
||||||
|
uint8_t *dest = (uint8_t *)buf;
|
||||||
|
while (len--) {
|
||||||
|
*dest++ = eeprom_read_byte(p++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void eeprom_write_word(uint16_t *addr, uint16_t value) {
|
||||||
|
uint8_t *p = (uint8_t *)addr;
|
||||||
|
eeprom_write_byte(p++, value);
|
||||||
|
eeprom_write_byte(p, value >> 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
void eeprom_write_dword(uint32_t *addr, uint32_t value) {
|
||||||
|
uint8_t *p = (uint8_t *)addr;
|
||||||
|
eeprom_write_byte(p++, value);
|
||||||
|
eeprom_write_byte(p++, value >> 8);
|
||||||
|
eeprom_write_byte(p++, value >> 16);
|
||||||
|
eeprom_write_byte(p, value >> 24);
|
||||||
|
}
|
||||||
|
|
||||||
|
void eeprom_write_block(const void *buf, void *addr, uint32_t len) {
|
||||||
|
uint8_t *p = (uint8_t *)addr;
|
||||||
|
const uint8_t *src = (const uint8_t *)buf;
|
||||||
|
while (len--) {
|
||||||
|
eeprom_write_byte(p++, *src++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void eeprom_update_byte(uint8_t *addr, uint8_t value) {
|
||||||
|
eeprom_write_byte(addr, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void eeprom_update_word(uint16_t *addr, uint16_t value) {
|
||||||
|
uint8_t *p = (uint8_t *)addr;
|
||||||
|
eeprom_write_byte(p++, value);
|
||||||
|
eeprom_write_byte(p, value >> 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
void eeprom_update_dword(uint32_t *addr, uint32_t value) {
|
||||||
|
uint8_t *p = (uint8_t *)addr;
|
||||||
|
eeprom_write_byte(p++, value);
|
||||||
|
eeprom_write_byte(p++, value >> 8);
|
||||||
|
eeprom_write_byte(p++, value >> 16);
|
||||||
|
eeprom_write_byte(p, value >> 24);
|
||||||
|
}
|
||||||
|
|
||||||
|
void eeprom_update_block(const void *buf, void *addr, uint32_t len) {
|
||||||
|
uint8_t *p = (uint8_t *)addr;
|
||||||
|
const uint8_t *src = (const uint8_t *)buf;
|
||||||
|
while (len--) {
|
||||||
|
eeprom_write_byte(p++, *src++);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
/* 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "timer.h"
|
||||||
|
|
||||||
|
// TODO: the timer should work, but at a much faster rate than realtime
|
||||||
|
// It should also have some kind of integration with the testing system
|
||||||
|
|
||||||
|
void timer_init(void) {}
|
||||||
|
|
||||||
|
void timer_clear(void) {}
|
||||||
|
|
||||||
|
uint16_t timer_read(void) { return 0; }
|
||||||
|
uint32_t timer_read32(void) { return 0; }
|
||||||
|
uint16_t timer_elapsed(uint16_t last) { return 0; }
|
||||||
|
uint32_t timer_elapsed32(uint32_t last) { return 0; }
|
||||||
|
|
||||||
@@ -9,13 +9,16 @@ extern "C" {
|
|||||||
# include <util/delay.h>
|
# include <util/delay.h>
|
||||||
# define wait_ms(ms) _delay_ms(ms)
|
# define wait_ms(ms) _delay_ms(ms)
|
||||||
# define wait_us(us) _delay_us(us)
|
# define wait_us(us) _delay_us(us)
|
||||||
#elif defined(PROTOCOL_CHIBIOS) /* __AVR__ */
|
#elif defined(PROTOCOL_CHIBIOS)
|
||||||
# include "ch.h"
|
# include "ch.h"
|
||||||
# define wait_ms(ms) chThdSleepMilliseconds(ms)
|
# define wait_ms(ms) chThdSleepMilliseconds(ms)
|
||||||
# define wait_us(us) chThdSleepMicroseconds(us)
|
# define wait_us(us) chThdSleepMicroseconds(us)
|
||||||
#elif defined(__arm__) /* __AVR__ */
|
#elif defined(__arm__)
|
||||||
# include "wait_api.h"
|
# include "wait_api.h"
|
||||||
#endif /* __AVR__ */
|
#else // Unit tests
|
||||||
|
#define wait_ms(ms)
|
||||||
|
#define wait_us(us)
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user