Merge branch 'master' of https://github.com/qmk/qmk_firmware
This commit is contained in:
commit
48ea46b04a
2
.clangd
2
.clangd
@ -1,4 +1,4 @@
|
||||
CompileFlags:
|
||||
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
|
||||
|
123
.github/workflows/ci_build_major_branch.yml
vendored
Normal file
123
.github/workflows/ci_build_major_branch.yml
vendored
Normal file
@ -0,0 +1,123 @@
|
||||
name: CI Build Major Branch
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
actions: write
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [master, develop]
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
branch:
|
||||
type: choice
|
||||
description: "Branch to build"
|
||||
options: [master, develop]
|
||||
|
||||
env:
|
||||
# https://docs.github.com/en/actions/learn-github-actions/usage-limits-billing-and-administration#usage-limits
|
||||
# We've decreased it from 20 to 15 to allow for other GHA to run unimpeded
|
||||
CONCURRENT_JOBS: 15
|
||||
|
||||
# Ensure we only have one build running at a time, cancelling any active builds if a new commit is pushed to the respective branch
|
||||
concurrency:
|
||||
group: ci_build-${{ github.event.inputs.branch || github.ref_name }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
determine_concurrency:
|
||||
name: "Determine concurrency"
|
||||
if: github.repository == 'qmk/qmk_firmware'
|
||||
runs-on: ubuntu-latest
|
||||
container: ghcr.io/qmk/qmk_cli
|
||||
|
||||
outputs:
|
||||
slice_length: ${{ steps.generate_slice_length.outputs.slice_length }}
|
||||
|
||||
steps:
|
||||
- name: Install prerequisites
|
||||
run: |
|
||||
apt-get update
|
||||
apt-get install -y jq
|
||||
|
||||
- name: Disable safe.directory check
|
||||
run: |
|
||||
git config --global --add safe.directory '*'
|
||||
|
||||
- name: Checkout QMK Firmware
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Determine concurrency
|
||||
id: generate_slice_length
|
||||
run: |
|
||||
target_count=$( {
|
||||
qmk find -km default 2>/dev/null
|
||||
qmk find -km via 2>/dev/null
|
||||
} | sort | uniq | wc -l)
|
||||
slice_length=$((target_count / ($CONCURRENT_JOBS - 1))) # Err on the side of caution as we're splitting default and via
|
||||
echo "slice_length=$slice_length" >> $GITHUB_OUTPUT
|
||||
|
||||
build_targets:
|
||||
name: "Compile keymap ${{ matrix.keymap }}"
|
||||
needs: determine_concurrency
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
keymap: [default, via]
|
||||
uses: ./.github/workflows/ci_build_major_branch_keymap.yml
|
||||
with:
|
||||
branch: ${{ inputs.branch || github.ref_name }}
|
||||
keymap: ${{ matrix.keymap }}
|
||||
slice_length: ${{ needs.determine_concurrency.outputs.slice_length }}
|
||||
secrets: inherit
|
||||
|
||||
rollup_tasks:
|
||||
name: "Consolidation"
|
||||
needs: build_targets
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Download firmwares
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
pattern: firmware-*
|
||||
path: firmwares
|
||||
merge-multiple: true
|
||||
|
||||
- name: Upload to https://ci.qmk.fm/${{ inputs.branch || github.ref_name }}/${{ github.sha }}
|
||||
uses: jakejarvis/s3-sync-action@master
|
||||
with:
|
||||
args: --acl public-read --follow-symlinks --delete
|
||||
env:
|
||||
AWS_S3_BUCKET: ${{ vars.CI_QMK_FM_SPACES_BUCKET }}
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.CI_QMK_FM_SPACES_KEY }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.CI_QMK_FM_SPACES_SECRET }}
|
||||
AWS_REGION: ${{ vars.CI_QMK_FM_SPACES_REGION }}
|
||||
AWS_S3_ENDPOINT: ${{ vars.CI_QMK_FM_SPACES_ENDPOINT }}
|
||||
SOURCE_DIR: firmwares
|
||||
DEST_DIR: ${{ inputs.branch || github.ref_name }}/${{ github.sha }}
|
||||
|
||||
- name: Upload to https://ci.qmk.fm/${{ inputs.branch || github.ref_name }}/latest
|
||||
uses: jakejarvis/s3-sync-action@master
|
||||
with:
|
||||
args: --acl public-read --follow-symlinks --delete
|
||||
env:
|
||||
AWS_S3_BUCKET: ${{ vars.CI_QMK_FM_SPACES_BUCKET }}
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.CI_QMK_FM_SPACES_KEY }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.CI_QMK_FM_SPACES_SECRET }}
|
||||
AWS_REGION: ${{ vars.CI_QMK_FM_SPACES_REGION }}
|
||||
AWS_S3_ENDPOINT: ${{ vars.CI_QMK_FM_SPACES_ENDPOINT }}
|
||||
SOURCE_DIR: firmwares
|
||||
DEST_DIR: ${{ inputs.branch || github.ref_name }}/latest
|
||||
|
||||
- name: Check if failure marker file exists
|
||||
id: check_failure_marker
|
||||
uses: andstor/file-existence-action@v3
|
||||
with:
|
||||
files: firmwares/.failed
|
||||
|
||||
- name: Fail build if needed
|
||||
if: steps.check_failure_marker.outputs.files_exists == 'true'
|
||||
run: |
|
||||
# Exit with failure if the compilation stage failed
|
||||
exit 1
|
181
.github/workflows/ci_build_major_branch_keymap.yml
vendored
Normal file
181
.github/workflows/ci_build_major_branch_keymap.yml
vendored
Normal file
@ -0,0 +1,181 @@
|
||||
name: CI Build Major Branch Keymap
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
actions: write
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
branch:
|
||||
type: string
|
||||
required: true
|
||||
keymap:
|
||||
type: string
|
||||
required: true
|
||||
slice_length:
|
||||
type: string
|
||||
required: true
|
||||
|
||||
jobs:
|
||||
generate_targets:
|
||||
name: "Generate targets (${{ inputs.keymap }})"
|
||||
runs-on: ubuntu-latest
|
||||
container: ghcr.io/qmk/qmk_cli
|
||||
|
||||
outputs:
|
||||
targets: ${{ steps.generate_targets.outputs.targets }}
|
||||
|
||||
steps:
|
||||
- name: Install prerequisites
|
||||
run: |
|
||||
apt-get update
|
||||
apt-get install -y jq
|
||||
|
||||
- name: Disable safe.directory check
|
||||
run: |
|
||||
git config --global --add safe.directory '*'
|
||||
|
||||
- name: Checkout QMK Firmware
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Generate build targets
|
||||
id: generate_targets
|
||||
run: |
|
||||
{ # Intentionally use `shuf` here so that we share manufacturers across all build groups -- some have a lot of ARM-based boards which inherently take longer
|
||||
counter=0
|
||||
echo -n '{'
|
||||
qmk find -km ${{ inputs.keymap }} 2>/dev/null | sort | uniq | shuf | xargs -L${{ inputs.slice_length }} | while IFS=$'\n' read target ; do
|
||||
if [ $counter -gt 0 ]; then
|
||||
echo -n ','
|
||||
fi
|
||||
counter=$((counter+1))
|
||||
printf "\"group %02d\":{" $counter
|
||||
echo -n '"targets":"'
|
||||
echo $target | tr ' ' '\n' | sort | uniq | xargs echo -n
|
||||
echo -n '"}'
|
||||
done
|
||||
echo -n '}'
|
||||
} | sed -e 's@\n@@g' > targets.json
|
||||
|
||||
# Output the target keys as a variable
|
||||
echo "targets=$(jq -c 'keys' targets.json)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Upload targets json
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: targets-${{ inputs.keymap }}
|
||||
path: targets.json
|
||||
|
||||
build_targets:
|
||||
name: "Compile ${{ matrix.target }} (${{ inputs.keymap }})"
|
||||
needs: generate_targets
|
||||
runs-on: ubuntu-latest
|
||||
container: ghcr.io/qmk/qmk_cli
|
||||
continue-on-error: true
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
target: ${{ fromJson(needs.generate_targets.outputs.targets) }}
|
||||
|
||||
steps:
|
||||
- name: Install prerequisites
|
||||
run: |
|
||||
apt-get update
|
||||
apt-get install -y jq
|
||||
|
||||
- name: Disable safe.directory check
|
||||
run: |
|
||||
git config --global --add safe.directory '*'
|
||||
|
||||
- name: Checkout QMK Firmware
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Get target definitions
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: targets-${{ inputs.keymap }}
|
||||
path: .
|
||||
|
||||
- name: Deploy submodules
|
||||
run: |
|
||||
qmk git-submodule -f
|
||||
|
||||
- name: Dump targets
|
||||
run: |
|
||||
jq -r '.["${{ matrix.target }}"].targets' targets.json | tr ' ' '\n' | sort
|
||||
|
||||
- name: Build targets
|
||||
continue-on-error: true
|
||||
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 -e DUMP_CI_METADATA=yes $(jq -r '.["${{ matrix.target }}"].targets' targets.json) || touch .failed
|
||||
|
||||
- name: Upload binaries
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: firmware-${{ inputs.keymap }}-${{ matrix.target }}
|
||||
if-no-files-found: ignore
|
||||
path: |
|
||||
*.bin
|
||||
*.hex
|
||||
*.uf2
|
||||
.build/failed.*
|
||||
.failed
|
||||
|
||||
- name: Fail build if any group failed
|
||||
run: |
|
||||
# Exit with failure if the compilation stage failed
|
||||
[ ! -f .failed ] || exit 1
|
||||
|
||||
repack_firmware:
|
||||
if: always()
|
||||
name: "Repack artifacts"
|
||||
needs: build_targets
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout QMK Firmware
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Download firmwares
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
pattern: firmware-${{ inputs.keymap }}-*
|
||||
path: .
|
||||
merge-multiple: true
|
||||
|
||||
- name: Upload all firmwares
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: firmware-${{ inputs.keymap }}
|
||||
if-no-files-found: ignore
|
||||
path: |
|
||||
*.bin
|
||||
*.hex
|
||||
*.uf2
|
||||
.build/failed.*
|
||||
.failed
|
||||
|
||||
- name: Generate output logs
|
||||
run: |
|
||||
# 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
|
||||
|
||||
- name: Delete temporary build artifacts
|
||||
uses: geekyeggo/delete-artifact@v5
|
||||
with:
|
||||
name: |
|
||||
firmware-${{ inputs.keymap }}-*
|
||||
targets-${{ inputs.keymap }}
|
||||
|
||||
- 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 ${{ inputs.branch || github.ref_name }} --keymap ${{ inputs.keymap }} --url ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
74
.github/workflows/ci_builds.yml
vendored
74
.github/workflows/ci_builds.yml
vendored
@ -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 }}
|
2
.github/workflows/docs.yml
vendored
2
.github/workflows/docs.yml
vendored
@ -37,7 +37,7 @@ jobs:
|
||||
qmk --verbose generate-docs
|
||||
|
||||
- name: Deploy
|
||||
uses: JamesIves/github-pages-deploy-action@v4.5.0
|
||||
uses: JamesIves/github-pages-deploy-action@v4.6.0
|
||||
with:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BASE_BRANCH: master
|
||||
|
261
docs/__capabilities.md
Normal file
261
docs/__capabilities.md
Normal file
@ -0,0 +1,261 @@
|
||||
# Documentation Capabilities
|
||||
|
||||
This page lays out the capabilities used by the QMK Firmware documentation, in order to aid future transitions to other page generators. Focuses mainly on things other than normal Markdown, as it's assumed that markdown generators should still function accordingly.
|
||||
|
||||
## Overall capabilities
|
||||
|
||||
Unrelated to styling, high-level tech.
|
||||
|
||||
* I18n -- translations to other languages: [_langs.md](_langs.md)
|
||||
* Sidebar -- listing of pages by category: [_summary.md](_summary.md)
|
||||
* Title anchors -- `:id=some-anchor-name`, used for direct linking to sections
|
||||
* Links to anchors:
|
||||
* Style 1: [early initialization](platformdev_chibios_earlyinit.md?id=board-init)
|
||||
* Style 2: [early initialization](platformdev_chibios_earlyinit.md#board-init)
|
||||
* Links to anchors on the same page, i.e. [Emoji](#emoji)
|
||||
* Specifying CNAME for root domain -- `docs.qmk.fm`
|
||||
* Moved pages, see `index.html`
|
||||
* Text search
|
||||
* Footnotes [like this][1]
|
||||
|
||||
<!-- Comments should not show up -->
|
||||
|
||||
<!-- Nor should
|
||||
multiline
|
||||
|
||||
comments with
|
||||
|
||||
newlines show up -->
|
||||
|
||||
|
||||
### Dividing lines
|
||||
|
||||
---
|
||||
|
||||
<hr>
|
||||
|
||||
<hr/>
|
||||
|
||||
### Images
|
||||
|
||||

|
||||
|
||||
<img src="gitbook/images/color-wheel.svg" alt="HSV Color Wheel" width="250"/>
|
||||
|
||||
### Lists
|
||||
|
||||
Newlines with `<br>`:
|
||||
|
||||
Line one<br>
|
||||
Line two<br/>
|
||||
Line three
|
||||
|
||||
Nested dotted:
|
||||
|
||||
* The PR is complete and ready to merge
|
||||
* GitHub checks for the PR are green whenever possible
|
||||
* A "red" check may be disregarded by maintainers if the items flagged are unrelated to the change proposed in the PR
|
||||
* Modifications to existing files should not need to add license headers to pass lint, for instance.
|
||||
* If it's not directly related to your PR's functionality, prefer avoiding making a change.
|
||||
|
||||
Nested dashed:
|
||||
|
||||
- The PR is complete and ready to merge
|
||||
- GitHub checks for the PR are green whenever possible
|
||||
- A "red" check may be disregarded by maintainers if the items flagged are unrelated to the change proposed in the PR
|
||||
- Modifications to existing files should not need to add license headers to pass lint, for instance.
|
||||
- If it's not directly related to your PR's functionality, prefer avoiding making a change.
|
||||
|
||||
Nested numbered:
|
||||
|
||||
1. The PR is complete and ready to merge
|
||||
1. GitHub checks for the PR are green whenever possible
|
||||
1. A "red" check may be disregarded by maintainers if the items flagged are unrelated to the change proposed in the PR
|
||||
1. Modifications to existing files should not need to add license headers to pass lint, for instance.
|
||||
1. If it's not directly related to your PR's functionality, prefer avoiding making a change.
|
||||
|
||||
Nested mixed:
|
||||
|
||||
1. Add it to the schema in `data/schemas/keyboards.jsonschema`
|
||||
1. Add a mapping in `data/maps`
|
||||
1. (optional and discouraged) Add code to extract/generate it to:
|
||||
* `lib/python/qmk/info.py`
|
||||
* `lib/python/qmk/cli/generate/config_h.py`
|
||||
* `lib/python/qmk/cli/generate/rules_mk.py`
|
||||
|
||||
### Emoji :id=emoji
|
||||
|
||||
#### Direct:
|
||||
|
||||
👍🎉 First off, thanks for taking the time to read this and contribute! 🎉👍
|
||||
|
||||
#### As colon-name-colon:
|
||||
|
||||
:heavy_check_mark: : works and was tested
|
||||
|
||||
:o: : does not apply
|
||||
|
||||
:x: : not supported by MCU
|
||||
|
||||
### XML Entities
|
||||
|
||||
[`clueboard`](https://github.com/qmk/qmk_firmware/tree/master/keyboards/clueboard) ← This is the organization folder, there's no `rules.mk` file
|
||||
|
||||
1–4
|
||||
|
||||
Command+<code>`</code>
|
||||
|
||||
## Styling
|
||||
|
||||
### CSS-ish
|
||||
|
||||
<b style="font-size:150%">This is 150% of normal sizing, and bold!</b>
|
||||
|
||||
|
||||
### Tables
|
||||
|
||||
| Column A | Column B |
|
||||
|----------|----------|
|
||||
| Left | Right |
|
||||
|
||||
### Indented sections
|
||||
|
||||
> Indent without any sort of marker
|
||||
|
||||
?> Query, this?
|
||||
|
||||
!> Notification, damnit!
|
||||
|
||||
### Keyboard keys
|
||||
|
||||
<kbd>,</kbd>
|
||||
|
||||
<kbd>Right Alt</kbd>+<kbd>Right Shift</kbd>
|
||||
|
||||
1. Click <kbd>File</kbd> > <kbd>New</kbd> > <kbd>Makefile Project with Existing Code</kbd>
|
||||
|
||||
1. Click <kbd><kbd>File</kbd> > <kbd>Preferences ></kbd> > <kbd>Settings</kbd> </kbd>
|
||||
|
||||
1. Hit Ctrl-<code>`</code> (Grave) to bring up the terminal or go to <kbd><kbd>View</kbd> > <kbd>Terminal</kbd></kbd> (command `workbench.action.terminal.toggleTerminal`). A new terminal will be opened if there isn‘t one already.
|
||||
|
||||
This should start the terminal in the workspace's folder (so the `qmk_firmware` folder), and then you can compile your keyboard.
|
||||
|
||||
|
||||
### Code Blocks
|
||||
|
||||
Inline code with tag: <code>test</code>
|
||||
|
||||
Inline code with backticks: `test`
|
||||
|
||||
This is preformatted
|
||||
Indented by 4 spaces
|
||||
The letters lined up
|
||||
|
||||
```c
|
||||
int c_code(void) {
|
||||
return -1;
|
||||
}
|
||||
```
|
||||
|
||||
```makefile
|
||||
ifeq ($(BUILD),)
|
||||
CHUNDER_REQUIRED = yes
|
||||
endif
|
||||
```
|
||||
|
||||
```python
|
||||
from pathlib import Path
|
||||
|
||||
p = Path('/path/to/qmk_firmware')
|
||||
```
|
||||
|
||||
```json
|
||||
{
|
||||
"a": "b",
|
||||
"c": 4,
|
||||
"d": {
|
||||
"e": [
|
||||
0, 1, 2, 3
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```diff
|
||||
#undef RGBLIGHT_LED_COUNT
|
||||
+#undef RGBLIGHT_EFFECT_STATIC_GRADIENT
|
||||
+#undef RGBLIGHT_EFFECT_RAINBOW_SWIRL
|
||||
#define RGBLIGHT_LED_COUNT 12
|
||||
#define RGBLIGHT_HUE_STEP 8
|
||||
#define RGBLIGHT_SAT_STEP 8
|
||||
```
|
||||
|
||||
Indented code as part of a list:
|
||||
|
||||
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
|
||||
* [Teensy Loader](https://www.pjrc.com/teensy/loader.html)
|
||||
* [Teensy Loader Command Line](https://www.pjrc.com/teensy/loader_cli.html) / `:teensy` target in QMK (recommended command line)
|
||||
```
|
||||
teensy_loader_cli -v -mmcu=<mcu> <filename>
|
||||
```
|
||||
|
||||
|
||||
### Sub/Superscript
|
||||
|
||||
<sub>This is subscripted, apparently.</sub>
|
||||
|
||||
<sup>This is superscripted, apparently.</sup>
|
||||
|
||||
I<sup>2</sup>C
|
||||
|
||||
T<sub>0H</sub>, T<sub>0L</sub>
|
||||
|
||||
### Tabs
|
||||
|
||||
Tabs are based on section headers, with `**` enclosing the tab title.
|
||||
|
||||
<!-- tabs:start -->
|
||||
|
||||
#### ** Tab one **
|
||||
|
||||
Content one
|
||||
|
||||
<!-- tabs:start -->
|
||||
|
||||
##### ** Nested one **
|
||||
|
||||
Nested content one
|
||||
|
||||
##### ** Nested two **
|
||||
|
||||
Nested content two
|
||||
|
||||
<!-- tabs:end -->
|
||||
|
||||
#### ** Tab two **
|
||||
|
||||
Content two
|
||||
|
||||
#### ** Tab three **
|
||||
|
||||
Content three
|
||||
|
||||
<!-- tabs:end -->
|
||||
|
||||
## Details sections
|
||||
|
||||
Expandable:
|
||||
|
||||
<details>
|
||||
<summary>Some summary text that shows up before expanding</summary>
|
||||
|
||||
!> Embedded notification!
|
||||
|
||||
This is some inner content.
|
||||
</details>
|
||||
|
||||
[1]: https://en.wikipedia.org/wiki/Eclipse_(software)
|
||||
|
||||
## Embed
|
||||
|
||||
[example embed](__capabilities_inc.md ':include')
|
1
docs/__capabilities_inc.md
Normal file
1
docs/__capabilities_inc.md
Normal file
@ -0,0 +1 @@
|
||||
Lorem ipsum dolor sit amet.
|
@ -322,6 +322,18 @@ Creates a keymap.json from a keymap.c.
|
||||
qmk c2json -km KEYMAP -kb KEYBOARD [-q] [--no-cpp] [-o OUTPUT] filename
|
||||
```
|
||||
|
||||
**Examples**:
|
||||
|
||||
```
|
||||
qmk c2json -km default -kb handwired/dactyl_promicro
|
||||
```
|
||||
|
||||
or with filename:
|
||||
|
||||
```
|
||||
qmk c2json keyboards/handwired/dactyl_promicro/keymaps/default/keymap.c
|
||||
```
|
||||
|
||||
## `qmk lint`
|
||||
|
||||
Checks over a keyboard and/or keymap and highlights common errors, problems, and anti-patterns.
|
||||
|
@ -236,7 +236,7 @@ Flashing sequence:
|
||||
|
||||
## STM32/APM32 DFU
|
||||
|
||||
All STM32 and APM32 MCUs, except for F103 (see the [STM32duino section](#stm32duino)) come preloaded with a factory bootloader that cannot be modified nor deleted.
|
||||
All USB-capable STM32 and APM32 MCUs, except for a small handful (such as STM32F103 -- see the [STM32duino section](#stm32duino)) come preloaded with a factory bootloader that cannot be modified nor deleted.
|
||||
|
||||
To ensure compatibility with the STM32-DFU bootloader, make sure this block is present in your `rules.mk` (optionally with `apm32-dfu` instead):
|
||||
|
||||
|
@ -7,7 +7,7 @@ QMK tries to put a lot of power into your hands by making easy things easy, and
|
||||
Not sure if your keyboard can run QMK? If it's a mechanical keyboard you built yourself chances are good it can. We support a [large number of hobbyist boards](https://qmk.fm/keyboards/). If your current keyboard can't run QMK there are a lot of choices out there for boards that do.
|
||||
|
||||
?> **Is This Guide For Me?**<br>
|
||||
If the thought of programming intimidates you, please [take a look at our online GUI](newbs_building_firmware_configurator.md) instead.</div>
|
||||
If the thought of programming intimidates you, please [take a look at our online GUI](newbs_building_firmware_configurator.md) instead.
|
||||
|
||||
## Overview
|
||||
|
||||
|
@ -148,6 +148,13 @@ https://github.com/qmk/qmk_firmware/pulls?q=is%3Apr+is%3Aclosed+label%3Akeyboard
|
||||
- For instance, only `wilba_tech` boards shall include `keyboards/wilba_tech/wt_main.c` and `keyboards/wilba_tech/wt_rgb_backlight.c`. But including `drivers/sensors/pmw3360.c` is absolutely fine for any and all boards that require it.
|
||||
- Code that needs to be used by multiple boards is a candidate for core code changes, and should be separated out.
|
||||
|
||||
Wireless-capable boards:
|
||||
- Given license abuse from vendors, QMK does not accept any vendor PRs for wireless- or Bluetooth-capable keyboards without wireless and/or Bluetooth code
|
||||
- Historically, vendors have done this in bad faith in order to attain downstream VIA compatibility with no intention of releasing wireless sources
|
||||
- QMK's license, the GPL2+, requires full source disclosure for any distributed binary -- including full sources for any keyboard shipped by vendors containing QMK and/or firmware-side VIA code
|
||||
- If a vendor's wireless-capable keyboard PR submission is lacking wireless capability, then the PR will be left on-hold and unmergeable until wireless bindings are provided
|
||||
- If a vendor's wireless-capable keyboard is merged into QMK before it's known that the board is wireless, then all existing and future PRs from the same vendor will be put on hold until wireless bindings for the offending keyboard are provided
|
||||
|
||||
Also, specific to ChibiOS:
|
||||
- **strong** preference to using existing ChibiOS board definitions.
|
||||
- a lot of the time, an equivalent Nucleo board can be used with a different flash size or slightly different model in the same family
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
AVR is severely resource-constrained, and as QMK continues to grow, it is approaching a point where support for AVR may need to be moved to legacy status as newer development is unable to fit into those constraints.
|
||||
|
||||
However, if you need to reduce the compiled size of your firmware, there are a number of options to do so.
|
||||
However, if you need to reduce the compiled size of your firmware to fit the controller's limited flash size, there are a number of options to do so.
|
||||
|
||||
## `rules.mk` Settings
|
||||
First and foremost is enabling link time optimization. To do so, add this to your rules.mk:
|
||||
@ -91,15 +91,19 @@ Or if you're not using layers at all, you can outright remove the functionality
|
||||
|
||||
There are two `__attribute__ ((weak))` placeholder functions available to customize magic keycodes. If you are not using that feature to swap keycodes, such as backslash with backspace, add the following to your `keymap.c` or user space code:
|
||||
```c
|
||||
#ifndef MAGIC_ENABLE
|
||||
uint16_t keycode_config(uint16_t keycode) {
|
||||
return keycode;
|
||||
}
|
||||
#endif
|
||||
```
|
||||
Likewise, if you are not using magic keycodes to swap modifiers, such as Control with GUI, add the following to your `keymap.c` or user space code:
|
||||
```c
|
||||
#ifndef MAGIC_ENABLE
|
||||
uint8_t mod_config(uint8_t mod) {
|
||||
return mod;
|
||||
}
|
||||
#endif
|
||||
```
|
||||
Both of them will overwrite the placeholder functions with a simple return statement to reduce firmware size.
|
||||
|
||||
@ -197,11 +201,7 @@ For RGB Matrix, these need to be explicitly enabled as well. To disable any that
|
||||
|
||||
# Final Thoughts
|
||||
|
||||
If you've done all of this, and your firmware is still too large, then it's time. It's time to consider making the switch to ARM. Unfortunately, right now is the worst possible time for that, due to the silicon shortage, and supply chain issues. Getting an ARM chip is difficult, at best, and significantly overpriced, at worst.
|
||||
-- Drashna
|
||||
|
||||
That said, there are a number of Pro Micro replacements with ARM controllers:
|
||||
* [Proton C](https://qmk.fm/proton-c/) (out of stock)
|
||||
If you've done all of this, and your firmware is still too large, then it is time to consider making the switch to ARM. There are a number of Pro Micro replacements with an ARM controller:
|
||||
* [Bonsai C](https://github.com/customMK/Bonsai-C) (Open Source, DIY/PCBA)
|
||||
* [STeMCell](https://github.com/megamind4089/STeMCell) (Open Source, DIY/PCBA)
|
||||
* [Adafruit KB2040](https://learn.adafruit.com/adafruit-kb2040)
|
||||
@ -212,6 +212,7 @@ That said, there are a number of Pro Micro replacements with ARM controllers:
|
||||
* [Liatris](https://splitkb.com/products/liatris)
|
||||
* [Imera](https://splitkb.com/products/imera)
|
||||
* [Michi](https://github.com/ci-bus/michi-promicro-rp2040)
|
||||
* [Proton C](https://qmk.fm/proton-c/) (out of stock)
|
||||
|
||||
There are other, non-Pro Micro compatible boards out there. The most popular being:
|
||||
* [WeAct Blackpill F411](https://www.aliexpress.com/item/1005001456186625.html) (~$6 USD)
|
||||
|
@ -3,8 +3,6 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#define ENCODER_DEFAULT_POS 0x3 // enable 1:1 resolution
|
||||
|
||||
// Default PIO0 cases flickering in this board. Setting to PIO1 resolves this issue.
|
||||
#define WS2812_PIO_USE_PIO1
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
"diode_direction": "COL2ROW",
|
||||
"encoder": {
|
||||
"rotary": [
|
||||
{"pin_a": "GP13", "pin_b": "GP14"}
|
||||
{"pin_a": "GP13", "pin_b": "GP14", "resolution": 2}
|
||||
]
|
||||
},
|
||||
"features": {
|
||||
@ -83,4 +83,4 @@
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
9
keyboards/cannonkeys/petrichor/config.h
Normal file
9
keyboards/cannonkeys/petrichor/config.h
Normal file
@ -0,0 +1,9 @@
|
||||
// Copyright 2024 Andrew Kannan
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
|
||||
#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U
|
||||
|
||||
#define PICO_XOSC_STARTUP_DELAY_MULTIPLIER 64
|
394
keyboards/cannonkeys/petrichor/info.json
Normal file
394
keyboards/cannonkeys/petrichor/info.json
Normal file
@ -0,0 +1,394 @@
|
||||
{
|
||||
"manufacturer": "CannonKeys",
|
||||
"keyboard_name": "Petrichor",
|
||||
"maintainer": "awkannan",
|
||||
"bootloader": "rp2040",
|
||||
"diode_direction": "COL2ROW",
|
||||
"features": {
|
||||
"bootmagic": true,
|
||||
"command": false,
|
||||
"console": false,
|
||||
"extrakey": true,
|
||||
"mousekey": true,
|
||||
"nkro": true,
|
||||
"rgblight": true
|
||||
},
|
||||
"matrix_pins": {
|
||||
"cols": ["GP28", "GP27", "GP26", "GP25", "GP24", "GP23", "GP22", "GP21", "GP20", "GP19", "GP18", "GP17", "GP16", "GP9", "GP6", "GP5", "GP4", "GP3"],
|
||||
"rows": ["GP13", "GP12", "GP11", "GP10", "GP8"]
|
||||
},
|
||||
"processor": "RP2040",
|
||||
"rgblight": {
|
||||
"animations": {
|
||||
"rainbow_mood": true,
|
||||
"rainbow_swirl": true,
|
||||
"static_gradient": true,
|
||||
"twinkle": true
|
||||
},
|
||||
"led_count": 3,
|
||||
"layers": {
|
||||
"enabled": true,
|
||||
"override_rgb": false
|
||||
},
|
||||
"default": {
|
||||
"animation": "rainbow_swirl"
|
||||
}
|
||||
},
|
||||
"url": "https://cannonkeys.com",
|
||||
"usb": {
|
||||
"device_version": "0.0.1",
|
||||
"pid": "0x0029",
|
||||
"vid": "0xCA04"
|
||||
},
|
||||
"ws2812": {
|
||||
"driver": "vendor",
|
||||
"pin": "GP7"
|
||||
},
|
||||
"layouts": {
|
||||
"LAYOUT_7u_no_split": {
|
||||
"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, "w": 2},
|
||||
{"matrix": [0, 14], "x": 15.5, "y": 0},
|
||||
{"matrix": [0, 15], "x": 16.5, "y": 0},
|
||||
{"matrix": [0, 16], "x": 17.5, "y": 0},
|
||||
{"matrix": [0, 17], "x": 18.5, "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": [1, 14], "x": 15.5, "y": 1},
|
||||
{"matrix": [1, 15], "x": 16.5, "y": 1},
|
||||
{"matrix": [1, 16], "x": 17.5, "y": 1},
|
||||
{"matrix": [1, 17], "x": 18.5, "y": 1, "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, 13], "x": 12.75, "y": 2, "w": 2.25},
|
||||
{"matrix": [2, 14], "x": 15.5, "y": 2},
|
||||
{"matrix": [2, 15], "x": 16.5, "y": 2},
|
||||
{"matrix": [2, 16], "x": 17.5, "y": 2},
|
||||
{"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.25, "y": 3.25},
|
||||
{"matrix": [3, 14], "x": 15.5, "y": 3},
|
||||
{"matrix": [3, 15], "x": 16.5, "y": 3},
|
||||
{"matrix": [3, 16], "x": 17.5, "y": 3},
|
||||
{"matrix": [3, 17], "x": 18.5, "y": 3, "h": 2},
|
||||
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
|
||||
{"matrix": [4, 1], "x": 1.5, "y": 4, "w": 1.5},
|
||||
{"matrix": [4, 6], "x": 3, "y": 4, "w": 7},
|
||||
{"matrix": [4, 10], "x": 10, "y": 4, "w": 1.5},
|
||||
{"matrix": [4, 11], "x": 11.5, "y": 4, "w": 1.5},
|
||||
{"matrix": [4, 12], "x": 13.25, "y": 4.25},
|
||||
{"matrix": [4, 13], "x": 14.25, "y": 4.25},
|
||||
{"matrix": [4, 14], "x": 15.25, "y": 4.25},
|
||||
{"matrix": [4, 15], "x": 16.5, "y": 4},
|
||||
{"matrix": [4, 16], "x": 17.5, "y": 4}
|
||||
]
|
||||
},
|
||||
"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": [2, 12], "x": 14, "y": 0},
|
||||
{"matrix": [0, 14], "x": 15.5, "y": 0},
|
||||
{"matrix": [0, 15], "x": 16.5, "y": 0},
|
||||
{"matrix": [0, 16], "x": 17.5, "y": 0},
|
||||
{"matrix": [0, 17], "x": 18.5, "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": [1, 14], "x": 15.5, "y": 1},
|
||||
{"matrix": [1, 15], "x": 16.5, "y": 1},
|
||||
{"matrix": [1, 16], "x": 17.5, "y": 1},
|
||||
{"matrix": [1, 17], "x": 18.5, "y": 1},
|
||||
{"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": [2, 14], "x": 15.5, "y": 2},
|
||||
{"matrix": [2, 15], "x": 16.5, "y": 2},
|
||||
{"matrix": [2, 16], "x": 17.5, "y": 2},
|
||||
{"matrix": [2, 17], "x": 18.5, "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.25, "y": 3.25},
|
||||
{"matrix": [3, 14], "x": 15.5, "y": 3},
|
||||
{"matrix": [3, 15], "x": 16.5, "y": 3},
|
||||
{"matrix": [3, 16], "x": 17.5, "y": 3},
|
||||
{"matrix": [3, 17], "x": 18.5, "y": 3},
|
||||
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
|
||||
{"matrix": [4, 1], "x": 1.25, "y": 4},
|
||||
{"matrix": [4, 2], "x": 2.25, "y": 4, "w": 1.25},
|
||||
{"matrix": [4, 6], "x": 3.5, "y": 4, "w": 6},
|
||||
{"matrix": [4, 9], "x": 9.5, "y": 4, "w": 1.25},
|
||||
{"matrix": [4, 10], "x": 10.75, "y": 4},
|
||||
{"matrix": [4, 11], "x": 11.75, "y": 4, "w": 1.25},
|
||||
{"matrix": [4, 12], "x": 13.25, "y": 4.25},
|
||||
{"matrix": [4, 13], "x": 14.25, "y": 4.25},
|
||||
{"matrix": [4, 14], "x": 15.25, "y": 4.25},
|
||||
{"matrix": [4, 15], "x": 16.5, "y": 4},
|
||||
{"matrix": [4, 16], "x": 17.5, "y": 4},
|
||||
{"matrix": [4, 17], "x": 18.5, "y": 4}
|
||||
]
|
||||
},
|
||||
"LAYOUT_default": {
|
||||
"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, "w": 2},
|
||||
{"matrix": [0, 14], "x": 15.5, "y": 0},
|
||||
{"matrix": [0, 15], "x": 16.5, "y": 0},
|
||||
{"matrix": [0, 16], "x": 17.5, "y": 0},
|
||||
{"matrix": [0, 17], "x": 18.5, "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": [1, 14], "x": 15.5, "y": 1},
|
||||
{"matrix": [1, 15], "x": 16.5, "y": 1},
|
||||
{"matrix": [1, 16], "x": 17.5, "y": 1},
|
||||
{"matrix": [1, 17], "x": 18.5, "y": 1, "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, 13], "x": 12.75, "y": 2, "w": 2.25},
|
||||
{"matrix": [2, 14], "x": 15.5, "y": 2},
|
||||
{"matrix": [2, 15], "x": 16.5, "y": 2},
|
||||
{"matrix": [2, 16], "x": 17.5, "y": 2},
|
||||
{"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.25, "y": 3.25},
|
||||
{"matrix": [3, 14], "x": 15.5, "y": 3},
|
||||
{"matrix": [3, 15], "x": 16.5, "y": 3},
|
||||
{"matrix": [3, 16], "x": 17.5, "y": 3},
|
||||
{"matrix": [3, 17], "x": 18.5, "y": 3, "h": 2},
|
||||
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
|
||||
{"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25},
|
||||
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25},
|
||||
{"matrix": [4, 6], "x": 3.75, "y": 4, "w": 6.25},
|
||||
{"matrix": [4, 10], "x": 10, "y": 4, "w": 1.5},
|
||||
{"matrix": [4, 11], "x": 11.5, "y": 4, "w": 1.5},
|
||||
{"matrix": [4, 12], "x": 13.25, "y": 4.25},
|
||||
{"matrix": [4, 13], "x": 14.25, "y": 4.25},
|
||||
{"matrix": [4, 14], "x": 15.25, "y": 4.25},
|
||||
{"matrix": [4, 15], "x": 16.5, "y": 4},
|
||||
{"matrix": [4, 16], "x": 17.5, "y": 4}
|
||||
]
|
||||
},
|
||||
"LAYOUT_iso_6u_split_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": [2, 12], "x": 14, "y": 0},
|
||||
{"matrix": [0, 14], "x": 15.5, "y": 0},
|
||||
{"matrix": [0, 15], "x": 16.5, "y": 0},
|
||||
{"matrix": [0, 16], "x": 17.5, "y": 0},
|
||||
{"matrix": [0, 17], "x": 18.5, "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": [1, 14], "x": 15.5, "y": 1},
|
||||
{"matrix": [1, 15], "x": 16.5, "y": 1},
|
||||
{"matrix": [1, 16], "x": 17.5, "y": 1},
|
||||
{"matrix": [1, 17], "x": 18.5, "y": 1},
|
||||
{"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": [1, 13], "x": 12.75, "y": 2},
|
||||
{"matrix": [2, 14], "x": 15.5, "y": 2},
|
||||
{"matrix": [2, 15], "x": 16.5, "y": 2},
|
||||
{"matrix": [2, 16], "x": 17.5, "y": 2},
|
||||
{"matrix": [2, 17], "x": 18.5, "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.25, "y": 3.25},
|
||||
{"matrix": [3, 14], "x": 15.5, "y": 3},
|
||||
{"matrix": [3, 15], "x": 16.5, "y": 3},
|
||||
{"matrix": [3, 16], "x": 17.5, "y": 3},
|
||||
{"matrix": [3, 17], "x": 18.5, "y": 3},
|
||||
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
|
||||
{"matrix": [4, 1], "x": 1.25, "y": 4},
|
||||
{"matrix": [4, 2], "x": 2.25, "y": 4, "w": 1.25},
|
||||
{"matrix": [4, 6], "x": 3.5, "y": 4, "w": 6},
|
||||
{"matrix": [4, 9], "x": 9.5, "y": 4, "w": 1.25},
|
||||
{"matrix": [4, 10], "x": 10.75, "y": 4},
|
||||
{"matrix": [4, 11], "x": 11.75, "y": 4, "w": 1.25},
|
||||
{"matrix": [4, 12], "x": 13.25, "y": 4.25},
|
||||
{"matrix": [4, 13], "x": 14.25, "y": 4.25},
|
||||
{"matrix": [4, 14], "x": 15.25, "y": 4.25},
|
||||
{"matrix": [4, 15], "x": 16.5, "y": 4},
|
||||
{"matrix": [4, 16], "x": 17.5, "y": 4},
|
||||
{"matrix": [4, 17], "x": 18.5, "y": 4}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
24
keyboards/cannonkeys/petrichor/keymaps/default/keymap.c
Normal file
24
keyboards/cannonkeys/petrichor/keymaps/default/keymap.c
Normal file
@ -0,0 +1,24 @@
|
||||
// Copyright 2024 Andrew Kannan
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
|
||||
[0] = LAYOUT_all( /* Base */
|
||||
QK_GESC, 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_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_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_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_RGUI, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT
|
||||
),
|
||||
|
||||
[1] = LAYOUT_all( /* Function Layer */
|
||||
QK_BOOT, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______,_______, _______, _______, _______, _______, _______, _______
|
||||
),
|
||||
|
||||
};
|
24
keyboards/cannonkeys/petrichor/keymaps/via/keymap.c
Normal file
24
keyboards/cannonkeys/petrichor/keymaps/via/keymap.c
Normal file
@ -0,0 +1,24 @@
|
||||
// Copyright 2024 Andrew Kannan
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
|
||||
[0] = LAYOUT_all( /* Base */
|
||||
QK_GESC, 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_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_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_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_RGUI, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT
|
||||
),
|
||||
|
||||
[1] = LAYOUT_all( /* Function Layer */
|
||||
QK_BOOT, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______,_______, _______, _______, _______, _______, _______, _______
|
||||
),
|
||||
|
||||
};
|
1
keyboards/cannonkeys/petrichor/keymaps/via/rules.mk
Normal file
1
keyboards/cannonkeys/petrichor/keymaps/via/rules.mk
Normal file
@ -0,0 +1 @@
|
||||
VIA_ENABLE = yes
|
40
keyboards/cannonkeys/petrichor/petrichor.c
Normal file
40
keyboards/cannonkeys/petrichor/petrichor.c
Normal file
@ -0,0 +1,40 @@
|
||||
// Copyright 2023 Andrew Kannan
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include "quantum.h"
|
||||
|
||||
const rgblight_segment_t PROGMEM my_capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS(
|
||||
{2, 1, HSV_PURPLE}
|
||||
);
|
||||
const rgblight_segment_t PROGMEM my_numlock_layer[] = RGBLIGHT_LAYER_SEGMENTS(
|
||||
{1, 1, HSV_GREEN}
|
||||
);
|
||||
const rgblight_segment_t PROGMEM my_layer1_layer[] = RGBLIGHT_LAYER_SEGMENTS(
|
||||
{0, 1, HSV_BLUE}
|
||||
);
|
||||
|
||||
const rgblight_segment_t* const PROGMEM enabled_rgb_layers[] = RGBLIGHT_LAYERS_LIST(
|
||||
my_capslock_layer,
|
||||
my_numlock_layer,
|
||||
my_layer1_layer
|
||||
);
|
||||
|
||||
void keyboard_post_init_kb(void) {
|
||||
keyboard_post_init_user();
|
||||
rgblight_layers = enabled_rgb_layers;
|
||||
}
|
||||
|
||||
bool led_update_kb(led_t led_state) {
|
||||
if(!led_update_user(led_state)){
|
||||
return false;
|
||||
}
|
||||
rgblight_set_layer_state(0, led_state.caps_lock);
|
||||
rgblight_set_layer_state(1, led_state.num_lock);
|
||||
return true;
|
||||
}
|
||||
|
||||
layer_state_t layer_state_set_kb(layer_state_t state) {
|
||||
state = layer_state_set_user(state);
|
||||
rgblight_set_layer_state(2, layer_state_cmp(state, 1));
|
||||
return state;
|
||||
}
|
28
keyboards/cannonkeys/petrichor/readme.md
Normal file
28
keyboards/cannonkeys/petrichor/readme.md
Normal file
@ -0,0 +1,28 @@
|
||||
# Petrichor PCB
|
||||
|
||||
Petrichor PCB from CannonKeys for the AKB Petrichor keyboard
|
||||
(This firmware is used for both the hotswap and solderable variant)
|
||||
|
||||
* Keyboard Maintainer: [Andrew Kannan](https://github.com/awkannan)
|
||||
* Hardware Supported: RP2040
|
||||
* Hardware Availability: [CannonKeys](https://cannonkeys.com)
|
||||
|
||||
|
||||
Make example for this keyboard (after setting up your build environment):
|
||||
|
||||
make cannonkeys/petrichor:default
|
||||
|
||||
Flashing example for this keyboard:
|
||||
|
||||
make cannonkeys/petrichor: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 4 ways:
|
||||
|
||||
* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
|
||||
* **Physical reset button**: Hold the "BOOTSEL" button on the back of the PCB and briefly press the "REBOOT" button on the back of the PCB.
|
||||
* **Top side reboot pads**: Bridge the reboot pads on the top of the PCB with a pair of tweezers twice in a row, quickly.
|
||||
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
|
1
keyboards/cannonkeys/petrichor/rules.mk
Normal file
1
keyboards/cannonkeys/petrichor/rules.mk
Normal file
@ -0,0 +1 @@
|
||||
# This file intentionally left blank
|
11
keyboards/chew/config.h
Normal file
11
keyboards/chew/config.h
Normal 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
84
keyboards/chew/info.json
Normal 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}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
27
keyboards/chew/keymaps/default/keymap.c
Normal file
27
keyboards/chew/keymaps/default/keymap.c
Normal 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
38
keyboards/chew/readme.md
Normal file
@ -0,0 +1,38 @@
|
||||
## Chew
|
||||
|
||||

|
||||

|
||||
|
||||
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)
|
||||
|
||||
|
||||

|
||||
|
||||
### 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.
|
||||
|
||||

|
||||

|
1
keyboards/chew/rules.mk
Normal file
1
keyboards/chew/rules.mk
Normal file
@ -0,0 +1 @@
|
||||
SERIAL_DRIVER = vendor
|
679
keyboards/cipulot/chroma/info.json
Normal file
679
keyboards/cipulot/chroma/info.json
Normal 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}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
43
keyboards/cipulot/chroma/keymaps/60_ansi_tsangan/keymap.c
Normal file
43
keyboards/cipulot/chroma/keymaps/60_ansi_tsangan/keymap.c
Normal 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
|
||||
};
|
43
keyboards/cipulot/chroma/keymaps/60_ansi_wkl/keymap.c
Normal file
43
keyboards/cipulot/chroma/keymaps/60_ansi_wkl/keymap.c
Normal 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
|
||||
};
|
@ -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
|
||||
};
|
43
keyboards/cipulot/chroma/keymaps/60_iso_tsangan/keymap.c
Normal file
43
keyboards/cipulot/chroma/keymaps/60_iso_tsangan/keymap.c
Normal 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
|
||||
};
|
@ -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
|
||||
};
|
43
keyboards/cipulot/chroma/keymaps/60_iso_wkl/keymap.c
Normal file
43
keyboards/cipulot/chroma/keymaps/60_iso_wkl/keymap.c
Normal 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
|
||||
};
|
@ -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
|
||||
};
|
43
keyboards/cipulot/chroma/keymaps/default/keymap.c
Normal file
43
keyboards/cipulot/chroma/keymaps/default/keymap.c
Normal 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
|
||||
};
|
43
keyboards/cipulot/chroma/keymaps/via/keymap.c
Normal file
43
keyboards/cipulot/chroma/keymaps/via/keymap.c
Normal 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
|
||||
};
|
1
keyboards/cipulot/chroma/keymaps/via/rules.mk
Normal file
1
keyboards/cipulot/chroma/keymaps/via/rules.mk
Normal file
@ -0,0 +1 @@
|
||||
VIA_ENABLE = yes
|
27
keyboards/cipulot/chroma/readme.md
Normal file
27
keyboards/cipulot/chroma/readme.md
Normal file
@ -0,0 +1,27 @@
|
||||
# Chroma
|
||||
|
||||

|
||||
|
||||
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.
|
0
keyboards/cipulot/chroma/rules.mk
Normal file
0
keyboards/cipulot/chroma/rules.mk
Normal file
@ -62,8 +62,3 @@
|
||||
|
||||
#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
|
||||
|
@ -6,6 +6,12 @@
|
||||
"build": {
|
||||
"lto": true
|
||||
},
|
||||
"qmk": {
|
||||
"locking": {
|
||||
"enabled": true,
|
||||
"resync": true
|
||||
}
|
||||
},
|
||||
"diode_direction": "COL2ROW",
|
||||
"features": {
|
||||
"bootmagic": false,
|
||||
|
@ -1,4 +1,5 @@
|
||||
CUSTOM_MATRIX = lite
|
||||
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
|
||||
|
@ -64,9 +64,3 @@
|
||||
// #define DEBUG_MATRIX_SCAN_RATE
|
||||
|
||||
#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
|
||||
|
@ -6,6 +6,12 @@
|
||||
"build": {
|
||||
"lto": true
|
||||
},
|
||||
"qmk": {
|
||||
"locking": {
|
||||
"enabled": true,
|
||||
"resync": true
|
||||
}
|
||||
},
|
||||
"diode_direction": "COL2ROW",
|
||||
"features": {
|
||||
"bootmagic": false,
|
||||
|
@ -1,4 +1,5 @@
|
||||
CUSTOM_MATRIX = lite
|
||||
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
|
||||
|
66
keyboards/cipulot/ec_660c/config.h
Normal file
66
keyboards/cipulot/ec_660c/config.h
Normal 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
|
21
keyboards/cipulot/ec_660c/halconf.h
Normal file
21
keyboards/cipulot/ec_660c/halconf.h
Normal 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>
|
111
keyboards/cipulot/ec_660c/info.json
Normal file
111
keyboards/cipulot/ec_660c/info.json
Normal 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}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
43
keyboards/cipulot/ec_660c/keymaps/default/keymap.c
Normal file
43
keyboards/cipulot/ec_660c/keymaps/default/keymap.c
Normal 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
|
||||
};
|
43
keyboards/cipulot/ec_660c/keymaps/via/keymap.c
Normal file
43
keyboards/cipulot/ec_660c/keymaps/via/keymap.c
Normal 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
|
||||
};
|
1
keyboards/cipulot/ec_660c/keymaps/via/rules.mk
Normal file
1
keyboards/cipulot/ec_660c/keymaps/via/rules.mk
Normal file
@ -0,0 +1 @@
|
||||
VIA_ENABLE = yes
|
22
keyboards/cipulot/ec_660c/mcuconf.h
Normal file
22
keyboards/cipulot/ec_660c/mcuconf.h
Normal 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
|
3
keyboards/cipulot/ec_660c/post_rules.mk
Normal file
3
keyboards/cipulot/ec_660c/post_rules.mk
Normal file
@ -0,0 +1,3 @@
|
||||
ifeq ($(strip $(VIA_ENABLE)), yes)
|
||||
SRC += keyboards/cipulot/common/via_ec.c
|
||||
endif
|
26
keyboards/cipulot/ec_660c/readme.md
Normal file
26
keyboards/cipulot/ec_660c/readme.md
Normal file
@ -0,0 +1,26 @@
|
||||
# EC660C
|
||||
|
||||

|
||||
|
||||
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
|
5
keyboards/cipulot/ec_660c/rules.mk
Normal file
5
keyboards/cipulot/ec_660c/rules.mk
Normal 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
|
86
keyboards/cipulot/ec_980c/config.h
Normal file
86
keyboards/cipulot/ec_980c/config.h
Normal 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
|
116
keyboards/cipulot/ec_980c/ec_980c.c
Normal file
116
keyboards/cipulot/ec_980c/ec_980c.c
Normal 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;
|
||||
}
|
318
keyboards/cipulot/ec_980c/ec_switch_matrix.c
Normal file
318
keyboards/cipulot/ec_980c/ec_switch_matrix.c
Normal 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(¤t_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;
|
||||
}
|
83
keyboards/cipulot/ec_980c/ec_switch_matrix.h
Normal file
83
keyboards/cipulot/ec_980c/ec_switch_matrix.h
Normal 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);
|
23
keyboards/cipulot/ec_980c/halconf.h
Normal file
23
keyboards/cipulot/ec_980c/halconf.h
Normal 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>
|
170
keyboards/cipulot/ec_980c/info.json
Normal file
170
keyboards/cipulot/ec_980c/info.json
Normal 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}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
48
keyboards/cipulot/ec_980c/keymaps/default/keymap.c
Normal file
48
keyboards/cipulot/ec_980c/keymaps/default/keymap.c
Normal 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
|
||||
};
|
48
keyboards/cipulot/ec_980c/keymaps/via/keymap.c
Normal file
48
keyboards/cipulot/ec_980c/keymaps/via/keymap.c
Normal 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
|
||||
};
|
3
keyboards/cipulot/ec_980c/keymaps/via/rules.mk
Normal file
3
keyboards/cipulot/ec_980c/keymaps/via/rules.mk
Normal file
@ -0,0 +1,3 @@
|
||||
VIA_ENABLE = yes
|
||||
|
||||
SRC += via_ec_indicators.c
|
499
keyboards/cipulot/ec_980c/keymaps/via/via_ec_indicators.c
Normal file
499
keyboards/cipulot/ec_980c/keymaps/via/via_ec_indicators.c
Normal 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
|
42
keyboards/cipulot/ec_980c/matrix.c
Normal file
42
keyboards/cipulot/ec_980c/matrix.c
Normal 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) {
|
||||
;
|
||||
}
|
28
keyboards/cipulot/ec_980c/mcuconf.h
Normal file
28
keyboards/cipulot/ec_980c/mcuconf.h
Normal 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
|
26
keyboards/cipulot/ec_980c/readme.md
Normal file
26
keyboards/cipulot/ec_980c/readme.md
Normal file
@ -0,0 +1,26 @@
|
||||
# EC980C
|
||||
|
||||

|
||||
|
||||
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
|
4
keyboards/cipulot/ec_980c/rules.mk
Normal file
4
keyboards/cipulot/ec_980c/rules.mk
Normal file
@ -0,0 +1,4 @@
|
||||
CUSTOM_MATRIX = lite
|
||||
ANALOG_DRIVER_REQUIRED = yes
|
||||
SRC += matrix.c ec_switch_matrix.c
|
||||
OPT = 2
|
@ -63,9 +63,3 @@
|
||||
// #define DEBUG_MATRIX_SCAN_RATE
|
||||
|
||||
#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
|
||||
|
@ -6,6 +6,12 @@
|
||||
"build": {
|
||||
"lto": true
|
||||
},
|
||||
"qmk": {
|
||||
"locking": {
|
||||
"enabled": true,
|
||||
"resync": true
|
||||
}
|
||||
},
|
||||
"diode_direction": "COL2ROW",
|
||||
"features": {
|
||||
"bootmagic": false,
|
||||
|
@ -1,4 +1,5 @@
|
||||
CUSTOM_MATRIX = lite
|
||||
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
|
||||
|
@ -63,9 +63,3 @@
|
||||
// #define DEBUG_MATRIX_SCAN_RATE
|
||||
|
||||
#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
|
||||
|
@ -6,6 +6,12 @@
|
||||
"build": {
|
||||
"lto": true
|
||||
},
|
||||
"qmk": {
|
||||
"locking": {
|
||||
"enabled": true,
|
||||
"resync": true
|
||||
}
|
||||
},
|
||||
"diode_direction": "COL2ROW",
|
||||
"features": {
|
||||
"bootmagic": false,
|
||||
|
@ -1,4 +1,5 @@
|
||||
CUSTOM_MATRIX = lite
|
||||
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
|
||||
|
66
keyboards/cipulot/ec_dolice/config.h
Normal file
66
keyboards/cipulot/ec_dolice/config.h
Normal 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
|
21
keyboards/cipulot/ec_dolice/halconf.h
Normal file
21
keyboards/cipulot/ec_dolice/halconf.h
Normal 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>
|
319
keyboards/cipulot/ec_dolice/info.json
Normal file
319
keyboards/cipulot/ec_dolice/info.json
Normal 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}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
41
keyboards/cipulot/ec_dolice/keymaps/default/keymap.c
Normal file
41
keyboards/cipulot/ec_dolice/keymaps/default/keymap.c
Normal 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, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______
|
||||
)
|
||||
};
|
41
keyboards/cipulot/ec_dolice/keymaps/via/keymap.c
Normal file
41
keyboards/cipulot/ec_dolice/keymaps/via/keymap.c
Normal 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, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______
|
||||
)
|
||||
};
|
1
keyboards/cipulot/ec_dolice/keymaps/via/rules.mk
Normal file
1
keyboards/cipulot/ec_dolice/keymaps/via/rules.mk
Normal file
@ -0,0 +1 @@
|
||||
VIA_ENABLE = yes
|
22
keyboards/cipulot/ec_dolice/mcuconf.h
Normal file
22
keyboards/cipulot/ec_dolice/mcuconf.h
Normal 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
|
3
keyboards/cipulot/ec_dolice/post_rules.mk
Normal file
3
keyboards/cipulot/ec_dolice/post_rules.mk
Normal file
@ -0,0 +1,3 @@
|
||||
ifeq ($(strip $(VIA_ENABLE)), yes)
|
||||
SRC += keyboards/cipulot/common/via_ec.c
|
||||
endif
|
26
keyboards/cipulot/ec_dolice/readme.md
Normal file
26
keyboards/cipulot/ec_dolice/readme.md
Normal file
@ -0,0 +1,26 @@
|
||||
# Dolice EC
|
||||
|
||||

|
||||
|
||||
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
|
5
keyboards/cipulot/ec_dolice/rules.mk
Normal file
5
keyboards/cipulot/ec_dolice/rules.mk
Normal 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
|
61
keyboards/cipulot/ec_menhir/config.h
Normal file
61
keyboards/cipulot/ec_menhir/config.h
Normal 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
|
21
keyboards/cipulot/ec_menhir/halconf.h
Normal file
21
keyboards/cipulot/ec_menhir/halconf.h
Normal 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>
|
87
keyboards/cipulot/ec_menhir/info.json
Normal file
87
keyboards/cipulot/ec_menhir/info.json
Normal 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}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
27
keyboards/cipulot/ec_menhir/keymaps/default/keymap.c
Normal file
27
keyboards/cipulot/ec_menhir/keymaps/default/keymap.c
Normal 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
|
||||
};
|
27
keyboards/cipulot/ec_menhir/keymaps/via/keymap.c
Normal file
27
keyboards/cipulot/ec_menhir/keymaps/via/keymap.c
Normal 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
|
||||
};
|
1
keyboards/cipulot/ec_menhir/keymaps/via/rules.mk
Normal file
1
keyboards/cipulot/ec_menhir/keymaps/via/rules.mk
Normal file
@ -0,0 +1 @@
|
||||
VIA_ENABLE = yes
|
22
keyboards/cipulot/ec_menhir/mcuconf.h
Normal file
22
keyboards/cipulot/ec_menhir/mcuconf.h
Normal 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
|
3
keyboards/cipulot/ec_menhir/post_rules.mk
Normal file
3
keyboards/cipulot/ec_menhir/post_rules.mk
Normal file
@ -0,0 +1,3 @@
|
||||
ifeq ($(strip $(VIA_ENABLE)), yes)
|
||||
SRC += keyboards/cipulot/common/via_ec.c
|
||||
endif
|
26
keyboards/cipulot/ec_menhir/readme.md
Normal file
26
keyboards/cipulot/ec_menhir/readme.md
Normal file
@ -0,0 +1,26 @@
|
||||
# EC Menhir
|
||||
|
||||

|
||||
|
||||
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
|
4
keyboards/cipulot/ec_menhir/rules.mk
Normal file
4
keyboards/cipulot/ec_menhir/rules.mk
Normal 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
|
@ -65,8 +65,3 @@
|
||||
|
||||
#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
|
||||
|
@ -6,6 +6,12 @@
|
||||
"build": {
|
||||
"lto": true
|
||||
},
|
||||
"qmk": {
|
||||
"locking": {
|
||||
"enabled": true,
|
||||
"resync": true
|
||||
}
|
||||
},
|
||||
"diode_direction": "COL2ROW",
|
||||
"features": {
|
||||
"bootmagic": false,
|
||||
|
@ -1,4 +1,5 @@
|
||||
CUSTOM_MATRIX = lite
|
||||
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
|
||||
|
@ -64,9 +64,3 @@
|
||||
// #define DEBUG_MATRIX_SCAN_RATE
|
||||
|
||||
#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
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user