Merge remote-tracking branch 'upstream/develop' into comm_60_mno

This commit is contained in:
Duncan Sutherland 2024-05-02 14:42:09 +01:00
commit 4bcb830e91
402 changed files with 18769 additions and 1932 deletions

View File

@ -1,4 +1,4 @@
CompileFlags: CompileFlags:
Add: [-Wno-unknown-attributes, -Wno-maybe-uninitialized, -Wno-unknown-warning-option] Add: [-Wno-unknown-attributes, -Wno-maybe-uninitialized, -Wno-unknown-warning-option]
Remove: [-W*, -mcall-prologues] Remove: [-W*, -mmcu=*, -mcpu=*, -mfpu=*, -mfloat-abi=*, -mno-unaligned-access, -mno-thumb-interwork, -mcall-prologues]
Compiler: clang Compiler: clang

View File

@ -1,74 +0,0 @@
name: CI Builds
permissions:
contents: read
on:
push:
branches: [master, develop]
workflow_dispatch:
inputs:
branch:
type: choice
description: 'Branch to build'
options: [master, develop]
concurrency: ci_build-${{ github.event.inputs.branch || github.ref_name }}
jobs:
ci_builds:
if: github.repository == 'qmk/qmk_firmware'
name: "CI Build"
runs-on: self-hosted
timeout-minutes: 1380
strategy:
fail-fast: false
matrix:
keymap: [default, via]
container: ghcr.io/qmk/qmk_cli
steps:
- name: Disable safe.directory check
run : git config --global --add safe.directory '*'
- uses: actions/checkout@v4
with:
submodules: recursive
ref: ${{ github.event.inputs.branch || github.ref }}
- name: Install dependencies
run: pip3 install -r requirements.txt
- name: Run `qmk mass-compile` (keymap ${{ matrix.keymap }})
run: |
export NCPUS=$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || getconf _NPROCESSORS_ONLN 2>/dev/null)
qmk mass-compile -t -j $NCPUS -km ${{ matrix.keymap }} -e DUMP_CI_METADATA=yes || touch .failed
# Generate the step summary markdown
./util/ci/generate_failure_markdown.sh > $GITHUB_STEP_SUMMARY || true
# Truncate to a maximum of 1MB to deal with GitHub workflow limit
truncate --size='<960K' $GITHUB_STEP_SUMMARY || true
# Exit with failure if the compilation stage failed
[ ! -f .failed ] || exit 1
- name: 'Upload artifacts'
uses: actions/upload-artifact@v4
if: always()
with:
name: artifacts-${{ github.event.inputs.branch || github.ref_name }}-${{ matrix.keymap }}
if-no-files-found: ignore
path: |
*.bin
*.hex
*.uf2
.build/failed.*
- name: 'CI Discord Notification'
if: always()
working-directory: util/ci/
env:
DISCORD_WEBHOOK: ${{ secrets.CI_DISCORD_WEBHOOK }}
run: |
python3 -m pip install -r requirements.txt
python3 ./discord-results.py --branch ${{ github.event.inputs.branch || github.ref_name }} --keymap ${{ matrix.keymap }} --url ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}

View File

@ -0,0 +1,580 @@
{
"aliases": {
/*
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
* │ \ │ + │ ě │ š │ č │ ř │ ž │ ý │ á │ í │ é │ = │ ' │ │
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
* │ │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ ú │ ) │ ¨ │
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───┤
* │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ů │ § │ │
* ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴──────┤
* │ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ - │ │
* ├─────┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
* │ │ │ │ │ │ │ │
* └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
*/
"KC_GRV": {
"key": "CZ_BSLS",
"label": "\\",
}
"KC_1": {
"key": "CZ_PLUS",
"label": "+",
}
"KC_2": {
"key": "CZ_ECAR",
"label": "ě",
}
"KC_3": {
"key": "CZ_SCAR",
"label": "š",
}
"KC_4": {
"key": "CZ_CCAR",
"label": "č",
}
"KC_5": {
"key": "CZ_RCAR",
"label": "ř",
}
"KC_6": {
"key": "CZ_ZCAR",
"label": "ž",
}
"KC_7": {
"key": "CZ_YACU",
"label": "ý",
}
"KC_8": {
"key": "CZ_AACU",
"label": "á",
}
"KC_9": {
"key": "CZ_IACU",
"label": "í",
}
"KC_0": {
"key": "CZ_EACU",
"label": "é",
}
"KC_MINS": {
"key": "CZ_EQL",
"label": "=",
}
"KC_EQL": {
"key": "CZ_ACUT",
"label": "' (dead)",
}
"KC_Q": {
"key": "CZ_Q",
"label": "Q",
}
"KC_W": {
"key": "CZ_W",
"label": "W",
}
"KC_E": {
"key": "CZ_E",
"label": "E",
}
"KC_R": {
"key": "CZ_R",
"label": "R",
}
"KC_T": {
"key": "CZ_T",
"label": "T",
}
"KC_Y": {
"key": "CZ_Z",
"label": "Z",
}
"KC_U": {
"key": "CZ_U",
"label": "U",
}
"KC_I": {
"key": "CZ_I",
"label": "I",
}
"KC_O": {
"key": "CZ_O",
"label": "O",
}
"KC_P": {
"key": "CZ_P",
"label": "P",
}
"KC_LBRC": {
"key": "CZ_UACU",
"label": "ú",
}
"KC_RBRC": {
"key": "CZ_RPRN",
"label": ")",
}
"KC_NUHS": {
"key": "CZ_DIAE",
"label": "¨ (dead)",
}
"KC_A": {
"key": "CZ_A",
"label": "A",
}
"KC_S": {
"key": "CZ_S",
"label": "S",
}
"KC_D": {
"key": "CZ_D",
"label": "D",
}
"KC_F": {
"key": "CZ_F",
"label": "F",
}
"KC_G": {
"key": "CZ_G",
"label": "G",
}
"KC_H": {
"key": "CZ_H",
"label": "H",
}
"KC_J": {
"key": "CZ_J",
"label": "J",
}
"KC_K": {
"key": "CZ_K",
"label": "K",
}
"KC_L": {
"key": "CZ_L",
"label": "L",
}
"KC_SCLN": {
"key": "CZ_URNG",
"label": "ů",
}
"KC_QUOT": {
"key": "CZ_SECT",
"label": "§",
}
"KC_Z": {
"key": "CZ_Y",
"label": "Y",
}
"KC_X": {
"key": "CZ_X",
"label": "X",
}
"KC_C": {
"key": "CZ_C",
"label": "C",
}
"KC_V": {
"key": "CZ_V",
"label": "V",
}
"KC_B": {
"key": "CZ_B",
"label": "B",
}
"KC_N": {
"key": "CZ_N",
"label": "N",
}
"KC_M": {
"key": "CZ_M",
"label": "M",
}
"KC_COMM": {
"key": "CZ_COMM",
"label": ",",
}
"KC_DOT": {
"key": "CZ_DOT",
"label": ".",
}
"KC_SLSH": {
"key": "CZ_MINS",
"label": "-",
}
/* Shifted symbols
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
* │ | │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ % │ ˇ │ │
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
* │ │ │ │ │ │ │ │ │ │ │ │ / │ ( │ ` │
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───┤
* │ │ │ │ │ │ │ │ │ │ │ " │ ! │ │
* ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴──────┤
* │ │ │ │ │ │ │ │ │ ? │ : │ _ │ │
* ├─────┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
* │ │ │ │ │ │ │ │
* └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
*/
"S(CZ_BSLS)": {
"key": "CZ_PIPE",
"label": "|",
}
"S(CZ_PLUS)": {
"key": "CZ_1",
"label": "1",
}
"S(CZ_ECAR)": {
"key": "CZ_2",
"label": "2",
}
"S(CZ_SCAR)": {
"key": "CZ_3",
"label": "3",
}
"S(CZ_CCAR)": {
"key": "CZ_4",
"label": "4",
}
"S(CZ_RCAR)": {
"key": "CZ_5",
"label": "5",
}
"S(CZ_ZCAR)": {
"key": "CZ_6",
"label": "6",
}
"S(CZ_YACU)": {
"key": "CZ_7",
"label": "7",
}
"S(CZ_AACU)": {
"key": "CZ_8",
"label": "8",
}
"S(CZ_IACU)": {
"key": "CZ_9",
"label": "9",
}
"S(CZ_EACU)": {
"key": "CZ_0",
"label": "0",
}
"S(CZ_EQL)": {
"key": "CZ_PERC",
"label": "%",
}
"S(CZ_ACUT)": {
"key": "CZ_CARN",
"label": "ˇ (dead)",
}
"S(CZ_UACU)": {
"key": "CZ_SLSH",
"label": "/",
}
"S(CZ_RPRN)": {
"key": "CZ_LPRN",
"label": "(",
}
"S(CZ_DIAE)": {
"key": "CZ_GRV",
"label": "`",
}
"S(CZ_URNG)": {
"key": "CZ_DQUO",
"label": "\"",
}
"S(CZ_SECT)": {
"key": "CZ_EXLM",
"label": "!",
}
"S(CZ_COMM)": {
"key": "CZ_QUES",
"label": "?",
}
"S(CZ_DOT)": {
"key": "CZ_COLN",
"label": ":",
}
"S(CZ_MINS)": {
"key": "CZ_UNDS",
"label": "_",
}
/* Alted symbols
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
* │ │ │ @ │ # │ $ │ ~ │ ^ │ & │ * │ { │ } │ ° │ ^ │ │
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
* │ │ │ ė │ ę │ € │ │ │ │ │ │ │ [ │ ] │ │
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───┤
* │ │ ą │ ß │ ∂ │ │ │ │ │ ł │ ; │ ' │ │
* ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴──────┤
* │ │ │ │ │ │ │ │ │ < │ > │ │ │
* ├─────┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
* │ │ │ │ │ │ │ │
* └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
*/
"A(CZ_ECAR)": {
"key": "CZ_AT",
"label": "@",
}
"A(CZ_SCAR)": {
"key": "CZ_HASH",
"label": "#",
}
"A(CZ_CCAR)": {
"key": "CZ_DLR",
"label": "$",
}
"A(CZ_RCAR)": {
"key": "CZ_TILD",
"label": "~",
}
"A(CZ_ZCAR)": {
"key": "CZ_CIRC",
"label": "^",
}
"A(CZ_YACU)": {
"key": "CZ_AMPR",
"label": "&",
}
"A(CZ_AACU)": {
"key": "CZ_ASTR",
"label": "*",
}
"A(CZ_IACU)": {
"key": "CZ_LCBR",
"label": "{",
}
"A(CZ_EACU)": {
"key": "CZ_RCBR",
"label": "}",
}
"A(CZ_EQL)": {
"key": "CZ_RNGA",
"label": "° (dead)",
}
"A(CZ_ACUT)": {
"key": "CZ_DCIR",
"label": "^ (dead)",
}
"A(CZ_W)": {
"key": "CZ_LEDT",
"label": "ė",
}
"A(CZ_E)": {
"key": "CZ_LEOG",
"label": "ę",
}
"A(CZ_R)": {
"key": "CZ_EURO",
"label": "€",
}
"A(CZ_Z)": {
"key": "CZ_LZDT",
"label": "ż",
}
"A(CZ_UACU)": {
"key": "CZ_LBRC",
"label": "[",
}
"A(CZ_RPRN)": {
"key": "CZ_RBRC",
"label": "]",
}
"A(CZ_A)": {
"key": "CZ_LAOG",
"label": "ą",
}
"A(CZ_S)": {
"key": "CZ_SS",
"label": "ß",
}
"A(CZ_D)": {
"key": "CZ_PDIF",
"label": "∂",
}
"A(CZ_H)": {
"key": "CZ_LSQU",
"label": "",
}
"A(CZ_J)": {
"key": "CZ_RSQU",
"label": "",
}
"A(CZ_L)": {
"key": "CZ_LLST",
"label": "ł",
}
"A(CZ_URNG)": {
"key": "CZ_SCLN",
"label": ";",
}
"A(CZ_SECT)": {
"key": "CZ_QUOT",
"label": "'",
}
"A(CZ_N)": {
"key": "CZ_SLQU",
"label": "",
}
"A(CZ_COMM)": {
"key": "CZ_LABK",
"label": "<",
}
"A(CZ_DOT)": {
"key": "CZ_RABK",
"label": ">",
}
"A(CZ_MINS)": {
"key": "CZ_NDSH",
"label": "",
}
/* Shift+Alted symbols
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
* │ │ ¬ │ • │ ≠ │ £ │ ◊ │ † │ ¶ │ ÷ │ « │ » │ , │ - │ │
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
* │ │ │ Ė │ Ę │ ® │ ™ │ Ż │ │ │ │ │ │ " │
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───┤
* │ │ Ą │ ∑ │ ∆ │ │ │ “ │ ” │ │ Ł │ … │ ~ │ │
* ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴──────┤
* │ │ │ │ © │ √ │ │ „ │ │ ≤ │ ≥ │ — │ │
* ├─────┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
* │ │ │ │ │ │ │ │
* └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
*/
"S(A(CZ_1))": {
"key": "CZ_NOT",
"label": "¬",
}
"S(A(CZ_2))": {
"key": "CZ_BULT",
"label": "•",
}
"S(A(CZ_3))": {
"key": "CZ_NEQL",
"label": "≠",
}
"S(A(CZ_4))": {
"key": "CZ_PND",
"label": "£",
}
"S(A(CZ_5))": {
"key": "CZ_LOZN",
"label": "◊",
}
"S(A(CZ_6))": {
"key": "CZ_DAGG",
"label": "†",
}
"S(A(CZ_7))": {
"key": "CZ_PARA",
"label": "¶",
}
"S(A(CZ_8))": {
"key": "CZ_DIV",
"label": "÷",
}
"S(A(CZ_9))": {
"key": "CZ_LDAQ",
"label": "«",
}
"S(A(CZ_0))": {
"key": "CZ_RDAQ",
"label": "»",
}
"S(A(CZ_EQL))": {
"key": "CZ_DCOM",
"label": ", (dead)",
}
"S(A(CZ_ACUT))": {
"key": "CZ_DHPN",
"label": "- (dead)",
}
"S(A(CZ_W))": {
"key": "CZ_CEDT",
"label": "Ė",
}
"S(A(CZ_E))": {
"key": "CZ_CEOG",
"label": "Ę",
}
"S(A(CZ_R))": {
"key": "CZ_REGD",
"label": "®",
}
"S(A(CZ_T))": {
"key": "CZ_TM",
"label": "™",
}
"S(A(CZ_Z))": {
"key": "CZ_CZDT",
"label": "Ż",
}
"S(A(CZ_UACU))": {
"key": "CZ_LSAQ",
"label": "",
}
"S(A(CZ_RPRN))": {
"key": "CZ_RSAQ",
"label": "",
}
"S(A(CZ_DIAE))": {
"key": "CZ_DDQT",
"label": "\" (dead)",
}
"S(A(CZ_A))": {
"key": "CZ_CAOG",
"label": "Ą",
}
"S(A(CZ_S))": {
"key": "CZ_NARS",
"label": "∑",
}
"S(A(CZ_D))": {
"key": "CZ_INCR",
"label": "∆",
}
"S(A(CZ_H))": {
"key": "CZ_LDQU",
"label": "“",
}
"S(A(CZ_J))": {
"key": "CZ_RDQU",
"label": "”",
}
"S(A(CZ_L))": {
"key": "CZ_CLST",
"label": "Ł",
}
"S(A(CZ_URNG))": {
"key": "CZ_ELLP",
"label": "…",
}
"S(A(CZ_SECT))": {
"key": "CZ_DTIL",
"label": "~ (dead)",
}
"S(A(CZ_C))": {
"key": "CZ_COPY",
"label": "©",
}
"S(A(CZ_V))": {
"key": "CZ_SQRT",
"label": "√",
}
"S(A(CZ_N))": {
"key": "CZ_DLQU",
"label": "„",
}
"S(A(CZ_COMM))": {
"key": "CZ_LEQL",
"label": "≤",
}
"S(A(CZ_DOT))": {
"key": "CZ_GEQL",
"label": "≥",
}
"S(A(CZ_MINS))": {
"key": "CZ_MDSH",
"label": "—",
}
}
}

View File

@ -0,0 +1,580 @@
{
"aliases": {
/*
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
* │ │ + │ ě │ š │ č │ ř │ ž │ ý │ á │ í │ é │ = │ ' │ │
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
* │ │ Q │ W │ E │ R │ T │ Z │ U │ I │ O │ P │ ú │ ) │ │
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
* │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ů │ § │ ¨ │ │
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
* │ │ \ │ Y │ X │ C │ V │ B │ N │ M │ , │ . │ - │ │
* ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
* │ │ │ │ │ │ │ │
* └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
*/
"KC_1": {
"key": "CZ_PLUS",
"label": "+",
}
"KC_2": {
"key": "CZ_ECAR",
"label": "ě",
}
"KC_3": {
"key": "CZ_SCAR",
"label": "š",
}
"KC_4": {
"key": "CZ_CCAR",
"label": "č",
}
"KC_5": {
"key": "CZ_RCAR",
"label": "ř",
}
"KC_6": {
"key": "CZ_ZCAR",
"label": "ž",
}
"KC_7": {
"key": "CZ_YACU",
"label": "ý",
}
"KC_8": {
"key": "CZ_AACU",
"label": "á",
}
"KC_9": {
"key": "CZ_IACU",
"label": "í",
}
"KC_0": {
"key": "CZ_EACU",
"label": "é",
}
"KC_MINS": {
"key": "CZ_EQL",
"label": "=",
}
"KC_EQL": {
"key": "CZ_ACUT",
"label": "' (dead)",
}
"KC_Q": {
"key": "CZ_Q",
"label": "Q",
}
"KC_W": {
"key": "CZ_W",
"label": "W",
}
"KC_E": {
"key": "CZ_E",
"label": "E",
}
"KC_R": {
"key": "CZ_R",
"label": "R",
}
"KC_T": {
"key": "CZ_T",
"label": "T",
}
"KC_Y": {
"key": "CZ_Z",
"label": "Z",
}
"KC_U": {
"key": "CZ_U",
"label": "U",
}
"KC_I": {
"key": "CZ_I",
"label": "I",
}
"KC_O": {
"key": "CZ_O",
"label": "O",
}
"KC_P": {
"key": "CZ_P",
"label": "P",
}
"KC_LBRC": {
"key": "CZ_UACU",
"label": "ú",
}
"KC_RBRC": {
"key": "CZ_RPRN",
"label": ")",
}
"KC_A": {
"key": "CZ_A",
"label": "A",
}
"KC_S": {
"key": "CZ_S",
"label": "S",
}
"KC_D": {
"key": "CZ_D",
"label": "D",
}
"KC_F": {
"key": "CZ_F",
"label": "F",
}
"KC_G": {
"key": "CZ_G",
"label": "G",
}
"KC_H": {
"key": "CZ_H",
"label": "H",
}
"KC_J": {
"key": "CZ_J",
"label": "J",
}
"KC_K": {
"key": "CZ_K",
"label": "K",
}
"KC_L": {
"key": "CZ_L",
"label": "L",
}
"KC_SCLN": {
"key": "CZ_URNG",
"label": "ů",
}
"KC_QUOT": {
"key": "CZ_SECT",
"label": "§",
}
"KC_NUHS": {
"key": "CZ_DIAE",
"label": "¨ (dead)",
}
"KC_NUBS": {
"key": "CZ_BSLS",
"label": "\\",
}
"KC_Z": {
"key": "CZ_Y",
"label": "Y",
}
"KC_X": {
"key": "CZ_X",
"label": "X",
}
"KC_C": {
"key": "CZ_C",
"label": "C",
}
"KC_V": {
"key": "CZ_V",
"label": "V",
}
"KC_B": {
"key": "CZ_B",
"label": "B",
}
"KC_N": {
"key": "CZ_N",
"label": "N",
}
"KC_M": {
"key": "CZ_M",
"label": "M",
}
"KC_COMM": {
"key": "CZ_COMM",
"label": ",",
}
"KC_DOT": {
"key": "CZ_DOT",
"label": ".",
}
"KC_SLSH": {
"key": "CZ_MINS",
"label": "-",
}
/* Shifted symbols
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
* │ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ % │ ˇ │ │
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
* │ │ │ │ │ │ │ │ │ │ │ │ / │ ( │ │
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
* │ │ │ │ │ │ │ │ │ │ │ " │ ! │ ` │ │
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
* │ │ | │ │ │ │ │ │ │ │ ? │ : │ _ │ │
* ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
* │ │ │ │ │ │ │ │
* └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
*/
"S(CZ_PLUS)": {
"key": "CZ_1",
"label": "1",
}
"S(CZ_ECAR)": {
"key": "CZ_2",
"label": "2",
}
"S(CZ_SCAR)": {
"key": "CZ_3",
"label": "3",
}
"S(CZ_CCAR)": {
"key": "CZ_4",
"label": "4",
}
"S(CZ_RCAR)": {
"key": "CZ_5",
"label": "5",
}
"S(CZ_ZCAR)": {
"key": "CZ_6",
"label": "6",
}
"S(CZ_YACU)": {
"key": "CZ_7",
"label": "7",
}
"S(CZ_AACU)": {
"key": "CZ_8",
"label": "8",
}
"S(CZ_IACU)": {
"key": "CZ_9",
"label": "9",
}
"S(CZ_EACU)": {
"key": "CZ_0",
"label": "0",
}
"S(CZ_EQL)": {
"key": "CZ_PERC",
"label": "%",
}
"S(CZ_ACUT)": {
"key": "CZ_CARN",
"label": "ˇ (dead)",
}
"S(CZ_UACU)": {
"key": "CZ_SLSH",
"label": "/",
}
"S(CZ_RPRN)": {
"key": "CZ_LPRN",
"label": "(",
}
"S(CZ_URNG)": {
"key": "CZ_DQUO",
"label": "\"",
}
"S(CZ_SECT)": {
"key": "CZ_EXLM",
"label": "!",
}
"S(CZ_DIAE)": {
"key": "CZ_GRV",
"label": "`",
}
"S(CZ_BSLS)": {
"key": "CZ_PIPE",
"label": "|",
}
"S(CZ_COMM)": {
"key": "CZ_QUES",
"label": "?",
}
"S(CZ_DOT)": {
"key": "CZ_COLN",
"label": ":",
}
"S(CZ_MINS)": {
"key": "CZ_UNDS",
"label": "_",
}
/* Alted symbols
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
* │ │ │ @ │ # │ $ │ ~ │ ^ │ & │ * │ { │ } │ ° │ ^ │ │
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
* │ │ │ ė │ ę │ € │ │ ż │ │ │ │ │ [ │ ] │ │
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
* │ │ ą │ ß │ ∂ │ │ │ │ │ ł │ ; │ ' │ │ │
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
* │ │ │ │ │ │ │ │ │ │ < │ > │ │ │
* ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
* │ │ │ │ │ │ │ │
* └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
*/
"A(CZ_ECAR)": {
"key": "CZ_AT",
"label": "@",
}
"A(CZ_SCAR)": {
"key": "CZ_HASH",
"label": "#",
}
"A(CZ_CCAR)": {
"key": "CZ_DLR",
"label": "$",
}
"A(CZ_RCAR)": {
"key": "CZ_TILD",
"label": "~",
}
"A(CZ_ZCAR)": {
"key": "CZ_CIRC",
"label": "^",
}
"A(CZ_YACU)": {
"key": "CZ_AMPR",
"label": "&",
}
"A(CZ_AACU)": {
"key": "CZ_ASTR",
"label": "*",
}
"A(CZ_IACU)": {
"key": "CZ_LCBR",
"label": "{",
}
"A(CZ_EACU)": {
"key": "CZ_RCBR",
"label": "}",
}
"A(CZ_EQL)": {
"key": "CZ_RNGA",
"label": "° (dead)",
}
"A(CZ_ACUT)": {
"key": "CZ_DCIR",
"label": "^ (dead)",
}
"A(CZ_W)": {
"key": "CZ_LEDT",
"label": "ė",
}
"A(CZ_E)": {
"key": "CZ_LEOG",
"label": "ę",
}
"A(CZ_R)": {
"key": "CZ_EURO",
"label": "€",
}
"A(CZ_Z)": {
"key": "CZ_LZDT",
"label": "ż",
}
"A(CZ_UACU)": {
"key": "CZ_LBRC",
"label": "[",
}
"A(CZ_RPRN)": {
"key": "CZ_RBRC",
"label": "]",
}
"A(CZ_A)": {
"key": "CZ_LAOG",
"label": "ą",
}
"A(CZ_S)": {
"key": "CZ_SS",
"label": "ß",
}
"A(CZ_D)": {
"key": "CZ_PDIF",
"label": "∂",
}
"A(CZ_H)": {
"key": "CZ_LSQU",
"label": "",
}
"A(CZ_J)": {
"key": "CZ_RSQU",
"label": "",
}
"A(CZ_L)": {
"key": "CZ_LLST",
"label": "ł",
}
"A(CZ_URNG)": {
"key": "CZ_SCLN",
"label": ";",
}
"A(CZ_SECT)": {
"key": "CZ_QUOT",
"label": "'",
}
"A(CZ_N)": {
"key": "CZ_SLQU",
"label": "",
}
"A(CZ_COMM)": {
"key": "CZ_LABK",
"label": "<",
}
"A(CZ_DOT)": {
"key": "CZ_RABK",
"label": ">",
}
"A(CZ_MINS)": {
"key": "CZ_NDSH",
"label": "",
}
/* Shift+Alted symbols
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
* │ │ ¬ │ • │ ≠ │ £ │ ◊ │ † │ ¶ │ ÷ │ « │ » │ , │ - │ │
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
* │ │ │ Ė │ Ę │ ® │ ™ │ Ż │ │ │ │ │ │ │
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
* │ │ Ą │ ∑ │ ∆ │ │ │ “ │ ” │ │ Ł │ … │ ~ │ " │ │
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
* │ │ │ │ │ © │ √ │ │ „ │ │ ≤ │ ≥ │ — │ │
* ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
* │ │ │ │ │ │ │ │
* └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
*/
"S(A(CZ_1))": {
"key": "CZ_NOT",
"label": "¬",
}
"S(A(CZ_2))": {
"key": "CZ_BULT",
"label": "•",
}
"S(A(CZ_3))": {
"key": "CZ_NEQL",
"label": "≠",
}
"S(A(CZ_4))": {
"key": "CZ_PND",
"label": "£",
}
"S(A(CZ_5))": {
"key": "CZ_LOZN",
"label": "◊",
}
"S(A(CZ_6))": {
"key": "CZ_DAGG",
"label": "†",
}
"S(A(CZ_7))": {
"key": "CZ_PARA",
"label": "¶",
}
"S(A(CZ_8))": {
"key": "CZ_DIV",
"label": "÷",
}
"S(A(CZ_9))": {
"key": "CZ_LDAQ",
"label": "«",
}
"S(A(CZ_0))": {
"key": "CZ_RDAQ",
"label": "»",
}
"S(A(CZ_EQL))": {
"key": "CZ_DCOM",
"label": ", (dead)",
}
"S(A(CZ_ACUT))": {
"key": "CZ_DHPN",
"label": "- (dead)",
}
"S(A(CZ_W))": {
"key": "CZ_CEDT",
"label": "Ė",
}
"S(A(CZ_E))": {
"key": "CZ_CEOG",
"label": "Ę",
}
"S(A(CZ_R))": {
"key": "CZ_REGD",
"label": "®",
}
"S(A(CZ_T))": {
"key": "CZ_TM",
"label": "™",
}
"S(A(CZ_Z))": {
"key": "CZ_CZDT",
"label": "Ż",
}
"S(A(CZ_UACU))": {
"key": "CZ_LSAQ",
"label": "",
}
"S(A(CZ_RPRN))": {
"key": "CZ_RSAQ",
"label": "",
}
"S(A(CZ_A))": {
"key": "CZ_CAOG",
"label": "Ą",
}
"S(A(CZ_S))": {
"key": "CZ_NARS",
"label": "∑",
}
"S(A(CZ_D))": {
"key": "CZ_INCR",
"label": "∆",
}
"S(A(CZ_H))": {
"key": "CZ_LDQU",
"label": "“",
}
"S(A(CZ_J))": {
"key": "CZ_RDQU",
"label": "”",
}
"S(A(CZ_L))": {
"key": "CZ_CLST",
"label": "Ł",
}
"S(A(CZ_URNG))": {
"key": "CZ_ELLP",
"label": "…",
}
"S(A(CZ_SECT))": {
"key": "CZ_DTIL",
"label": "~ (dead)",
}
"S(A(CZ_DIAE))": {
"key": "CZ_DDQT",
"label": "\" (dead)",
}
"S(A(CZ_C))": {
"key": "CZ_COPY",
"label": "©",
}
"S(A(CZ_V))": {
"key": "CZ_SQRT",
"label": "√",
}
"S(A(CZ_N))": {
"key": "CZ_DLQU",
"label": "„",
}
"S(A(CZ_COMM))": {
"key": "CZ_LEQL",
"label": "≤",
}
"S(A(CZ_DOT))": {
"key": "CZ_GEQL",
"label": "≥",
}
"S(A(CZ_MINS))": {
"key": "CZ_MDSH",
"label": "—",
}
}
}

View File

@ -0,0 +1,35 @@
# MechKeys ACR60 Layout Updates
This PR removed and changed some of the layouts that were configured for
the ACR60. If you use one of the following layouts, you will need to
update your keymap:
- [`LAYOUT_hhkb`](#layout-hhkb)
- [`LAYOUT_true_hhkb`](#layout-true-hhkb)
- [`LAYOUT_directional`](#layout-directional)
- [`LAYOUT_mitchsplit`](#layout-mitchsplit)
## `LAYOUT_hhkb` :id=layout-hhkb
1. Change your layout macro to `LAYOUT_60_hhkb`.
2. Remove any keycodes for the key between Left Shift and QWERTY Z.
## `LAYOUT_true_hhkb` :id=layout-true-hhkb
1. Change your layout macro to `LAYOUT_60_true_hhkb`.
2. Remove any keycodes for the key between Left Shift and QWERTY Z.
## `LAYOUT_directional` :id=layout-directional
1. Change your layout macro to `LAYOUT_60_ansi_arrow_split_bs`.
2. Remove any keycodes for the key between Left Shift and QWERTY Z.
3. Remove any keycodes for the keys immediately before *and* after the
1.25u key of Split Spacebar.
If you need split spacebars, you may implement
`LAYOUT_60_ansi_arrow_split_space_split_bs` and change your layout to
it, removing the keycode between Left Shift and QWERTY Z.
## `LAYOUT_mitchsplit` :id=layout-mitchsplit
1. Use `LAYOUT_60_ansi_split_space_split_rshift`.

View File

@ -23,6 +23,8 @@ These headers are located in [`quantum/keymap_extras/`](https://github.com/qmk/q
|Canadian Multilingual (CSA) |`keymap_canadian_multilingual.h` |`sendstring_canadian_multilingual.h`| |Canadian Multilingual (CSA) |`keymap_canadian_multilingual.h` |`sendstring_canadian_multilingual.h`|
|Croatian |`keymap_croatian.h` |`sendstring_croatian.h` | |Croatian |`keymap_croatian.h` |`sendstring_croatian.h` |
|Czech |`keymap_czech.h` |`sendstring_czech.h` | |Czech |`keymap_czech.h` |`sendstring_czech.h` |
|Czech (macOS, ANSI) |`keymap_czech_mac_ansi.h` |`sendstring_czech_mac_ansi.h` |
|Czech (macOS, ISO) |`keymap_czech_mac_iso.h` |`sendstring_czech_mac_iso.h` |
|Danish |`keymap_danish.h` |`sendstring_danish.h` | |Danish |`keymap_danish.h` |`sendstring_danish.h` |
|Dutch (Belgium) |`keymap_belgian.h` |`sendstring_belgian.h` | |Dutch (Belgium) |`keymap_belgian.h` |`sendstring_belgian.h` |
|English (Ireland) |`keymap_irish.h` | | |English (Ireland) |`keymap_irish.h` | |

View File

@ -25,16 +25,14 @@ bool led_update_kb(led_t led_state)
if (res) { if (res) {
if (led_state.caps_lock) { if (led_state.caps_lock) {
// output low // output low
DDRB |= (1<<0); gpio_set_pin_output(B0);
PORTB &= ~(1<<0); gpio_write_pin_low(B0);
DDRD |= (1<<5); gpio_set_pin_output(D5);
PORTD &= ~(1<<5); gpio_write_pin_low(D5);
} else { } else {
// Hi-Z // Hi-Z
DDRB &= ~(1<<0); gpio_set_pin_input(B0);
PORTB &= ~(1<<0); gpio_set_pin_input(D5);
DDRD &= ~(1<<5);
PORTD &= ~(1<<5);
} }
} }
return false; return false;

View File

@ -126,14 +126,18 @@ void matrix_print(void)
static void init_cols(void) static void init_cols(void)
{ {
// Input with pull-up(DDR:0, PORT:1) // Input with pull-up(DDR:0, PORT:1)
DDRF &= ~(1<<4 | 1<<5 | 1<<6 | 1<<7); gpio_set_pin_input_high(F4);
PORTF |= (1<<4 | 1<<5 | 1<<6 | 1<<7); gpio_set_pin_input_high(F5);
DDRE &= ~(1<<6); gpio_set_pin_input_high(F6);
PORTE |= (1<<6); gpio_set_pin_input_high(F7);
DDRD &= ~(1<<7); gpio_set_pin_input_high(E6);
PORTD |= (1<<7); gpio_set_pin_input_high(D7);
DDRB &= ~(1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6); gpio_set_pin_input_high(B1);
PORTB |= (1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6); gpio_set_pin_input_high(B2);
gpio_set_pin_input_high(B3);
gpio_set_pin_input_high(B4);
gpio_set_pin_input_high(B5);
gpio_set_pin_input_high(B6);
} }
static matrix_row_t read_cols(void) static matrix_row_t read_cols(void)
@ -160,10 +164,10 @@ static matrix_row_t read_cols(void)
static void unselect_rows(void) static void unselect_rows(void)
{ {
// Hi-Z(DDR:0, PORT:0) to unselect // Hi-Z(DDR:0, PORT:0) to unselect
DDRD &= ~0b00010011; gpio_set_pin_input(C6);
PORTD &= ~0b00010011; gpio_set_pin_input(D0);
DDRC &= ~0b01000000; gpio_set_pin_input(D1);
PORTC &= ~0b01000000; gpio_set_pin_input(D4);
} }
static void select_row(uint8_t row) static void select_row(uint8_t row)
@ -171,20 +175,20 @@ static void select_row(uint8_t row)
// Output low(DDR:1, PORT:0) to select // Output low(DDR:1, PORT:0) to select
switch (row) { switch (row) {
case 0: case 0:
DDRD |= (1<<1); gpio_set_pin_output(D1);
PORTD &= ~(1<<1); gpio_write_pin_low(D1);
break; break;
case 1: case 1:
DDRD |= (1<<0); gpio_set_pin_output(D0);
PORTD &= ~(1<<0); gpio_write_pin_low(D0);
break; break;
case 2: case 2:
DDRD |= (1<<4); gpio_set_pin_output(D4);
PORTD &= ~(1<<4); gpio_write_pin_low(D4);
break; break;
case 3: case 3:
DDRC |= (1<<6); gpio_set_pin_output(C6);
PORTC &= ~(1<<6); gpio_write_pin_low(C6);
break; break;
} }
} }

View File

@ -65,8 +65,8 @@ void matrix_init(void)
#endif #endif
// 85 REST // 85 REST
DDRD |= _BV(PD7); gpio_set_pin_output(D7);
PORTD |= _BV(PD7); gpio_write_pin_high(D7);
// initialize row and col // initialize row and col
init_rows(); init_rows();
@ -143,36 +143,35 @@ static void init_cols(void)
DDRD &= 0b00011100; DDRD &= 0b00011100;
PORTD |= 0b11100011; PORTD |= 0b11100011;
DDRB &= ~(_BV(PB6) | _BV(PB7)| _BV(PB0)); gpio_set_pin_input_high(B0);
PORTB |= (_BV(PB6) | _BV(PB7)| _BV(PB0)); gpio_set_pin_input_high(B6);
gpio_set_pin_input_high(B7);
DDRE &= ~_BV(PE6); gpio_set_pin_input_high(E6);
PORTE |= _BV(PE6);
DDRC &= ~_BV(PC7); gpio_set_pin_input_high(C7);
PORTC |= _BV(PC7);
} }
static matrix_row_t read_cols(void) static matrix_row_t read_cols(void)
{ {
return (PINF&_BV(PF7) ? 0 : (1<<0)) | return (gpio_read_pin(F7) ? 0 : (1<<0)) |
(PINF&_BV(PF6) ? 0 : (1<<1)) | (gpio_read_pin(F6) ? 0 : (1<<1)) |
(PINF&_BV(PF5) ? 0 : (1<<2)) | (gpio_read_pin(F5) ? 0 : (1<<2)) |
(PINF&_BV(PF4) ? 0 : (1<<3)) | (gpio_read_pin(F4) ? 0 : (1<<3)) |
(PINF&_BV(PF1) ? 0 : (1<<4)) | (gpio_read_pin(F1) ? 0 : (1<<4)) |
(PINF&_BV(PF0) ? 0 : (1<<5)) | (gpio_read_pin(F0) ? 0 : (1<<5)) |
(PINE&_BV(PE6) ? 0 : (1<<6)) | (gpio_read_pin(E6) ? 0 : (1<<6)) |
(PIND&_BV(PD7) ? 0 : (1<<7)) | (gpio_read_pin(D7) ? 0 : (1<<7)) |
(PIND&_BV(PD6) ? 0 : (1<<8)) | (gpio_read_pin(D6) ? 0 : (1<<8)) |
(PIND&_BV(PD5) ? 0 : (1<<9)) | (gpio_read_pin(D5) ? 0 : (1<<9)) |
(PIND&_BV(PD1) ? 0 : (1<<10)) | (gpio_read_pin(D1) ? 0 : (1<<10)) |
(PIND&_BV(PD0) ? 0 : (1<<11)) | (gpio_read_pin(D0) ? 0 : (1<<11)) |
(PINB&_BV(PB7) ? 0 : (1<<12)) | (gpio_read_pin(B7) ? 0 : (1<<12)) |
(PINB&_BV(PB6) ? 0 : (1<<13)) | (gpio_read_pin(B6) ? 0 : (1<<13)) |
(PINB&_BV(PB0) ? 0 : (1<<14)) | (gpio_read_pin(B0) ? 0 : (1<<14)) |
(PINC&_BV(PC7) ? 0 : (1<<15)); (gpio_read_pin(C7) ? 0 : (1<<15));
} }
/* Row pin configuration /* Row pin configuration
@ -184,21 +183,23 @@ static matrix_row_t read_cols(void)
static void init_rows(void) static void init_rows(void)
{ {
DDRB |= (1<<PB1 | 1<<PB2 | 1<<PB3); gpio_set_pin_input(B1);
gpio_set_pin_input(B2);
gpio_set_pin_input(B3);
} }
static void unselect_rows(void) static void unselect_rows(void)
{ {
// Hi-Z(DDR:0, PORT:0) to unselect // Hi-Z(DDR:0, PORT:0) to unselect
PORTB |= (1<<PB1); gpio_write_pin_high(B1);
PORTB |= (1<<PB2); gpio_write_pin_high(B2);
PORTB |= (1<<PB3); gpio_write_pin_high(B3);
} }
static void select_row(uint8_t row) static void select_row(uint8_t row)
{ {
// Output low(DDR:1, PORT:0) to select // Output low(DDR:1, PORT:0) to select
(row & (1<<0)) ? (PORTB |= (1<<PB3)) : (PORTB &= ~(1<<PB3)); gpio_write_pin(B3, row & (1<<0));
(row & (1<<1)) ? (PORTB |= (1<<PB2)) : (PORTB &= ~(1<<PB2)); gpio_write_pin(B2, row & (1<<1));
(row & (1<<2)) ? (PORTB |= (1<<PB1)) : (PORTB &= ~(1<<PB1)); gpio_write_pin(B1, row & (1<<2));
} }

View File

@ -54,15 +54,13 @@ void matrix_init_kb(void) {
TCCR1B = 0b00001001; // set and configure fast PWM TCCR1B = 0b00001001; // set and configure fast PWM
// (tied to Vcc for hardware convenience) // (tied to Vcc for hardware convenience)
DDRB &= ~(1<<4); // set B(4) as input gpio_set_pin_input(B4); // set B(4) as input, internal pull-up disabled
PORTB &= ~(1<<4); // set B(4) internal pull-up disabled
// unused pins - D4, D5, E6 // unused pins - D4, D5, E6
// set as input with internal pull-up enabled // set as input with internal pull-up enabled
DDRD &= ~(1<<5 | 1<<4); gpio_set_pin_input_high(D4);
DDRE &= ~(1<<6); gpio_set_pin_input_high(D5);
PORTD |= (1<<5 | 1<<4); gpio_set_pin_input_high(E6);
PORTE |= (1<<6);
keyboard_config.raw = eeconfig_read_kb(); keyboard_config.raw = eeconfig_read_kb();
bajjak_led_all_set((uint8_t)keyboard_config.led_level * 255 / 4 ); bajjak_led_all_set((uint8_t)keyboard_config.led_level * 255 / 4 );

View File

@ -2,19 +2,56 @@
#include "quantum.h" #include "quantum.h"
inline void sixshooter_led_0_on(void) { DDRB |= (1<<6); PORTB |= (1<<6); } #define SIXSHOOTER_LED_0_PIN B6
inline void sixshooter_led_1_on(void) { DDRC |= (1<<7); PORTC |= (1<<7); } #define SIXSHOOTER_LED_1_PIN C7
inline void sixshooter_led_2_on(void) { DDRD |= (1<<0); PORTD |= (1<<0); } #define SIXSHOOTER_LED_2_PIN D0
inline void sixshooter_led_3_on(void) { DDRB |= (1<<5); PORTB |= (1<<5); } #define SIXSHOOTER_LED_3_PIN B5
inline void sixshooter_led_4_on(void) { DDRD |= (1<<7); PORTD |= (1<<7); } #define SIXSHOOTER_LED_4_PIN D7
inline void sixshooter_led_5_on(void) { DDRB |= (1<<7); PORTB |= (1<<7); } #define SIXSHOOTER_LED_5_PIN B7
inline void sixshooter_led_0_off(void) { DDRB &= ~(1<<6); PORTB &= ~(1<<6); } inline void sixshooter_led_0_on(void) {
inline void sixshooter_led_1_off(void) { DDRC &= ~(1<<7); PORTC &= ~(1<<7); } gpio_set_pin_output(SIXSHOOTER_LED_0_PIN);
inline void sixshooter_led_2_off(void) { DDRD &= ~(1<<0); PORTD &= ~(1<<0); } gpio_write_pin_high(SIXSHOOTER_LED_0_PIN);
inline void sixshooter_led_3_off(void) { DDRB &= ~(1<<5); PORTB &= ~(1<<5); } }
inline void sixshooter_led_4_off(void) { DDRD &= ~(1<<7); PORTD &= ~(1<<7); } inline void sixshooter_led_1_on(void) {
inline void sixshooter_led_5_off(void) { DDRB &= ~(1<<7); PORTB &= ~(1<<7); } gpio_set_pin_output(SIXSHOOTER_LED_1_PIN);
gpio_write_pin_high(SIXSHOOTER_LED_1_PIN);
}
inline void sixshooter_led_2_on(void) {
gpio_set_pin_output(SIXSHOOTER_LED_2_PIN);
gpio_write_pin_high(SIXSHOOTER_LED_2_PIN);
}
inline void sixshooter_led_3_on(void) {
gpio_set_pin_output(SIXSHOOTER_LED_3_PIN);
gpio_write_pin_high(SIXSHOOTER_LED_3_PIN);
}
inline void sixshooter_led_4_on(void) {
gpio_set_pin_output(SIXSHOOTER_LED_4_PIN);
gpio_write_pin_high(SIXSHOOTER_LED_4_PIN);
}
inline void sixshooter_led_5_on(void) {
gpio_set_pin_output(SIXSHOOTER_LED_5_PIN);
gpio_write_pin_high(SIXSHOOTER_LED_5_PIN);
}
inline void sixshooter_led_0_off(void) {
gpio_set_pin_input(SIXSHOOTER_LED_0_PIN);
}
inline void sixshooter_led_1_off(void) {
gpio_set_pin_input(SIXSHOOTER_LED_1_PIN);
}
inline void sixshooter_led_2_off(void) {
gpio_set_pin_input(SIXSHOOTER_LED_2_PIN);
}
inline void sixshooter_led_3_off(void) {
gpio_set_pin_input(SIXSHOOTER_LED_3_PIN);
}
inline void sixshooter_led_4_off(void) {
gpio_set_pin_input(SIXSHOOTER_LED_4_PIN);
}
inline void sixshooter_led_5_off(void) {
gpio_set_pin_input(SIXSHOOTER_LED_5_PIN);
}
inline void sixshooter_led_all_on(void) { inline void sixshooter_led_all_on(void) {
sixshooter_led_0_on(); sixshooter_led_0_on();

11
keyboards/chew/config.h Normal file
View File

@ -0,0 +1,11 @@
// Copyright 2024 Florent (@FLinguenheld)
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
/* Flash */
#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET // Activates the double-tap behavior
#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 200U // In ms in which the double tap can occur
#define EE_HANDS
#define SERIAL_USART_TX_PIN GP11

84
keyboards/chew/info.json Normal file
View File

@ -0,0 +1,84 @@
{
"manufacturer": "florent@linguenheld.fr",
"keyboard_name": "chew",
"maintainer": "florent@linguenheld.fr",
"bootloader": "rp2040",
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": true
},
"matrix_pins": {
"direct": [
["GP4", "GP3", "GP2", "GP1", "GP0"],
["GP15", "GP26", "GP27", "GP28", "GP29"],
["GP14", "GP13", "GP9", "GP8", "NO_PIN"],
["GP7", "GP6", "GP5", "NO_PIN", "NO_PIN"]
]
},
"processor": "RP2040",
"split": {
"enabled": true,
"matrix_pins": {
"right": {
"direct": [
["GP0", "GP1", "GP2", "GP3", "GP4"],
["GP29", "GP28", "GP27", "GP26", "GP15"],
["GP8", "GP9", "GP13", "GP14", "NO_PIN"],
["GP5", "GP6", "GP7", "NO_PIN", "NO_PIN"]
]
}
},
"transport": {
"watchdog": true
}
},
"usb": {
"device_version": "1.0.0",
"pid": "0x0000",
"vid": "0xFEED"
},
"layouts": {
"LAYOUT": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0.25},
{"matrix": [0, 1], "x": 1, "y": 0.125},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0.125},
{"matrix": [0, 4], "x": 4, "y": 0.25},
{"matrix": [4, 0], "x": 7, "y": 0.25},
{"matrix": [4, 1], "x": 8, "y": 0.125},
{"matrix": [4, 2], "x": 9, "y": 0},
{"matrix": [4, 3], "x": 10, "y": 0.125},
{"matrix": [4, 4], "x": 11, "y": 0.25},
{"matrix": [1, 0], "x": 0, "y": 1.25},
{"matrix": [1, 1], "x": 1, "y": 1.125},
{"matrix": [1, 2], "x": 2, "y": 1},
{"matrix": [1, 3], "x": 3, "y": 1.125},
{"matrix": [1, 4], "x": 4, "y": 1.25},
{"matrix": [5, 0], "x": 7, "y": 1.25},
{"matrix": [5, 1], "x": 8, "y": 1.125},
{"matrix": [5, 2], "x": 9, "y": 1},
{"matrix": [5, 3], "x": 10, "y": 1.125},
{"matrix": [5, 4], "x": 11, "y": 1.25},
{"matrix": [2, 0], "x": 0, "y": 2.25},
{"matrix": [2, 1], "x": 1, "y": 2.125},
{"matrix": [2, 2], "x": 2, "y": 2},
{"matrix": [2, 3], "x": 3, "y": 2.125},
{"matrix": [6, 0], "x": 8, "y": 2.125},
{"matrix": [6, 1], "x": 9, "y": 2},
{"matrix": [6, 2], "x": 10, "y": 2.125},
{"matrix": [6, 3], "x": 11, "y": 2.25},
{"matrix": [3, 0], "x": 2.5, "y": 3.25},
{"matrix": [3, 1], "x": 3.5, "y": 3.5},
{"matrix": [3, 2], "x": 4.5, "y": 3.75},
{"matrix": [7, 0], "x": 6.5, "y": 3.75},
{"matrix": [7, 1], "x": 7.5, "y": 3.5},
{"matrix": [7, 2], "x": 8.5, "y": 3.25}
]
}
}
}

View File

@ -0,0 +1,27 @@
// Copyright 2024 QMK
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/*
*
* Q W E R T Y U I O P
*
* A S D F G H J K L ;
*
* Z X C V M , . /
*
*
* B N
* Bsp Ent
* Alt
*
*/
[0] = LAYOUT(
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,
KC_Z, KC_X, KC_C, KC_V, KC_M, KC_COMM, KC_DOT, KC_SLSH,
KC_B, KC_BSPC, KC_RALT, KC_SPC, KC_ENT, KC_N
)
};

38
keyboards/chew/readme.md Normal file
View File

@ -0,0 +1,38 @@
## Chew
![Chew front photo](https://live.staticflickr.com/65535/53681212617_90e4eebaf9_o.jpg)
![Chew front photo](https://live.staticflickr.com/65535/53682442119_1fcea26fef_o.jpg)
A humble 34 key choc-spaced keyboard.
- Keyboard Maintainer: [Florent Linguenheld](https://github.com/flinguenheld/)
- Visit the repository to get the last release: [Chew](https://github.com/flinguenheld/chew)
- Read the wiki to have some help or information: [Chew wiki](https://github.com/flinguenheld/chew/wiki)
![squirrel](https://github.com/flinguenheld/chew/blob/main/images/squirrel_brown.png?raw=true)
### Requirements
- 2x PCB
- 2x MCU board [RP2040-Zero](https://www.waveshare.com/wiki/RP2040-Zero)
- 2x TRRS jack
- 34 switches Choc V1 **only**
- 34 keycaps Choc V1
Optional:
- 23 [Mill Max sockets](https://splitkb.com/collections/keyboard-parts/products/mill-max-low-profile-sockets)
- 34 [kailh hotswap sockets](https://cdn.shopify.com/s/files/1/0588/1108/9090/files/5118-Choc-Socket.pdf?v=1686715063)
- 2x Back PCB + screws and bolts
- 2x [Tenting pucks](https://splitkb.com/collections/keyboard-parts/products/tenting-puck)
- 2x [Tripods](https://www.manfrotto.com/us-en/pocket-support-large-black-mp3-bk/)
### Bootloader
The controller has two buttons, so you can enter the bootloader in 2 ways:
- Maintain the **boot** button and plug the usb cable in.
- Press twice the **reset** button.
![hazelnuts](https://github.com/flinguenheld/chew/blob/main/images/hazelnuts.png?raw=true)
![Chew back photo](https://live.staticflickr.com/65535/53682442124_677ffa6cb5_o.jpg)

1
keyboards/chew/rules.mk Normal file
View File

@ -0,0 +1 @@
SERIAL_DRIVER = vendor

View File

@ -0,0 +1,679 @@
{
"manufacturer": "Cipulot",
"keyboard_name": "Chroma",
"maintainer": "Cipulot",
"bootloader": "stm32-dfu",
"build": {
"lto": true
},
"diode_direction": "COL2ROW",
"features": {
"extrakey": true,
"mousekey": true,
"nkro": true
},
"matrix_pins": {
"cols": ["A5", "A6", "A7", "B0", "B1", "B2", "B10", "B11", "B12", "A15", "B3", "B4", "B5", "B7", "B6"],
"rows": ["F0", "A2", "A3", "A4", "C15"]
},
"processor": "STM32F072",
"usb": {
"device_version": "0.0.1",
"pid": "0x6BBF",
"shared_endpoint": {
"keyboard": true
},
"vid": "0x6369"
},
"community_layouts": ["60_ansi_tsangan", "60_tsangan_hhkb", "60_ansi_wkl", "60_ansi_wkl_split_bs_rshift", "60_hhkb", "60_iso_tsangan", "60_iso_tsangan_split_bs_rshift", "60_iso_wkl", "60_iso_wkl_split_bs_rshift"],
"layouts": {
"LAYOUT_60_ansi_tsangan": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 14], "x": 13, "y": 0, "w": 2},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [3, 2], "x": 2.25, "y": 3},
{"matrix": [3, 3], "x": 3.25, "y": 3},
{"matrix": [3, 4], "x": 4.25, "y": 3},
{"matrix": [3, 5], "x": 5.25, "y": 3},
{"matrix": [3, 6], "x": 6.25, "y": 3},
{"matrix": [3, 7], "x": 7.25, "y": 3},
{"matrix": [3, 8], "x": 8.25, "y": 3},
{"matrix": [3, 9], "x": 9.25, "y": 3},
{"matrix": [3, 10], "x": 10.25, "y": 3},
{"matrix": [3, 11], "x": 11.25, "y": 3},
{"matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [4, 1], "x": 1.5, "y": 4},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 7], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 12], "x": 12.5, "y": 4},
{"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
]
},
"LAYOUT_60_ansi_wkl": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 14], "x": 13, "y": 0, "w": 2},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [3, 2], "x": 2.25, "y": 3},
{"matrix": [3, 3], "x": 3.25, "y": 3},
{"matrix": [3, 4], "x": 4.25, "y": 3},
{"matrix": [3, 5], "x": 5.25, "y": 3},
{"matrix": [3, 6], "x": 6.25, "y": 3},
{"matrix": [3, 7], "x": 7.25, "y": 3},
{"matrix": [3, 8], "x": 8.25, "y": 3},
{"matrix": [3, 9], "x": 9.25, "y": 3},
{"matrix": [3, 10], "x": 10.25, "y": 3},
{"matrix": [3, 11], "x": 11.25, "y": 3},
{"matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 7], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
]
},
"LAYOUT_60_ansi_wkl_split_bs_rshift": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 13], "x": 13, "y": 0},
{"matrix": [0, 14], "x": 14, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [3, 2], "x": 2.25, "y": 3},
{"matrix": [3, 3], "x": 3.25, "y": 3},
{"matrix": [3, 4], "x": 4.25, "y": 3},
{"matrix": [3, 5], "x": 5.25, "y": 3},
{"matrix": [3, 6], "x": 6.25, "y": 3},
{"matrix": [3, 7], "x": 7.25, "y": 3},
{"matrix": [3, 8], "x": 8.25, "y": 3},
{"matrix": [3, 9], "x": 9.25, "y": 3},
{"matrix": [3, 10], "x": 10.25, "y": 3},
{"matrix": [3, 11], "x": 11.25, "y": 3},
{"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [3, 13], "x": 14, "y": 3},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 7], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
]
},
"LAYOUT_60_hhkb": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 13], "x": 13, "y": 0},
{"matrix": [0, 14], "x": 14, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [3, 2], "x": 2.25, "y": 3},
{"matrix": [3, 3], "x": 3.25, "y": 3},
{"matrix": [3, 4], "x": 4.25, "y": 3},
{"matrix": [3, 5], "x": 5.25, "y": 3},
{"matrix": [3, 6], "x": 6.25, "y": 3},
{"matrix": [3, 7], "x": 7.25, "y": 3},
{"matrix": [3, 8], "x": 8.25, "y": 3},
{"matrix": [3, 9], "x": 9.25, "y": 3},
{"matrix": [3, 10], "x": 10.25, "y": 3},
{"matrix": [3, 11], "x": 11.25, "y": 3},
{"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [3, 13], "x": 14, "y": 3},
{"matrix": [4, 1], "x": 1.5, "y": 4},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 7], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 12], "x": 12.5, "y": 4}
]
},
"LAYOUT_60_iso_tsangan": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 14], "x": 13, "y": 0, "w": 2},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 12], "x": 12.75, "y": 2},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
{"matrix": [3, 1], "x": 1.25, "y": 3},
{"matrix": [3, 2], "x": 2.25, "y": 3},
{"matrix": [3, 3], "x": 3.25, "y": 3},
{"matrix": [3, 4], "x": 4.25, "y": 3},
{"matrix": [3, 5], "x": 5.25, "y": 3},
{"matrix": [3, 6], "x": 6.25, "y": 3},
{"matrix": [3, 7], "x": 7.25, "y": 3},
{"matrix": [3, 8], "x": 8.25, "y": 3},
{"matrix": [3, 9], "x": 9.25, "y": 3},
{"matrix": [3, 10], "x": 10.25, "y": 3},
{"matrix": [3, 11], "x": 11.25, "y": 3},
{"matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [4, 1], "x": 1.5, "y": 4},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 7], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 12], "x": 12.5, "y": 4},
{"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
]
},
"LAYOUT_60_iso_tsangan_split_bs_rshift": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 13], "x": 13, "y": 0},
{"matrix": [0, 14], "x": 14, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 12], "x": 12.75, "y": 2},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
{"matrix": [3, 1], "x": 1.25, "y": 3},
{"matrix": [3, 2], "x": 2.25, "y": 3},
{"matrix": [3, 3], "x": 3.25, "y": 3},
{"matrix": [3, 4], "x": 4.25, "y": 3},
{"matrix": [3, 5], "x": 5.25, "y": 3},
{"matrix": [3, 6], "x": 6.25, "y": 3},
{"matrix": [3, 7], "x": 7.25, "y": 3},
{"matrix": [3, 8], "x": 8.25, "y": 3},
{"matrix": [3, 9], "x": 9.25, "y": 3},
{"matrix": [3, 10], "x": 10.25, "y": 3},
{"matrix": [3, 11], "x": 11.25, "y": 3},
{"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [3, 13], "x": 14, "y": 3},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [4, 1], "x": 1.5, "y": 4},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 7], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 12], "x": 12.5, "y": 4},
{"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
]
},
"LAYOUT_60_iso_wkl": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 14], "x": 13, "y": 0, "w": 2},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 12], "x": 12.75, "y": 2},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
{"matrix": [3, 1], "x": 1.25, "y": 3},
{"matrix": [3, 2], "x": 2.25, "y": 3},
{"matrix": [3, 3], "x": 3.25, "y": 3},
{"matrix": [3, 4], "x": 4.25, "y": 3},
{"matrix": [3, 5], "x": 5.25, "y": 3},
{"matrix": [3, 6], "x": 6.25, "y": 3},
{"matrix": [3, 7], "x": 7.25, "y": 3},
{"matrix": [3, 8], "x": 8.25, "y": 3},
{"matrix": [3, 9], "x": 9.25, "y": 3},
{"matrix": [3, 10], "x": 10.25, "y": 3},
{"matrix": [3, 11], "x": 11.25, "y": 3},
{"matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 7], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
]
},
"LAYOUT_60_iso_wkl_split_bs_rshift": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 13], "x": 13, "y": 0},
{"matrix": [0, 14], "x": 14, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 12], "x": 12.75, "y": 2},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
{"matrix": [3, 1], "x": 1.25, "y": 3},
{"matrix": [3, 2], "x": 2.25, "y": 3},
{"matrix": [3, 3], "x": 3.25, "y": 3},
{"matrix": [3, 4], "x": 4.25, "y": 3},
{"matrix": [3, 5], "x": 5.25, "y": 3},
{"matrix": [3, 6], "x": 6.25, "y": 3},
{"matrix": [3, 7], "x": 7.25, "y": 3},
{"matrix": [3, 8], "x": 8.25, "y": 3},
{"matrix": [3, 9], "x": 9.25, "y": 3},
{"matrix": [3, 10], "x": 10.25, "y": 3},
{"matrix": [3, 11], "x": 11.25, "y": 3},
{"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [3, 13], "x": 14, "y": 3},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 7], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
]
},
"LAYOUT_60_tsangan_hhkb": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 13], "x": 13, "y": 0},
{"matrix": [0, 14], "x": 14, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [3, 2], "x": 2.25, "y": 3},
{"matrix": [3, 3], "x": 3.25, "y": 3},
{"matrix": [3, 4], "x": 4.25, "y": 3},
{"matrix": [3, 5], "x": 5.25, "y": 3},
{"matrix": [3, 6], "x": 6.25, "y": 3},
{"matrix": [3, 7], "x": 7.25, "y": 3},
{"matrix": [3, 8], "x": 8.25, "y": 3},
{"matrix": [3, 9], "x": 9.25, "y": 3},
{"matrix": [3, 10], "x": 10.25, "y": 3},
{"matrix": [3, 11], "x": 11.25, "y": 3},
{"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [3, 13], "x": 14, "y": 3},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [4, 1], "x": 1.5, "y": 4},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 7], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 12], "x": 12.5, "y": 4},
{"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
]
},
"LAYOUT_all": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 13], "x": 13, "y": 0},
{"matrix": [0, 14], "x": 14, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 12], "x": 12.75, "y": 2},
{"matrix": [2, 13], "x": 13.75, "y": 2, "w": 1.25},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
{"matrix": [3, 1], "x": 1.25, "y": 3},
{"matrix": [3, 2], "x": 2.25, "y": 3},
{"matrix": [3, 3], "x": 3.25, "y": 3},
{"matrix": [3, 4], "x": 4.25, "y": 3},
{"matrix": [3, 5], "x": 5.25, "y": 3},
{"matrix": [3, 6], "x": 6.25, "y": 3},
{"matrix": [3, 7], "x": 7.25, "y": 3},
{"matrix": [3, 8], "x": 8.25, "y": 3},
{"matrix": [3, 9], "x": 9.25, "y": 3},
{"matrix": [3, 10], "x": 10.25, "y": 3},
{"matrix": [3, 11], "x": 11.25, "y": 3},
{"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [3, 13], "x": 14, "y": 3},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [4, 1], "x": 1.5, "y": 4},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 7], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 12], "x": 12.5, "y": 4},
{"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
]
}
}
}

View File

@ -0,0 +1,43 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format off
[0] = LAYOUT_60_ansi_tsangan(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
KC_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_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_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL
),
[1] = LAYOUT_60_ansi_tsangan(
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_DEL,
_______, _______, KC_UP, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, _______, _______,
_______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______
),
[2] = LAYOUT_60_ansi_tsangan(
QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______
)
// clang-format on
};

View File

@ -0,0 +1,43 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format off
[0] = LAYOUT_60_ansi_wkl(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
KC_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_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_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL
),
[1] = LAYOUT_60_ansi_wkl(
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_DEL,
_______, _______, KC_UP, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, _______, _______,
_______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______
),
[2] = LAYOUT_60_ansi_wkl(
QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______
)
// clang-format on
};

View File

@ -0,0 +1,43 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format off
[0] = LAYOUT_60_ansi_wkl_split_bs_rshift(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
KC_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_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1),
KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL
),
[1] = LAYOUT_60_ansi_wkl_split_bs_rshift(
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_DEL,
_______, _______, KC_UP, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, _______, _______,
_______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, MO(2)
),
[2] = LAYOUT_60_ansi_wkl_split_bs_rshift(
QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______
)
// clang-format on
};

View File

@ -0,0 +1,43 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format off
[0] = LAYOUT_60_iso_tsangan(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
KC_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_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL
),
[1] = LAYOUT_60_iso_tsangan(
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_DEL,
_______, _______, KC_UP, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, _______,
_______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______
),
[2] = LAYOUT_60_iso_tsangan(
QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______
)
// clang-format on
};

View File

@ -0,0 +1,43 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format off
[0] = LAYOUT_60_iso_tsangan_split_bs_rshift(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1),
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL
),
[1] = LAYOUT_60_iso_tsangan_split_bs_rshift(
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_DEL,
_______, _______, KC_UP, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, _______,
_______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, MO(2)
),
[2] = LAYOUT_60_iso_tsangan_split_bs_rshift(
QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______
)
// clang-format on
};

View File

@ -0,0 +1,43 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format off
[0] = LAYOUT_60_iso_wkl(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
KC_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_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL
),
[1] = LAYOUT_60_iso_wkl(
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_DEL,
_______, _______, KC_UP, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, _______,
_______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______
),
[2] = LAYOUT_60_iso_wkl(
QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______
)
// clang-format on
};

View File

@ -0,0 +1,43 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format off
[0] = LAYOUT_60_iso_wkl_split_bs_rshift(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1),
KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL
),
[1] = LAYOUT_60_iso_wkl_split_bs_rshift(
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_DEL,
_______, _______, KC_UP, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, _______,
_______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, MO(2)
),
[2] = LAYOUT_60_iso_wkl_split_bs_rshift(
QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______
)
// clang-format on
};

View File

@ -0,0 +1,43 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format off
[0] = LAYOUT_all(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1),
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL
),
[1] = LAYOUT_all(
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_DEL,
_______, _______, KC_UP, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, _______, _______,
_______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, MO(2)
),
[2] = LAYOUT_all(
QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______
)
// clang-format on
};

View File

@ -0,0 +1,43 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format off
[0] = LAYOUT_all(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1),
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL
),
[1] = LAYOUT_all(
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_DEL,
_______, _______, KC_UP, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, _______, _______,
_______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, MO(2)
),
[2] = LAYOUT_all(
QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______
)
// clang-format on
};

View File

@ -0,0 +1 @@
VIA_ENABLE = yes

View File

@ -0,0 +1,27 @@
# Chroma
![Chroma](https://i.imgur.com/clhRkDDh.png)
A 60% hot swap PCB for MX switches.
* Keyboard Maintainer: [cipulot](https://github.com/cipulot)
* Hardware Supported: Chroma
* Hardware Availability: [Eloquent Clicks](https://eloquentclicks.com/)
Make example for this keyboard (after setting up your build environment):
make cipulot/chroma:default
Flashing example for this keyboard:
make cipulot/chroma:default:flash
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
## Bootloader
Enter the bootloader in 3 ways:
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is configured.
* **Physical reset button**: Long press the reset button soldered on the PCB.
* **Bootmagic reset**: Hold down the top left key and plug in the controller.

View File

View File

@ -62,8 +62,3 @@
#define EECONFIG_KB_DATA_SIZE 57 #define EECONFIG_KB_DATA_SIZE 57
/* 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

View File

@ -6,6 +6,12 @@
"build": { "build": {
"lto": true "lto": true
}, },
"qmk": {
"locking": {
"enabled": true,
"resync": true
}
},
"diode_direction": "COL2ROW", "diode_direction": "COL2ROW",
"features": { "features": {
"bootmagic": false, "bootmagic": false,

View File

@ -1,4 +1,5 @@
CUSTOM_MATRIX = lite CUSTOM_MATRIX = lite
ANALOG_DRIVER_REQUIRED = yes ANALOG_DRIVER_REQUIRED = yes
SRC += keyboards/cipulot/common/matrix.c keyboards/cipulot/common/ec_board.c keyboards/cipulot/common/ec_switch_matrix.c VPATH += keyboards/cipulot/common
SRC += matrix.c ec_board.c ec_switch_matrix.c
OPT = 2 OPT = 2

View File

@ -64,9 +64,3 @@
// #define DEBUG_MATRIX_SCAN_RATE // #define DEBUG_MATRIX_SCAN_RATE
#define EECONFIG_KB_DATA_SIZE 159 #define EECONFIG_KB_DATA_SIZE 159
/* 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

View File

@ -6,6 +6,12 @@
"build": { "build": {
"lto": true "lto": true
}, },
"qmk": {
"locking": {
"enabled": true,
"resync": true
}
},
"diode_direction": "COL2ROW", "diode_direction": "COL2ROW",
"features": { "features": {
"bootmagic": false, "bootmagic": false,

View File

@ -1,4 +1,5 @@
CUSTOM_MATRIX = lite CUSTOM_MATRIX = lite
ANALOG_DRIVER_REQUIRED = yes ANALOG_DRIVER_REQUIRED = yes
SRC += keyboards/cipulot/common/matrix.c keyboards/cipulot/common/ec_board.c keyboards/cipulot/common/ec_switch_matrix.c VPATH += keyboards/cipulot/common
SRC += matrix.c ec_board.c ec_switch_matrix.c
OPT = 3 OPT = 3

View File

@ -0,0 +1,66 @@
/* Copyright 2023 Cipulot
*
* 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 3 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
#define MATRIX_ROWS 5
#define MATRIX_COLS 15
#define MATRIX_ROW_PINS \
{ B1, B10, B0, A1, A0 }
#define AMUX_COUNT 2
#define AMUX_MAX_COLS_COUNT 8
#define AMUX_EN_PINS \
{ B7, B6 }
#define AMUX_SEL_PINS \
{ B5, B4, B3 }
#define AMUX_COL_CHANNELS_SIZES \
{ 8, 7 }
#define AMUX_0_COL_CHANNELS \
{ 3, 0, 1, 2, 4, 6, 7, 5 }
#define AMUX_1_COL_CHANNELS \
{ 3, 0, 1, 2, 4, 6, 7 }
#define AMUX_COL_CHANNELS AMUX_0_COL_CHANNELS, AMUX_1_COL_CHANNELS
#define DISCHARGE_PIN A5
#define ANALOG_PORT A4
#define DEFAULT_ACTUATION_MODE 0
#define DEFAULT_MODE_0_ACTUATION_LEVEL 550
#define DEFAULT_MODE_0_RELEASE_LEVEL 500
#define DEFAULT_MODE_1_INITIAL_DEADZONE_OFFSET DEFAULT_MODE_0_ACTUATION_LEVEL
#define DEFAULT_MODE_1_ACTUATION_OFFSET 70
#define DEFAULT_MODE_1_RELEASE_OFFSET 70
#define DEFAULT_EXTREMUM 1023
#define EXPECTED_NOISE_FLOOR 0
#define NOISE_FLOOR_THRESHOLD 50
#define BOTTOMING_CALIBRATION_THRESHOLD 100
#define DEFAULT_NOISE_FLOOR_SAMPLING_COUNT 30
#define DEFAULT_BOTTOMING_READING 1023
#define DEFAULT_CALIBRATION_STARTER true
#define DISCHARGE_TIME 10
// #define DEBUG_MATRIX_SCAN_RATE
#define EECONFIG_KB_DATA_SIZE 159

View File

@ -0,0 +1,21 @@
/* Copyright 2023 Cipulot
*
* 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 3 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
#define HAL_USE_ADC TRUE
#include_next <halconf.h>

View File

@ -0,0 +1,111 @@
{
"manufacturer": "Cipulot",
"keyboard_name": "EC 660C",
"maintainer": "Cipulot",
"bootloader": "stm32-dfu",
"build": {
"lto": true
},
"diode_direction": "COL2ROW",
"features": {
"bootmagic": false,
"console": true,
"extrakey": true,
"mousekey": true,
"nkro": true
},
"indicators": {
"caps_lock": "B14",
"scroll_lock": "B15"
},
"processor": "STM32F401",
"qmk": {
"locking": {
"enabled": true,
"resync": true
}
},
"usb": {
"device_version": "0.0.1",
"pid": "0x6BA6",
"shared_endpoint": {
"keyboard": true
},
"vid": "0x6369"
},
"layouts": {
"LAYOUT": {
"layout": [
{"label": "0,0", "matrix": [0, 0], "x": 0, "y": 0},
{"label": "0,1", "matrix": [0, 1], "x": 1, "y": 0},
{"label": "0,2", "matrix": [0, 2], "x": 2, "y": 0},
{"label": "0,3", "matrix": [0, 3], "x": 3, "y": 0},
{"label": "0,4", "matrix": [0, 4], "x": 4, "y": 0},
{"label": "0,5", "matrix": [0, 5], "x": 5, "y": 0},
{"label": "0,6", "matrix": [0, 6], "x": 6, "y": 0},
{"label": "0,7", "matrix": [0, 7], "x": 7, "y": 0},
{"label": "0,8", "matrix": [0, 8], "x": 8, "y": 0},
{"label": "0,9", "matrix": [0, 9], "x": 9, "y": 0},
{"label": "0,10", "matrix": [0, 10], "x": 10, "y": 0},
{"label": "0,11", "matrix": [0, 11], "x": 11, "y": 0},
{"label": "0,12", "matrix": [0, 12], "x": 12, "y": 0},
{"label": "0,13", "matrix": [0, 13], "x": 13, "y": 0},
{"label": "0,14", "matrix": [0, 14], "x": 14, "y": 0},
{"label": "1,14", "matrix": [1, 14], "x": 15.5, "y": 0},
{"label": "1,0", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"label": "1,1", "matrix": [1, 1], "x": 1.5, "y": 1},
{"label": "1,2", "matrix": [1, 2], "x": 2.5, "y": 1},
{"label": "1,3", "matrix": [1, 3], "x": 3.5, "y": 1},
{"label": "1,4", "matrix": [1, 4], "x": 4.5, "y": 1},
{"label": "1,5", "matrix": [1, 5], "x": 5.5, "y": 1},
{"label": "1,6", "matrix": [1, 6], "x": 6.5, "y": 1},
{"label": "1,7", "matrix": [1, 7], "x": 7.5, "y": 1},
{"label": "1,8", "matrix": [1, 8], "x": 8.5, "y": 1},
{"label": "1,9", "matrix": [1, 9], "x": 9.5, "y": 1},
{"label": "1,10", "matrix": [1, 10], "x": 10.5, "y": 1},
{"label": "1,11", "matrix": [1, 11], "x": 11.5, "y": 1},
{"label": "1,12", "matrix": [1, 12], "x": 12.5, "y": 1},
{"label": "1,13", "matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
{"label": "2,14", "matrix": [2, 14], "x": 15.5, "y": 1},
{"label": "2,0", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"label": "2,1", "matrix": [2, 1], "x": 1.75, "y": 2},
{"label": "2,2", "matrix": [2, 2], "x": 2.75, "y": 2},
{"label": "2,3", "matrix": [2, 3], "x": 3.75, "y": 2},
{"label": "2,4", "matrix": [2, 4], "x": 4.75, "y": 2},
{"label": "2,5", "matrix": [2, 5], "x": 5.75, "y": 2},
{"label": "2,6", "matrix": [2, 6], "x": 6.75, "y": 2},
{"label": "2,7", "matrix": [2, 7], "x": 7.75, "y": 2},
{"label": "2,8", "matrix": [2, 8], "x": 8.75, "y": 2},
{"label": "2,9", "matrix": [2, 9], "x": 9.75, "y": 2},
{"label": "2,10", "matrix": [2, 10], "x": 10.75, "y": 2},
{"label": "2,11", "matrix": [2, 11], "x": 11.75, "y": 2},
{"label": "2,12", "matrix": [2, 12], "x": 12.75, "y": 2},
{"label": "2,13", "matrix": [2, 13], "x": 13.75, "y": 2, "w": 1.25},
{"label": "3,0", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
{"label": "3,1", "matrix": [3, 1], "x": 1.25, "y": 3},
{"label": "3,2", "matrix": [3, 2], "x": 2.25, "y": 3},
{"label": "3,3", "matrix": [3, 3], "x": 3.25, "y": 3},
{"label": "3,4", "matrix": [3, 4], "x": 4.25, "y": 3},
{"label": "3,5", "matrix": [3, 5], "x": 5.25, "y": 3},
{"label": "3,6", "matrix": [3, 6], "x": 6.25, "y": 3},
{"label": "3,7", "matrix": [3, 7], "x": 7.25, "y": 3},
{"label": "3,8", "matrix": [3, 8], "x": 8.25, "y": 3},
{"label": "3,9", "matrix": [3, 9], "x": 9.25, "y": 3},
{"label": "3,10", "matrix": [3, 10], "x": 10.25, "y": 3},
{"label": "3,11", "matrix": [3, 11], "x": 11.25, "y": 3},
{"label": "3,12", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.25},
{"label": "3,13", "matrix": [3, 13], "x": 14.5, "y": 3},
{"label": "4,0", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
{"label": "4,1", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25},
{"label": "4,2", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25},
{"label": "4,6", "matrix": [4, 6], "x": 3.75, "y": 4, "w": 6},
{"label": "4,9", "matrix": [4, 9], "x": 9.75, "y": 4, "w": 1.25},
{"label": "4,10", "matrix": [4, 10], "x": 11, "y": 4, "w": 1.25},
{"label": "4,11", "matrix": [4, 11], "x": 12.25, "y": 4, "w": 1.25},
{"label": "4,12", "matrix": [4, 12], "x": 13.5, "y": 4},
{"label": "4,13", "matrix": [4, 13], "x": 14.5, "y": 4},
{"label": "4,14", "matrix": [4, 14], "x": 15.5, "y": 4}
]
}
}
}

View File

@ -0,0 +1,43 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format off
[0] = LAYOUT(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_INS,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,
KC_LSFT, KC_BSLS, 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_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
),
[1] = LAYOUT(
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_CAPS, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUS, _______, _______, _______, _______,
_______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, KC_HOME, KC_PGUP, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, KC_PGDN, _______, _______, _______,
_______, _______, _______, _______, _______, MO(2), _______, _______, _______, _______
),
[2] = LAYOUT(
QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
)
// clang-format on
};

View File

@ -0,0 +1,43 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format off
[0] = LAYOUT(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_INS,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,
KC_LSFT, KC_BSLS, 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_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
),
[1] = LAYOUT(
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_CAPS, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUS, _______, _______, _______, _______,
_______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, KC_HOME, KC_PGUP, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, KC_PGDN, _______, _______, _______,
_______, _______, _______, _______, _______, MO(2), _______, _______, _______, _______
),
[2] = LAYOUT(
QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
)
// clang-format on
};

View File

@ -0,0 +1 @@
VIA_ENABLE = yes

View File

@ -0,0 +1,22 @@
/* Copyright 2023 Cipulot
*
* 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 3 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_next <mcuconf.h>
#undef STM32_ADC_USE_ADC1
#define STM32_ADC_USE_ADC1 TRUE

View File

@ -0,0 +1,3 @@
ifeq ($(strip $(VIA_ENABLE)), yes)
SRC += keyboards/cipulot/common/via_ec.c
endif

View File

@ -0,0 +1,26 @@
# EC660C
![EC660C PCB](https://i.imgur.com/HfTvrkph.jpg)
Replacement PCB for the Leopold FC660C.
* Keyboard Maintainer: [cipulot](https://github.com/cipulot)
* Hardware Supported: EC660C PCB
* Hardware Availability: TBD
Make example for this keyboard (after setting up your build environment):
make cipulot/ec_660c:default
Flashing example for this keyboard:
make cipulot/ec_660c:default:flash
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
## Bootloader
Enter the bootloader in 2 ways:
* **Physical reset**: Long short the exposed pads on the top of the PCB
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available

View File

@ -0,0 +1,5 @@
CUSTOM_MATRIX = lite
ANALOG_DRIVER_REQUIRED = yes
VPATH += keyboards/cipulot/common
SRC += matrix.c ec_board.c ec_switch_matrix.c
OPT = 3

View File

@ -0,0 +1,86 @@
/* Copyright 2023 Cipulot
*
* 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 3 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
#define MATRIX_ROWS 6
#define MATRIX_COLS 19
#define MATRIX_ROW_PINS \
{ B13, B12, B14, A9, B6, B7 }
#define AMUX_COUNT 3
#define AMUX_MAX_COLS_COUNT 8
#define AMUX_EN_PINS \
{ A0, A1, A8 }
#define AMUX_SEL_PINS \
{ A4, A3, A2 }
#define AMUX_COL_CHANNELS_SIZES \
{ 8, 7, 4 }
#define AMUX_0_COL_CHANNELS \
{ 0, 3, 1, 2, 4, 6, 7, 5 }
#define AMUX_1_COL_CHANNELS \
{ 1, 0, 3, 2, 4, 6, 7 }
#define AMUX_2_COL_CHANNELS \
{ 4, 6, 7, 5 }
#define AMUX_COL_CHANNELS AMUX_0_COL_CHANNELS, AMUX_1_COL_CHANNELS, AMUX_2_COL_CHANNELS
#define DISCHARGE_PIN A6
#define ANALOG_PORT A7
#define DEFAULT_ACTUATION_MODE 0
#define DEFAULT_MODE_0_ACTUATION_LEVEL 550
#define DEFAULT_MODE_0_RELEASE_LEVEL 500
#define DEFAULT_MODE_1_INITIAL_DEADZONE_OFFSET DEFAULT_MODE_0_ACTUATION_LEVEL
#define DEFAULT_MODE_1_ACTUATION_OFFSET 70
#define DEFAULT_MODE_1_RELEASE_OFFSET 70
#define DEFAULT_EXTREMUM 1023
#define EXPECTED_NOISE_FLOOR 0
#define NOISE_FLOOR_THRESHOLD 50
#define BOTTOMING_CALIBRATION_THRESHOLD 100
#define DEFAULT_NOISE_FLOOR_SAMPLING_COUNT 30
#define DEFAULT_BOTTOMING_READING 1023
#define DEFAULT_CALIBRATION_STARTER true
#define DISCHARGE_TIME 10
//#define DEBUG_MATRIX_SCAN_RATE
#define EECONFIG_KB_DATA_SIZE 249
// Indicators
// PWM driver with direct memory access (DMA) support
#define WS2812_PWM_COMPLEMENTARY_OUTPUT
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 3
#define WS2812_PWM_PAL_MODE 1
#define WS2812_DMA_STREAM STM32_DMA2_STREAM5
#define WS2812_DMA_CHANNEL 6
#define NUM_INDICATOR_INDEX 0
#define CAPS_INDICATOR_INDEX 1
#define SCROLL_INDICATOR_INDEX 2
#define RGB_MATRIX_DEFAULT_VAL 60
#define RGB_MATRIX_SLEEP
#define RGB_MATRIX_DEFAULT_MODE RGB_MATRIX_SOLID_COLOR

View File

@ -0,0 +1,116 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 "ec_switch_matrix.h"
#include "quantum.h"
void eeconfig_init_kb(void) {
// Default values
eeprom_ec_config.num.h = 0;
eeprom_ec_config.num.s = 0;
eeprom_ec_config.num.v = 60;
eeprom_ec_config.num.enabled = true;
eeprom_ec_config.caps.h = 0;
eeprom_ec_config.caps.s = 0;
eeprom_ec_config.caps.v = 60;
eeprom_ec_config.caps.enabled = true;
eeprom_ec_config.scroll.h = 0;
eeprom_ec_config.scroll.s = 0;
eeprom_ec_config.scroll.v = 60;
eeprom_ec_config.scroll.enabled = true;
eeprom_ec_config.actuation_mode = DEFAULT_ACTUATION_MODE;
eeprom_ec_config.mode_0_actuation_threshold = DEFAULT_MODE_0_ACTUATION_LEVEL;
eeprom_ec_config.mode_0_release_threshold = DEFAULT_MODE_0_RELEASE_LEVEL;
eeprom_ec_config.mode_1_initial_deadzone_offset = DEFAULT_MODE_1_INITIAL_DEADZONE_OFFSET;
eeprom_ec_config.mode_1_actuation_offset = DEFAULT_MODE_1_ACTUATION_OFFSET;
eeprom_ec_config.mode_1_release_offset = DEFAULT_MODE_1_RELEASE_OFFSET;
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
eeprom_ec_config.bottoming_reading[row][col] = DEFAULT_BOTTOMING_READING;
}
}
// Write default value to EEPROM now
eeconfig_update_kb_datablock(&eeprom_ec_config);
eeconfig_init_user();
}
// On Keyboard startup
void keyboard_post_init_kb(void) {
// Read custom menu variables from memory
eeconfig_read_kb_datablock(&eeprom_ec_config);
// Set runtime values to EEPROM values
ec_config.actuation_mode = eeprom_ec_config.actuation_mode;
ec_config.mode_0_actuation_threshold = eeprom_ec_config.mode_0_actuation_threshold;
ec_config.mode_0_release_threshold = eeprom_ec_config.mode_0_release_threshold;
ec_config.mode_1_initial_deadzone_offset = eeprom_ec_config.mode_1_initial_deadzone_offset;
ec_config.mode_1_actuation_offset = eeprom_ec_config.mode_1_actuation_offset;
ec_config.mode_1_release_offset = eeprom_ec_config.mode_1_release_offset;
ec_config.bottoming_calibration = false;
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
ec_config.bottoming_calibration_starter[row][col] = true;
ec_config.bottoming_reading[row][col] = eeprom_ec_config.bottoming_reading[row][col];
ec_config.rescaled_mode_0_actuation_threshold[row][col] = rescale(ec_config.mode_0_actuation_threshold, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
ec_config.rescaled_mode_0_release_threshold[row][col] = rescale(ec_config.mode_0_release_threshold, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
ec_config.rescaled_mode_1_initial_deadzone_offset[row][col] = rescale(ec_config.mode_1_initial_deadzone_offset, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
}
}
// Call the indicator callback to set the indicator color
rgb_matrix_indicators_kb();
keyboard_post_init_user();
}
// INDICATOR CALLBACK ------------------------------------------------------------------------------
/* LED index to physical position
*
* LED0 | LED1 | LED2
* -----+------+--------
* Num | Caps | Scroll |
*/
bool rgb_matrix_indicators_kb(void) {
if (eeprom_ec_config.num.enabled) {
// The rgb_matrix_set_color function needs an RGB code to work, so first the indicator color is cast to an HSV value and then translated to RGB
HSV hsv_num_indicator_color = {eeprom_ec_config.num.h, eeprom_ec_config.num.s, eeprom_ec_config.num.v};
RGB rgb_num_indicator_color = hsv_to_rgb(hsv_num_indicator_color);
if (host_keyboard_led_state().num_lock)
rgb_matrix_set_color(NUM_INDICATOR_INDEX, rgb_num_indicator_color.r, rgb_num_indicator_color.g, rgb_num_indicator_color.b);
else
rgb_matrix_set_color(NUM_INDICATOR_INDEX, 0, 0, 0);
}
if (eeprom_ec_config.caps.enabled) {
HSV hsv_caps_indicator_color = {eeprom_ec_config.caps.h, eeprom_ec_config.caps.s, eeprom_ec_config.caps.v};
RGB rgb_caps_indicator_color = hsv_to_rgb(hsv_caps_indicator_color);
if (host_keyboard_led_state().caps_lock)
rgb_matrix_set_color(CAPS_INDICATOR_INDEX, rgb_caps_indicator_color.r, rgb_caps_indicator_color.g, rgb_caps_indicator_color.b);
else
rgb_matrix_set_color(CAPS_INDICATOR_INDEX, 0, 0, 0);
}
if (eeprom_ec_config.scroll.enabled) {
HSV hsv_scroll_indicator_color = {eeprom_ec_config.scroll.h, eeprom_ec_config.scroll.s, eeprom_ec_config.scroll.v};
RGB rgb_scroll_indicator_color = hsv_to_rgb(hsv_scroll_indicator_color);
if (host_keyboard_led_state().scroll_lock)
rgb_matrix_set_color(SCROLL_INDICATOR_INDEX, rgb_scroll_indicator_color.r, rgb_scroll_indicator_color.g, rgb_scroll_indicator_color.b);
else
rgb_matrix_set_color(SCROLL_INDICATOR_INDEX, 0, 0, 0);
}
return true;
}

View File

@ -0,0 +1,318 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 "ec_switch_matrix.h"
#include "analog.h"
#include "atomic_util.h"
#include "math.h"
#include "print.h"
#include "wait.h"
#if defined(__AVR__)
# error "AVR platforms not supported due to a variety of reasons. Among them there are limited memory, limited number of pins and ADC not being able to give satisfactory results."
#endif
#define OPEN_DRAIN_SUPPORT defined(PAL_MODE_OUTPUT_OPENDRAIN)
eeprom_ec_config_t eeprom_ec_config;
ec_config_t ec_config;
// Pin and port array
const pin_t row_pins[] = MATRIX_ROW_PINS;
const pin_t amux_sel_pins[] = AMUX_SEL_PINS;
const pin_t amux_en_pins[] = AMUX_EN_PINS;
const pin_t amux_n_col_sizes[] = AMUX_COL_CHANNELS_SIZES;
const pin_t amux_n_col_channels[][AMUX_MAX_COLS_COUNT] = {AMUX_COL_CHANNELS};
#define AMUX_SEL_PINS_COUNT ARRAY_SIZE(amux_sel_pins)
#define EXPECTED_AMUX_SEL_PINS_COUNT ceil(log2(AMUX_MAX_COLS_COUNT)
// Checks for the correctness of the configuration
_Static_assert(ARRAY_SIZE(amux_en_pins) == AMUX_COUNT, "AMUX_EN_PINS doesn't have the minimum number of bits required to enable all the multiplexers available");
// Check that number of select pins is enough to select all the channels
_Static_assert(AMUX_SEL_PINS_COUNT == EXPECTED_AMUX_SEL_PINS_COUNT), "AMUX_SEL_PINS doesn't have the minimum number of bits required address all the channels");
// Check that number of elements in AMUX_COL_CHANNELS_SIZES is enough to specify the number of channels for all the multiplexers available
_Static_assert(ARRAY_SIZE(amux_n_col_sizes) == AMUX_COUNT, "AMUX_COL_CHANNELS_SIZES doesn't have the minimum number of elements required to specify the number of channels for all the multiplexers available");
static uint16_t sw_value[MATRIX_ROWS][MATRIX_COLS];
static adc_mux adcMux;
// Initialize the row pins
void init_row(void) {
// Set all row pins as output and low
for (uint8_t idx = 0; idx < MATRIX_ROWS; idx++) {
gpio_set_pin_output(row_pins[idx]);
gpio_write_pin_low(row_pins[idx]);
}
}
// Initialize the multiplexers
void init_amux(void) {
for (uint8_t idx = 0; idx < AMUX_COUNT; idx++) {
gpio_set_pin_output(amux_en_pins[idx]);
gpio_write_pin_low(amux_en_pins[idx]);
}
for (uint8_t idx = 0; idx < AMUX_SEL_PINS_COUNT; idx++) {
gpio_set_pin_output(amux_sel_pins[idx]);
}
}
// Select the multiplexer channel of the specified multiplexer
void select_amux_channel(uint8_t channel, uint8_t col) {
// Get the channel for the specified multiplexer
uint8_t ch = amux_n_col_channels[channel][col];
// momentarily disable specified multiplexer
gpio_write_pin_high(amux_en_pins[channel]);
// Select the multiplexer channel
for (uint8_t i = 0; i < AMUX_SEL_PINS_COUNT; i++) {
gpio_write_pin(amux_sel_pins[i], ch & (1 << i));
}
// re enable specified multiplexer
gpio_write_pin_low(amux_en_pins[channel]);
}
// Disable all the unused multiplexers
void disable_unused_amux(uint8_t channel) {
// disable all the other multiplexers apart from the current selected one
for (uint8_t idx = 0; idx < AMUX_COUNT; idx++) {
if (idx != channel) {
gpio_write_pin_high(amux_en_pins[idx]);
}
}
}
// Discharge the peak hold capacitor
void discharge_capacitor(void) {
#ifdef OPEN_DRAIN_SUPPORT
gpio_write_pin_low(DISCHARGE_PIN);
#else
gpio_write_pin_low(DISCHARGE_PIN);
gpio_set_pin_output(DISCHARGE_PIN);
#endif
}
// Charge the peak hold capacitor
void charge_capacitor(uint8_t row) {
#ifdef OPEN_DRAIN_SUPPORT
gpio_write_pin_high(DISCHARGE_PIN);
#else
gpio_set_pin_input(DISCHARGE_PIN);
#endif
gpio_write_pin_high(row_pins[row]);
}
// Initialize the peripherals pins
int ec_init(void) {
// Initialize ADC
palSetLineMode(ANALOG_PORT, PAL_MODE_INPUT_ANALOG);
adcMux = pinToMux(ANALOG_PORT);
// Dummy call to make sure that adcStart() has been called in the appropriate state
adc_read(adcMux);
// Initialize discharge pin as discharge mode
gpio_write_pin_low(DISCHARGE_PIN);
#ifdef OPEN_DRAIN_SUPPORT
gpio_set_pin_output_open_drain(DISCHARGE_PIN);
#else
gpio_set_pin_output(DISCHARGE_PIN);
#endif
// Initialize drive lines
init_row();
// Initialize AMUXs
init_amux();
return 0;
}
// Get the noise floor
void ec_noise_floor(void) {
// Initialize the noise floor
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
ec_config.noise_floor[row][col] = 0;
}
}
// Sample the noise floor
for (uint8_t i = 0; i < DEFAULT_NOISE_FLOOR_SAMPLING_COUNT; i++) {
for (uint8_t amux = 0; amux < AMUX_COUNT; amux++) {
disable_unused_amux(amux);
for (uint8_t col = 0; col < amux_n_col_sizes[amux]; col++) {
uint8_t sum = 0;
for (uint8_t i = 0; i < (amux > 0 ? amux : 0); i++)
sum += amux_n_col_sizes[i];
uint8_t adjusted_col = col + sum;
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
ec_config.noise_floor[row][adjusted_col] += ec_readkey_raw(amux, row, col);
}
}
}
wait_ms(5);
}
// Average the noise floor
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
ec_config.noise_floor[row][col] /= DEFAULT_NOISE_FLOOR_SAMPLING_COUNT;
}
}
}
// Scan key values and update matrix state
bool ec_matrix_scan(matrix_row_t current_matrix[]) {
bool updated = false;
for (uint8_t amux = 0; amux < AMUX_COUNT; amux++) {
disable_unused_amux(amux);
for (uint8_t col = 0; col < amux_n_col_sizes[amux]; col++) {
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
uint8_t sum = 0;
for (uint8_t i = 0; i < (amux > 0 ? amux : 0); i++)
sum += amux_n_col_sizes[i];
uint8_t adjusted_col = col + sum;
sw_value[row][adjusted_col] = ec_readkey_raw(amux, row, col);
if (ec_config.bottoming_calibration) {
if (ec_config.bottoming_calibration_starter[row][adjusted_col]) {
ec_config.bottoming_reading[row][adjusted_col] = sw_value[row][adjusted_col];
ec_config.bottoming_calibration_starter[row][adjusted_col] = false;
} else if (sw_value[row][adjusted_col] > ec_config.bottoming_reading[row][adjusted_col]) {
ec_config.bottoming_reading[row][adjusted_col] = sw_value[row][adjusted_col];
}
} else {
updated |= ec_update_key(&current_matrix[row], row, adjusted_col, sw_value[row][adjusted_col]);
}
}
}
}
return ec_config.bottoming_calibration ? false : updated;
}
// Read the capacitive sensor value
uint16_t ec_readkey_raw(uint8_t channel, uint8_t row, uint8_t col) {
uint16_t sw_value = 0;
// Select the multiplexer
select_amux_channel(channel, col);
// Set the row pin to low state to avoid ghosting
gpio_write_pin_low(row_pins[row]);
ATOMIC_BLOCK_FORCEON {
// Set the row pin to high state and have capacitor charge
charge_capacitor(row);
// Read the ADC value
sw_value = adc_read(adcMux);
}
// Discharge peak hold capacitor
discharge_capacitor();
// Waiting for the ghost capacitor to discharge fully
wait_us(DISCHARGE_TIME);
return sw_value;
}
// Update press/release state of key
bool ec_update_key(matrix_row_t* current_row, uint8_t row, uint8_t col, uint16_t sw_value) {
bool current_state = (*current_row >> col) & 1;
// Real Time Noise Floor Calibration
if (sw_value < (ec_config.noise_floor[row][col] - NOISE_FLOOR_THRESHOLD)) {
uprintf("Noise Floor Change: %d, %d, %d\n", row, col, sw_value);
ec_config.noise_floor[row][col] = sw_value;
ec_config.rescaled_mode_0_actuation_threshold[row][col] = rescale(ec_config.mode_0_actuation_threshold, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
ec_config.rescaled_mode_0_release_threshold[row][col] = rescale(ec_config.mode_0_release_threshold, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
ec_config.rescaled_mode_1_initial_deadzone_offset[row][col] = rescale(ec_config.mode_1_initial_deadzone_offset, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
}
// Normal board-wide APC
if (ec_config.actuation_mode == 0) {
if (current_state && sw_value < ec_config.rescaled_mode_0_release_threshold[row][col]) {
*current_row &= ~(1 << col);
uprintf("Key released: %d, %d, %d\n", row, col, sw_value);
return true;
}
if ((!current_state) && sw_value > ec_config.rescaled_mode_0_actuation_threshold[row][col]) {
*current_row |= (1 << col);
uprintf("Key pressed: %d, %d, %d\n", row, col, sw_value);
return true;
}
}
// Rapid Trigger
else if (ec_config.actuation_mode == 1) {
// Is key in active zone?
if (sw_value > ec_config.rescaled_mode_1_initial_deadzone_offset[row][col]) {
// Is key pressed while in active zone?
if (current_state) {
// Is the key still moving down?
if (sw_value > ec_config.extremum[row][col]) {
ec_config.extremum[row][col] = sw_value;
uprintf("Key pressed: %d, %d, %d\n", row, col, sw_value);
}
// Has key moved up enough to be released?
else if (sw_value < ec_config.extremum[row][col] - ec_config.mode_1_release_offset) {
ec_config.extremum[row][col] = sw_value;
*current_row &= ~(1 << col);
uprintf("Key released: %d, %d, %d\n", row, col, sw_value);
return true;
}
}
// Key is not pressed while in active zone
else {
// Is the key still moving up?
if (sw_value < ec_config.extremum[row][col]) {
ec_config.extremum[row][col] = sw_value;
}
// Has key moved down enough to be pressed?
else if (sw_value > ec_config.extremum[row][col] + ec_config.mode_1_actuation_offset) {
ec_config.extremum[row][col] = sw_value;
*current_row |= (1 << col);
uprintf("Key pressed: %d, %d, %d\n", row, col, sw_value);
return true;
}
}
}
// Key is not in active zone
else {
// Check to avoid key being stuck in pressed state near the active zone threshold
if (sw_value < ec_config.extremum[row][col]) {
ec_config.extremum[row][col] = sw_value;
*current_row &= ~(1 << col);
return true;
}
}
}
return false;
}
// Print the matrix values
void ec_print_matrix(void) {
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS - 1; col++) {
uprintf("%4d,", sw_value[row][col]);
}
uprintf("%4d\n", sw_value[row][MATRIX_COLS - 1]);
}
print("\n");
}
// Rescale the value to a different range
uint16_t rescale(uint16_t x, uint16_t in_min, uint16_t in_max, uint16_t out_min, uint16_t out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

View File

@ -0,0 +1,83 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 <stdint.h>
#include <stdbool.h>
#include "matrix.h"
#include "eeconfig.h"
#include "util.h"
typedef struct _indicator_config_t {
uint8_t h;
uint8_t s;
uint8_t v;
bool enabled;
} indicator_config;
typedef struct PACKED {
indicator_config num;
indicator_config caps;
indicator_config scroll;
uint8_t actuation_mode; // 0: normal board-wide APC, 1: Rapid trigger from specific board-wide actuation point, 2: Rapid trigger from resting point
uint16_t mode_0_actuation_threshold; // threshold for key press in mode 0
uint16_t mode_0_release_threshold; // threshold for key release in mode 0
uint16_t mode_1_initial_deadzone_offset; // threshold for key press in mode 1
uint8_t mode_1_actuation_offset; // offset for key press in mode 1 and 2 (1-255)
uint8_t mode_1_release_offset; // offset for key release in mode 1 and 2 (1-255)
uint16_t bottoming_reading[MATRIX_ROWS][MATRIX_COLS]; // bottoming reading
} eeprom_ec_config_t;
typedef struct {
uint8_t actuation_mode; // 0: normal board-wide APC, 1: Rapid trigger from specific board-wide actuation point (it can be very near that baseline noise and be "full travel")
uint16_t mode_0_actuation_threshold; // threshold for key press in mode 0
uint16_t mode_0_release_threshold; // threshold for key release in mode 0
uint16_t mode_1_initial_deadzone_offset; // threshold for key press in mode 1 (initial deadzone)
uint16_t rescaled_mode_0_actuation_threshold[MATRIX_ROWS][MATRIX_COLS]; // threshold for key press in mode 0 rescaled to actual scale
uint16_t rescaled_mode_0_release_threshold[MATRIX_ROWS][MATRIX_COLS]; // threshold for key release in mode 0 rescaled to actual scale
uint16_t rescaled_mode_1_initial_deadzone_offset[MATRIX_ROWS][MATRIX_COLS]; // threshold for key press in mode 1 (initial deadzone) rescaled to actual scale
uint8_t mode_1_actuation_offset; // offset for key press in mode 1 (1-255)
uint8_t mode_1_release_offset; // offset for key release in mode 1 (1-255)
uint16_t extremum[MATRIX_ROWS][MATRIX_COLS]; // extremum values for mode 1
uint16_t noise_floor[MATRIX_ROWS][MATRIX_COLS]; // noise floor detected during startup
bool bottoming_calibration; // calibration mode for bottoming out values (true: calibration mode, false: normal mode)
bool bottoming_calibration_starter[MATRIX_ROWS][MATRIX_COLS]; // calibration mode for bottoming out values (true: calibration mode, false: normal mode)
uint16_t bottoming_reading[MATRIX_ROWS][MATRIX_COLS]; // bottoming reading
} ec_config_t;
// Check if the size of the reserved persistent memory is the same as the size of struct eeprom_ec_config_t
_Static_assert(sizeof(eeprom_ec_config_t) == EECONFIG_KB_DATA_SIZE, "Mismatch in keyboard EECONFIG stored data");
extern eeprom_ec_config_t eeprom_ec_config;
extern ec_config_t ec_config;
void init_row(void);
void init_amux(void);
void select_amux_channel(uint8_t channel, uint8_t col);
void disable_unused_amux(uint8_t channel);
void discharge_capacitor(void);
void charge_capacitor(uint8_t row);
int ec_init(void);
void ec_noise_floor(void);
bool ec_matrix_scan(matrix_row_t current_matrix[]);
uint16_t ec_readkey_raw(uint8_t channel, uint8_t row, uint8_t col);
bool ec_update_key(matrix_row_t* current_row, uint8_t row, uint8_t col, uint16_t sw_value);
void ec_print_matrix(void);
uint16_t rescale(uint16_t x, uint16_t in_min, uint16_t in_max, uint16_t out_min, uint16_t out_max);

View File

@ -0,0 +1,23 @@
/* Copyright 2023 Cipulot
*
* 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 3 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
#define HAL_USE_ADC TRUE
#define HAL_USE_PWM TRUE
#define HAL_USE_PAL TRUE
#include_next <halconf.h>

View File

@ -0,0 +1,170 @@
{
"manufacturer": "Cipulot",
"keyboard_name": "EC 980C",
"maintainer": "Cipulot",
"bootloader": "stm32-dfu",
"build": {
"lto": true
},
"diode_direction": "COL2ROW",
"eeprom": {
"wear_leveling": {
"backing_size": 4096
}
},
"features": {
"bootmagic": false,
"console": true,
"extrakey": true,
"mousekey": true,
"nkro": true,
"rgb_matrix": true
},
"processor": "STM32F411",
"qmk": {
"locking": {
"enabled": true,
"resync": true
}
},
"rgb_matrix": {
"animations": {
"breathing": true,
"cycle_left_right": true,
"solid_color": true
},
"driver": "ws2812",
"layout": [
{"matrix": [0, 15], "x": 16.25, "y": 1, "flags": 4},
{"matrix": [0, 16], "x": 17.25, "y": 1, "flags": 4},
{"matrix": [0, 17], "x": 18.25, "y": 1, "flags": 4}
],
"led_count": 3,
"max_brightness": 255
},
"usb": {
"device_version": "0.0.1",
"pid": "0x6BBE",
"shared_endpoint": {
"keyboard": true
},
"vid": "0x6369"
},
"ws2812": {
"driver": "pwm",
"pin": "B15"
},
"layouts": {
"LAYOUT": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6.5, "y": 0},
{"matrix": [0, 7], "x": 7.5, "y": 0},
{"matrix": [0, 8], "x": 8.5, "y": 0},
{"matrix": [0, 9], "x": 9.5, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 13], "x": 13, "y": 0},
{"matrix": [0, 14], "x": 14, "y": 0},
{"matrix": [0, 15], "x": 15.5, "y": 0},
{"matrix": [0, 16], "x": 16.5, "y": 0},
{"matrix": [0, 17], "x": 17.5, "y": 0},
{"matrix": [0, 18], "x": 18.5, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1.5},
{"matrix": [1, 1], "x": 1, "y": 1.5},
{"matrix": [1, 2], "x": 2, "y": 1.5},
{"matrix": [1, 3], "x": 3, "y": 1.5},
{"matrix": [1, 4], "x": 4, "y": 1.5},
{"matrix": [1, 5], "x": 5, "y": 1.5},
{"matrix": [1, 6], "x": 6, "y": 1.5},
{"matrix": [1, 7], "x": 7, "y": 1.5},
{"matrix": [1, 8], "x": 8, "y": 1.5},
{"matrix": [1, 9], "x": 9, "y": 1.5},
{"matrix": [1, 10], "x": 10, "y": 1.5},
{"matrix": [1, 11], "x": 11, "y": 1.5},
{"matrix": [1, 12], "x": 12, "y": 1.5},
{"matrix": [1, 13], "x": 13, "y": 1.5},
{"matrix": [1, 14], "x": 14, "y": 1.5},
{"matrix": [1, 15], "x": 15.5, "y": 1.5},
{"matrix": [1, 16], "x": 16.5, "y": 1.5},
{"matrix": [1, 17], "x": 17.5, "y": 1.5},
{"matrix": [1, 18], "x": 18.5, "y": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2.5, "w": 1.5},
{"matrix": [2, 1], "x": 1.5, "y": 2.5},
{"matrix": [2, 2], "x": 2.5, "y": 2.5},
{"matrix": [2, 3], "x": 3.5, "y": 2.5},
{"matrix": [2, 4], "x": 4.5, "y": 2.5},
{"matrix": [2, 5], "x": 5.5, "y": 2.5},
{"matrix": [2, 6], "x": 6.5, "y": 2.5},
{"matrix": [2, 7], "x": 7.5, "y": 2.5},
{"matrix": [2, 8], "x": 8.5, "y": 2.5},
{"matrix": [2, 9], "x": 9.5, "y": 2.5},
{"matrix": [2, 10], "x": 10.5, "y": 2.5},
{"matrix": [2, 11], "x": 11.5, "y": 2.5},
{"matrix": [2, 12], "x": 12.5, "y": 2.5},
{"matrix": [2, 13], "x": 13.5, "y": 2.5, "w": 0.75},
{"matrix": [2, 14], "x": 14.25, "y": 2.5, "w": 0.75},
{"matrix": [2, 15], "x": 15.5, "y": 2.5},
{"matrix": [2, 16], "x": 16.5, "y": 2.5},
{"matrix": [2, 17], "x": 17.5, "y": 2.5},
{"matrix": [2, 18], "x": 18.5, "y": 2.5},
{"matrix": [3, 0], "x": 0, "y": 3.5, "w": 1.75},
{"matrix": [3, 1], "x": 1.75, "y": 3.5},
{"matrix": [3, 2], "x": 2.75, "y": 3.5},
{"matrix": [3, 3], "x": 3.75, "y": 3.5},
{"matrix": [3, 4], "x": 4.75, "y": 3.5},
{"matrix": [3, 5], "x": 5.75, "y": 3.5},
{"matrix": [3, 6], "x": 6.75, "y": 3.5},
{"matrix": [3, 7], "x": 7.75, "y": 3.5},
{"matrix": [3, 8], "x": 8.75, "y": 3.5},
{"matrix": [3, 9], "x": 9.75, "y": 3.5},
{"matrix": [3, 10], "x": 10.75, "y": 3.5},
{"matrix": [3, 11], "x": 11.75, "y": 3.5},
{"matrix": [3, 12], "x": 12.75, "y": 3.5},
{"matrix": [3, 13], "x": 13.75, "y": 3.5, "w": 1.25},
{"matrix": [3, 15], "x": 15.5, "y": 3.5},
{"matrix": [3, 16], "x": 16.5, "y": 3.5},
{"matrix": [3, 17], "x": 17.5, "y": 3.5},
{"matrix": [3, 18], "x": 18.5, "y": 3.5},
{"matrix": [4, 0], "x": 0, "y": 4.5, "w": 1.25},
{"matrix": [4, 1], "x": 1.25, "y": 4.5},
{"matrix": [4, 2], "x": 2.25, "y": 4.5},
{"matrix": [4, 3], "x": 3.25, "y": 4.5},
{"matrix": [4, 4], "x": 4.25, "y": 4.5},
{"matrix": [4, 5], "x": 5.25, "y": 4.5},
{"matrix": [4, 6], "x": 6.25, "y": 4.5},
{"matrix": [4, 7], "x": 7.25, "y": 4.5},
{"matrix": [4, 8], "x": 8.25, "y": 4.5},
{"matrix": [4, 9], "x": 9.25, "y": 4.5},
{"matrix": [4, 10], "x": 10.25, "y": 4.5},
{"matrix": [4, 11], "x": 11.25, "y": 4.5},
{"matrix": [4, 12], "x": 12.25, "y": 4.5, "w": 1.75},
{"matrix": [4, 14], "x": 14.25, "y": 4.75},
{"matrix": [4, 15], "x": 15.5, "y": 4.5},
{"matrix": [4, 16], "x": 16.5, "y": 4.5},
{"matrix": [4, 17], "x": 17.5, "y": 4.5},
{"matrix": [4, 18], "x": 18.5, "y": 4.5},
{"matrix": [5, 0], "x": 0, "y": 5.5, "w": 1.25},
{"matrix": [5, 1], "x": 1.25, "y": 5.5},
{"matrix": [5, 2], "x": 2.25, "y": 5.5, "w": 1.25},
{"matrix": [5, 3], "x": 3.5, "y": 5.5},
{"matrix": [5, 5], "x": 4.5, "y": 5.5, "w": 2.5},
{"matrix": [5, 6], "x": 7, "y": 5.5, "w": 1.25},
{"matrix": [5, 8], "x": 8.25, "y": 5.5, "w": 1.25},
{"matrix": [5, 9], "x": 9.5, "y": 5.5, "w": 1.25},
{"matrix": [5, 10], "x": 10.75, "y": 5.5},
{"matrix": [5, 11], "x": 11.75, "y": 5.5, "w": 1.25},
{"matrix": [5, 13], "x": 13.25, "y": 5.75},
{"matrix": [5, 14], "x": 14.25, "y": 5.75},
{"matrix": [5, 15], "x": 15.25, "y": 5.75},
{"matrix": [5, 16], "x": 16.5, "y": 5.5},
{"matrix": [5, 17], "x": 17.5, "y": 5.5},
{"matrix": [5, 18], "x": 18.5, "y": 5.5}
]
}
}
}

View File

@ -0,0 +1,48 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 QMK_KEYBOARD_H
#include "keymap_japanese.h"
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format off
[0] = LAYOUT(
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_DEL, KC_INS, KC_PGUP, KC_PGDN,
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, JP_YEN, KC_BSPC, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS,
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_ENT, KC_P7, KC_P8, KC_P9, KC_PPLS,
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_NUHS, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS,
KC_LSFT, KC_NUBS, 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_P1, KC_P2, KC_P3, KC_PENT,
KC_LCTL, KC_LGUI, KC_LALT, _______, KC_SPC, KC_SPC, _______, KC_RALT, KC_RCTL, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT, KC_P0, KC_PDOT, KC_PENT
),
[1] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
KC_CAPS, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, _______, _______, _______, _______, _______, _______, _______,
_______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, MO(2), _______, _______, _______, _______, _______, _______, _______
),
[2] = LAYOUT(
QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
// clang-format on
};

View File

@ -0,0 +1,48 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 QMK_KEYBOARD_H
#include "keymap_japanese.h"
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format off
[0] = LAYOUT(
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_DEL, KC_INS, KC_PGUP, KC_PGDN,
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, JP_YEN, KC_BSPC, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS,
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_ENT, KC_P7, KC_P8, KC_P9, KC_PPLS,
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_NUHS, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS,
KC_LSFT, KC_NUBS, 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_P1, KC_P2, KC_P3, KC_PENT,
KC_LCTL, KC_LGUI, KC_LALT, _______, KC_SPC, KC_SPC, _______, KC_RALT, KC_RCTL, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT, KC_P0, KC_PDOT, KC_PENT
),
[1] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
KC_CAPS, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, _______, _______, _______, _______, _______, _______, _______,
_______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, MO(2), _______, _______, _______, _______, _______, _______, _______
),
[2] = LAYOUT(
QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
// clang-format on
};

View File

@ -0,0 +1,3 @@
VIA_ENABLE = yes
SRC += via_ec_indicators.c

View File

@ -0,0 +1,499 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 "keyboards/cipulot/common/eeprom_tools.h"
#include "ec_switch_matrix.h"
#include "action.h"
#include "print.h"
#include "via.h"
#ifdef VIA_ENABLE
void ec_rescale_values(uint8_t item);
void ec_save_threshold_data(uint8_t option);
void ec_save_bottoming_reading(void);
void ec_show_calibration_data(void);
void ec_clear_bottoming_calibration_data(void);
// Declaring enums for VIA config menu
enum via_enums {
// clang-format off
id_num_indicator_enabled = 1,
id_num_indicator_brightness = 2,
id_num_indicator_color = 3,
id_caps_indicator_enabled = 4,
id_caps_indicator_brightness = 5,
id_caps_indicator_color = 6,
id_scroll_indicator_enabled = 7,
id_scroll_indicator_brightness = 8,
id_scroll_indicator_color = 9,
id_actuation_mode = 10,
id_mode_0_actuation_threshold = 11,
id_mode_0_release_threshold = 12,
id_save_threshold_data = 13,
id_mode_1_initial_deadzone_offset = 14,
id_mode_1_actuation_offset = 15,
id_mode_1_release_offset = 16,
id_bottoming_calibration = 17,
id_noise_floor_calibration = 18,
id_show_calibration_data = 19,
id_clear_bottoming_calibration_data = 20
// clang-format on
};
// Handle the data received by the keyboard from the VIA menus
void via_config_set_value(uint8_t *data) {
// data = [ value_id, value_data ]
uint8_t *value_id = &(data[0]);
uint8_t *value_data = &(data[1]);
switch (*value_id) {
case id_num_indicator_enabled: {
if (value_data[0] == 1) {
eeprom_ec_config.num.enabled = true;
uprintf("#########################\n");
uprintf("# Num indicator enabled #\n");
uprintf("#########################\n");
} else {
eeprom_ec_config.num.enabled = false;
uprintf("##########################\n");
uprintf("# Num indicator disabled #\n");
uprintf("##########################\n");
}
EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, num.enabled);
break;
}
case id_num_indicator_brightness: {
eeprom_ec_config.num.v = value_data[0];
uprintf("Num indicator brightness: %d\n", eeprom_ec_config.num.v);
EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, num.v);
break;
}
case id_num_indicator_color: {
eeprom_ec_config.num.h = value_data[0];
eeprom_ec_config.num.s = value_data[1];
uprintf("Num indicator color: %d, %d\n", eeprom_ec_config.num.h, eeprom_ec_config.num.s);
EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, num.h);
EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, num.s);
break;
}
case id_caps_indicator_enabled: {
if (value_data[0] == 1) {
eeprom_ec_config.caps.enabled = true;
uprintf("##########################\n");
uprintf("# Caps indicator enabled #\n");
uprintf("##########################\n");
} else {
eeprom_ec_config.caps.enabled = false;
uprintf("###########################\n");
uprintf("# Caps indicator disabled #\n");
uprintf("###########################\n");
}
EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, caps.enabled);
break;
}
case id_caps_indicator_brightness: {
eeprom_ec_config.caps.v = value_data[0];
uprintf("Caps indicator brightness: %d\n", eeprom_ec_config.caps.v);
EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, caps.v);
break;
}
case id_caps_indicator_color: {
eeprom_ec_config.caps.h = value_data[0];
eeprom_ec_config.caps.s = value_data[1];
uprintf("Caps indicator color: %d, %d\n", eeprom_ec_config.caps.h, eeprom_ec_config.caps.s);
EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, caps.h);
EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, caps.s);
break;
}
case id_scroll_indicator_enabled: {
if (value_data[0] == 1) {
eeprom_ec_config.scroll.enabled = true;
uprintf("############################\n");
uprintf("# Scroll indicator enabled #\n");
uprintf("############################\n");
} else {
eeprom_ec_config.scroll.enabled = false;
uprintf("#############################\n");
uprintf("# Scroll indicator disabled #\n");
uprintf("#############################\n");
}
EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, scroll.enabled);
break;
}
case id_scroll_indicator_brightness: {
eeprom_ec_config.scroll.v = value_data[0];
uprintf("Scroll indicator brightness: %d\n", eeprom_ec_config.scroll.v);
EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, scroll.v);
break;
}
case id_scroll_indicator_color: {
eeprom_ec_config.scroll.h = value_data[0];
eeprom_ec_config.scroll.s = value_data[1];
uprintf("Scroll indicator color: %d, %d\n", eeprom_ec_config.scroll.h, eeprom_ec_config.scroll.s);
EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, scroll.h);
EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, scroll.s);
break;
}
case id_actuation_mode: {
eeprom_ec_config.actuation_mode = value_data[0];
ec_config.actuation_mode = eeprom_ec_config.actuation_mode;
if (ec_config.actuation_mode == 0) {
uprintf("#########################\n");
uprintf("# Actuation Mode: APC #\n");
uprintf("#########################\n");
} else if (ec_config.actuation_mode == 1) {
uprintf("#################################\n");
uprintf("# Actuation Mode: Rapid Trigger #\n");
uprintf("#################################\n");
}
EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, actuation_mode);
break;
}
case id_mode_0_actuation_threshold: {
ec_config.mode_0_actuation_threshold = value_data[1] | (value_data[0] << 8);
uprintf("APC Mode Actuation Threshold: %d\n", ec_config.mode_0_actuation_threshold);
break;
}
case id_mode_0_release_threshold: {
ec_config.mode_0_release_threshold = value_data[1] | (value_data[0] << 8);
uprintf("APC Mode Release Threshold: %d\n", ec_config.mode_0_release_threshold);
break;
}
case id_mode_1_initial_deadzone_offset: {
ec_config.mode_1_initial_deadzone_offset = value_data[1] | (value_data[0] << 8);
uprintf("Rapid Trigger Mode Initial Deadzone Offset: %d\n", ec_config.mode_1_initial_deadzone_offset);
break;
}
case id_mode_1_actuation_offset: {
ec_config.mode_1_actuation_offset = value_data[0];
uprintf("Rapid Trigger Mode Actuation Offset: %d\n", ec_config.mode_1_actuation_offset);
break;
}
case id_mode_1_release_offset: {
ec_config.mode_1_release_offset = value_data[0];
uprintf("Rapid Trigger Mode Release Offset: %d\n", ec_config.mode_1_release_offset);
break;
}
case id_bottoming_calibration: {
if (value_data[0] == 1) {
ec_config.bottoming_calibration = true;
uprintf("##############################\n");
uprintf("# Bottoming calibration mode #\n");
uprintf("##############################\n");
} else {
ec_config.bottoming_calibration = false;
ec_save_bottoming_reading();
uprintf("## Bottoming calibration done ##\n");
ec_show_calibration_data();
}
break;
}
case id_save_threshold_data: {
ec_save_threshold_data(value_data[0]);
break;
}
case id_noise_floor_calibration: {
if (value_data[0] == 0) {
ec_noise_floor();
ec_rescale_values(0);
ec_rescale_values(1);
ec_rescale_values(2);
uprintf("#############################\n");
uprintf("# Noise floor data acquired #\n");
uprintf("#############################\n");
break;
}
}
case id_show_calibration_data: {
if (value_data[0] == 0) {
ec_show_calibration_data();
break;
}
}
case id_clear_bottoming_calibration_data: {
if (value_data[0] == 0) {
ec_clear_bottoming_calibration_data();
}
}
default: {
// Unhandled value.
break;
}
}
}
// Handle the data sent by the keyboard to the VIA menus
void via_config_get_value(uint8_t *data) {
// data = [ value_id, value_data ]
uint8_t *value_id = &(data[0]);
uint8_t *value_data = &(data[1]);
switch (*value_id) {
case id_num_indicator_enabled: {
value_data[0] = eeprom_ec_config.num.enabled;
break;
}
case id_num_indicator_brightness: {
value_data[0] = eeprom_ec_config.num.v;
break;
}
case id_num_indicator_color: {
value_data[0] = eeprom_ec_config.num.h;
value_data[1] = eeprom_ec_config.num.s;
break;
}
case id_caps_indicator_enabled: {
value_data[0] = eeprom_ec_config.caps.enabled;
break;
}
case id_caps_indicator_brightness: {
value_data[0] = eeprom_ec_config.caps.v;
break;
}
case id_caps_indicator_color: {
value_data[0] = eeprom_ec_config.caps.h;
value_data[1] = eeprom_ec_config.caps.s;
break;
}
case id_scroll_indicator_enabled: {
value_data[0] = eeprom_ec_config.scroll.enabled;
break;
}
case id_scroll_indicator_brightness: {
value_data[0] = eeprom_ec_config.scroll.v;
break;
}
case id_scroll_indicator_color: {
value_data[0] = eeprom_ec_config.scroll.h;
value_data[1] = eeprom_ec_config.scroll.s;
break;
}
case id_actuation_mode: {
value_data[0] = eeprom_ec_config.actuation_mode;
break;
}
case id_mode_0_actuation_threshold: {
value_data[0] = eeprom_ec_config.mode_0_actuation_threshold >> 8;
value_data[1] = eeprom_ec_config.mode_0_actuation_threshold & 0xFF;
break;
}
case id_mode_0_release_threshold: {
value_data[0] = eeprom_ec_config.mode_0_release_threshold >> 8;
value_data[1] = eeprom_ec_config.mode_0_release_threshold & 0xFF;
break;
}
case id_mode_1_initial_deadzone_offset: {
value_data[0] = eeprom_ec_config.mode_1_initial_deadzone_offset >> 8;
value_data[1] = eeprom_ec_config.mode_1_initial_deadzone_offset & 0xFF;
break;
}
case id_mode_1_actuation_offset: {
value_data[0] = eeprom_ec_config.mode_1_actuation_offset;
break;
}
case id_mode_1_release_offset: {
value_data[0] = eeprom_ec_config.mode_1_release_offset;
break;
}
default: {
// Unhandled value.
break;
}
}
}
// Handle the commands sent and received by the keyboard with VIA
void via_custom_value_command_kb(uint8_t *data, uint8_t length) {
// data = [ command_id, channel_id, value_id, value_data ]
uint8_t *command_id = &(data[0]);
uint8_t *channel_id = &(data[1]);
uint8_t *value_id_and_data = &(data[2]);
if (*channel_id == id_custom_channel) {
switch (*command_id) {
case id_custom_set_value: {
via_config_set_value(value_id_and_data);
break;
}
case id_custom_get_value: {
via_config_get_value(value_id_and_data);
break;
}
case id_custom_save: {
// Bypass the save function in favor of pinpointed saves
break;
}
default: {
// Unhandled message.
*command_id = id_unhandled;
break;
}
}
return;
}
*command_id = id_unhandled;
}
// Rescale the values received by VIA to fit the new range
void ec_rescale_values(uint8_t item) {
switch (item) {
// Rescale the APC mode actuation thresholds
case 0:
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
ec_config.rescaled_mode_0_actuation_threshold[row][col] = rescale(ec_config.mode_0_actuation_threshold, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
}
}
break;
// Rescale the APC mode release thresholds
case 1:
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
ec_config.rescaled_mode_0_release_threshold[row][col] = rescale(ec_config.mode_0_release_threshold, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
}
}
break;
// Rescale the Rapid Trigger mode initial deadzone offsets
case 2:
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
ec_config.rescaled_mode_1_initial_deadzone_offset[row][col] = rescale(ec_config.mode_1_initial_deadzone_offset, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
}
}
break;
default:
// Unhandled item.
break;
}
}
void ec_save_threshold_data(uint8_t option) {
// Save APC mode thresholds and rescale them for runtime usage
if (option == 0) {
eeprom_ec_config.mode_0_actuation_threshold = ec_config.mode_0_actuation_threshold;
eeprom_ec_config.mode_0_release_threshold = ec_config.mode_0_release_threshold;
ec_rescale_values(0);
ec_rescale_values(1);
}
// Save Rapid Trigger mode thresholds and rescale them for runtime usage
else if (option == 1) {
eeprom_ec_config.mode_1_initial_deadzone_offset = ec_config.mode_1_initial_deadzone_offset;
eeprom_ec_config.mode_1_actuation_offset = ec_config.mode_1_actuation_offset;
eeprom_ec_config.mode_1_release_offset = ec_config.mode_1_release_offset;
ec_rescale_values(2);
}
eeconfig_update_kb_datablock(&eeprom_ec_config);
uprintf("####################################\n");
uprintf("# New thresholds applied and saved #\n");
uprintf("####################################\n");
}
// Save the bottoming reading
void ec_save_bottoming_reading(void) {
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
// If the bottom reading doesn't go over the noise floor by BOTTOMING_CALIBRATION_THRESHOLD, it is likely that:
// 1. The key is not actually in the matrix
// 2. The key is on an alternative layout, therefore not being pressed
// 3. The key in in the current layout but not being pressed
if (ec_config.bottoming_reading[row][col] < (ec_config.noise_floor[row][col] + BOTTOMING_CALIBRATION_THRESHOLD)) {
eeprom_ec_config.bottoming_reading[row][col] = 1023;
} else {
eeprom_ec_config.bottoming_reading[row][col] = ec_config.bottoming_reading[row][col];
}
}
}
// Rescale the values to fit the new range for runtime usage
ec_rescale_values(0);
ec_rescale_values(1);
ec_rescale_values(2);
eeconfig_update_kb_datablock(&eeprom_ec_config);
}
// Show the calibration data
void ec_show_calibration_data(void) {
uprintf("\n###############\n");
uprintf("# Noise Floor #\n");
uprintf("###############\n");
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS - 1; col++) {
uprintf("%4d,", ec_config.noise_floor[row][col]);
}
uprintf("%4d\n", ec_config.noise_floor[row][MATRIX_COLS - 1]);
}
uprintf("\n######################\n");
uprintf("# Bottoming Readings #\n");
uprintf("######################\n");
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS - 1; col++) {
uprintf("%4d,", eeprom_ec_config.bottoming_reading[row][col]);
}
uprintf("%4d\n", eeprom_ec_config.bottoming_reading[row][MATRIX_COLS - 1]);
}
uprintf("\n######################################\n");
uprintf("# Rescaled APC Mode Actuation Points #\n");
uprintf("######################################\n");
uprintf("Original APC Mode Actuation Point: %4d\n", ec_config.mode_0_actuation_threshold);
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS - 1; col++) {
uprintf("%4d,", ec_config.rescaled_mode_0_actuation_threshold[row][col]);
}
uprintf("%4d\n", ec_config.rescaled_mode_0_actuation_threshold[row][MATRIX_COLS - 1]);
}
uprintf("\n######################################\n");
uprintf("# Rescaled APC Mode Release Points #\n");
uprintf("######################################\n");
uprintf("Original APC Mode Release Point: %4d\n", ec_config.mode_0_release_threshold);
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS - 1; col++) {
uprintf("%4d,", ec_config.rescaled_mode_0_release_threshold[row][col]);
}
uprintf("%4d\n", ec_config.rescaled_mode_0_release_threshold[row][MATRIX_COLS - 1]);
}
uprintf("\n#######################################################\n");
uprintf("# Rescaled Rapid Trigger Mode Initial Deadzone Offset #\n");
uprintf("#######################################################\n");
uprintf("Original Rapid Trigger Mode Initial Deadzone Offset: %4d\n", ec_config.mode_1_initial_deadzone_offset);
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS - 1; col++) {
uprintf("%4d,", ec_config.rescaled_mode_1_initial_deadzone_offset[row][col]);
}
uprintf("%4d\n", ec_config.rescaled_mode_1_initial_deadzone_offset[row][MATRIX_COLS - 1]);
}
print("\n");
}
// Clear the calibration data
void ec_clear_bottoming_calibration_data(void) {
// Clear the EEPROM data
eeconfig_init_kb();
// Reset the runtime values to the EEPROM values
keyboard_post_init_kb();
uprintf("######################################\n");
uprintf("# Bottoming calibration data cleared #\n");
uprintf("######################################\n");
}
#endif // VIA_ENABLE

View File

@ -0,0 +1,42 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 "ec_switch_matrix.h"
#include "matrix.h"
extern matrix_row_t raw_matrix[MATRIX_ROWS]; // raw values
extern matrix_row_t matrix[MATRIX_ROWS]; // debounced values
// Custom matrix init function
void matrix_init_custom(void) {
// Initialize EC
ec_init();
// Get the noise floor at boot
ec_noise_floor();
}
// Custom matrix scan function
bool matrix_scan_custom(matrix_row_t current_matrix[]) {
bool updated = ec_matrix_scan(current_matrix);
return updated;
}
// Bootmagic overriden to avoid conflicts with EC
void bootmagic_scan(void) {
;
}

View File

@ -0,0 +1,28 @@
/* Copyright 2023 Cipulot
*
* 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 3 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_next <mcuconf.h>
#undef STM32_ADC_USE_ADC1
#define STM32_ADC_USE_ADC1 TRUE
#undef STM32_PWM_USE_ADVANCED
#define STM32_PWM_USE_ADVANCED TRUE
#undef STM32_PWM_USE_TIM1
#define STM32_PWM_USE_TIM1 TRUE

View File

@ -0,0 +1,26 @@
# EC980C
![EC980C PCB](https://i.imgur.com/KcnLdVFh.png)
Replacement PCB for the Leopold FC980C.
* Keyboard Maintainer: [cipulot](https://github.com/cipulot)
* Hardware Supported: EC980C PCB
* Hardware Availability: TBD
Make example for this keyboard (after setting up your build environment):
make cipulot/ec_980c:default
Flashing example for this keyboard:
make cipulot/ec_980c:default:flash
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
## Bootloader
Enter the bootloader in 2 ways:
* **Physical reset**: Long short the exposed pads on the top of the PCB
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available

View File

@ -0,0 +1,4 @@
CUSTOM_MATRIX = lite
ANALOG_DRIVER_REQUIRED = yes
SRC += matrix.c ec_switch_matrix.c
OPT = 2

View File

@ -63,9 +63,3 @@
// #define DEBUG_MATRIX_SCAN_RATE // #define DEBUG_MATRIX_SCAN_RATE
#define EECONFIG_KB_DATA_SIZE 169 #define EECONFIG_KB_DATA_SIZE 169
/* 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

View File

@ -6,6 +6,12 @@
"build": { "build": {
"lto": true "lto": true
}, },
"qmk": {
"locking": {
"enabled": true,
"resync": true
}
},
"diode_direction": "COL2ROW", "diode_direction": "COL2ROW",
"features": { "features": {
"bootmagic": false, "bootmagic": false,

View File

@ -1,4 +1,5 @@
CUSTOM_MATRIX = lite CUSTOM_MATRIX = lite
ANALOG_DRIVER_REQUIRED = yes ANALOG_DRIVER_REQUIRED = yes
SRC += keyboards/cipulot/common/matrix.c keyboards/cipulot/common/ec_board.c keyboards/cipulot/common/ec_switch_matrix.c VPATH += keyboards/cipulot/common
SRC += matrix.c ec_board.c ec_switch_matrix.c
OPT = 3 OPT = 3

View File

@ -63,9 +63,3 @@
// #define DEBUG_MATRIX_SCAN_RATE // #define DEBUG_MATRIX_SCAN_RATE
#define EECONFIG_KB_DATA_SIZE 169 #define EECONFIG_KB_DATA_SIZE 169
/* 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

View File

@ -6,6 +6,12 @@
"build": { "build": {
"lto": true "lto": true
}, },
"qmk": {
"locking": {
"enabled": true,
"resync": true
}
},
"diode_direction": "COL2ROW", "diode_direction": "COL2ROW",
"features": { "features": {
"bootmagic": false, "bootmagic": false,

View File

@ -1,4 +1,5 @@
CUSTOM_MATRIX = lite CUSTOM_MATRIX = lite
ANALOG_DRIVER_REQUIRED = yes ANALOG_DRIVER_REQUIRED = yes
SRC += keyboards/cipulot/common/matrix.c keyboards/cipulot/common/ec_board.c keyboards/cipulot/common/ec_switch_matrix.c VPATH += keyboards/cipulot/common
SRC += matrix.c ec_board.c ec_switch_matrix.c
OPT = 3 OPT = 3

View File

@ -0,0 +1,66 @@
/* Copyright 2023 Cipulot
*
* 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 3 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
#define MATRIX_ROWS 5
#define MATRIX_COLS 15
#define MATRIX_ROW_PINS \
{ B13, A8, B12, B14, B15 }
#define AMUX_COUNT 2
#define AMUX_MAX_COLS_COUNT 8
#define AMUX_EN_PINS \
{ B9, B8 }
#define AMUX_SEL_PINS \
{ B7, B6, B5 }
#define AMUX_COL_CHANNELS_SIZES \
{ 8, 7 }
#define AMUX_0_COL_CHANNELS \
{ 3, 0, 1, 2, 4, 6, 7, 5 }
#define AMUX_1_COL_CHANNELS \
{ 3, 0, 1, 2, 4, 6, 7 }
#define AMUX_COL_CHANNELS AMUX_0_COL_CHANNELS, AMUX_1_COL_CHANNELS
#define DISCHARGE_PIN A3
#define ANALOG_PORT A2
#define DEFAULT_ACTUATION_MODE 0
#define DEFAULT_MODE_0_ACTUATION_LEVEL 550
#define DEFAULT_MODE_0_RELEASE_LEVEL 500
#define DEFAULT_MODE_1_INITIAL_DEADZONE_OFFSET DEFAULT_MODE_0_ACTUATION_LEVEL
#define DEFAULT_MODE_1_ACTUATION_OFFSET 70
#define DEFAULT_MODE_1_RELEASE_OFFSET 70
#define DEFAULT_EXTREMUM 1023
#define EXPECTED_NOISE_FLOOR 0
#define NOISE_FLOOR_THRESHOLD 50
#define BOTTOMING_CALIBRATION_THRESHOLD 100
#define DEFAULT_NOISE_FLOOR_SAMPLING_COUNT 30
#define DEFAULT_BOTTOMING_READING 1023
#define DEFAULT_CALIBRATION_STARTER true
#define DISCHARGE_TIME 10
// #define DEBUG_MATRIX_SCAN_RATE
#define EECONFIG_KB_DATA_SIZE 159

View File

@ -0,0 +1,21 @@
/* Copyright 2023 Cipulot
*
* 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 3 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
#define HAL_USE_ADC TRUE
#include_next <halconf.h>

View File

@ -0,0 +1,319 @@
{
"manufacturer": "Cipulot",
"keyboard_name": "Dolice EC",
"maintainer": "Cipulot",
"bootloader": "stm32-dfu",
"build": {
"lto": true
},
"diode_direction": "COL2ROW",
"features": {
"bootmagic": false,
"console": true,
"extrakey": true,
"mousekey": true,
"nkro": true
},
"indicators": {
"caps_lock": "B4",
"num_lock": "A15",
"scroll_lock": "B3",
"on_state": 0
},
"processor": "STM32F411",
"qmk": {
"locking": {
"enabled": true,
"resync": true
}
},
"usb": {
"device_version": "0.0.1",
"pid": "0x6BB9",
"shared_endpoint": {
"keyboard": true
},
"vid": "0x6369"
},
"layout_aliases": {
"LAYOUT_all": "LAYOUT_alice_split_bs"
},
"layouts": {
"LAYOUT_alice": {
"layout": [
{"matrix": [1, 0], "x": 0, "y": 0},
{"matrix": [0, 0], "x": 1.25, "y": 0},
{"matrix": [0, 1], "x": 2.25, "y": 0},
{"matrix": [0, 2], "x": 3.25, "y": 0},
{"matrix": [0, 3], "x": 4.25, "y": 0},
{"matrix": [0, 4], "x": 5.25, "y": 0},
{"matrix": [0, 5], "x": 6.25, "y": 0},
{"matrix": [0, 6], "x": 7.25, "y": 0},
{"matrix": [0, 7], "x": 10.25, "y": 0},
{"matrix": [0, 8], "x": 11.25, "y": 0},
{"matrix": [0, 9], "x": 12.25, "y": 0},
{"matrix": [0, 10], "x": 13.25, "y": 0},
{"matrix": [0, 11], "x": 14.25, "y": 0},
{"matrix": [0, 12], "x": 15.25, "y": 0},
{"matrix": [0, 14], "x": 16.25, "y": 0, "w": 2},
{"matrix": [2, 0], "x": 0, "y": 1},
{"matrix": [1, 1], "x": 1.25, "y": 1, "w": 1.5},
{"matrix": [1, 2], "x": 2.75, "y": 1},
{"matrix": [1, 3], "x": 3.75, "y": 1},
{"matrix": [1, 4], "x": 4.75, "y": 1},
{"matrix": [1, 5], "x": 5.75, "y": 1},
{"matrix": [1, 6], "x": 6.75, "y": 1},
{"matrix": [1, 7], "x": 9.75, "y": 1},
{"matrix": [1, 8], "x": 10.75, "y": 1},
{"matrix": [1, 9], "x": 11.75, "y": 1},
{"matrix": [1, 10], "x": 12.75, "y": 1},
{"matrix": [1, 11], "x": 13.75, "y": 1},
{"matrix": [1, 12], "x": 14.75, "y": 1},
{"matrix": [1, 13], "x": 15.75, "y": 1},
{"matrix": [1, 14], "x": 16.75, "y": 1, "w": 1.5},
{"matrix": [3, 0], "x": 0, "y": 2},
{"matrix": [2, 1], "x": 1.25, "y": 2, "w": 1.75},
{"matrix": [2, 2], "x": 3, "y": 2},
{"matrix": [2, 3], "x": 4, "y": 2},
{"matrix": [2, 4], "x": 5, "y": 2},
{"matrix": [2, 5], "x": 6, "y": 2},
{"matrix": [2, 6], "x": 7, "y": 2},
{"matrix": [2, 7], "x": 10, "y": 2},
{"matrix": [2, 8], "x": 11, "y": 2},
{"matrix": [2, 9], "x": 12, "y": 2},
{"matrix": [2, 10], "x": 13, "y": 2},
{"matrix": [2, 11], "x": 14, "y": 2},
{"matrix": [2, 12], "x": 15, "y": 2},
{"matrix": [2, 13], "x": 16, "y": 2, "w": 2.25},
{"matrix": [3, 1], "x": 1.25, "y": 3, "w": 2.25},
{"matrix": [3, 2], "x": 3.5, "y": 3},
{"matrix": [3, 3], "x": 4.5, "y": 3},
{"matrix": [3, 4], "x": 5.5, "y": 3},
{"matrix": [3, 5], "x": 6.5, "y": 3},
{"matrix": [3, 6], "x": 7.5, "y": 3},
{"matrix": [3, 7], "x": 9.5, "y": 3},
{"matrix": [3, 8], "x": 10.5, "y": 3},
{"matrix": [3, 9], "x": 11.5, "y": 3},
{"matrix": [3, 10], "x": 12.5, "y": 3},
{"matrix": [3, 11], "x": 13.5, "y": 3},
{"matrix": [3, 12], "x": 14.5, "y": 3},
{"matrix": [3, 13], "x": 15.5, "y": 3, "w": 1.75},
{"matrix": [3, 14], "x": 17.25, "y": 3},
{"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.5},
{"matrix": [4, 2], "x": 4.25, "y": 4, "w": 1.5},
{"matrix": [4, 5], "x": 5.75, "y": 4, "w": 2},
{"matrix": [4, 6], "x": 7.75, "y": 4, "w": 1.25},
{"matrix": [4, 8], "x": 9.5, "y": 4, "w": 2.75},
{"matrix": [4, 10], "x": 12.25, "y": 4, "w": 1.5},
{"matrix": [4, 14], "x": 16.75, "y": 4, "w": 1.5}
]
},
"LAYOUT_alice_split_bs": {
"layout": [
{"matrix": [1, 0], "x": 0, "y": 0},
{"matrix": [0, 0], "x": 1.25, "y": 0},
{"matrix": [0, 1], "x": 2.25, "y": 0},
{"matrix": [0, 2], "x": 3.25, "y": 0},
{"matrix": [0, 3], "x": 4.25, "y": 0},
{"matrix": [0, 4], "x": 5.25, "y": 0},
{"matrix": [0, 5], "x": 6.25, "y": 0},
{"matrix": [0, 6], "x": 7.25, "y": 0},
{"matrix": [0, 7], "x": 10.25, "y": 0},
{"matrix": [0, 8], "x": 11.25, "y": 0},
{"matrix": [0, 9], "x": 12.25, "y": 0},
{"matrix": [0, 10], "x": 13.25, "y": 0},
{"matrix": [0, 11], "x": 14.25, "y": 0},
{"matrix": [0, 12], "x": 15.25, "y": 0},
{"matrix": [0, 13], "x": 16.25, "y": 0},
{"matrix": [0, 14], "x": 17.25, "y": 0},
{"matrix": [2, 0], "x": 0, "y": 1},
{"matrix": [1, 1], "x": 1.25, "y": 1, "w": 1.5},
{"matrix": [1, 2], "x": 2.75, "y": 1},
{"matrix": [1, 3], "x": 3.75, "y": 1},
{"matrix": [1, 4], "x": 4.75, "y": 1},
{"matrix": [1, 5], "x": 5.75, "y": 1},
{"matrix": [1, 6], "x": 6.75, "y": 1},
{"matrix": [1, 7], "x": 9.75, "y": 1},
{"matrix": [1, 8], "x": 10.75, "y": 1},
{"matrix": [1, 9], "x": 11.75, "y": 1},
{"matrix": [1, 10], "x": 12.75, "y": 1},
{"matrix": [1, 11], "x": 13.75, "y": 1},
{"matrix": [1, 12], "x": 14.75, "y": 1},
{"matrix": [1, 13], "x": 15.75, "y": 1},
{"matrix": [1, 14], "x": 16.75, "y": 1, "w": 1.5},
{"matrix": [3, 0], "x": 0, "y": 2},
{"matrix": [2, 1], "x": 1.25, "y": 2, "w": 1.75},
{"matrix": [2, 2], "x": 3, "y": 2},
{"matrix": [2, 3], "x": 4, "y": 2},
{"matrix": [2, 4], "x": 5, "y": 2},
{"matrix": [2, 5], "x": 6, "y": 2},
{"matrix": [2, 6], "x": 7, "y": 2},
{"matrix": [2, 7], "x": 10, "y": 2},
{"matrix": [2, 8], "x": 11, "y": 2},
{"matrix": [2, 9], "x": 12, "y": 2},
{"matrix": [2, 10], "x": 13, "y": 2},
{"matrix": [2, 11], "x": 14, "y": 2},
{"matrix": [2, 12], "x": 15, "y": 2},
{"matrix": [2, 13], "x": 16, "y": 2, "w": 2.25},
{"matrix": [3, 1], "x": 1.25, "y": 3, "w": 2.25},
{"matrix": [3, 2], "x": 3.5, "y": 3},
{"matrix": [3, 3], "x": 4.5, "y": 3},
{"matrix": [3, 4], "x": 5.5, "y": 3},
{"matrix": [3, 5], "x": 6.5, "y": 3},
{"matrix": [3, 6], "x": 7.5, "y": 3},
{"matrix": [3, 7], "x": 9.5, "y": 3},
{"matrix": [3, 8], "x": 10.5, "y": 3},
{"matrix": [3, 9], "x": 11.5, "y": 3},
{"matrix": [3, 10], "x": 12.5, "y": 3},
{"matrix": [3, 11], "x": 13.5, "y": 3},
{"matrix": [3, 12], "x": 14.5, "y": 3},
{"matrix": [3, 13], "x": 15.5, "y": 3, "w": 1.75},
{"matrix": [3, 14], "x": 17.25, "y": 3},
{"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.5},
{"matrix": [4, 2], "x": 4.25, "y": 4, "w": 1.5},
{"matrix": [4, 5], "x": 5.75, "y": 4, "w": 2},
{"matrix": [4, 6], "x": 7.75, "y": 4, "w": 1.25},
{"matrix": [4, 8], "x": 9.5, "y": 4, "w": 2.75},
{"matrix": [4, 10], "x": 12.25, "y": 4, "w": 1.5},
{"matrix": [4, 14], "x": 16.75, "y": 4, "w": 1.5}
]
},
"LAYOUT_long_rshift": {
"layout": [
{"matrix": [1, 0], "x": 0, "y": 0},
{"matrix": [0, 0], "x": 1.25, "y": 0},
{"matrix": [0, 1], "x": 2.25, "y": 0},
{"matrix": [0, 2], "x": 3.25, "y": 0},
{"matrix": [0, 3], "x": 4.25, "y": 0},
{"matrix": [0, 4], "x": 5.25, "y": 0},
{"matrix": [0, 5], "x": 6.25, "y": 0},
{"matrix": [0, 6], "x": 7.25, "y": 0},
{"matrix": [0, 7], "x": 10.25, "y": 0},
{"matrix": [0, 8], "x": 11.25, "y": 0},
{"matrix": [0, 9], "x": 12.25, "y": 0},
{"matrix": [0, 10], "x": 13.25, "y": 0},
{"matrix": [0, 11], "x": 14.25, "y": 0},
{"matrix": [0, 12], "x": 15.25, "y": 0},
{"matrix": [0, 14], "x": 16.25, "y": 0, "w": 2},
{"matrix": [2, 0], "x": 0, "y": 1},
{"matrix": [1, 1], "x": 1.25, "y": 1, "w": 1.5},
{"matrix": [1, 2], "x": 2.75, "y": 1},
{"matrix": [1, 3], "x": 3.75, "y": 1},
{"matrix": [1, 4], "x": 4.75, "y": 1},
{"matrix": [1, 5], "x": 5.75, "y": 1},
{"matrix": [1, 6], "x": 6.75, "y": 1},
{"matrix": [1, 7], "x": 9.75, "y": 1},
{"matrix": [1, 8], "x": 10.75, "y": 1},
{"matrix": [1, 9], "x": 11.75, "y": 1},
{"matrix": [1, 10], "x": 12.75, "y": 1},
{"matrix": [1, 11], "x": 13.75, "y": 1},
{"matrix": [1, 12], "x": 14.75, "y": 1},
{"matrix": [1, 13], "x": 15.75, "y": 1},
{"matrix": [1, 14], "x": 16.75, "y": 1, "w": 1.5},
{"matrix": [3, 0], "x": 0, "y": 2},
{"matrix": [2, 1], "x": 1.25, "y": 2, "w": 1.75},
{"matrix": [2, 2], "x": 3, "y": 2},
{"matrix": [2, 3], "x": 4, "y": 2},
{"matrix": [2, 4], "x": 5, "y": 2},
{"matrix": [2, 5], "x": 6, "y": 2},
{"matrix": [2, 6], "x": 7, "y": 2},
{"matrix": [2, 7], "x": 10, "y": 2},
{"matrix": [2, 8], "x": 11, "y": 2},
{"matrix": [2, 9], "x": 12, "y": 2},
{"matrix": [2, 10], "x": 13, "y": 2},
{"matrix": [2, 11], "x": 14, "y": 2},
{"matrix": [2, 12], "x": 15, "y": 2},
{"matrix": [2, 13], "x": 16, "y": 2, "w": 2.25},
{"matrix": [3, 1], "x": 1.25, "y": 3, "w": 2.25},
{"matrix": [3, 2], "x": 3.5, "y": 3},
{"matrix": [3, 3], "x": 4.5, "y": 3},
{"matrix": [3, 4], "x": 5.5, "y": 3},
{"matrix": [3, 5], "x": 6.5, "y": 3},
{"matrix": [3, 6], "x": 7.5, "y": 3},
{"matrix": [3, 7], "x": 9.5, "y": 3},
{"matrix": [3, 8], "x": 10.5, "y": 3},
{"matrix": [3, 9], "x": 11.5, "y": 3},
{"matrix": [3, 10], "x": 12.5, "y": 3},
{"matrix": [3, 11], "x": 13.5, "y": 3},
{"matrix": [3, 12], "x": 14.5, "y": 3},
{"matrix": [3, 13], "x": 15.5, "y": 3, "w": 2.75},
{"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.5},
{"matrix": [4, 2], "x": 4.25, "y": 4, "w": 1.5},
{"matrix": [4, 5], "x": 5.75, "y": 4, "w": 2},
{"matrix": [4, 6], "x": 7.75, "y": 4, "w": 1.25},
{"matrix": [4, 8], "x": 9.5, "y": 4, "w": 2.75},
{"matrix": [4, 10], "x": 12.25, "y": 4, "w": 1.5},
{"matrix": [4, 14], "x": 16.75, "y": 4, "w": 1.5}
]
},
"LAYOUT_long_rshift_split_bs": {
"layout": [
{"matrix": [1, 0], "x": 0, "y": 0},
{"matrix": [0, 0], "x": 1.25, "y": 0},
{"matrix": [0, 1], "x": 2.25, "y": 0},
{"matrix": [0, 2], "x": 3.25, "y": 0},
{"matrix": [0, 3], "x": 4.25, "y": 0},
{"matrix": [0, 4], "x": 5.25, "y": 0},
{"matrix": [0, 5], "x": 6.25, "y": 0},
{"matrix": [0, 6], "x": 7.25, "y": 0},
{"matrix": [0, 7], "x": 10.25, "y": 0},
{"matrix": [0, 8], "x": 11.25, "y": 0},
{"matrix": [0, 9], "x": 12.25, "y": 0},
{"matrix": [0, 10], "x": 13.25, "y": 0},
{"matrix": [0, 11], "x": 14.25, "y": 0},
{"matrix": [0, 12], "x": 15.25, "y": 0},
{"matrix": [0, 13], "x": 16.25, "y": 0},
{"matrix": [0, 14], "x": 17.25, "y": 0},
{"matrix": [2, 0], "x": 0, "y": 1},
{"matrix": [1, 1], "x": 1.25, "y": 1, "w": 1.5},
{"matrix": [1, 2], "x": 2.75, "y": 1},
{"matrix": [1, 3], "x": 3.75, "y": 1},
{"matrix": [1, 4], "x": 4.75, "y": 1},
{"matrix": [1, 5], "x": 5.75, "y": 1},
{"matrix": [1, 6], "x": 6.75, "y": 1},
{"matrix": [1, 7], "x": 9.75, "y": 1},
{"matrix": [1, 8], "x": 10.75, "y": 1},
{"matrix": [1, 9], "x": 11.75, "y": 1},
{"matrix": [1, 10], "x": 12.75, "y": 1},
{"matrix": [1, 11], "x": 13.75, "y": 1},
{"matrix": [1, 12], "x": 14.75, "y": 1},
{"matrix": [1, 13], "x": 15.75, "y": 1},
{"matrix": [1, 14], "x": 16.75, "y": 1, "w": 1.5},
{"matrix": [3, 0], "x": 0, "y": 2},
{"matrix": [2, 1], "x": 1.25, "y": 2, "w": 1.75},
{"matrix": [2, 2], "x": 3, "y": 2},
{"matrix": [2, 3], "x": 4, "y": 2},
{"matrix": [2, 4], "x": 5, "y": 2},
{"matrix": [2, 5], "x": 6, "y": 2},
{"matrix": [2, 6], "x": 7, "y": 2},
{"matrix": [2, 7], "x": 10, "y": 2},
{"matrix": [2, 8], "x": 11, "y": 2},
{"matrix": [2, 9], "x": 12, "y": 2},
{"matrix": [2, 10], "x": 13, "y": 2},
{"matrix": [2, 11], "x": 14, "y": 2},
{"matrix": [2, 12], "x": 15, "y": 2},
{"matrix": [2, 13], "x": 16, "y": 2, "w": 2.25},
{"matrix": [3, 1], "x": 1.25, "y": 3, "w": 2.25},
{"matrix": [3, 2], "x": 3.5, "y": 3},
{"matrix": [3, 3], "x": 4.5, "y": 3},
{"matrix": [3, 4], "x": 5.5, "y": 3},
{"matrix": [3, 5], "x": 6.5, "y": 3},
{"matrix": [3, 6], "x": 7.5, "y": 3},
{"matrix": [3, 7], "x": 9.5, "y": 3},
{"matrix": [3, 8], "x": 10.5, "y": 3},
{"matrix": [3, 9], "x": 11.5, "y": 3},
{"matrix": [3, 10], "x": 12.5, "y": 3},
{"matrix": [3, 11], "x": 13.5, "y": 3},
{"matrix": [3, 12], "x": 14.5, "y": 3},
{"matrix": [3, 13], "x": 15.5, "y": 3, "w": 2.75},
{"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.5},
{"matrix": [4, 2], "x": 4.25, "y": 4, "w": 1.5},
{"matrix": [4, 5], "x": 5.75, "y": 4, "w": 2},
{"matrix": [4, 6], "x": 7.75, "y": 4, "w": 1.25},
{"matrix": [4, 8], "x": 9.5, "y": 4, "w": 2.75},
{"matrix": [4, 10], "x": 12.25, "y": 4, "w": 1.5},
{"matrix": [4, 14], "x": 16.75, "y": 4, "w": 1.5}
]
}
}
}

View File

@ -0,0 +1,41 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_all(
KC_PSCR, KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,
KC_PGUP, 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_PGDN, 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_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1),
KC_LCTL, KC_LALT, KC_SPC, KC_LGUI, KC_SPC, KC_RALT, KC_RCTL
),
[1] = LAYOUT_all(
_______, 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_DEL, KC_DEL,
_______, _______, KC_HOME, KC_UP, KC_END, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, KC_CAPS, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, KC_MPRV, KC_MNXT, KC_MPLY, _______, _______,
_______, _______, _______, _______, _______, _______, MO(2)
),
[2] = LAYOUT_all(
QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______
)
};

View File

@ -0,0 +1,41 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_all(
KC_PSCR, KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,
KC_PGUP, 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_PGDN, 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_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1),
KC_LCTL, KC_LALT, KC_SPC, KC_LGUI, KC_SPC, KC_RALT, KC_RCTL
),
[1] = LAYOUT_all(
_______, 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_DEL, KC_DEL,
_______, _______, KC_HOME, KC_UP, KC_END, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, KC_CAPS, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, KC_MPRV, KC_MNXT, KC_MPLY, _______, _______,
_______, _______, _______, _______, _______, _______, MO(2)
),
[2] = LAYOUT_all(
QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______
)
};

View File

@ -0,0 +1 @@
VIA_ENABLE = yes

View File

@ -0,0 +1,22 @@
/* Copyright 2023 Cipulot
*
* 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 3 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_next <mcuconf.h>
#undef STM32_ADC_USE_ADC1
#define STM32_ADC_USE_ADC1 TRUE

View File

@ -0,0 +1,3 @@
ifeq ($(strip $(VIA_ENABLE)), yes)
SRC += keyboards/cipulot/common/via_ec.c
endif

View File

@ -0,0 +1,26 @@
# Dolice EC
![Dolice EC](https://i.imgur.com/uvM0G5v.png)
The Dolice is a alice keyboard designed by Lx3 (Linworks) and yuktsi (TGR) and run by KLC. EC Version designed by Cipulot.
* Keyboard Maintainer: [cipulot](https://github.com/cipulot)
* Hardware Supported: Dolice EC
* Hardware availability: Groupbuys. Check the ongoing ones on [the KLC Discord](https://discord.gg/d2A72mGPRB) or [Webshop](https://klc-playground.com/).
Make example for this keyboard (after setting up your build environment):
make cipulot/ec_dolice:default
Flashing example for this keyboard:
make cipulot/ec_dolice:default:flash
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
## Bootloader
Enter the bootloader in 2 ways:
* **Physical reset**: Long short the exposed pads on the top of the PCB
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available

View File

@ -0,0 +1,5 @@
CUSTOM_MATRIX = lite
ANALOG_DRIVER_REQUIRED = yes
VPATH += keyboards/cipulot/common
SRC += matrix.c ec_board.c ec_switch_matrix.c
OPT = 3

View File

@ -0,0 +1,61 @@
/* Copyright 2023 Cipulot
*
* 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 3 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
#define MATRIX_ROWS 4
#define MATRIX_COLS 12
#define MATRIX_ROW_PINS \
{ A0, A3, A2, A1 }
#define AMUX_COUNT 1
#define AMUX_MAX_COLS_COUNT 12
#define AMUX_EN_PINS \
{ C10 }
#define AMUX_SEL_PINS \
{ C11, B3, A15, A14 }
#define AMUX_COL_CHANNELS_SIZES \
{ 12 }
#define AMUX_0_COL_CHANNELS \
{ 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10 }
#define AMUX_COL_CHANNELS AMUX_0_COL_CHANNELS
#define DISCHARGE_PIN A4
#define ANALOG_PORT A5
#define DEFAULT_ACTUATION_MODE 0
#define DEFAULT_MODE_0_ACTUATION_LEVEL 550
#define DEFAULT_MODE_0_RELEASE_LEVEL 500
#define DEFAULT_MODE_1_INITIAL_DEADZONE_OFFSET DEFAULT_MODE_0_ACTUATION_LEVEL
#define DEFAULT_MODE_1_ACTUATION_OFFSET 70
#define DEFAULT_MODE_1_RELEASE_OFFSET 70
#define DEFAULT_EXTREMUM 1023
#define EXPECTED_NOISE_FLOOR 0
#define NOISE_FLOOR_THRESHOLD 50
#define BOTTOMING_CALIBRATION_THRESHOLD 50
#define DEFAULT_NOISE_FLOOR_SAMPLING_COUNT 30
#define DEFAULT_BOTTOMING_READING 1023
#define DEFAULT_CALIBRATION_STARTER true
#define DISCHARGE_TIME 10
#define EECONFIG_KB_DATA_SIZE 105

View File

@ -0,0 +1,21 @@
/* Copyright 2023 Cipulot
*
* 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 3 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
#define HAL_USE_ADC TRUE
#include_next <halconf.h>

View File

@ -0,0 +1,87 @@
{
"manufacturer": "Cipulot",
"keyboard_name": "EC Menhir",
"maintainer": "Cipulot",
"bootloader": "stm32-dfu",
"build": {
"lto": true
},
"diode_direction": "COL2ROW",
"eeprom": {
"driver": "wear_leveling",
"wear_leveling": {
"driver": "embedded_flash",
"backing_size": 4096
}
},
"features": {
"bootmagic": false,
"console": true,
"extrakey": true,
"mousekey": true,
"nkro": true
},
"processor": "STM32G431",
"qmk": {
"locking": {
"enabled": true,
"resync": true
}
},
"usb": {
"device_version": "0.0.1",
"pid": "0x6BB8",
"shared_endpoint": {
"keyboard": true
},
"vid": "0x6369"
},
"layouts": {
"LAYOUT": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0, "w": 1.75},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.25},
{"matrix": [1, 1], "x": 1.25, "y": 1},
{"matrix": [1, 2], "x": 2.25, "y": 1},
{"matrix": [1, 3], "x": 3.25, "y": 1},
{"matrix": [1, 4], "x": 4.25, "y": 1},
{"matrix": [1, 5], "x": 5.25, "y": 1},
{"matrix": [1, 6], "x": 6.25, "y": 1},
{"matrix": [1, 7], "x": 7.25, "y": 1},
{"matrix": [1, 8], "x": 8.25, "y": 1},
{"matrix": [1, 9], "x": 9.25, "y": 1},
{"matrix": [1, 10], "x": 10.25, "y": 1},
{"matrix": [1, 11], "x": 11.25, "y": 1, "w": 1.5},
{"matrix": [2, 0], "x": 0.5, "y": 2, "w": 1.25},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2, "w": 1.5},
{"matrix": [3, 1], "x": 1.75, "y": 3, "w": 1.25},
{"matrix": [3, 2], "x": 3, "y": 3},
{"matrix": [3, 4], "x": 4, "y": 3, "w": 2},
{"matrix": [3, 5], "x": 6, "y": 3},
{"matrix": [3, 6], "x": 7, "y": 3, "w": 2},
{"matrix": [3, 8], "x": 9, "y": 3},
{"matrix": [3, 9], "x": 10, "y": 3}
]
}
}
}

View File

@ -0,0 +1,27 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format off
[0] = LAYOUT(
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_TAB, 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,
KC_LALT, KC_LGUI, MO(1), KC_SPC, KC_SPC, MO(2), KC_LCTL)
// clang-format on
};

View File

@ -0,0 +1,27 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format off
[0] = LAYOUT(
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_TAB, 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,
KC_LALT, KC_LGUI, MO(1), KC_SPC, KC_SPC, MO(2), KC_LCTL)
// clang-format on
};

View File

@ -0,0 +1 @@
VIA_ENABLE = yes

View File

@ -0,0 +1,22 @@
/* Copyright 2023 Cipulot
*
* 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 3 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_next <mcuconf.h>
#undef STM32_ADC_USE_ADC2
#define STM32_ADC_USE_ADC2 TRUE

View File

@ -0,0 +1,3 @@
ifeq ($(strip $(VIA_ENABLE)), yes)
SRC += keyboards/cipulot/common/via_ec.c
endif

View File

@ -0,0 +1,26 @@
# EC Menhir
![EC Menhir](https://i.imgur.com/m0feb2Zh.png)
EC version of the Menhir.
* Keyboard Maintainer: [cipulot](https://github.com/cipulot)
* Hardware Supported: EC Menhir
* Hardware Availability: [fruitykeeb](https://fruitykeeb.xyz/)
Make example for this keyboard (after setting up your build environment):
make cipulot/ec_menhir:default
Flashing example for this keyboard:
make cipulot/ec_menhir:default:flash
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
## Bootloader
Enter the bootloader in 2 ways:
* **Physical Boot0 pins**: Short the Boot0 pins on the back of the PCB while plugging in the keyboard
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available

View File

@ -0,0 +1,4 @@
CUSTOM_MATRIX = lite
ANALOG_DRIVER_REQUIRED = yes
VPATH += keyboards/cipulot/common
SRC += matrix.c ec_board.c ec_switch_matrix.c

View File

@ -65,8 +65,3 @@
#define EECONFIG_KB_DATA_SIZE 159 #define EECONFIG_KB_DATA_SIZE 159
/* 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

View File

@ -6,6 +6,12 @@
"build": { "build": {
"lto": true "lto": true
}, },
"qmk": {
"locking": {
"enabled": true,
"resync": true
}
},
"diode_direction": "COL2ROW", "diode_direction": "COL2ROW",
"features": { "features": {
"bootmagic": false, "bootmagic": false,

View File

@ -1,4 +1,5 @@
CUSTOM_MATRIX = lite CUSTOM_MATRIX = lite
ANALOG_DRIVER_REQUIRED = yes ANALOG_DRIVER_REQUIRED = yes
SRC += keyboards/cipulot/common/matrix.c keyboards/cipulot/common/ec_board.c keyboards/cipulot/common/ec_switch_matrix.c VPATH += keyboards/cipulot/common
SRC += matrix.c ec_board.c ec_switch_matrix.c
OPT = 2 OPT = 2

View File

@ -64,9 +64,3 @@
// #define DEBUG_MATRIX_SCAN_RATE // #define DEBUG_MATRIX_SCAN_RATE
#define EECONFIG_KB_DATA_SIZE 159 #define EECONFIG_KB_DATA_SIZE 159
/* 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

View File

@ -6,6 +6,12 @@
"build": { "build": {
"lto": true "lto": true
}, },
"qmk": {
"locking": {
"enabled": true,
"resync": true
}
},
"diode_direction": "COL2ROW", "diode_direction": "COL2ROW",
"features": { "features": {
"bootmagic": false, "bootmagic": false,

View File

@ -1,4 +1,5 @@
CUSTOM_MATRIX = lite CUSTOM_MATRIX = lite
ANALOG_DRIVER_REQUIRED = yes ANALOG_DRIVER_REQUIRED = yes
SRC += keyboards/cipulot/common/matrix.c keyboards/cipulot/common/ec_board.c keyboards/cipulot/common/ec_switch_matrix.c VPATH += keyboards/cipulot/common
SRC += matrix.c ec_board.c ec_switch_matrix.c
OPT = 2 OPT = 2

View File

@ -64,9 +64,3 @@
// #define DEBUG_MATRIX_SCAN_RATE // #define DEBUG_MATRIX_SCAN_RATE
#define EECONFIG_KB_DATA_SIZE 149 #define EECONFIG_KB_DATA_SIZE 149
/* 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

View File

@ -6,6 +6,12 @@
"build": { "build": {
"lto": true "lto": true
}, },
"qmk": {
"locking": {
"enabled": true,
"resync": true
}
},
"diode_direction": "COL2ROW", "diode_direction": "COL2ROW",
"features": { "features": {
"bootmagic": false, "bootmagic": false,

View File

@ -1,4 +1,5 @@
CUSTOM_MATRIX = lite CUSTOM_MATRIX = lite
ANALOG_DRIVER_REQUIRED = yes ANALOG_DRIVER_REQUIRED = yes
SRC += keyboards/cipulot/common/matrix.c keyboards/cipulot/common/ec_board.c keyboards/cipulot/common/ec_switch_matrix.c VPATH += keyboards/cipulot/common
SRC += matrix.c ec_board.c ec_switch_matrix.c
OPT = 2 OPT = 2

View File

@ -63,9 +63,3 @@
// #define DEBUG_MATRIX_SCAN_RATE // #define DEBUG_MATRIX_SCAN_RATE
#define DYNAMIC_KEYMAP_LAYER_COUNT 3 #define DYNAMIC_KEYMAP_LAYER_COUNT 3
#define EECONFIG_KB_DATA_SIZE 201 #define EECONFIG_KB_DATA_SIZE 201
/* 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

View File

@ -6,6 +6,12 @@
"build": { "build": {
"lto": true "lto": true
}, },
"qmk": {
"locking": {
"enabled": true,
"resync": true
}
},
"diode_direction": "COL2ROW", "diode_direction": "COL2ROW",
"features": { "features": {
"bootmagic": false, "bootmagic": false,
@ -27,10 +33,6 @@
"LAYOUT_all": "LAYOUT_tkl_ansi", "LAYOUT_all": "LAYOUT_tkl_ansi",
"LAYOUT_tkl_ansi_tsangan_wkl": "LAYOUT_tkl_ansi_wkl" "LAYOUT_tkl_ansi_tsangan_wkl": "LAYOUT_tkl_ansi_wkl"
}, },
"community_layouts": [
"tkl_ansi",
"tkl_ansi_tsangan"
],
"layouts": { "layouts": {
"LAYOUT_tkl_ansi": { "LAYOUT_tkl_ansi": {
"layout": [ "layout": [

View File

@ -1,4 +1,5 @@
CUSTOM_MATRIX = lite CUSTOM_MATRIX = lite
ANALOG_DRIVER_REQUIRED = yes ANALOG_DRIVER_REQUIRED = yes
SRC += keyboards/cipulot/common/matrix.c keyboards/cipulot/common/ec_board.c keyboards/cipulot/common/ec_switch_matrix.c VPATH += keyboards/cipulot/common
SRC += matrix.c ec_board.c ec_switch_matrix.c
OPT = 3 OPT = 3

View File

@ -0,0 +1,69 @@
/* Copyright 2023 Cipulot
*
* 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 3 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
#define MATRIX_ROWS 6
#define MATRIX_COLS 16
#define MATRIX_ROW_PINS \
{ B6, B5, B12, B10, B13, B7 }
#define AMUX_COUNT 1
#define AMUX_MAX_COLS_COUNT 16
#define AMUX_EN_PINS \
{ A8 }
#define AMUX_SEL_PINS \
{ B14, B15, A9, A10 }
#define AMUX_COL_CHANNELS_SIZES \
{ 16 }
#define AMUX_0_COL_CHANNELS \
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
#define AMUX_COL_CHANNELS AMUX_0_COL_CHANNELS
#define DISCHARGE_PIN A4
#define ANALOG_PORT A2
#define DEFAULT_ACTUATION_MODE 0
#define DEFAULT_MODE_0_ACTUATION_LEVEL 550
#define DEFAULT_MODE_0_RELEASE_LEVEL 500
#define DEFAULT_MODE_1_INITIAL_DEADZONE_OFFSET DEFAULT_MODE_0_ACTUATION_LEVEL
#define DEFAULT_MODE_1_ACTUATION_OFFSET 70
#define DEFAULT_MODE_1_RELEASE_OFFSET 70
#define DEFAULT_EXTREMUM 1023
#define EXPECTED_NOISE_FLOOR 0
#define NOISE_FLOOR_THRESHOLD 50
#define BOTTOMING_CALIBRATION_THRESHOLD 50
#define DEFAULT_NOISE_FLOOR_SAMPLING_COUNT 30
#define DEFAULT_BOTTOMING_READING 1023
#define DEFAULT_CALIBRATION_STARTER true
#define DISCHARGE_TIME 10
// #define DEBUG_MATRIX_SCAN_RATE
#define EECONFIG_KB_DATA_SIZE 201
// PWM driver with direct memory access (DMA) support
#define WS2812_PWM_DRIVER PWMD3
#define WS2812_PWM_CHANNEL 1
#define WS2812_PWM_PAL_MODE 2
#define WS2812_DMA_STREAM STM32_DMA1_STREAM2
#define WS2812_DMA_CHANNEL 5

View File

@ -0,0 +1,23 @@
/* Copyright 2023 Cipulot
*
* 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 3 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
#define HAL_USE_ADC TRUE
#define HAL_USE_PAL TRUE
#define HAL_USE_PWM TRUE
#include_next <halconf.h>

View File

@ -0,0 +1,433 @@
{
"manufacturer": "Cipulot",
"keyboard_name": "EC TKL",
"maintainer": "Cipulot",
"bootloader": "stm32-dfu",
"build": {
"lto": true
},
"diode_direction": "COL2ROW",
"eeprom": {
"wear_leveling": {
"backing_size": 4096
}
},
"features": {
"bootmagic": false,
"console": true,
"extrakey": true,
"mousekey": true,
"nkro": true,
"rgblight": true
},
"processor": "STM32F411",
"qmk": {
"locking": {
"enabled": true,
"resync": true
}
},
"rgblight": {
"animations": {
"alternating": true,
"breathing": true,
"christmas": true,
"knight": true,
"rainbow_mood": true,
"rainbow_swirl": true,
"rgb_test": true,
"snake": true,
"static_gradient": true,
"twinkle": true
},
"led_count": 22
},
"usb": {
"device_version": "0.0.1",
"pid": "0x6BC3",
"shared_endpoint": {
"keyboard": true
},
"vid": "0x6369"
},
"ws2812": {
"driver": "pwm",
"pin": "B4"
},
"layouts": {
"LAYOUT_all": {
"layout": [
{"label": "0,0", "matrix": [0, 0], "x": 0, "y": 0},
{"label": "0,1", "matrix": [0, 1], "x": 2, "y": 0},
{"label": "0,2", "matrix": [0, 2], "x": 3, "y": 0},
{"label": "0,3", "matrix": [0, 3], "x": 4, "y": 0},
{"label": "0,4", "matrix": [0, 4], "x": 5, "y": 0},
{"label": "0,5", "matrix": [0, 5], "x": 6.5, "y": 0},
{"label": "0,6", "matrix": [0, 6], "x": 7.5, "y": 0},
{"label": "0,7", "matrix": [0, 7], "x": 8.5, "y": 0},
{"label": "0,8", "matrix": [0, 8], "x": 9.5, "y": 0},
{"label": "0,9", "matrix": [0, 9], "x": 11, "y": 0},
{"label": "0,10", "matrix": [0, 10], "x": 12, "y": 0},
{"label": "0,11", "matrix": [0, 11], "x": 13, "y": 0},
{"label": "0,12", "matrix": [0, 12], "x": 14, "y": 0},
{"label": "0,13", "matrix": [0, 13], "x": 15.25, "y": 0},
{"label": "0,14", "matrix": [0, 14], "x": 16.25, "y": 0},
{"label": "0,15", "matrix": [0, 15], "x": 17.25, "y": 0},
{"label": "1,0", "matrix": [1, 0], "x": 0, "y": 1.25},
{"label": "1,1", "matrix": [1, 1], "x": 1, "y": 1.25},
{"label": "1,2", "matrix": [1, 2], "x": 2, "y": 1.25},
{"label": "1,3", "matrix": [1, 3], "x": 3, "y": 1.25},
{"label": "1,4", "matrix": [1, 4], "x": 4, "y": 1.25},
{"label": "1,5", "matrix": [1, 5], "x": 5, "y": 1.25},
{"label": "1,6", "matrix": [1, 6], "x": 6, "y": 1.25},
{"label": "1,7", "matrix": [1, 7], "x": 7, "y": 1.25},
{"label": "1,8", "matrix": [1, 8], "x": 8, "y": 1.25},
{"label": "1,9", "matrix": [1, 9], "x": 9, "y": 1.25},
{"label": "1,10", "matrix": [1, 10], "x": 10, "y": 1.25},
{"label": "1,11", "matrix": [1, 11], "x": 11, "y": 1.25},
{"label": "1,12", "matrix": [1, 12], "x": 12, "y": 1.25},
{"label": "1,13", "matrix": [1, 13], "x": 13, "y": 1.25},
{"label": "1,14", "matrix": [1, 14], "x": 14, "y": 1.25},
{"label": "3,14", "matrix": [3, 14], "x": 15.25, "y": 1.25},
{"label": "2,15", "matrix": [2, 15], "x": 16.25, "y": 1.25},
{"label": "1,15", "matrix": [1, 15], "x": 17.25, "y": 1.25},
{"label": "2,0", "matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
{"label": "2,1", "matrix": [2, 1], "x": 1.5, "y": 2.25},
{"label": "2,2", "matrix": [2, 2], "x": 2.5, "y": 2.25},
{"label": "2,3", "matrix": [2, 3], "x": 3.5, "y": 2.25},
{"label": "2,4", "matrix": [2, 4], "x": 4.5, "y": 2.25},
{"label": "2,5", "matrix": [2, 5], "x": 5.5, "y": 2.25},
{"label": "2,6", "matrix": [2, 6], "x": 6.5, "y": 2.25},
{"label": "2,7", "matrix": [2, 7], "x": 7.5, "y": 2.25},
{"label": "2,8", "matrix": [2, 8], "x": 8.5, "y": 2.25},
{"label": "2,9", "matrix": [2, 9], "x": 9.5, "y": 2.25},
{"label": "2,10", "matrix": [2, 10], "x": 10.5, "y": 2.25},
{"label": "2,11", "matrix": [2, 11], "x": 11.5, "y": 2.25},
{"label": "2,12", "matrix": [2, 12], "x": 12.5, "y": 2.25},
{"label": "2,13", "matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 0.75},
{"label": "2,14", "matrix": [2, 14], "x": 14.25, "y": 2.25, "w": 0.75},
{"label": "4,14", "matrix": [4, 14], "x": 15.25, "y": 2.25},
{"label": "4,15", "matrix": [4, 15], "x": 16.25, "y": 2.25},
{"label": "3,15", "matrix": [3, 15], "x": 17.25, "y": 2.25},
{"label": "3,0", "matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
{"label": "3,1", "matrix": [3, 1], "x": 1.75, "y": 3.25},
{"label": "3,2", "matrix": [3, 2], "x": 2.75, "y": 3.25},
{"label": "3,3", "matrix": [3, 3], "x": 3.75, "y": 3.25},
{"label": "3,4", "matrix": [3, 4], "x": 4.75, "y": 3.25},
{"label": "3,5", "matrix": [3, 5], "x": 5.75, "y": 3.25},
{"label": "3,6", "matrix": [3, 6], "x": 6.75, "y": 3.25},
{"label": "3,7", "matrix": [3, 7], "x": 7.75, "y": 3.25},
{"label": "3,8", "matrix": [3, 8], "x": 8.75, "y": 3.25},
{"label": "3,9", "matrix": [3, 9], "x": 9.75, "y": 3.25},
{"label": "3,10", "matrix": [3, 10], "x": 10.75, "y": 3.25},
{"label": "3,11", "matrix": [3, 11], "x": 11.75, "y": 3.25},
{"label": "3,12", "matrix": [3, 12], "x": 12.75, "y": 3.25},
{"label": "3,13", "matrix": [3, 13], "x": 13.75, "y": 3.25, "w": 1.25},
{"label": "4,0", "matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25},
{"label": "4,1", "matrix": [4, 1], "x": 1.25, "y": 4.25},
{"label": "4,2", "matrix": [4, 2], "x": 2.25, "y": 4.25},
{"label": "4,3", "matrix": [4, 3], "x": 3.25, "y": 4.25},
{"label": "4,4", "matrix": [4, 4], "x": 4.25, "y": 4.25},
{"label": "4,5", "matrix": [4, 5], "x": 5.25, "y": 4.25},
{"label": "4,6", "matrix": [4, 6], "x": 6.25, "y": 4.25},
{"label": "4,7", "matrix": [4, 7], "x": 7.25, "y": 4.25},
{"label": "4,8", "matrix": [4, 8], "x": 8.25, "y": 4.25},
{"label": "4,9", "matrix": [4, 9], "x": 9.25, "y": 4.25},
{"label": "4,10", "matrix": [4, 10], "x": 10.25, "y": 4.25},
{"label": "4,11", "matrix": [4, 11], "x": 11.25, "y": 4.25},
{"label": "4,12", "matrix": [4, 12], "x": 12.25, "y": 4.25},
{"label": "4,13", "matrix": [4, 13], "x": 13.25, "y": 4.25, "w": 1.75},
{"label": "5,14", "matrix": [5, 14], "x": 16.25, "y": 4.25},
{"label": "5,0", "matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
{"label": "5,1", "matrix": [5, 1], "x": 1.5, "y": 5.25},
{"label": "5,2", "matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5},
{"label": "5,4", "matrix": [5, 4], "x": 4, "y": 5.25, "w": 1.5},
{"label": "5,6", "matrix": [5, 6], "x": 5.5, "y": 5.25, "w": 2.5},
{"label": "5,7", "matrix": [5, 7], "x": 8, "y": 5.25, "w": 1.5},
{"label": "5,8", "matrix": [5, 8], "x": 9.5, "y": 5.25, "w": 1.5},
{"label": "5,9", "matrix": [5, 9], "x": 11, "y": 5.25, "w": 1.5},
{"label": "5,10", "matrix": [5, 10], "x": 12.5, "y": 5.25},
{"label": "5,11", "matrix": [5, 11], "x": 13.5, "y": 5.25, "w": 1.5},
{"label": "5,12", "matrix": [5, 12], "x": 15.25, "y": 5.25},
{"label": "5,13", "matrix": [5, 13], "x": 16.25, "y": 5.25},
{"label": "5,15", "matrix": [5, 15], "x": 17.25, "y": 5.25}
]
},
"LAYOUT_tkl_ansi_tsangan": {
"layout": [
{"label": "0,0", "matrix": [0, 0], "x": 0, "y": 0},
{"label": "0,1", "matrix": [0, 1], "x": 2, "y": 0},
{"label": "0,2", "matrix": [0, 2], "x": 3, "y": 0},
{"label": "0,3", "matrix": [0, 3], "x": 4, "y": 0},
{"label": "0,4", "matrix": [0, 4], "x": 5, "y": 0},
{"label": "0,5", "matrix": [0, 5], "x": 6.5, "y": 0},
{"label": "0,6", "matrix": [0, 6], "x": 7.5, "y": 0},
{"label": "0,7", "matrix": [0, 7], "x": 8.5, "y": 0},
{"label": "0,8", "matrix": [0, 8], "x": 9.5, "y": 0},
{"label": "0,9", "matrix": [0, 9], "x": 11, "y": 0},
{"label": "0,10", "matrix": [0, 10], "x": 12, "y": 0},
{"label": "0,11", "matrix": [0, 11], "x": 13, "y": 0},
{"label": "0,12", "matrix": [0, 12], "x": 14, "y": 0},
{"label": "0,13", "matrix": [0, 13], "x": 15.25, "y": 0},
{"label": "0,14", "matrix": [0, 14], "x": 16.25, "y": 0},
{"label": "0,15", "matrix": [0, 15], "x": 17.25, "y": 0},
{"label": "1,0", "matrix": [1, 0], "x": 0, "y": 1.25},
{"label": "1,1", "matrix": [1, 1], "x": 1, "y": 1.25},
{"label": "1,2", "matrix": [1, 2], "x": 2, "y": 1.25},
{"label": "1,3", "matrix": [1, 3], "x": 3, "y": 1.25},
{"label": "1,4", "matrix": [1, 4], "x": 4, "y": 1.25},
{"label": "1,5", "matrix": [1, 5], "x": 5, "y": 1.25},
{"label": "1,6", "matrix": [1, 6], "x": 6, "y": 1.25},
{"label": "1,7", "matrix": [1, 7], "x": 7, "y": 1.25},
{"label": "1,8", "matrix": [1, 8], "x": 8, "y": 1.25},
{"label": "1,9", "matrix": [1, 9], "x": 9, "y": 1.25},
{"label": "1,10", "matrix": [1, 10], "x": 10, "y": 1.25},
{"label": "1,11", "matrix": [1, 11], "x": 11, "y": 1.25},
{"label": "1,12", "matrix": [1, 12], "x": 12, "y": 1.25},
{"label": "1,14", "matrix": [1, 14], "x": 13, "y": 1.25, "w": 2},
{"label": "3,14", "matrix": [3, 14], "x": 15.25, "y": 1.25},
{"label": "2,15", "matrix": [2, 15], "x": 16.25, "y": 1.25},
{"label": "1,15", "matrix": [1, 15], "x": 17.25, "y": 1.25},
{"label": "2,0", "matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
{"label": "2,1", "matrix": [2, 1], "x": 1.5, "y": 2.25},
{"label": "2,2", "matrix": [2, 2], "x": 2.5, "y": 2.25},
{"label": "2,3", "matrix": [2, 3], "x": 3.5, "y": 2.25},
{"label": "2,4", "matrix": [2, 4], "x": 4.5, "y": 2.25},
{"label": "2,5", "matrix": [2, 5], "x": 5.5, "y": 2.25},
{"label": "2,6", "matrix": [2, 6], "x": 6.5, "y": 2.25},
{"label": "2,7", "matrix": [2, 7], "x": 7.5, "y": 2.25},
{"label": "2,8", "matrix": [2, 8], "x": 8.5, "y": 2.25},
{"label": "2,9", "matrix": [2, 9], "x": 9.5, "y": 2.25},
{"label": "2,10", "matrix": [2, 10], "x": 10.5, "y": 2.25},
{"label": "2,11", "matrix": [2, 11], "x": 11.5, "y": 2.25},
{"label": "2,12", "matrix": [2, 12], "x": 12.5, "y": 2.25},
{"label": "2,13", "matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5},
{"label": "4,14", "matrix": [4, 14], "x": 15.25, "y": 2.25},
{"label": "4,15", "matrix": [4, 15], "x": 16.25, "y": 2.25},
{"label": "3,15", "matrix": [3, 15], "x": 17.25, "y": 2.25},
{"label": "3,0", "matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
{"label": "3,1", "matrix": [3, 1], "x": 1.75, "y": 3.25},
{"label": "3,2", "matrix": [3, 2], "x": 2.75, "y": 3.25},
{"label": "3,3", "matrix": [3, 3], "x": 3.75, "y": 3.25},
{"label": "3,4", "matrix": [3, 4], "x": 4.75, "y": 3.25},
{"label": "3,5", "matrix": [3, 5], "x": 5.75, "y": 3.25},
{"label": "3,6", "matrix": [3, 6], "x": 6.75, "y": 3.25},
{"label": "3,7", "matrix": [3, 7], "x": 7.75, "y": 3.25},
{"label": "3,8", "matrix": [3, 8], "x": 8.75, "y": 3.25},
{"label": "3,9", "matrix": [3, 9], "x": 9.75, "y": 3.25},
{"label": "3,10", "matrix": [3, 10], "x": 10.75, "y": 3.25},
{"label": "3,11", "matrix": [3, 11], "x": 11.75, "y": 3.25},
{"label": "3,13", "matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25},
{"label": "4,0", "matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25},
{"label": "4,2", "matrix": [4, 2], "x": 2.25, "y": 4.25},
{"label": "4,3", "matrix": [4, 3], "x": 3.25, "y": 4.25},
{"label": "4,4", "matrix": [4, 4], "x": 4.25, "y": 4.25},
{"label": "4,5", "matrix": [4, 5], "x": 5.25, "y": 4.25},
{"label": "4,6", "matrix": [4, 6], "x": 6.25, "y": 4.25},
{"label": "4,7", "matrix": [4, 7], "x": 7.25, "y": 4.25},
{"label": "4,8", "matrix": [4, 8], "x": 8.25, "y": 4.25},
{"label": "4,9", "matrix": [4, 9], "x": 9.25, "y": 4.25},
{"label": "4,10", "matrix": [4, 10], "x": 10.25, "y": 4.25},
{"label": "4,11", "matrix": [4, 11], "x": 11.25, "y": 4.25},
{"label": "4,13", "matrix": [4, 13], "x": 12.25, "y": 4.25, "w": 2.75},
{"label": "5,14", "matrix": [5, 14], "x": 16.25, "y": 4.25},
{"label": "5,0", "matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
{"label": "5,1", "matrix": [5, 1], "x": 1.5, "y": 5.25},
{"label": "5,2", "matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5},
{"label": "5,6", "matrix": [5, 6], "x": 4, "y": 5.25, "w": 7},
{"label": "5,9", "matrix": [5, 9], "x": 11, "y": 5.25, "w": 1.5},
{"label": "5,10", "matrix": [5, 10], "x": 12.5, "y": 5.25},
{"label": "5,11", "matrix": [5, 11], "x": 13.5, "y": 5.25, "w": 1.5},
{"label": "5,12", "matrix": [5, 12], "x": 15.25, "y": 5.25},
{"label": "5,13", "matrix": [5, 13], "x": 16.25, "y": 5.25},
{"label": "5,15", "matrix": [5, 15], "x": 17.25, "y": 5.25}
]
},
"LAYOUT_tkl_iso_tsangan": {
"layout": [
{"label": "0,0", "matrix": [0, 0], "x": 0, "y": 0},
{"label": "0,1", "matrix": [0, 1], "x": 2, "y": 0},
{"label": "0,2", "matrix": [0, 2], "x": 3, "y": 0},
{"label": "0,3", "matrix": [0, 3], "x": 4, "y": 0},
{"label": "0,4", "matrix": [0, 4], "x": 5, "y": 0},
{"label": "0,5", "matrix": [0, 5], "x": 6.5, "y": 0},
{"label": "0,6", "matrix": [0, 6], "x": 7.5, "y": 0},
{"label": "0,7", "matrix": [0, 7], "x": 8.5, "y": 0},
{"label": "0,8", "matrix": [0, 8], "x": 9.5, "y": 0},
{"label": "0,9", "matrix": [0, 9], "x": 11, "y": 0},
{"label": "0,10", "matrix": [0, 10], "x": 12, "y": 0},
{"label": "0,11", "matrix": [0, 11], "x": 13, "y": 0},
{"label": "0,12", "matrix": [0, 12], "x": 14, "y": 0},
{"label": "0,13", "matrix": [0, 13], "x": 15.25, "y": 0},
{"label": "0,14", "matrix": [0, 14], "x": 16.25, "y": 0},
{"label": "0,15", "matrix": [0, 15], "x": 17.25, "y": 0},
{"label": "1,0", "matrix": [1, 0], "x": 0, "y": 1.25},
{"label": "1,1", "matrix": [1, 1], "x": 1, "y": 1.25},
{"label": "1,2", "matrix": [1, 2], "x": 2, "y": 1.25},
{"label": "1,3", "matrix": [1, 3], "x": 3, "y": 1.25},
{"label": "1,4", "matrix": [1, 4], "x": 4, "y": 1.25},
{"label": "1,5", "matrix": [1, 5], "x": 5, "y": 1.25},
{"label": "1,6", "matrix": [1, 6], "x": 6, "y": 1.25},
{"label": "1,7", "matrix": [1, 7], "x": 7, "y": 1.25},
{"label": "1,8", "matrix": [1, 8], "x": 8, "y": 1.25},
{"label": "1,9", "matrix": [1, 9], "x": 9, "y": 1.25},
{"label": "1,10", "matrix": [1, 10], "x": 10, "y": 1.25},
{"label": "1,11", "matrix": [1, 11], "x": 11, "y": 1.25},
{"label": "1,12", "matrix": [1, 12], "x": 12, "y": 1.25},
{"label": "1,14", "matrix": [1, 14], "x": 13, "y": 1.25, "w": 2},
{"label": "3,14", "matrix": [3, 14], "x": 15.25, "y": 1.25},
{"label": "2,15", "matrix": [2, 15], "x": 16.25, "y": 1.25},
{"label": "1,15", "matrix": [1, 15], "x": 17.25, "y": 1.25},
{"label": "2,0", "matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
{"label": "2,1", "matrix": [2, 1], "x": 1.5, "y": 2.25},
{"label": "2,2", "matrix": [2, 2], "x": 2.5, "y": 2.25},
{"label": "2,3", "matrix": [2, 3], "x": 3.5, "y": 2.25},
{"label": "2,4", "matrix": [2, 4], "x": 4.5, "y": 2.25},
{"label": "2,5", "matrix": [2, 5], "x": 5.5, "y": 2.25},
{"label": "2,6", "matrix": [2, 6], "x": 6.5, "y": 2.25},
{"label": "2,7", "matrix": [2, 7], "x": 7.5, "y": 2.25},
{"label": "2,8", "matrix": [2, 8], "x": 8.5, "y": 2.25},
{"label": "2,9", "matrix": [2, 9], "x": 9.5, "y": 2.25},
{"label": "2,10", "matrix": [2, 10], "x": 10.5, "y": 2.25},
{"label": "2,11", "matrix": [2, 11], "x": 11.5, "y": 2.25},
{"label": "2,12", "matrix": [2, 12], "x": 12.5, "y": 2.25},
{"label": "2,14", "matrix": [2, 14], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2},
{"label": "4,14", "matrix": [4, 14], "x": 15.25, "y": 2.25},
{"label": "4,15", "matrix": [4, 15], "x": 16.25, "y": 2.25},
{"label": "3,15", "matrix": [3, 15], "x": 17.25, "y": 2.25},
{"label": "3,0", "matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
{"label": "3,1", "matrix": [3, 1], "x": 1.75, "y": 3.25},
{"label": "3,2", "matrix": [3, 2], "x": 2.75, "y": 3.25},
{"label": "3,3", "matrix": [3, 3], "x": 3.75, "y": 3.25},
{"label": "3,4", "matrix": [3, 4], "x": 4.75, "y": 3.25},
{"label": "3,5", "matrix": [3, 5], "x": 5.75, "y": 3.25},
{"label": "3,6", "matrix": [3, 6], "x": 6.75, "y": 3.25},
{"label": "3,7", "matrix": [3, 7], "x": 7.75, "y": 3.25},
{"label": "3,8", "matrix": [3, 8], "x": 8.75, "y": 3.25},
{"label": "3,9", "matrix": [3, 9], "x": 9.75, "y": 3.25},
{"label": "3,10", "matrix": [3, 10], "x": 10.75, "y": 3.25},
{"label": "3,11", "matrix": [3, 11], "x": 11.75, "y": 3.25},
{"label": "3,12", "matrix": [3, 12], "x": 12.75, "y": 3.25},
{"label": "4,0", "matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25},
{"label": "4,1", "matrix": [4, 1], "x": 1.25, "y": 4.25},
{"label": "4,2", "matrix": [4, 2], "x": 2.25, "y": 4.25},
{"label": "4,3", "matrix": [4, 3], "x": 3.25, "y": 4.25},
{"label": "4,4", "matrix": [4, 4], "x": 4.25, "y": 4.25},
{"label": "4,5", "matrix": [4, 5], "x": 5.25, "y": 4.25},
{"label": "4,6", "matrix": [4, 6], "x": 6.25, "y": 4.25},
{"label": "4,7", "matrix": [4, 7], "x": 7.25, "y": 4.25},
{"label": "4,8", "matrix": [4, 8], "x": 8.25, "y": 4.25},
{"label": "4,9", "matrix": [4, 9], "x": 9.25, "y": 4.25},
{"label": "4,10", "matrix": [4, 10], "x": 10.25, "y": 4.25},
{"label": "4,11", "matrix": [4, 11], "x": 11.25, "y": 4.25},
{"label": "4,13", "matrix": [4, 13], "x": 12.25, "y": 4.25, "w": 2.75},
{"label": "5,14", "matrix": [5, 14], "x": 16.25, "y": 4.25},
{"label": "5,0", "matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
{"label": "5,1", "matrix": [5, 1], "x": 1.5, "y": 5.25},
{"label": "5,2", "matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5},
{"label": "5,6", "matrix": [5, 6], "x": 4, "y": 5.25, "w": 7},
{"label": "5,9", "matrix": [5, 9], "x": 11, "y": 5.25, "w": 1.5},
{"label": "5,10", "matrix": [5, 10], "x": 12.5, "y": 5.25},
{"label": "5,11", "matrix": [5, 11], "x": 13.5, "y": 5.25, "w": 1.5},
{"label": "5,12", "matrix": [5, 12], "x": 15.25, "y": 5.25},
{"label": "5,13", "matrix": [5, 13], "x": 16.25, "y": 5.25},
{"label": "5,15", "matrix": [5, 15], "x": 17.25, "y": 5.25}
]
},
"LAYOUT_tkl_jis": {
"layout": [
{"label": "0,0", "matrix": [0, 0], "x": 0, "y": 0},
{"label": "0,1", "matrix": [0, 1], "x": 2, "y": 0},
{"label": "0,2", "matrix": [0, 2], "x": 3, "y": 0},
{"label": "0,3", "matrix": [0, 3], "x": 4, "y": 0},
{"label": "0,4", "matrix": [0, 4], "x": 5, "y": 0},
{"label": "0,5", "matrix": [0, 5], "x": 6.5, "y": 0},
{"label": "0,6", "matrix": [0, 6], "x": 7.5, "y": 0},
{"label": "0,7", "matrix": [0, 7], "x": 8.5, "y": 0},
{"label": "0,8", "matrix": [0, 8], "x": 9.5, "y": 0},
{"label": "0,9", "matrix": [0, 9], "x": 11, "y": 0},
{"label": "0,10", "matrix": [0, 10], "x": 12, "y": 0},
{"label": "0,11", "matrix": [0, 11], "x": 13, "y": 0},
{"label": "0,12", "matrix": [0, 12], "x": 14, "y": 0},
{"label": "0,13", "matrix": [0, 13], "x": 15.25, "y": 0},
{"label": "0,14", "matrix": [0, 14], "x": 16.25, "y": 0},
{"label": "0,15", "matrix": [0, 15], "x": 17.25, "y": 0},
{"label": "1,0", "matrix": [1, 0], "x": 0, "y": 1.25},
{"label": "1,1", "matrix": [1, 1], "x": 1, "y": 1.25},
{"label": "1,2", "matrix": [1, 2], "x": 2, "y": 1.25},
{"label": "1,3", "matrix": [1, 3], "x": 3, "y": 1.25},
{"label": "1,4", "matrix": [1, 4], "x": 4, "y": 1.25},
{"label": "1,5", "matrix": [1, 5], "x": 5, "y": 1.25},
{"label": "1,6", "matrix": [1, 6], "x": 6, "y": 1.25},
{"label": "1,7", "matrix": [1, 7], "x": 7, "y": 1.25},
{"label": "1,8", "matrix": [1, 8], "x": 8, "y": 1.25},
{"label": "1,9", "matrix": [1, 9], "x": 9, "y": 1.25},
{"label": "1,10", "matrix": [1, 10], "x": 10, "y": 1.25},
{"label": "1,11", "matrix": [1, 11], "x": 11, "y": 1.25},
{"label": "1,12", "matrix": [1, 12], "x": 12, "y": 1.25},
{"label": "1,13", "matrix": [1, 13], "x": 13, "y": 1.25},
{"label": "1,14", "matrix": [1, 14], "x": 14, "y": 1.25},
{"label": "3,14", "matrix": [3, 14], "x": 15.25, "y": 1.25},
{"label": "2,15", "matrix": [2, 15], "x": 16.25, "y": 1.25},
{"label": "1,15", "matrix": [1, 15], "x": 17.25, "y": 1.25},
{"label": "2,0", "matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5},
{"label": "2,1", "matrix": [2, 1], "x": 1.5, "y": 2.25},
{"label": "2,2", "matrix": [2, 2], "x": 2.5, "y": 2.25},
{"label": "2,3", "matrix": [2, 3], "x": 3.5, "y": 2.25},
{"label": "2,4", "matrix": [2, 4], "x": 4.5, "y": 2.25},
{"label": "2,5", "matrix": [2, 5], "x": 5.5, "y": 2.25},
{"label": "2,6", "matrix": [2, 6], "x": 6.5, "y": 2.25},
{"label": "2,7", "matrix": [2, 7], "x": 7.5, "y": 2.25},
{"label": "2,8", "matrix": [2, 8], "x": 8.5, "y": 2.25},
{"label": "2,9", "matrix": [2, 9], "x": 9.5, "y": 2.25},
{"label": "2,10", "matrix": [2, 10], "x": 10.5, "y": 2.25},
{"label": "2,11", "matrix": [2, 11], "x": 11.5, "y": 2.25},
{"label": "2,12", "matrix": [2, 12], "x": 12.5, "y": 2.25},
{"label": "2,14", "matrix": [2, 14], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2},
{"label": "4,14", "matrix": [4, 14], "x": 15.25, "y": 2.25},
{"label": "4,15", "matrix": [4, 15], "x": 16.25, "y": 2.25},
{"label": "3,15", "matrix": [3, 15], "x": 17.25, "y": 2.25},
{"label": "3,0", "matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75},
{"label": "3,1", "matrix": [3, 1], "x": 1.75, "y": 3.25},
{"label": "3,2", "matrix": [3, 2], "x": 2.75, "y": 3.25},
{"label": "3,3", "matrix": [3, 3], "x": 3.75, "y": 3.25},
{"label": "3,4", "matrix": [3, 4], "x": 4.75, "y": 3.25},
{"label": "3,5", "matrix": [3, 5], "x": 5.75, "y": 3.25},
{"label": "3,6", "matrix": [3, 6], "x": 6.75, "y": 3.25},
{"label": "3,7", "matrix": [3, 7], "x": 7.75, "y": 3.25},
{"label": "3,8", "matrix": [3, 8], "x": 8.75, "y": 3.25},
{"label": "3,9", "matrix": [3, 9], "x": 9.75, "y": 3.25},
{"label": "3,10", "matrix": [3, 10], "x": 10.75, "y": 3.25},
{"label": "3,11", "matrix": [3, 11], "x": 11.75, "y": 3.25},
{"label": "3,12", "matrix": [3, 12], "x": 12.75, "y": 3.25},
{"label": "4,0", "matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25},
{"label": "4,2", "matrix": [4, 2], "x": 2.25, "y": 4.25},
{"label": "4,3", "matrix": [4, 3], "x": 3.25, "y": 4.25},
{"label": "4,4", "matrix": [4, 4], "x": 4.25, "y": 4.25},
{"label": "4,5", "matrix": [4, 5], "x": 5.25, "y": 4.25},
{"label": "4,6", "matrix": [4, 6], "x": 6.25, "y": 4.25},
{"label": "4,7", "matrix": [4, 7], "x": 7.25, "y": 4.25},
{"label": "4,8", "matrix": [4, 8], "x": 8.25, "y": 4.25},
{"label": "4,9", "matrix": [4, 9], "x": 9.25, "y": 4.25},
{"label": "4,10", "matrix": [4, 10], "x": 10.25, "y": 4.25},
{"label": "4,11", "matrix": [4, 11], "x": 11.25, "y": 4.25},
{"label": "4,12", "matrix": [4, 12], "x": 12.25, "y": 4.25},
{"label": "4,13", "matrix": [4, 13], "x": 13.25, "y": 4.25, "w": 1.75},
{"label": "5,14", "matrix": [5, 14], "x": 16.25, "y": 4.25},
{"label": "5,0", "matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5},
{"label": "5,1", "matrix": [5, 1], "x": 1.5, "y": 5.25},
{"label": "5,2", "matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5},
{"label": "5,4", "matrix": [5, 4], "x": 4, "y": 5.25, "w": 1.5},
{"label": "5,6", "matrix": [5, 6], "x": 5.5, "y": 5.25, "w": 2.5},
{"label": "5,7", "matrix": [5, 7], "x": 8, "y": 5.25, "w": 1.5},
{"label": "5,8", "matrix": [5, 8], "x": 9.5, "y": 5.25, "w": 1.5},
{"label": "5,9", "matrix": [5, 9], "x": 11, "y": 5.25, "w": 1.5},
{"label": "5,10", "matrix": [5, 10], "x": 12.5, "y": 5.25},
{"label": "5,11", "matrix": [5, 11], "x": 13.5, "y": 5.25, "w": 1.5},
{"label": "5,12", "matrix": [5, 12], "x": 15.25, "y": 5.25},
{"label": "5,13", "matrix": [5, 13], "x": 16.25, "y": 5.25},
{"label": "5,15", "matrix": [5, 15], "x": 17.25, "y": 5.25}
]
}
}
}

Some files were not shown because too many files have changed in this diff Show More