mirror of
https://github.com/qmk/qmk_firmware.git
synced 2024-11-28 14:10:13 +00:00
Merge remote-tracking branch 'upstream/develop' into data-repository
This commit is contained in:
commit
fee56db8a1
@ -11,7 +11,8 @@ charset = utf-8
|
|||||||
trim_trailing_whitespace = true
|
trim_trailing_whitespace = true
|
||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
|
|
||||||
[{*.yaml,*.yml}] # To match GitHub Actions formatting
|
# To match GitHub Actions formatting
|
||||||
|
[*.{yaml,yml}]
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
|
|
||||||
[*.md]
|
[*.md]
|
||||||
|
2
.github/workflows/docs.yml
vendored
2
.github/workflows/docs.yml
vendored
@ -56,7 +56,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Deploy
|
- name: Deploy
|
||||||
if: ${{ github.event_name == 'push' && github.repository == 'qmk/qmk_firmware' }}
|
if: ${{ github.event_name == 'push' && github.repository == 'qmk/qmk_firmware' }}
|
||||||
uses: JamesIves/github-pages-deploy-action@v4.6.4
|
uses: JamesIves/github-pages-deploy-action@v4.6.8
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
branch: gh-pages
|
branch: gh-pages
|
||||||
|
@ -131,13 +131,13 @@ ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes)
|
|||||||
MOUSE_ENABLE := yes
|
MOUSE_ENABLE := yes
|
||||||
VPATH += $(QUANTUM_DIR)/pointing_device
|
VPATH += $(QUANTUM_DIR)/pointing_device
|
||||||
SRC += $(QUANTUM_DIR)/pointing_device/pointing_device.c
|
SRC += $(QUANTUM_DIR)/pointing_device/pointing_device.c
|
||||||
SRC += $(QUANTUM_DIR)/pointing_device/pointing_device_drivers.c
|
|
||||||
SRC += $(QUANTUM_DIR)/pointing_device/pointing_device_auto_mouse.c
|
SRC += $(QUANTUM_DIR)/pointing_device/pointing_device_auto_mouse.c
|
||||||
ifneq ($(strip $(POINTING_DEVICE_DRIVER)), custom)
|
ifneq ($(strip $(POINTING_DEVICE_DRIVER)), custom)
|
||||||
SRC += drivers/sensors/$(strip $(POINTING_DEVICE_DRIVER)).c
|
SRC += drivers/sensors/$(strip $(POINTING_DEVICE_DRIVER)).c
|
||||||
OPT_DEFS += -DPOINTING_DEVICE_DRIVER_$(strip $(shell echo $(POINTING_DEVICE_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
OPT_DEFS += -DPOINTING_DEVICE_DRIVER_$(strip $(shell echo $(POINTING_DEVICE_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||||
endif
|
endif
|
||||||
OPT_DEFS += -DPOINTING_DEVICE_DRIVER_$(strip $(POINTING_DEVICE_DRIVER))
|
OPT_DEFS += -DPOINTING_DEVICE_DRIVER_$(strip $(POINTING_DEVICE_DRIVER))
|
||||||
|
OPT_DEFS += -DPOINTING_DEVICE_DRIVER_NAME=$(strip $(POINTING_DEVICE_DRIVER))
|
||||||
ifeq ($(strip $(POINTING_DEVICE_DRIVER)), adns9800)
|
ifeq ($(strip $(POINTING_DEVICE_DRIVER)), adns9800)
|
||||||
SPI_DRIVER_REQUIRED = yes
|
SPI_DRIVER_REQUIRED = yes
|
||||||
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), analog_joystick)
|
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), analog_joystick)
|
||||||
@ -308,11 +308,11 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
|
|||||||
POST_CONFIG_H += $(QUANTUM_DIR)/rgblight/rgblight_post_config.h
|
POST_CONFIG_H += $(QUANTUM_DIR)/rgblight/rgblight_post_config.h
|
||||||
OPT_DEFS += -DRGBLIGHT_ENABLE
|
OPT_DEFS += -DRGBLIGHT_ENABLE
|
||||||
OPT_DEFS += -DRGBLIGHT_$(strip $(shell echo $(RGBLIGHT_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
OPT_DEFS += -DRGBLIGHT_$(strip $(shell echo $(RGBLIGHT_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_underglow.c
|
||||||
SRC += $(QUANTUM_DIR)/color.c
|
SRC += $(QUANTUM_DIR)/color.c
|
||||||
SRC += $(QUANTUM_DIR)/rgblight/rgblight.c
|
SRC += $(QUANTUM_DIR)/rgblight/rgblight.c
|
||||||
SRC += $(QUANTUM_DIR)/rgblight/rgblight_drivers.c
|
SRC += $(QUANTUM_DIR)/rgblight/rgblight_drivers.c
|
||||||
CIE1931_CURVE := yes
|
CIE1931_CURVE := yes
|
||||||
RGB_KEYCODES_ENABLE := yes
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(strip $(RGBLIGHT_DRIVER)), ws2812)
|
ifeq ($(strip $(RGBLIGHT_DRIVER)), ws2812)
|
||||||
@ -458,12 +458,12 @@ ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes)
|
|||||||
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix/animations
|
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix/animations
|
||||||
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix/animations/runners
|
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix/animations/runners
|
||||||
POST_CONFIG_H += $(QUANTUM_DIR)/rgb_matrix/post_config.h
|
POST_CONFIG_H += $(QUANTUM_DIR)/rgb_matrix/post_config.h
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_rgb_matrix.c
|
||||||
SRC += $(QUANTUM_DIR)/color.c
|
SRC += $(QUANTUM_DIR)/color.c
|
||||||
SRC += $(QUANTUM_DIR)/rgb_matrix/rgb_matrix.c
|
SRC += $(QUANTUM_DIR)/rgb_matrix/rgb_matrix.c
|
||||||
SRC += $(QUANTUM_DIR)/rgb_matrix/rgb_matrix_drivers.c
|
SRC += $(QUANTUM_DIR)/rgb_matrix/rgb_matrix_drivers.c
|
||||||
LIB8TION_ENABLE := yes
|
LIB8TION_ENABLE := yes
|
||||||
CIE1931_CURVE := yes
|
CIE1931_CURVE := yes
|
||||||
RGB_KEYCODES_ENABLE := yes
|
|
||||||
|
|
||||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), aw20216s)
|
ifeq ($(strip $(RGB_MATRIX_DRIVER)), aw20216s)
|
||||||
SPI_DRIVER_REQUIRED = yes
|
SPI_DRIVER_REQUIRED = yes
|
||||||
@ -566,10 +566,6 @@ ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes)
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(strip $(RGB_KEYCODES_ENABLE)), yes)
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_rgb.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
VARIABLE_TRACE ?= no
|
VARIABLE_TRACE ?= no
|
||||||
ifneq ($(strip $(VARIABLE_TRACE)),no)
|
ifneq ($(strip $(VARIABLE_TRACE)),no)
|
||||||
SRC += $(QUANTUM_DIR)/variable_trace.c
|
SRC += $(QUANTUM_DIR)/variable_trace.c
|
||||||
@ -934,7 +930,7 @@ ifeq ($(strip $(WS2812_DRIVER_REQUIRED)), yes)
|
|||||||
|
|
||||||
OPT_DEFS += -DWS2812_$(strip $(shell echo $(WS2812_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
OPT_DEFS += -DWS2812_$(strip $(shell echo $(WS2812_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||||
|
|
||||||
SRC += ws2812_$(strip $(WS2812_DRIVER)).c
|
SRC += ws2812.c ws2812_$(strip $(WS2812_DRIVER)).c
|
||||||
|
|
||||||
ifeq ($(strip $(PLATFORM)), CHIBIOS)
|
ifeq ($(strip $(PLATFORM)), CHIBIOS)
|
||||||
ifeq ($(strip $(WS2812_DRIVER)), pwm)
|
ifeq ($(strip $(WS2812_DRIVER)), pwm)
|
||||||
|
@ -298,85 +298,85 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
|
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
|
||||||
integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
|
integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
|
||||||
|
|
||||||
"@rollup/rollup-android-arm-eabi@4.16.4":
|
"@rollup/rollup-android-arm-eabi@4.22.4":
|
||||||
version "4.16.4"
|
version "4.22.4"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.4.tgz#5e8930291f1e5ead7fb1171d53ba5c87718de062"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz#8b613b9725e8f9479d142970b106b6ae878610d5"
|
||||||
integrity sha512-GkhjAaQ8oUTOKE4g4gsZ0u8K/IHU1+2WQSgS1TwTcYvL+sjbaQjNHFXbOJ6kgqGHIO1DfUhI/Sphi9GkRT9K+Q==
|
integrity sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==
|
||||||
|
|
||||||
"@rollup/rollup-android-arm64@4.16.4":
|
"@rollup/rollup-android-arm64@4.22.4":
|
||||||
version "4.16.4"
|
version "4.22.4"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.16.4.tgz#ffb84f1359c04ec8a022a97110e18a5600f5f638"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz#654ca1049189132ff602bfcf8df14c18da1f15fb"
|
||||||
integrity sha512-Bvm6D+NPbGMQOcxvS1zUl8H7DWlywSXsphAeOnVeiZLQ+0J6Is8T7SrjGTH29KtYkiY9vld8ZnpV3G2EPbom+w==
|
integrity sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==
|
||||||
|
|
||||||
"@rollup/rollup-darwin-arm64@4.16.4":
|
"@rollup/rollup-darwin-arm64@4.22.4":
|
||||||
version "4.16.4"
|
version "4.22.4"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.16.4.tgz#b2fcee8d4806a0b1b9185ac038cc428ddedce9f4"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz#6d241d099d1518ef0c2205d96b3fa52e0fe1954b"
|
||||||
integrity sha512-i5d64MlnYBO9EkCOGe5vPR/EeDwjnKOGGdd7zKFhU5y8haKhQZTN2DgVtpODDMxUr4t2K90wTUJg7ilgND6bXw==
|
integrity sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==
|
||||||
|
|
||||||
"@rollup/rollup-darwin-x64@4.16.4":
|
"@rollup/rollup-darwin-x64@4.22.4":
|
||||||
version "4.16.4"
|
version "4.22.4"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.16.4.tgz#fcb25ccbaa3dd33a6490e9d1c64bab2e0e16b932"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz#42bd19d292a57ee11734c980c4650de26b457791"
|
||||||
integrity sha512-WZupV1+CdUYehaZqjaFTClJI72fjJEgTXdf4NbW69I9XyvdmztUExBtcI2yIIU6hJtYvtwS6pkTkHJz+k08mAQ==
|
integrity sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm-gnueabihf@4.16.4":
|
"@rollup/rollup-linux-arm-gnueabihf@4.22.4":
|
||||||
version "4.16.4"
|
version "4.22.4"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.16.4.tgz#40d46bdfe667e5eca31bf40047460e326d2e26bb"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz#f23555ee3d8fe941c5c5fd458cd22b65eb1c2232"
|
||||||
integrity sha512-ADm/xt86JUnmAfA9mBqFcRp//RVRt1ohGOYF6yL+IFCYqOBNwy5lbEK05xTsEoJq+/tJzg8ICUtS82WinJRuIw==
|
integrity sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm-musleabihf@4.16.4":
|
"@rollup/rollup-linux-arm-musleabihf@4.22.4":
|
||||||
version "4.16.4"
|
version "4.22.4"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.16.4.tgz#7741df2448c11c56588b50835dbfe91b1a10b375"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz#f3bbd1ae2420f5539d40ac1fde2b38da67779baa"
|
||||||
integrity sha512-tJfJaXPiFAG+Jn3cutp7mCs1ePltuAgRqdDZrzb1aeE3TktWWJ+g7xK9SNlaSUFw6IU4QgOxAY4rA+wZUT5Wfg==
|
integrity sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm64-gnu@4.16.4":
|
"@rollup/rollup-linux-arm64-gnu@4.22.4":
|
||||||
version "4.16.4"
|
version "4.22.4"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.16.4.tgz#0a23b02d2933e4c4872ad18d879890b6a4a295df"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz#7abe900120113e08a1f90afb84c7c28774054d15"
|
||||||
integrity sha512-7dy1BzQkgYlUTapDTvK997cgi0Orh5Iu7JlZVBy1MBURk7/HSbHkzRnXZa19ozy+wwD8/SlpJnOOckuNZtJR9w==
|
integrity sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm64-musl@4.16.4":
|
"@rollup/rollup-linux-arm64-musl@4.22.4":
|
||||||
version "4.16.4"
|
version "4.22.4"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.16.4.tgz#e37ef259358aa886cc07d782220a4fb83c1e6970"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz#9e655285c8175cd44f57d6a1e8e5dedfbba1d820"
|
||||||
integrity sha512-zsFwdUw5XLD1gQe0aoU2HVceI6NEW7q7m05wA46eUAyrkeNYExObfRFQcvA6zw8lfRc5BHtan3tBpo+kqEOxmg==
|
integrity sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==
|
||||||
|
|
||||||
"@rollup/rollup-linux-powerpc64le-gnu@4.16.4":
|
"@rollup/rollup-linux-powerpc64le-gnu@4.22.4":
|
||||||
version "4.16.4"
|
version "4.22.4"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.16.4.tgz#8c69218b6de05ee2ba211664a2d2ac1e54e43f94"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz#9a79ae6c9e9d8fe83d49e2712ecf4302db5bef5e"
|
||||||
integrity sha512-p8C3NnxXooRdNrdv6dBmRTddEapfESEUflpICDNKXpHvTjRRq1J82CbU5G3XfebIZyI3B0s074JHMWD36qOW6w==
|
integrity sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==
|
||||||
|
|
||||||
"@rollup/rollup-linux-riscv64-gnu@4.16.4":
|
"@rollup/rollup-linux-riscv64-gnu@4.22.4":
|
||||||
version "4.16.4"
|
version "4.22.4"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.16.4.tgz#d32727dab8f538d9a4a7c03bcf58c436aecd0139"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz#67ac70eca4ace8e2942fabca95164e8874ab8128"
|
||||||
integrity sha512-Lh/8ckoar4s4Id2foY7jNgitTOUQczwMWNYi+Mjt0eQ9LKhr6sK477REqQkmy8YHY3Ca3A2JJVdXnfb3Rrwkng==
|
integrity sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==
|
||||||
|
|
||||||
"@rollup/rollup-linux-s390x-gnu@4.16.4":
|
"@rollup/rollup-linux-s390x-gnu@4.22.4":
|
||||||
version "4.16.4"
|
version "4.22.4"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.16.4.tgz#d46097246a187d99fc9451fe8393b7155b47c5ec"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz#9f883a7440f51a22ed7f99e1d070bd84ea5005fc"
|
||||||
integrity sha512-1xwwn9ZCQYuqGmulGsTZoKrrn0z2fAur2ujE60QgyDpHmBbXbxLaQiEvzJWDrscRq43c8DnuHx3QorhMTZgisQ==
|
integrity sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==
|
||||||
|
|
||||||
"@rollup/rollup-linux-x64-gnu@4.16.4":
|
"@rollup/rollup-linux-x64-gnu@4.22.4":
|
||||||
version "4.16.4"
|
version "4.22.4"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.16.4.tgz#6356c5a03a4afb1c3057490fc51b4764e109dbc7"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz#70116ae6c577fe367f58559e2cffb5641a1dd9d0"
|
||||||
integrity sha512-LuOGGKAJ7dfRtxVnO1i3qWc6N9sh0Em/8aZ3CezixSTM+E9Oq3OvTsvC4sm6wWjzpsIlOCnZjdluINKESflJLA==
|
integrity sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==
|
||||||
|
|
||||||
"@rollup/rollup-linux-x64-musl@4.16.4":
|
"@rollup/rollup-linux-x64-musl@4.22.4":
|
||||||
version "4.16.4"
|
version "4.22.4"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.16.4.tgz#03a5831a9c0d05877b94653b5ddd3020d3c6fb06"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz#f473f88219feb07b0b98b53a7923be716d1d182f"
|
||||||
integrity sha512-ch86i7KkJKkLybDP2AtySFTRi5fM3KXp0PnHocHuJMdZwu7BuyIKi35BE9guMlmTpwwBTB3ljHj9IQXnTCD0vA==
|
integrity sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==
|
||||||
|
|
||||||
"@rollup/rollup-win32-arm64-msvc@4.16.4":
|
"@rollup/rollup-win32-arm64-msvc@4.22.4":
|
||||||
version "4.16.4"
|
version "4.22.4"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.16.4.tgz#6cc0db57750376b9303bdb6f5482af8974fcae35"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz#4349482d17f5d1c58604d1c8900540d676f420e0"
|
||||||
integrity sha512-Ma4PwyLfOWZWayfEsNQzTDBVW8PZ6TUUN1uFTBQbF2Chv/+sjenE86lpiEwj2FiviSmSZ4Ap4MaAfl1ciF4aSA==
|
integrity sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==
|
||||||
|
|
||||||
"@rollup/rollup-win32-ia32-msvc@4.16.4":
|
"@rollup/rollup-win32-ia32-msvc@4.22.4":
|
||||||
version "4.16.4"
|
version "4.22.4"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.16.4.tgz#aea0b7e492bd9ed46971cb80bc34f1eb14e07789"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz#a6fc39a15db618040ec3c2a24c1e26cb5f4d7422"
|
||||||
integrity sha512-9m/ZDrQsdo/c06uOlP3W9G2ENRVzgzbSXmXHT4hwVaDQhYcRpi9bgBT0FTG9OhESxwK0WjQxYOSfv40cU+T69w==
|
integrity sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==
|
||||||
|
|
||||||
"@rollup/rollup-win32-x64-msvc@4.16.4":
|
"@rollup/rollup-win32-x64-msvc@4.22.4":
|
||||||
version "4.16.4"
|
version "4.22.4"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.16.4.tgz#c09ad9a132ccb5a67c4f211d909323ab1294f95f"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz#3dd5d53e900df2a40841882c02e56f866c04d202"
|
||||||
integrity sha512-YunpoOAyGLDseanENHmbFvQSfVL5BxW3k7hhy0eN4rb3gS/ct75dVD0EXOWIqFT/nE8XYW6LP6vz6ctKRi0k9A==
|
integrity sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==
|
||||||
|
|
||||||
"@shikijs/core@1.3.0", "@shikijs/core@^1.3.0":
|
"@shikijs/core@1.3.0", "@shikijs/core@^1.3.0":
|
||||||
version "1.3.0"
|
version "1.3.0"
|
||||||
@ -697,28 +697,28 @@ rfdc@^1.3.1:
|
|||||||
integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==
|
integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==
|
||||||
|
|
||||||
rollup@^4.13.0:
|
rollup@^4.13.0:
|
||||||
version "4.16.4"
|
version "4.22.4"
|
||||||
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.16.4.tgz#fe328eb41293f20c9593a095ec23bdc4b5d93317"
|
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.22.4.tgz#4135a6446671cd2a2453e1ad42a45d5973ec3a0f"
|
||||||
integrity sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==
|
integrity sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/estree" "1.0.5"
|
"@types/estree" "1.0.5"
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
"@rollup/rollup-android-arm-eabi" "4.16.4"
|
"@rollup/rollup-android-arm-eabi" "4.22.4"
|
||||||
"@rollup/rollup-android-arm64" "4.16.4"
|
"@rollup/rollup-android-arm64" "4.22.4"
|
||||||
"@rollup/rollup-darwin-arm64" "4.16.4"
|
"@rollup/rollup-darwin-arm64" "4.22.4"
|
||||||
"@rollup/rollup-darwin-x64" "4.16.4"
|
"@rollup/rollup-darwin-x64" "4.22.4"
|
||||||
"@rollup/rollup-linux-arm-gnueabihf" "4.16.4"
|
"@rollup/rollup-linux-arm-gnueabihf" "4.22.4"
|
||||||
"@rollup/rollup-linux-arm-musleabihf" "4.16.4"
|
"@rollup/rollup-linux-arm-musleabihf" "4.22.4"
|
||||||
"@rollup/rollup-linux-arm64-gnu" "4.16.4"
|
"@rollup/rollup-linux-arm64-gnu" "4.22.4"
|
||||||
"@rollup/rollup-linux-arm64-musl" "4.16.4"
|
"@rollup/rollup-linux-arm64-musl" "4.22.4"
|
||||||
"@rollup/rollup-linux-powerpc64le-gnu" "4.16.4"
|
"@rollup/rollup-linux-powerpc64le-gnu" "4.22.4"
|
||||||
"@rollup/rollup-linux-riscv64-gnu" "4.16.4"
|
"@rollup/rollup-linux-riscv64-gnu" "4.22.4"
|
||||||
"@rollup/rollup-linux-s390x-gnu" "4.16.4"
|
"@rollup/rollup-linux-s390x-gnu" "4.22.4"
|
||||||
"@rollup/rollup-linux-x64-gnu" "4.16.4"
|
"@rollup/rollup-linux-x64-gnu" "4.22.4"
|
||||||
"@rollup/rollup-linux-x64-musl" "4.16.4"
|
"@rollup/rollup-linux-x64-musl" "4.22.4"
|
||||||
"@rollup/rollup-win32-arm64-msvc" "4.16.4"
|
"@rollup/rollup-win32-arm64-msvc" "4.22.4"
|
||||||
"@rollup/rollup-win32-ia32-msvc" "4.16.4"
|
"@rollup/rollup-win32-ia32-msvc" "4.22.4"
|
||||||
"@rollup/rollup-win32-x64-msvc" "4.16.4"
|
"@rollup/rollup-win32-x64-msvc" "4.22.4"
|
||||||
fsevents "~2.3.2"
|
fsevents "~2.3.2"
|
||||||
|
|
||||||
shiki@1.3.0, shiki@^1.3.0:
|
shiki@1.3.0, shiki@^1.3.0:
|
||||||
|
@ -67,7 +67,6 @@ OTHER_OPTION_NAMES = \
|
|||||||
PS2_DRIVER \
|
PS2_DRIVER \
|
||||||
RAW_ENABLE \
|
RAW_ENABLE \
|
||||||
SWAP_HANDS_ENABLE \
|
SWAP_HANDS_ENABLE \
|
||||||
RING_BUFFERED_6KRO_REPORT_ENABLE \
|
|
||||||
WATCHDOG_ENABLE \
|
WATCHDOG_ENABLE \
|
||||||
ERGOINU \
|
ERGOINU \
|
||||||
NO_USB_STARTUP_CHECK \
|
NO_USB_STARTUP_CHECK \
|
||||||
|
@ -84,7 +84,7 @@
|
|||||||
"group": "midi",
|
"group": "midi",
|
||||||
"key": "QK_MIDI_NOTE_G_SHARP_0",
|
"key": "QK_MIDI_NOTE_G_SHARP_0",
|
||||||
"aliases": [
|
"aliases": [
|
||||||
"MI_Gs"
|
"MI_Gs",
|
||||||
"MI_Ab"
|
"MI_Ab"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@ -99,7 +99,7 @@
|
|||||||
"group": "midi",
|
"group": "midi",
|
||||||
"key": "QK_MIDI_NOTE_A_SHARP_0",
|
"key": "QK_MIDI_NOTE_A_SHARP_0",
|
||||||
"aliases": [
|
"aliases": [
|
||||||
"MI_As"
|
"MI_As",
|
||||||
"MI_Bb"
|
"MI_Bb"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -2,131 +2,131 @@
|
|||||||
"keycodes": {
|
"keycodes": {
|
||||||
"0x7E00": {
|
"0x7E00": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_0",
|
"key": "QK_KB_0"
|
||||||
},
|
},
|
||||||
"0x7E01": {
|
"0x7E01": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_1",
|
"key": "QK_KB_1"
|
||||||
},
|
},
|
||||||
"0x7E02": {
|
"0x7E02": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_2",
|
"key": "QK_KB_2"
|
||||||
},
|
},
|
||||||
"0x7E03": {
|
"0x7E03": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_3",
|
"key": "QK_KB_3"
|
||||||
},
|
},
|
||||||
"0x7E04": {
|
"0x7E04": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_4",
|
"key": "QK_KB_4"
|
||||||
},
|
},
|
||||||
"0x7E05": {
|
"0x7E05": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_5",
|
"key": "QK_KB_5"
|
||||||
},
|
},
|
||||||
"0x7E06": {
|
"0x7E06": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_6",
|
"key": "QK_KB_6"
|
||||||
},
|
},
|
||||||
"0x7E07": {
|
"0x7E07": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_7",
|
"key": "QK_KB_7"
|
||||||
},
|
},
|
||||||
"0x7E08": {
|
"0x7E08": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_8",
|
"key": "QK_KB_8"
|
||||||
},
|
},
|
||||||
"0x7E09": {
|
"0x7E09": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_9",
|
"key": "QK_KB_9"
|
||||||
},
|
},
|
||||||
"0x7E0A": {
|
"0x7E0A": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_10",
|
"key": "QK_KB_10"
|
||||||
},
|
},
|
||||||
"0x7E0B": {
|
"0x7E0B": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_11",
|
"key": "QK_KB_11"
|
||||||
},
|
},
|
||||||
"0x7E0C": {
|
"0x7E0C": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_12",
|
"key": "QK_KB_12"
|
||||||
},
|
},
|
||||||
"0x7E0D": {
|
"0x7E0D": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_13",
|
"key": "QK_KB_13"
|
||||||
},
|
},
|
||||||
"0x7E0E": {
|
"0x7E0E": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_14",
|
"key": "QK_KB_14"
|
||||||
},
|
},
|
||||||
"0x7E0F": {
|
"0x7E0F": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_15",
|
"key": "QK_KB_15"
|
||||||
},
|
},
|
||||||
"0x7E10": {
|
"0x7E10": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_16",
|
"key": "QK_KB_16"
|
||||||
},
|
},
|
||||||
"0x7E11": {
|
"0x7E11": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_17",
|
"key": "QK_KB_17"
|
||||||
},
|
},
|
||||||
"0x7E12": {
|
"0x7E12": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_18",
|
"key": "QK_KB_18"
|
||||||
},
|
},
|
||||||
"0x7E13": {
|
"0x7E13": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_19",
|
"key": "QK_KB_19"
|
||||||
},
|
},
|
||||||
"0x7E14": {
|
"0x7E14": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_20",
|
"key": "QK_KB_20"
|
||||||
},
|
},
|
||||||
"0x7E15": {
|
"0x7E15": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_21",
|
"key": "QK_KB_21"
|
||||||
},
|
},
|
||||||
"0x7E16": {
|
"0x7E16": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_22",
|
"key": "QK_KB_22"
|
||||||
},
|
},
|
||||||
"0x7E17": {
|
"0x7E17": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_23",
|
"key": "QK_KB_23"
|
||||||
},
|
},
|
||||||
"0x7E18": {
|
"0x7E18": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_24",
|
"key": "QK_KB_24"
|
||||||
},
|
},
|
||||||
"0x7E19": {
|
"0x7E19": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_25",
|
"key": "QK_KB_25"
|
||||||
},
|
},
|
||||||
"0x7E1A": {
|
"0x7E1A": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_26",
|
"key": "QK_KB_26"
|
||||||
},
|
},
|
||||||
"0x7E1B": {
|
"0x7E1B": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_27",
|
"key": "QK_KB_27"
|
||||||
},
|
},
|
||||||
"0x7E1C": {
|
"0x7E1C": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_28",
|
"key": "QK_KB_28"
|
||||||
},
|
},
|
||||||
"0x7E1D": {
|
"0x7E1D": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_29",
|
"key": "QK_KB_29"
|
||||||
},
|
},
|
||||||
"0x7E1E": {
|
"0x7E1E": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_30",
|
"key": "QK_KB_30"
|
||||||
},
|
},
|
||||||
"0x7E1F": {
|
"0x7E1F": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_31",
|
"key": "QK_KB_31"
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -86,7 +86,7 @@
|
|||||||
"group": "midi",
|
"group": "midi",
|
||||||
"key": "QK_MIDI_NOTE_G_SHARP_0",
|
"key": "QK_MIDI_NOTE_G_SHARP_0",
|
||||||
"aliases": [
|
"aliases": [
|
||||||
"MI_Gs"
|
"MI_Gs",
|
||||||
"MI_Ab"
|
"MI_Ab"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@ -101,7 +101,7 @@
|
|||||||
"group": "midi",
|
"group": "midi",
|
||||||
"key": "QK_MIDI_NOTE_A_SHARP_0",
|
"key": "QK_MIDI_NOTE_A_SHARP_0",
|
||||||
"aliases": [
|
"aliases": [
|
||||||
"MI_As"
|
"MI_As",
|
||||||
"MI_Bb"
|
"MI_Bb"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -2,131 +2,131 @@
|
|||||||
"keycodes": {
|
"keycodes": {
|
||||||
"0x7E40": {
|
"0x7E40": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_0",
|
"key": "QK_USER_0"
|
||||||
},
|
},
|
||||||
"0x7E41": {
|
"0x7E41": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_1",
|
"key": "QK_USER_1"
|
||||||
},
|
},
|
||||||
"0x7E42": {
|
"0x7E42": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_2",
|
"key": "QK_USER_2"
|
||||||
},
|
},
|
||||||
"0x7E43": {
|
"0x7E43": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_3",
|
"key": "QK_USER_3"
|
||||||
},
|
},
|
||||||
"0x7E44": {
|
"0x7E44": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_4",
|
"key": "QK_USER_4"
|
||||||
},
|
},
|
||||||
"0x7E45": {
|
"0x7E45": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_5",
|
"key": "QK_USER_5"
|
||||||
},
|
},
|
||||||
"0x7E46": {
|
"0x7E46": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_6",
|
"key": "QK_USER_6"
|
||||||
},
|
},
|
||||||
"0x7E47": {
|
"0x7E47": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_7",
|
"key": "QK_USER_7"
|
||||||
},
|
},
|
||||||
"0x7E48": {
|
"0x7E48": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_8",
|
"key": "QK_USER_8"
|
||||||
},
|
},
|
||||||
"0x7E49": {
|
"0x7E49": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_9",
|
"key": "QK_USER_9"
|
||||||
},
|
},
|
||||||
"0x7E4A": {
|
"0x7E4A": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_10",
|
"key": "QK_USER_10"
|
||||||
},
|
},
|
||||||
"0x7E4B": {
|
"0x7E4B": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_11",
|
"key": "QK_USER_11"
|
||||||
},
|
},
|
||||||
"0x7E4C": {
|
"0x7E4C": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_12",
|
"key": "QK_USER_12"
|
||||||
},
|
},
|
||||||
"0x7E4D": {
|
"0x7E4D": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_13",
|
"key": "QK_USER_13"
|
||||||
},
|
},
|
||||||
"0x7E4E": {
|
"0x7E4E": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_14",
|
"key": "QK_USER_14"
|
||||||
},
|
},
|
||||||
"0x7E4F": {
|
"0x7E4F": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_15",
|
"key": "QK_USER_15"
|
||||||
},
|
},
|
||||||
"0x7E50": {
|
"0x7E50": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_16",
|
"key": "QK_USER_16"
|
||||||
},
|
},
|
||||||
"0x7E51": {
|
"0x7E51": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_17",
|
"key": "QK_USER_17"
|
||||||
},
|
},
|
||||||
"0x7E52": {
|
"0x7E52": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_18",
|
"key": "QK_USER_18"
|
||||||
},
|
},
|
||||||
"0x7E53": {
|
"0x7E53": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_19",
|
"key": "QK_USER_19"
|
||||||
},
|
},
|
||||||
"0x7E54": {
|
"0x7E54": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_20",
|
"key": "QK_USER_20"
|
||||||
},
|
},
|
||||||
"0x7E55": {
|
"0x7E55": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_21",
|
"key": "QK_USER_21"
|
||||||
},
|
},
|
||||||
"0x7E56": {
|
"0x7E56": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_22",
|
"key": "QK_USER_22"
|
||||||
},
|
},
|
||||||
"0x7E57": {
|
"0x7E57": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_23",
|
"key": "QK_USER_23"
|
||||||
},
|
},
|
||||||
"0x7E58": {
|
"0x7E58": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_24",
|
"key": "QK_USER_24"
|
||||||
},
|
},
|
||||||
"0x7E59": {
|
"0x7E59": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_25",
|
"key": "QK_USER_25"
|
||||||
},
|
},
|
||||||
"0x7E5A": {
|
"0x7E5A": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_26",
|
"key": "QK_USER_26"
|
||||||
},
|
},
|
||||||
"0x7E5B": {
|
"0x7E5B": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_27",
|
"key": "QK_USER_27"
|
||||||
},
|
},
|
||||||
"0x7E5C": {
|
"0x7E5C": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_28",
|
"key": "QK_USER_28"
|
||||||
},
|
},
|
||||||
"0x7E5D": {
|
"0x7E5D": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_29",
|
"key": "QK_USER_29"
|
||||||
},
|
},
|
||||||
"0x7E5E": {
|
"0x7E5E": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_30",
|
"key": "QK_USER_30"
|
||||||
},
|
},
|
||||||
"0x7E5F": {
|
"0x7E5F": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_31",
|
"key": "QK_USER_31"
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -84,6 +84,11 @@
|
|||||||
"board": "STEMCELL",
|
"board": "STEMCELL",
|
||||||
"bootloader": "tinyuf2",
|
"bootloader": "tinyuf2",
|
||||||
"processor": "STM32F411"
|
"processor": "STM32F411"
|
||||||
|
},
|
||||||
|
"svlinky": {
|
||||||
|
"board": "QMK_PM2040",
|
||||||
|
"bootloader": "rp2040",
|
||||||
|
"processor": "RP2040"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1365,6 +1365,12 @@
|
|||||||
"runner3680/5x8": {
|
"runner3680/5x8": {
|
||||||
"target": "omkbd/runner3680/5x8"
|
"target": "omkbd/runner3680/5x8"
|
||||||
},
|
},
|
||||||
|
"saevus/cor": {
|
||||||
|
"target": "concreteflowers/cor"
|
||||||
|
},
|
||||||
|
"saevus/cor_tkl": {
|
||||||
|
"target": "concreteflowers/cor_tkl"
|
||||||
|
},
|
||||||
"scarletbandana": {
|
"scarletbandana": {
|
||||||
"target": "woodkeys/scarletbandana"
|
"target": "woodkeys/scarletbandana"
|
||||||
},
|
},
|
||||||
|
@ -45,7 +45,7 @@
|
|||||||
},
|
},
|
||||||
"development_board": {
|
"development_board": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["promicro", "elite_c", "elite_pi", "proton_c", "kb2040", "promicro_rp2040", "blok", "michi", "bit_c_pro", "stemcell", "bluepill", "blackpill_f401", "blackpill_f411", "bonsai_c4", "helios", "liatris", "imera"]
|
"enum": ["promicro", "elite_c", "elite_pi", "proton_c", "kb2040", "promicro_rp2040", "blok", "michi", "bit_c_pro", "stemcell", "bluepill", "blackpill_f401", "blackpill_f411", "bonsai_c4", "helios", "liatris", "imera", "svlinky"]
|
||||||
},
|
},
|
||||||
"pin_compatible": {
|
"pin_compatible": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
|
@ -426,8 +426,6 @@ Use these to enable or disable building certain features. The more you have enab
|
|||||||
* Key combo feature
|
* Key combo feature
|
||||||
* `NKRO_ENABLE`
|
* `NKRO_ENABLE`
|
||||||
* USB N-Key Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
* USB N-Key Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||||
* `RING_BUFFERED_6KRO_REPORT_ENABLE`
|
|
||||||
* USB 6-Key Rollover - Instead of stopping any new input once 6 keys are pressed, the oldest key is released and the new key is pressed.
|
|
||||||
* `AUDIO_ENABLE`
|
* `AUDIO_ENABLE`
|
||||||
* Enable the audio subsystem.
|
* Enable the audio subsystem.
|
||||||
* `KEY_OVERRIDE_ENABLE`
|
* `KEY_OVERRIDE_ENABLE`
|
||||||
|
@ -236,18 +236,49 @@ The following `#define`s apply only to the `pwm` driver:
|
|||||||
|`WS2812_PWM_COMPLEMENTARY_OUTPUT`|*Not defined* |Whether the PWM output is complementary (`TIMx_CHyN`) |
|
|`WS2812_PWM_COMPLEMENTARY_OUTPUT`|*Not defined* |Whether the PWM output is complementary (`TIMx_CHyN`) |
|
||||||
|
|
||||||
::: tip
|
::: tip
|
||||||
Using a complementary timer output (`TIMx_CHyN`) is possible only for advanced-control timers (1, 8 and 20 on STM32), and the `STM32_PWM_USE_ADVANCED` option in `mcuconf.h` must be set to `TRUE`. Complementary outputs of general-purpose timers are not supported due to ChibiOS limitations.
|
Using a complementary timer output (`TIMx_CHyN`) is possible only for advanced-control timers (1, 8 and 20 on STM32). Complementary outputs of general-purpose timers are not supported due to ChibiOS limitations.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
## API {#api}
|
## API {#api}
|
||||||
|
|
||||||
### `void ws2812_setleds(rgb_led_t *ledarray, uint16_t number_of_leds)` {#api-ws2812-setleds}
|
### `void ws2812_init(void)` {#api-ws2812-init}
|
||||||
|
|
||||||
Send RGB data to the WS2812 LED chain.
|
Initialize the LED driver. This function should be called first.
|
||||||
|
|
||||||
#### Arguments {#api-ws2812-setleds-arguments}
|
---
|
||||||
|
|
||||||
- `rgb_led_t *ledarray`
|
### `void ws2812_set_color(int index, uint8_t red, uint8_t green, uint8_t blue)` {#api-ws2812-set-color}
|
||||||
A pointer to the LED array.
|
|
||||||
- `uint16_t number_of_leds`
|
Set the color of a single LED. This function does not immediately update the LEDs; call `ws2812_flush()` after you are finished.
|
||||||
The length of the LED array.
|
|
||||||
|
#### Arguments {#api-ws2812-set-color-arguments}
|
||||||
|
|
||||||
|
- `int index`
|
||||||
|
The LED index in the WS2812 chain.
|
||||||
|
- `uint8_t red`
|
||||||
|
The red value to set.
|
||||||
|
- `uint8_t green`
|
||||||
|
The green value to set.
|
||||||
|
- `uint8_t blue`
|
||||||
|
The blue value to set.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `void ws812_set_color_all(uint8_t red, uint8_t green, uint8_t blue)` {#api-ws2812-set-color-all}
|
||||||
|
|
||||||
|
Set the color of all LEDs.
|
||||||
|
|
||||||
|
#### Arguments {#api-ws2812-set-color-all-arguments}
|
||||||
|
|
||||||
|
- `uint8_t red`
|
||||||
|
The red value to set.
|
||||||
|
- `uint8_t green`
|
||||||
|
The green value to set.
|
||||||
|
- `uint8_t blue`
|
||||||
|
The blue value to set.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `void ws2812_flush(void)` {#api-ws2812-flush}
|
||||||
|
|
||||||
|
Flush the PWM values to the LED chain.
|
||||||
|
@ -21,6 +21,7 @@ The following converters are available at this time:
|
|||||||
| `promicro` | `liatris` |
|
| `promicro` | `liatris` |
|
||||||
| `promicro` | `imera` |
|
| `promicro` | `imera` |
|
||||||
| `promicro` | `michi` |
|
| `promicro` | `michi` |
|
||||||
|
| `promicro` | `svlinky` |
|
||||||
| `elite_c` | `stemcell` |
|
| `elite_c` | `stemcell` |
|
||||||
| `elite_c` | `rp2040_ce` |
|
| `elite_c` | `rp2040_ce` |
|
||||||
| `elite_c` | `elite_pi` |
|
| `elite_c` | `elite_pi` |
|
||||||
@ -87,6 +88,7 @@ If a board currently supported in QMK uses a [Pro Micro](https://www.sparkfun.co
|
|||||||
| [Liatris](https://splitkb.com/products/liatris) | `liatris` |
|
| [Liatris](https://splitkb.com/products/liatris) | `liatris` |
|
||||||
| [Imera](https://splitkb.com/products/imera) | `imera` |
|
| [Imera](https://splitkb.com/products/imera) | `imera` |
|
||||||
| [Michi](https://github.com/ci-bus/michi-promicro-rp2040) | `michi` |
|
| [Michi](https://github.com/ci-bus/michi-promicro-rp2040) | `michi` |
|
||||||
|
| [Svlinky](https://github.com/sadekbaroudi/svlinky) | `svlinky` |
|
||||||
|
|
||||||
Converter summary:
|
Converter summary:
|
||||||
|
|
||||||
@ -105,6 +107,7 @@ Converter summary:
|
|||||||
| `liatris` | `-e CONVERT_TO=liatris` | `CONVERT_TO=liatris` | `#ifdef CONVERT_TO_LIATRIS` |
|
| `liatris` | `-e CONVERT_TO=liatris` | `CONVERT_TO=liatris` | `#ifdef CONVERT_TO_LIATRIS` |
|
||||||
| `imera` | `-e CONVERT_TO=imera` | `CONVERT_TO=imera` | `#ifdef CONVERT_TO_IMERA` |
|
| `imera` | `-e CONVERT_TO=imera` | `CONVERT_TO=imera` | `#ifdef CONVERT_TO_IMERA` |
|
||||||
| `michi` | `-e CONVERT_TO=michi` | `CONVERT_TO=michi` | `#ifdef CONVERT_TO_MICHI` |
|
| `michi` | `-e CONVERT_TO=michi` | `CONVERT_TO=michi` | `#ifdef CONVERT_TO_MICHI` |
|
||||||
|
| `svlinky` | `-e CONVERT_TO=svlinky` | `CONVERT_TO=svlinky` | `#ifdef CONVERT_TO_SVLINKY` |
|
||||||
|
|
||||||
### Proton C {#proton_c}
|
### Proton C {#proton_c}
|
||||||
|
|
||||||
@ -170,6 +173,9 @@ The Bonsai C4 only has one on-board LED (B2), and by default, both the Pro Micro
|
|||||||
|
|
||||||
Feature set is identical to [Adafruit KB2040](#kb2040). VBUS detection is enabled by default for superior split keyboard support. For more information, refer to the [Community Edition pinout](platformdev_rp2040#rp2040_ce) docs.
|
Feature set is identical to [Adafruit KB2040](#kb2040). VBUS detection is enabled by default for superior split keyboard support. For more information, refer to the [Community Edition pinout](platformdev_rp2040#rp2040_ce) docs.
|
||||||
|
|
||||||
|
### Svlinky {#svlinky}
|
||||||
|
|
||||||
|
Feature set is a pro micro equivalent of the [RP2040 Community Edition](#rp2040_ce), except that two of the analog GPIO have been replaced with digital only GPIO. These two were moved to the FPC connector to support the [VIK specification](https://github.com/sadekbaroudi/vik). This means that if you are expecting analog support on all 4 pins as provided on a RP2040 Community Edition pinout, you will not have that. Please see the [Svlinky github page](https://github.com/sadekbaroudi/svlinky) for more details.
|
||||||
|
|
||||||
## Elite-C
|
## Elite-C
|
||||||
|
|
||||||
|
@ -74,6 +74,7 @@ There are a number of functions (and variables) related to how you can use or ma
|
|||||||
| `default_layer_and(layer_mask)` | Turns on layers based on matching enabled bits between specifed layer and existing default layer state. |
|
| `default_layer_and(layer_mask)` | Turns on layers based on matching enabled bits between specifed layer and existing default layer state. |
|
||||||
| `default_layer_xor(layer_mask)` | Turns on layers based on non-matching bits between specifed layer and existing default layer state. |
|
| `default_layer_xor(layer_mask)` | Turns on layers based on non-matching bits between specifed layer and existing default layer state. |
|
||||||
| `default_layer_debug(layer_mask)` | Prints out the current bit mask and highest active default layer to debugger console. |
|
| `default_layer_debug(layer_mask)` | Prints out the current bit mask and highest active default layer to debugger console. |
|
||||||
|
| [`set_single_default_layer(layer)`](ref_functions.md#setting-the-persistent-default-layer) | Sets the default layer, but does _not_ write it to persistent memory (EEPROM). |
|
||||||
| [`set_single_persistent_default_layer(layer)`](ref_functions.md#setting-the-persistent-default-layer) | Sets the default layer and writes it to persistent memory (EEPROM). |
|
| [`set_single_persistent_default_layer(layer)`](ref_functions.md#setting-the-persistent-default-layer) | Sets the default layer and writes it to persistent memory (EEPROM). |
|
||||||
| [`update_tri_layer(x, y, z)`](ref_functions.md#update_tri_layerx-y-z) | Checks if layers `x` and `y` are both on, and sets `z` based on that (on if both on, otherwise off). |
|
| [`update_tri_layer(x, y, z)`](ref_functions.md#update_tri_layerx-y-z) | Checks if layers `x` and `y` are both on, and sets `z` based on that (on if both on, otherwise off). |
|
||||||
| [`update_tri_layer_state(state, x, y, z)`](ref_functions.md#update_tri_layer_statestate-x-y-z) | Does the same as `update_tri_layer(x, y, z)`, but from `layer_state_set_*` functions. |
|
| [`update_tri_layer_state(state, x, y, z)`](ref_functions.md#update_tri_layer_statestate-x-y-z) | Does the same as `update_tri_layer(x, y, z)`, but from `layer_state_set_*` functions. |
|
||||||
|
@ -152,14 +152,15 @@ In order to use these features, the following configuration options and function
|
|||||||
|
|
||||||
| Config Flag | Function | Description |
|
| Config Flag | Function | Description |
|
||||||
|-----------------------------|-----------------------------------------------------------|--------------------------------------------------------------------------------------------------------|
|
|-----------------------------|-----------------------------------------------------------|--------------------------------------------------------------------------------------------------------|
|
||||||
| `COMBO_TERM_PER_COMBO` | uint16_t get_combo_term(uint16_t index, combo_t \*combo) | Optional per-combo timeout window. (default: `COMBO_TERM`) |
|
| `COMBO_TERM_PER_COMBO` | `uint16_t get_combo_term(uint16_t combo_index, combo_t *combo)` | Optional per-combo timeout window. (default: `COMBO_TERM`) |
|
||||||
| `COMBO_MUST_HOLD_PER_COMBO` | bool get_combo_must_hold(uint16_t index, combo_t \*combo) | Controls if a given combo should fire immediately on tap or if it needs to be held. (default: `false`) |
|
| `COMBO_MUST_HOLD_PER_COMBO` | `bool get_combo_must_hold(uint16_t combo_index, combo_t *combo)` | Controls if a given combo should fire immediately on tap or if it needs to be held. (default: `false`) |
|
||||||
| `COMBO_MUST_TAP_PER_COMBO` | bool get_combo_must_tap(uint16_t index, combo_t \*combo) | Controls if a given combo should fire only if tapped within `COMBO_HOLD_TERM`. (default: `false`) |
|
| `COMBO_MUST_TAP_PER_COMBO` | `bool get_combo_must_tap(uint16_t combo_index, combo_t *combo)` | Controls if a given combo should fire only if tapped within `COMBO_HOLD_TERM`. (default: `false`) |
|
||||||
| `COMBO_MUST_PRESS_IN_ORDER_PER_COMBO` | bool get_combo_must_press_in_order(uint16_t index, combo_t \*combo) | Controls if a given combo should fire only if its keys are pressed in order. (default: `true`) |
|
| `COMBO_MUST_PRESS_IN_ORDER_PER_COMBO` | `bool get_combo_must_press_in_order(uint16_t combo_index, combo_t *combo)` | Controls if a given combo should fire only if its keys are pressed in order. (default: `true`) |
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
```c
|
```c
|
||||||
uint16_t get_combo_term(uint16_t index, combo_t *combo) {
|
#ifdef COMBO_TERM_PER_COMBO
|
||||||
|
uint16_t get_combo_term(uint16_t combo_index, combo_t *combo) {
|
||||||
// decide by combo->keycode
|
// decide by combo->keycode
|
||||||
switch (combo->keycode) {
|
switch (combo->keycode) {
|
||||||
case KC_X:
|
case KC_X:
|
||||||
@ -167,7 +168,7 @@ uint16_t get_combo_term(uint16_t index, combo_t *combo) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// or with combo index, i.e. its name from enum.
|
// or with combo index, i.e. its name from enum.
|
||||||
switch (index) {
|
switch (combo_index) {
|
||||||
case COMBO_NAME_HERE:
|
case COMBO_NAME_HERE:
|
||||||
return 9001;
|
return 9001;
|
||||||
}
|
}
|
||||||
@ -182,8 +183,10 @@ uint16_t get_combo_term(uint16_t index, combo_t *combo) {
|
|||||||
|
|
||||||
return COMBO_TERM;
|
return COMBO_TERM;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
bool get_combo_must_hold(uint16_t index, combo_t *combo) {
|
#ifdef COMBO_MUST_HOLD_PER_COMBO
|
||||||
|
bool get_combo_must_hold(uint16_t combo_index, combo_t *combo) {
|
||||||
// Same as above, decide by keycode, the combo index, or by the keys in the chord.
|
// Same as above, decide by keycode, the combo index, or by the keys in the chord.
|
||||||
|
|
||||||
if (KEYCODE_IS_MOD(combo->keycode) ||
|
if (KEYCODE_IS_MOD(combo->keycode) ||
|
||||||
@ -192,15 +195,17 @@ bool get_combo_must_hold(uint16_t index, combo_t *combo) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (index) {
|
switch (combo_index) {
|
||||||
case COMBO_NAME_HERE:
|
case COMBO_NAME_HERE:
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
bool get_combo_must_tap(uint16_t index, combo_t *combo) {
|
#ifdef COMBO_MUST_TAP_PER_COMBO
|
||||||
|
bool get_combo_must_tap(uint16_t combo_index, combo_t *combo) {
|
||||||
// If you want all combos to be tap-only, just uncomment the next line
|
// If you want all combos to be tap-only, just uncomment the next line
|
||||||
// return true
|
// return true
|
||||||
|
|
||||||
@ -219,7 +224,9 @@ bool get_combo_must_tap(uint16_t index, combo_t *combo) {
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef COMBO_MUST_PRESS_IN_ORDER_PER_COMBO
|
||||||
bool get_combo_must_press_in_order(uint16_t combo_index, combo_t *combo) {
|
bool get_combo_must_press_in_order(uint16_t combo_index, combo_t *combo) {
|
||||||
switch (combo_index) {
|
switch (combo_index) {
|
||||||
/* List combos here that you want to only activate if their keys
|
/* List combos here that you want to only activate if their keys
|
||||||
@ -231,6 +238,7 @@ bool get_combo_must_press_in_order(uint16_t combo_index, combo_t *combo) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
```
|
```
|
||||||
|
|
||||||
### Generic hook to (dis)allow a combo activation
|
### Generic hook to (dis)allow a combo activation
|
||||||
|
@ -70,17 +70,33 @@ The process is done in steps, generating a number of intermediate results until
|
|||||||
We therefore resort to debouncing the result until it has been stable for a given amount of milliseconds.
|
We therefore resort to debouncing the result until it has been stable for a given amount of milliseconds.
|
||||||
This amount can be configured, in case your board is not stable within the default debouncing time of 200ms.
|
This amount can be configured, in case your board is not stable within the default debouncing time of 200ms.
|
||||||
|
|
||||||
## KVM and USB switches
|
|
||||||
|
|
||||||
Some KVM and USB switches may not trigger the USB controller on the keyboard to fully reset upon switching machines.
|
|
||||||
If your keyboard does not redetect the OS in this situation, you can force the keyboard to reset when the USB initialization event is detected, forcing the USB controller to be reconfigured.
|
|
||||||
|
|
||||||
## Configuration Options
|
## Configuration Options
|
||||||
|
|
||||||
* `#define OS_DETECTION_DEBOUNCE 200`
|
* `#define OS_DETECTION_DEBOUNCE 250`
|
||||||
* defined the debounce time for OS detection, in milliseconds
|
* defined the debounce time for OS detection, in milliseconds
|
||||||
|
* defaults to 250ms
|
||||||
* `#define OS_DETECTION_KEYBOARD_RESET`
|
* `#define OS_DETECTION_KEYBOARD_RESET`
|
||||||
* enables the keyboard reset upon a USB device reinitilization, such as switching devices on some KVMs
|
* enables the keyboard reset upon a USB device reinitilization
|
||||||
|
* this setting may help with detection issues when switching between devices on some KVMs (see [Troubleshooting](#troubleshooting))
|
||||||
|
* `#define OS_DETECTION_SINGLE_REPORT`
|
||||||
|
* allows the report callbacks to be called only once, when the OS detection result is considered stable
|
||||||
|
* subsequent changes in the detection results, if any, are ignored
|
||||||
|
* this setting may help with delayed stability issues when switching devices on some KVMs (see [Troubleshooting](#troubleshooting))
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
Some KVMs and USB switches may cause issues when the OS detection is turned on.
|
||||||
|
Here is a list of common issues and how to fix them:
|
||||||
|
|
||||||
|
* **Problem**: _keyboard won't redetect the OS when switching between machines using a KVM_
|
||||||
|
* **Explanation**: some KVMs keep the USB controller powered on during the switch and OS
|
||||||
|
detection happens when the USB device description is being assembled.
|
||||||
|
* **Solution**: use `OS_DETECTION_KEYBOARD_RESET` to force the keyboard to reset upon switching.
|
||||||
|
* **Problem**: _keyboard OS detection callback gets invoked even minuted after startup_
|
||||||
|
* **Explanation**: some OSes, notably macOS on ARM-based Macs, may cause this behavior.
|
||||||
|
The actual cause is not known at this time.'
|
||||||
|
* **Solution**: use `OS_DETECTION_SINGLE_REPORT` to suppress repeated callback invocations.
|
||||||
|
|
||||||
|
|
||||||
## Debug
|
## Debug
|
||||||
|
|
||||||
|
@ -394,6 +394,7 @@ Ideally, new sensor hardware should be added to `drivers/sensors/` and `quantum/
|
|||||||
| Setting | Description | Default |
|
| Setting | Description | Default |
|
||||||
| ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ------------- |
|
| ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ------------- |
|
||||||
| `MOUSE_EXTENDED_REPORT` | (Optional) Enables support for extended mouse reports. (-32767 to 32767, instead of just -127 to 127). | _not defined_ |
|
| `MOUSE_EXTENDED_REPORT` | (Optional) Enables support for extended mouse reports. (-32767 to 32767, instead of just -127 to 127). | _not defined_ |
|
||||||
|
| `WHEEL_EXTENDED_REPORT` | (Optional) Enables support for extended wheel reports. (-32767 to 32767, instead of just -127 to 127). | _not defined_ |
|
||||||
| `POINTING_DEVICE_ROTATION_90` | (Optional) Rotates the X and Y data by 90 degrees. | _not defined_ |
|
| `POINTING_DEVICE_ROTATION_90` | (Optional) Rotates the X and Y data by 90 degrees. | _not defined_ |
|
||||||
| `POINTING_DEVICE_ROTATION_180` | (Optional) Rotates the X and Y data by 180 degrees. | _not defined_ |
|
| `POINTING_DEVICE_ROTATION_180` | (Optional) Rotates the X and Y data by 180 degrees. | _not defined_ |
|
||||||
| `POINTING_DEVICE_ROTATION_270` | (Optional) Rotates the X and Y data by 270 degrees. | _not defined_ |
|
| `POINTING_DEVICE_ROTATION_270` | (Optional) Rotates the X and Y data by 270 degrees. | _not defined_ |
|
||||||
|
@ -81,38 +81,21 @@ As mentioned earlier, the center of the keyboard by default is expected to be `{
|
|||||||
|
|
||||||
## Keycodes {#keycodes}
|
## Keycodes {#keycodes}
|
||||||
|
|
||||||
All RGB keycodes are currently shared with the RGBLIGHT system:
|
|Key |Aliases |Description |
|
||||||
|
|-------------------------------|---------|-----------------------------------|
|
||||||
|Key |Aliases |Description |
|
|`QK_RGB_MATRIX_ON` |`RM_ON` |Turn on RGB Matrix |
|
||||||
|-------------------|----------|--------------------------------------------------------------------------------------|
|
|`QK_RGB_MATRIX_OFF` |`RM_OFF` |Turn off RGB Matrix |
|
||||||
|`RGB_TOG` | |Toggle RGB lighting on or off |
|
|`QK_RGB_MATRIX_TOGGLE` |`RM_TOGG`|Toggle RGB Matrix on or off |
|
||||||
|`RGB_MODE_FORWARD` |`RGB_MOD` |Cycle through modes, reverse direction when Shift is held |
|
|`QK_RGB_MATRIX_MODE_NEXT` |`RM_NEXT`|Cycle through animations |
|
||||||
|`RGB_MODE_REVERSE` |`RGB_RMOD`|Cycle through modes in reverse, forward direction when Shift is held |
|
|`QK_RGB_MATRIX_MODE_PREVIOUS` |`RM_PREV`|Cycle through animations in reverse|
|
||||||
|`RGB_HUI` | |Increase hue, decrease hue when Shift is held |
|
|`QK_RGB_MATRIX_HUE_UP` |`RM_HUEU`|Cycle through hue |
|
||||||
|`RGB_HUD` | |Decrease hue, increase hue when Shift is held |
|
|`QK_RGB_MATRIX_HUE_DOWN` |`RM_HUED`|Cycle through hue in reverse |
|
||||||
|`RGB_SAI` | |Increase saturation, decrease saturation when Shift is held |
|
|`QK_RGB_MATRIX_SATURATION_UP` |`RM_SATU`|Increase the saturation |
|
||||||
|`RGB_SAD` | |Decrease saturation, increase saturation when Shift is held |
|
|`QK_RGB_MATRIX_SATURATION_DOWN`|`RM_SATD`|Decrease the saturation |
|
||||||
|`RGB_VAI` | |Increase value (brightness), decrease value when Shift is held |
|
|`QK_RGB_MATRIX_VALUE_UP` |`RM_VALU`|Increase the brightness level |
|
||||||
|`RGB_VAD` | |Decrease value (brightness), increase value when Shift is held |
|
|`QK_RGB_MATRIX_VALUE_DOWN` |`RM_VALD`|Decrease the brightness level |
|
||||||
|`RGB_SPI` | |Increase effect speed (does not support eeprom yet), decrease speed when Shift is held|
|
|`QK_RGB_MATRIX_SPEED_UP` |`RM_SPDU`|Increase the animation speed |
|
||||||
|`RGB_SPD` | |Decrease effect speed (does not support eeprom yet), increase speed when Shift is held|
|
|`QK_RGB_MATRIX_SPEED_DOWN` |`RM_SPDD`|Decrease the animation speed |
|
||||||
|`RGB_MODE_PLAIN` |`RGB_M_P` |Static (no animation) mode |
|
|
||||||
|`RGB_MODE_BREATHE` |`RGB_M_B` |Breathing animation mode |
|
|
||||||
|`RGB_MODE_RAINBOW` |`RGB_M_R` |Full gradient scrolling left to right (uses the `RGB_MATRIX_CYCLE_LEFT_RIGHT` mode) |
|
|
||||||
|`RGB_MODE_SWIRL` |`RGB_M_SW`|Full gradient spinning pinwheel around center of keyboard (uses `RGB_MATRIX_CYCLE_PINWHEEL` mode) |
|
|
||||||
|
|
||||||
* `RGB_MODE_*` keycodes will generally work, but not all of the modes are currently mapped to the correct effects for the RGB Matrix system.
|
|
||||||
|
|
||||||
`RGB_MODE_PLAIN`, `RGB_MODE_BREATHE`, `RGB_MODE_RAINBOW`, and `RGB_MODE_SWIRL` are the only ones that are mapped properly. The rest don't have a direct equivalent, and are not mapped.
|
|
||||||
|
|
||||||
::: tip
|
|
||||||
`RGB_*` keycodes cannot be used with functions like `tap_code16(RGB_HUD)` as they're not USB HID keycodes. If you wish to replicate similar behaviour in custom code within your firmware (e.g. inside `encoder_update_user()` or `process_record_user()`), the equivalent [RGB functions](#functions) should be used instead.
|
|
||||||
:::
|
|
||||||
|
|
||||||
|
|
||||||
::: warning
|
|
||||||
By default, if you have both the [RGB Light](rgblight) and the RGB Matrix feature enabled, these keycodes will work for both features, at the same time. You can disable the keycode functionality by defining the `*_DISABLE_KEYCODES` option for the specific feature.
|
|
||||||
:::
|
|
||||||
|
|
||||||
## RGB Matrix Effects {#rgb-matrix-effects}
|
## RGB Matrix Effects {#rgb-matrix-effects}
|
||||||
|
|
||||||
@ -289,7 +272,7 @@ Solid reactive effects will pulse RGB light on key presses with user configurabl
|
|||||||
#define RGB_MATRIX_SOLID_REACTIVE_GRADIENT_MODE
|
#define RGB_MATRIX_SOLID_REACTIVE_GRADIENT_MODE
|
||||||
```
|
```
|
||||||
|
|
||||||
Gradient mode will loop through the color wheel hues over time and its duration can be controlled with the effect speed keycodes (`RGB_SPI`/`RGB_SPD`).
|
Gradient mode will loop through the color wheel hues over time and its duration can be controlled with the effect speed keycodes (`RM_SPDU`/`RM_SPDD`).
|
||||||
|
|
||||||
## Custom RGB Matrix Effects {#custom-rgb-matrix-effects}
|
## Custom RGB Matrix Effects {#custom-rgb-matrix-effects}
|
||||||
|
|
||||||
@ -396,7 +379,6 @@ These are defined in [`color.h`](https://github.com/qmk/qmk_firmware/blob/master
|
|||||||
#define RGB_MATRIX_DEFAULT_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS // Sets the default brightness value, if none has been set
|
#define RGB_MATRIX_DEFAULT_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS // Sets the default brightness value, if none has been set
|
||||||
#define RGB_MATRIX_DEFAULT_SPD 127 // Sets the default animation speed, if none has been set
|
#define RGB_MATRIX_DEFAULT_SPD 127 // Sets the default animation speed, if none has been set
|
||||||
#define RGB_MATRIX_DEFAULT_FLAGS LED_FLAG_ALL // Sets the default LED flags, if none has been set
|
#define RGB_MATRIX_DEFAULT_FLAGS LED_FLAG_ALL // Sets the default LED flags, if none has been set
|
||||||
#define RGB_MATRIX_DISABLE_KEYCODES // disables control of rgb matrix by keycodes (must use code functions to control the feature)
|
|
||||||
#define RGB_MATRIX_SPLIT { X, Y } // (Optional) For split keyboards, the number of LEDs connected on each half. X = left, Y = Right.
|
#define RGB_MATRIX_SPLIT { X, Y } // (Optional) For split keyboards, the number of LEDs connected on each half. X = left, Y = Right.
|
||||||
// If reactive effects are enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR
|
// If reactive effects are enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR
|
||||||
#define RGB_TRIGGER_ON_KEYDOWN // Triggers RGB keypress events on key down. This makes RGB control feel more responsive. This may cause RGB to not function properly on some boards
|
#define RGB_TRIGGER_ON_KEYDOWN // Triggers RGB keypress events on key down. This makes RGB control feel more responsive. This may cause RGB to not function properly on some boards
|
||||||
@ -496,18 +478,18 @@ This example sets the modifiers to be a specific color based on the layer state.
|
|||||||
|
|
||||||
```c
|
```c
|
||||||
bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
|
bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
|
||||||
HSV hsv = {0, 255, 255};
|
hsv_t hsv = {0, 255, 255};
|
||||||
|
|
||||||
if (layer_state_is(layer_state, 2)) {
|
if (layer_state_is(layer_state, 2)) {
|
||||||
hsv = (HSV){130, 255, 255};
|
hsv = (hsv_t){130, 255, 255};
|
||||||
} else {
|
} else {
|
||||||
hsv = (HSV){30, 255, 255};
|
hsv = (hsv_t){30, 255, 255};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hsv.v > rgb_matrix_get_val()) {
|
if (hsv.v > rgb_matrix_get_val()) {
|
||||||
hsv.v = rgb_matrix_get_val();
|
hsv.v = rgb_matrix_get_val();
|
||||||
}
|
}
|
||||||
RGB rgb = hsv_to_rgb(hsv);
|
rgb_t rgb = hsv_to_rgb(hsv);
|
||||||
|
|
||||||
for (uint8_t i = led_min; i < led_max; i++) {
|
for (uint8_t i = led_min; i < led_max; i++) {
|
||||||
if (HAS_FLAGS(g_led_config.flags[i], 0x01)) { // 0x01 == LED_FLAG_MODIFIER
|
if (HAS_FLAGS(g_led_config.flags[i], 0x01)) { // 0x01 == LED_FLAG_MODIFIER
|
||||||
@ -873,13 +855,13 @@ Set the global effect hue, saturation, and value (brightness). New state is not
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### `HSV rgb_matrix_get_hsv(void)` {#api-rgb-matrix-get-hsv}
|
### `hsv_t rgb_matrix_get_hsv(void)` {#api-rgb-matrix-get-hsv}
|
||||||
|
|
||||||
Get the current global effect hue, saturation, and value (brightness).
|
Get the current global effect hue, saturation, and value (brightness).
|
||||||
|
|
||||||
#### Return Value {#api-rgb-matrix-get-hsv-return}
|
#### Return Value {#api-rgb-matrix-get-hsv-return}
|
||||||
|
|
||||||
The current effect HSV as an `HSV` struct.
|
The current effect HSV as an `hsv_t` struct.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -87,11 +87,6 @@ Changing the **Value** sets the overall brightness.<br>
|
|||||||
These keycodes cannot be used with functions like `tap_code16()` as they are not USB HID keycodes. If you wish to replicate similar behaviour in custom code within your firmware (e.g. inside `encoder_update_user()` or `process_record_user()`), the equivalent [RGB functions](#functions) should be used instead.
|
These keycodes cannot be used with functions like `tap_code16()` as they are not USB HID keycodes. If you wish to replicate similar behaviour in custom code within your firmware (e.g. inside `encoder_update_user()` or `process_record_user()`), the equivalent [RGB functions](#functions) should be used instead.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
|
||||||
::: warning
|
|
||||||
By default, if you have both the RGB Light and the [RGB Matrix](rgb_matrix) feature enabled, these keycodes will work for both features, at the same time. You can disable the keycode functionality by defining the `*_DISABLE_KEYCODES` option for the specific feature.
|
|
||||||
:::
|
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
Your RGB lighting can be configured by placing these `#define`s in your `config.h`:
|
Your RGB lighting can be configured by placing these `#define`s in your `config.h`:
|
||||||
@ -104,7 +99,6 @@ Your RGB lighting can be configured by placing these `#define`s in your `config.
|
|||||||
|`RGBLIGHT_LIMIT_VAL` |`255` |The maximum brightness level |
|
|`RGBLIGHT_LIMIT_VAL` |`255` |The maximum brightness level |
|
||||||
|`RGBLIGHT_SLEEP` |*Not defined* |If defined, the RGB lighting will be switched off when the host goes to sleep |
|
|`RGBLIGHT_SLEEP` |*Not defined* |If defined, the RGB lighting will be switched off when the host goes to sleep |
|
||||||
|`RGBLIGHT_SPLIT` |*Not defined* |If defined, synchronization functionality for split keyboards is added |
|
|`RGBLIGHT_SPLIT` |*Not defined* |If defined, synchronization functionality for split keyboards is added |
|
||||||
|`RGBLIGHT_DISABLE_KEYCODES`|*Not defined* |If defined, disables the ability to control RGB Light from the keycodes. You must use code functions to control the feature|
|
|
||||||
|`RGBLIGHT_DEFAULT_MODE` |`RGBLIGHT_MODE_STATIC_LIGHT`|The default mode to use upon clearing the EEPROM |
|
|`RGBLIGHT_DEFAULT_MODE` |`RGBLIGHT_MODE_STATIC_LIGHT`|The default mode to use upon clearing the EEPROM |
|
||||||
|`RGBLIGHT_DEFAULT_HUE` |`0` (red) |The default hue to use upon clearing the EEPROM |
|
|`RGBLIGHT_DEFAULT_HUE` |`0` (red) |The default hue to use upon clearing the EEPROM |
|
||||||
|`RGBLIGHT_DEFAULT_SAT` |`UINT8_MAX` (255) |The default saturation to use upon clearing the EEPROM |
|
|`RGBLIGHT_DEFAULT_SAT` |`UINT8_MAX` (255) |The default saturation to use upon clearing the EEPROM |
|
||||||
|
@ -728,23 +728,25 @@ See also: [RGB Lighting](features/rgblight)
|
|||||||
|`RGB_MODE_RGBTEST` |`RGB_M_T` |Red, Green, Blue test animation mode (deprecated) |
|
|`RGB_MODE_RGBTEST` |`RGB_M_T` |Red, Green, Blue test animation mode (deprecated) |
|
||||||
|`RGB_MODE_TWINKLE` |`RGB_M_TW`|Twinkle animation mode (deprecated) |
|
|`RGB_MODE_TWINKLE` |`RGB_M_TW`|Twinkle animation mode (deprecated) |
|
||||||
|
|
||||||
## RGB Matrix Lighting {#rgb-matrix-lighting}
|
## RGB Matrix {#rgb-matrix}
|
||||||
|
|
||||||
See also: [RGB Matrix Lighting](features/rgb_matrix)
|
See also: [RGB Matrix](features/rgb_matrix)
|
||||||
|
|
||||||
|Key |Aliases |Description |
|
|Key |Aliases |Description |
|
||||||
|-------------------|----------|--------------------------------------------------------------------------------------|
|
|-------------------------------|---------|-----------------------------------|
|
||||||
|`RGB_TOG` | |Toggle RGB lighting on or off |
|
|`QK_RGB_MATRIX_ON` |`RM_ON` |Turn on RGB Matrix |
|
||||||
|`RGB_MODE_FORWARD` |`RGB_MOD` |Cycle through modes, reverse direction when Shift is held |
|
|`QK_RGB_MATRIX_OFF` |`RM_OFF` |Turn off RGB Matrix |
|
||||||
|`RGB_MODE_REVERSE` |`RGB_RMOD`|Cycle through modes in reverse, forward direction when Shift is held |
|
|`QK_RGB_MATRIX_TOGGLE` |`RM_TOGG`|Toggle RGB Matrix on or off |
|
||||||
|`RGB_HUI` | |Increase hue, decrease hue when Shift is held |
|
|`QK_RGB_MATRIX_MODE_NEXT` |`RM_NEXT`|Cycle through animations |
|
||||||
|`RGB_HUD` | |Decrease hue, increase hue when Shift is held |
|
|`QK_RGB_MATRIX_MODE_PREVIOUS` |`RM_PREV`|Cycle through animations in reverse|
|
||||||
|`RGB_SAI` | |Increase saturation, decrease saturation when Shift is held |
|
|`QK_RGB_MATRIX_HUE_UP` |`RM_HUEU`|Cycle through hue |
|
||||||
|`RGB_SAD` | |Decrease saturation, increase saturation when Shift is held |
|
|`QK_RGB_MATRIX_HUE_DOWN` |`RM_HUED`|Cycle through hue in reverse |
|
||||||
|`RGB_VAI` | |Increase value (brightness), decrease value when Shift is held |
|
|`QK_RGB_MATRIX_SATURATION_UP` |`RM_SATU`|Increase the saturation |
|
||||||
|`RGB_VAD` | |Decrease value (brightness), increase value when Shift is held |
|
|`QK_RGB_MATRIX_SATURATION_DOWN`|`RM_SATD`|Decrease the saturation |
|
||||||
|`RGB_SPI` | |Increase effect speed (does not support eeprom yet), decrease speed when Shift is held|
|
|`QK_RGB_MATRIX_VALUE_UP` |`RM_VALU`|Increase the brightness level |
|
||||||
|`RGB_SPD` | |Decrease effect speed (does not support eeprom yet), increase speed when Shift is held|
|
|`QK_RGB_MATRIX_VALUE_DOWN` |`RM_VALD`|Decrease the brightness level |
|
||||||
|
|`QK_RGB_MATRIX_SPEED_UP` |`RM_SPDU`|Increase the animation speed |
|
||||||
|
|`QK_RGB_MATRIX_SPEED_DOWN` |`RM_SPDD`|Decrease the animation speed |
|
||||||
|
|
||||||
## US ANSI Shifted Symbols {#us-ansi-shifted-symbols}
|
## US ANSI Shifted Symbols {#us-ansi-shifted-symbols}
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ layer_state_t layer_state_set_user(layer_state_t state) {
|
|||||||
|
|
||||||
Do you want to set the default layer, so that it's retained even after you unplug the board? If so, this is the function for you.
|
Do you want to set the default layer, so that it's retained even after you unplug the board? If so, this is the function for you.
|
||||||
|
|
||||||
To use this, you would use `set_single_persistent_default_layer(layer)`. If you have a name defined for your layer, you can use that instead (such as _QWERTY, _DVORAK or _COLEMAK).
|
To do this, you would use `set_single_persistent_default_layer(layer)`. If you have a name defined for your layer, you can use that instead (such as _QWERTY, _DVORAK or _COLEMAK).
|
||||||
|
|
||||||
This will set the default layer, update the persistent settings, and play a tune if you have [Audio](features/audio) enabled on your board, and the default layer sounds set.
|
This will set the default layer, update the persistent settings, and play a tune if you have [Audio](features/audio) enabled on your board, and the default layer sounds set.
|
||||||
|
|
||||||
@ -82,6 +82,8 @@ To configure the default layer sounds, you would want to define this in your `co
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If you do not require it to be retained after you unplug the board, use `set_single_default_layer(layer)` instead.
|
||||||
|
|
||||||
|
|
||||||
::: tip
|
::: tip
|
||||||
There are a large number of predefined songs in [quantum/audio/song_list.h](https://github.com/qmk/qmk_firmware/blob/master/quantum/audio/song_list.h) that you can use.
|
There are a large number of predefined songs in [quantum/audio/song_list.h](https://github.com/qmk/qmk_firmware/blob/master/quantum/audio/song_list.h) that you can use.
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -158,7 +158,7 @@ void solenoid_setup(void) {
|
|||||||
#endif
|
#endif
|
||||||
gpio_write_pin(solenoid_pads[i], !solenoid_active_state[i]);
|
gpio_write_pin(solenoid_pads[i], !solenoid_active_state[i]);
|
||||||
gpio_set_pin_output(solenoid_pads[i]);
|
gpio_set_pin_output(solenoid_pads[i]);
|
||||||
if ((!HAPTIC_OFF_IN_LOW_POWER) || (usb_device_state == USB_DEVICE_STATE_CONFIGURED)) {
|
if ((!HAPTIC_OFF_IN_LOW_POWER) || (usb_device_state_get_configure_state() == USB_DEVICE_STATE_CONFIGURED)) {
|
||||||
solenoid_fire(i);
|
solenoid_fire(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -187,6 +187,8 @@ void st7565_render(void) {
|
|||||||
|
|
||||||
st7565_send_data(&st7565_buffer[ST7565_BLOCK_SIZE * update_start], ST7565_BLOCK_SIZE);
|
st7565_send_data(&st7565_buffer[ST7565_BLOCK_SIZE * update_start], ST7565_BLOCK_SIZE);
|
||||||
|
|
||||||
|
spi_stop();
|
||||||
|
|
||||||
// Turn on display if it is off
|
// Turn on display if it is off
|
||||||
st7565_on();
|
st7565_on();
|
||||||
|
|
||||||
|
@ -53,8 +53,8 @@
|
|||||||
io_wait; \
|
io_wait; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
rgb_led_t apa102_leds[APA102_LED_COUNT];
|
rgb_t apa102_leds[APA102_LED_COUNT];
|
||||||
uint8_t apa102_led_brightness = APA102_DEFAULT_BRIGHTNESS;
|
uint8_t apa102_led_brightness = APA102_DEFAULT_BRIGHTNESS;
|
||||||
|
|
||||||
static void apa102_send_byte(uint8_t byte) {
|
static void apa102_send_byte(uint8_t byte) {
|
||||||
APA102_SEND_BIT(byte, 7);
|
APA102_SEND_BIT(byte, 7);
|
||||||
|
@ -52,7 +52,7 @@ static bool qp_surface_pixdata_rgb565(painter_device_t device, const void *pixel
|
|||||||
// Pixel colour conversion
|
// Pixel colour conversion
|
||||||
static bool qp_surface_palette_convert_rgb565_swapped(painter_device_t device, int16_t palette_size, qp_pixel_t *palette) {
|
static bool qp_surface_palette_convert_rgb565_swapped(painter_device_t device, int16_t palette_size, qp_pixel_t *palette) {
|
||||||
for (int16_t i = 0; i < palette_size; ++i) {
|
for (int16_t i = 0; i < palette_size; ++i) {
|
||||||
RGB rgb = hsv_to_rgb_nocie((HSV){palette[i].hsv888.h, palette[i].hsv888.s, palette[i].hsv888.v});
|
rgb_t rgb = hsv_to_rgb_nocie((hsv_t){palette[i].hsv888.h, palette[i].hsv888.s, palette[i].hsv888.v});
|
||||||
uint16_t rgb565 = (((uint16_t)rgb.r) >> 3) << 11 | (((uint16_t)rgb.g) >> 2) << 5 | (((uint16_t)rgb.b) >> 3);
|
uint16_t rgb565 = (((uint16_t)rgb.r) >> 3) << 11 | (((uint16_t)rgb.g) >> 2) << 5 | (((uint16_t)rgb.b) >> 3);
|
||||||
palette[i].rgb565 = __builtin_bswap16(rgb565);
|
palette[i].rgb565 = __builtin_bswap16(rgb565);
|
||||||
}
|
}
|
||||||
|
@ -90,7 +90,7 @@ bool qp_tft_panel_pixdata(painter_device_t device, const void *pixel_data, uint3
|
|||||||
|
|
||||||
bool qp_tft_panel_palette_convert_rgb565_swapped(painter_device_t device, int16_t palette_size, qp_pixel_t *palette) {
|
bool qp_tft_panel_palette_convert_rgb565_swapped(painter_device_t device, int16_t palette_size, qp_pixel_t *palette) {
|
||||||
for (int16_t i = 0; i < palette_size; ++i) {
|
for (int16_t i = 0; i < palette_size; ++i) {
|
||||||
RGB rgb = hsv_to_rgb_nocie((HSV){palette[i].hsv888.h, palette[i].hsv888.s, palette[i].hsv888.v});
|
rgb_t rgb = hsv_to_rgb_nocie((hsv_t){palette[i].hsv888.h, palette[i].hsv888.s, palette[i].hsv888.v});
|
||||||
uint16_t rgb565 = (((uint16_t)rgb.r) >> 3) << 11 | (((uint16_t)rgb.g) >> 2) << 5 | (((uint16_t)rgb.b) >> 3);
|
uint16_t rgb565 = (((uint16_t)rgb.r) >> 3) << 11 | (((uint16_t)rgb.g) >> 2) << 5 | (((uint16_t)rgb.b) >> 3);
|
||||||
palette[i].rgb565 = __builtin_bswap16(rgb565);
|
palette[i].rgb565 = __builtin_bswap16(rgb565);
|
||||||
}
|
}
|
||||||
@ -99,7 +99,7 @@ bool qp_tft_panel_palette_convert_rgb565_swapped(painter_device_t device, int16_
|
|||||||
|
|
||||||
bool qp_tft_panel_palette_convert_rgb888(painter_device_t device, int16_t palette_size, qp_pixel_t *palette) {
|
bool qp_tft_panel_palette_convert_rgb888(painter_device_t device, int16_t palette_size, qp_pixel_t *palette) {
|
||||||
for (int16_t i = 0; i < palette_size; ++i) {
|
for (int16_t i = 0; i < palette_size; ++i) {
|
||||||
RGB rgb = hsv_to_rgb_nocie((HSV){palette[i].hsv888.h, palette[i].hsv888.s, palette[i].hsv888.v});
|
rgb_t rgb = hsv_to_rgb_nocie((hsv_t){palette[i].hsv888.h, palette[i].hsv888.s, palette[i].hsv888.v});
|
||||||
palette[i].rgb888.r = rgb.r;
|
palette[i].rgb888.r = rgb.r;
|
||||||
palette[i].rgb888.g = rgb.g;
|
palette[i].rgb888.g = rgb.g;
|
||||||
palette[i].rgb888.b = rgb.b;
|
palette[i].rgb888.b = rgb.b;
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "wait.h"
|
#include "wait.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "gpio.h"
|
#include "gpio.h"
|
||||||
|
#include "pointing_device_internal.h"
|
||||||
|
|
||||||
// Registers
|
// Registers
|
||||||
// clang-format off
|
// clang-format off
|
||||||
@ -45,6 +46,13 @@
|
|||||||
#define REG_MOTION_BURST 0x63
|
#define REG_MOTION_BURST 0x63
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
const pointing_device_driver_t adns5050_pointing_device_driver = {
|
||||||
|
.init = adns5050_init,
|
||||||
|
.get_report = adns5050_get_report,
|
||||||
|
.set_cpi = adns5050_set_cpi,
|
||||||
|
.get_cpi = adns5050_get_cpi,
|
||||||
|
};
|
||||||
|
|
||||||
static bool powered_down = false;
|
static bool powered_down = false;
|
||||||
|
|
||||||
void adns5050_init(void) {
|
void adns5050_init(void) {
|
||||||
@ -226,3 +234,15 @@ void adns5050_power_down(void) {
|
|||||||
adns5050_write_reg(REG_MOUSE_CONTROL, 0b10);
|
adns5050_write_reg(REG_MOUSE_CONTROL, 0b10);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
report_mouse_t adns5050_get_report(report_mouse_t mouse_report) {
|
||||||
|
report_adns5050_t data = adns5050_read_burst();
|
||||||
|
|
||||||
|
if (data.dx != 0 || data.dy != 0) {
|
||||||
|
pd_dprintf("Raw ] X: %d, Y: %d\n", data.dx, data.dy);
|
||||||
|
mouse_report.x = (mouse_xy_report_t)data.dx;
|
||||||
|
mouse_report.y = (mouse_xy_report_t)data.dy;
|
||||||
|
}
|
||||||
|
|
||||||
|
return mouse_report;
|
||||||
|
}
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include "pointing_device.h"
|
||||||
|
|
||||||
// CPI values
|
// CPI values
|
||||||
// clang-format off
|
// clang-format off
|
||||||
@ -69,6 +70,8 @@ typedef struct {
|
|||||||
int8_t dy;
|
int8_t dy;
|
||||||
} report_adns5050_t;
|
} report_adns5050_t;
|
||||||
|
|
||||||
|
const pointing_device_driver_t adns5050_pointing_device_driver;
|
||||||
|
|
||||||
// A bunch of functions to implement the ADNS5050-specific serial protocol.
|
// A bunch of functions to implement the ADNS5050-specific serial protocol.
|
||||||
// Note that the "serial.h" driver is insufficient, because it does not
|
// Note that the "serial.h" driver is insufficient, because it does not
|
||||||
// manually manipulate a serial clock signal.
|
// manually manipulate a serial clock signal.
|
||||||
@ -84,3 +87,4 @@ uint16_t adns5050_get_cpi(void);
|
|||||||
int8_t convert_twoscomp(uint8_t data);
|
int8_t convert_twoscomp(uint8_t data);
|
||||||
bool adns5050_check_signature(void);
|
bool adns5050_check_signature(void);
|
||||||
void adns5050_power_down(void);
|
void adns5050_power_down(void);
|
||||||
|
report_mouse_t adns5050_get_report(report_mouse_t mouse_report);
|
||||||
|
@ -15,7 +15,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "spi_master.h"
|
#include "spi_master.h"
|
||||||
#include "adns9800_srom_A6.h"
|
|
||||||
#include "adns9800.h"
|
#include "adns9800.h"
|
||||||
#include "wait.h"
|
#include "wait.h"
|
||||||
|
|
||||||
@ -78,6 +77,21 @@
|
|||||||
#define MSB1 0x80
|
#define MSB1 0x80
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
const pointing_device_driver_t adns9800_pointing_device_driver = {
|
||||||
|
.init = adns9800_init,
|
||||||
|
.get_report = adns9800_get_report_driver,
|
||||||
|
.set_cpi = adns9800_set_cpi,
|
||||||
|
.get_cpi = adns9800_get_cpi,
|
||||||
|
};
|
||||||
|
|
||||||
|
uint16_t __attribute__((weak)) adns9800_srom_get_length(void) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t __attribute__((weak)) adns9800_srom_get_byte(uint16_t position) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void adns9800_spi_start(void) {
|
void adns9800_spi_start(void) {
|
||||||
spi_start(ADNS9800_CS_PIN, false, ADNS9800_SPI_MODE, ADNS9800_SPI_DIVISOR);
|
spi_start(ADNS9800_CS_PIN, false, ADNS9800_SPI_MODE, ADNS9800_SPI_DIVISOR);
|
||||||
}
|
}
|
||||||
@ -117,48 +131,48 @@ void adns9800_init(void) {
|
|||||||
adns9800_read(REG_Delta_Y_L);
|
adns9800_read(REG_Delta_Y_L);
|
||||||
adns9800_read(REG_Delta_Y_H);
|
adns9800_read(REG_Delta_Y_H);
|
||||||
|
|
||||||
#ifdef ADNS9800_UPLOAD_SROM
|
if (adns9800_srom_get_length() != 0) {
|
||||||
// upload firmware
|
// upload firmware
|
||||||
|
|
||||||
// 3k firmware mode
|
// 3k firmware mode
|
||||||
adns9800_write(REG_Configuration_IV, 0x02);
|
adns9800_write(REG_Configuration_IV, 0x02);
|
||||||
|
|
||||||
// enable initialisation
|
// enable initialisation
|
||||||
adns9800_write(REG_SROM_Enable, 0x1d);
|
adns9800_write(REG_SROM_Enable, 0x1d);
|
||||||
|
|
||||||
// wait a frame
|
// wait a frame
|
||||||
wait_ms(10);
|
wait_ms(10);
|
||||||
|
|
||||||
// start SROM download
|
// start SROM download
|
||||||
adns9800_write(REG_SROM_Enable, 0x18);
|
adns9800_write(REG_SROM_Enable, 0x18);
|
||||||
|
|
||||||
// write the SROM file
|
// write the SROM file
|
||||||
|
|
||||||
adns9800_spi_start();
|
adns9800_spi_start();
|
||||||
|
|
||||||
spi_write(REG_SROM_Load_Burst | 0x80);
|
spi_write(REG_SROM_Load_Burst | 0x80);
|
||||||
wait_us(15);
|
|
||||||
|
|
||||||
// send all bytes of the firmware
|
|
||||||
for (uint16_t i = 0; i < FIRMWARE_LENGTH; i++) {
|
|
||||||
spi_write(pgm_read_byte(firmware_data + i));
|
|
||||||
wait_us(15);
|
wait_us(15);
|
||||||
|
|
||||||
|
// send all bytes of the firmware
|
||||||
|
for (uint16_t i = 0; i < adns9800_srom_get_length(); i++) {
|
||||||
|
spi_write(adns9800_srom_get_byte(i));
|
||||||
|
wait_us(15);
|
||||||
|
}
|
||||||
|
|
||||||
|
spi_stop();
|
||||||
|
|
||||||
|
wait_ms(10);
|
||||||
|
} else {
|
||||||
|
// write reset value to REG_Configuration_IV
|
||||||
|
adns9800_write(REG_Configuration_IV, 0x0);
|
||||||
|
|
||||||
|
// write reset value to REG_SROM_Enable
|
||||||
|
adns9800_write(REG_SROM_Enable, 0x0);
|
||||||
|
|
||||||
|
// wait a frame
|
||||||
|
wait_ms(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
spi_stop();
|
|
||||||
|
|
||||||
wait_ms(10);
|
|
||||||
#else
|
|
||||||
// write reset value to REG_Configuration_IV
|
|
||||||
adns9800_write(REG_Configuration_IV, 0x0);
|
|
||||||
|
|
||||||
// write reset value to REG_SROM_Enable
|
|
||||||
adns9800_write(REG_SROM_Enable, 0x0);
|
|
||||||
|
|
||||||
// wait a frame
|
|
||||||
wait_ms(10);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// enable laser
|
// enable laser
|
||||||
uint8_t laser_ctrl0 = adns9800_read(REG_LASER_CTRL0);
|
uint8_t laser_ctrl0 = adns9800_read(REG_LASER_CTRL0);
|
||||||
adns9800_write(REG_LASER_CTRL0, laser_ctrl0 & 0xf0);
|
adns9800_write(REG_LASER_CTRL0, laser_ctrl0 & 0xf0);
|
||||||
@ -229,3 +243,12 @@ report_adns9800_t adns9800_get_report(void) {
|
|||||||
|
|
||||||
return report;
|
return report;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
report_mouse_t adns9800_get_report_driver(report_mouse_t mouse_report) {
|
||||||
|
report_adns9800_t sensor_report = adns9800_get_report();
|
||||||
|
|
||||||
|
mouse_report.x = CONSTRAIN_HID_XY(sensor_report.x);
|
||||||
|
mouse_report.y = CONSTRAIN_HID_XY(sensor_report.y);
|
||||||
|
|
||||||
|
return mouse_report;
|
||||||
|
}
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include "pointing_device.h"
|
||||||
|
|
||||||
#ifndef ADNS9800_CPI
|
#ifndef ADNS9800_CPI
|
||||||
# define ADNS9800_CPI 1600
|
# define ADNS9800_CPI 1600
|
||||||
@ -60,6 +61,8 @@ typedef struct {
|
|||||||
int16_t y;
|
int16_t y;
|
||||||
} report_adns9800_t;
|
} report_adns9800_t;
|
||||||
|
|
||||||
|
const pointing_device_driver_t adns9800_pointing_device_driver;
|
||||||
|
|
||||||
void adns9800_init(void);
|
void adns9800_init(void);
|
||||||
config_adns9800_t adns9800_get_config(void);
|
config_adns9800_t adns9800_get_config(void);
|
||||||
void adns9800_set_config(config_adns9800_t);
|
void adns9800_set_config(config_adns9800_t);
|
||||||
@ -67,3 +70,4 @@ uint16_t adns9800_get_cpi(void);
|
|||||||
void adns9800_set_cpi(uint16_t cpi);
|
void adns9800_set_cpi(uint16_t cpi);
|
||||||
/* Reads and clears the current delta values on the ADNS sensor */
|
/* Reads and clears the current delta values on the ADNS sensor */
|
||||||
report_adns9800_t adns9800_get_report(void);
|
report_adns9800_t adns9800_get_report(void);
|
||||||
|
report_mouse_t adns9800_get_report_driver(report_mouse_t mouse_report);
|
||||||
|
@ -1,202 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "progmem.h"
|
|
||||||
|
|
||||||
#define FIRMWARE_LENGTH 3070
|
|
||||||
|
|
||||||
// clang-format off
|
|
||||||
|
|
||||||
const uint8_t firmware_data[FIRMWARE_LENGTH] PROGMEM = {
|
|
||||||
0x03, 0xA6, 0x68, 0x1E, 0x7D, 0x10, 0x7E, 0x7E, 0x5F, 0x1C, 0xB8, 0xF2, 0x47, 0x0C, 0x7B, 0x74,
|
|
||||||
0x4B, 0x14, 0x8B, 0x75, 0x66, 0x51, 0x0B, 0x8C, 0x76, 0x74, 0x4B, 0x14, 0xAA, 0xD6, 0x0F, 0x9C,
|
|
||||||
0xBA, 0xF6, 0x6E, 0x3F, 0xDD, 0x38, 0xD5, 0x02, 0x80, 0x9B, 0x82, 0x6D, 0x58, 0x13, 0xA4, 0xAB,
|
|
||||||
0xB5, 0xC9, 0x10, 0xA2, 0xC6, 0x0A, 0x7F, 0x5D, 0x19, 0x91, 0xA0, 0xA3, 0xCE, 0xEB, 0x3E, 0xC9,
|
|
||||||
0xF1, 0x60, 0x42, 0xE7, 0x4C, 0xFB, 0x74, 0x6A, 0x56, 0x2E, 0xBF, 0xDD, 0x38, 0xD3, 0x05, 0x88,
|
|
||||||
0x92, 0xA6, 0xCE, 0xFF, 0x5D, 0x38, 0xD1, 0xCF, 0xEF, 0x58, 0xCB, 0x65, 0x48, 0xF0, 0x35, 0x85,
|
|
||||||
0xA9, 0xB2, 0x8F, 0x5E, 0xF3, 0x80, 0x94, 0x97, 0x7E, 0x75, 0x97, 0x87, 0x73, 0x13, 0xB0, 0x8A,
|
|
||||||
0x69, 0xD4, 0x0A, 0xDE, 0xC1, 0x79, 0x59, 0x36, 0xDB, 0x9D, 0xD6, 0xB8, 0x15, 0x6F, 0xCE, 0x3C,
|
|
||||||
0x72, 0x32, 0x45, 0x88, 0xDF, 0x6C, 0xA5, 0x6D, 0xE8, 0x76, 0x96, 0x14, 0x74, 0x20, 0xDC, 0xF4,
|
|
||||||
0xFA, 0x37, 0x6A, 0x27, 0x32, 0xE3, 0x29, 0xBF, 0xC4, 0xC7, 0x06, 0x9D, 0x58, 0xE7, 0x87, 0x7C,
|
|
||||||
0x2E, 0x9F, 0x6E, 0x49, 0x07, 0x5D, 0x23, 0x64, 0x54, 0x83, 0x6E, 0xCB, 0xB7, 0x77, 0xF7, 0x2B,
|
|
||||||
0x6E, 0x0F, 0x2E, 0x66, 0x12, 0x60, 0x55, 0x65, 0xFC, 0x43, 0xB3, 0x58, 0x73, 0x5B, 0xE8, 0x67,
|
|
||||||
0x04, 0x43, 0x02, 0xDE, 0xB3, 0x89, 0xA0, 0x6D, 0x3A, 0x27, 0x79, 0x64, 0x5B, 0x0C, 0x16, 0x9E,
|
|
||||||
0x66, 0xB1, 0x8B, 0x87, 0x0C, 0x5D, 0xF2, 0xB6, 0x3D, 0x71, 0xDF, 0x42, 0x03, 0x8A, 0x06, 0x8D,
|
|
||||||
0xEF, 0x1D, 0xA8, 0x96, 0x5C, 0xED, 0x31, 0x61, 0x5C, 0xA1, 0x34, 0xF6, 0x8C, 0x08, 0x60, 0x33,
|
|
||||||
0x07, 0x00, 0x3E, 0x79, 0x95, 0x1B, 0x43, 0x7F, 0xFE, 0xB6, 0xA6, 0xD4, 0x9D, 0x76, 0x72, 0xBF,
|
|
||||||
0xAD, 0xC0, 0x15, 0xE8, 0x37, 0x31, 0xA3, 0x72, 0x63, 0x52, 0x1D, 0x1C, 0x5D, 0x51, 0x1B, 0xE1,
|
|
||||||
0xA9, 0xED, 0x60, 0x32, 0x3E, 0xA9, 0x50, 0x28, 0x53, 0x06, 0x59, 0xE2, 0xFC, 0xE7, 0x02, 0x64,
|
|
||||||
0x39, 0x21, 0x56, 0x4A, 0xA5, 0x40, 0x80, 0x81, 0xD5, 0x5A, 0x60, 0x7B, 0x68, 0x84, 0xF1, 0xE0,
|
|
||||||
0xB1, 0xB6, 0x5B, 0xDF, 0xA8, 0x1D, 0x6D, 0x65, 0x20, 0xC0, 0xA2, 0xB9, 0xD9, 0xBB, 0x00, 0xA6,
|
|
||||||
0xDB, 0x8B, 0x01, 0x53, 0x91, 0xFE, 0xC4, 0x51, 0x85, 0xB0, 0x96, 0x7F, 0xFD, 0x51, 0xDD, 0x14,
|
|
||||||
0x03, 0x67, 0x2E, 0x75, 0x1C, 0x76, 0xD3, 0x6E, 0xDD, 0x99, 0x55, 0x76, 0xE5, 0xAB, 0x23, 0xFC,
|
|
||||||
0x4A, 0xD5, 0xC6, 0xE8, 0x2E, 0xCA, 0x8A, 0xB3, 0xF6, 0x8C, 0x6C, 0xB0, 0xE9, 0xF2, 0xE7, 0x9E,
|
|
||||||
0x69, 0x41, 0xED, 0xF1, 0x6D, 0xD2, 0x86, 0xD8, 0x7E, 0xCB, 0x5D, 0x47, 0x6C, 0x85, 0x6A, 0x23,
|
|
||||||
0xED, 0x20, 0x40, 0x93, 0xB4, 0x20, 0xC7, 0xA5, 0xC9, 0xAF, 0x03, 0x15, 0xAC, 0x19, 0xE5, 0x2A,
|
|
||||||
0x36, 0xDF, 0x6D, 0xC5, 0x8C, 0x80, 0x07, 0xCE, 0x92, 0x0C, 0xD8, 0x06, 0x62, 0x0F, 0xDD, 0x48,
|
|
||||||
0x46, 0x1A, 0x53, 0xC7, 0x8A, 0x8C, 0x5D, 0x5D, 0xB4, 0xA1, 0x02, 0xD3, 0xA9, 0xB8, 0xF3, 0x94,
|
|
||||||
0x8F, 0x3F, 0xE5, 0x54, 0xD4, 0x11, 0x65, 0xB2, 0x5E, 0x09, 0x0B, 0x81, 0xE3, 0x75, 0xA7, 0x89,
|
|
||||||
0x81, 0x39, 0x6C, 0x46, 0xF6, 0x06, 0x9F, 0x27, 0x3B, 0xB6, 0x2D, 0x5F, 0x1D, 0x4B, 0xD4, 0x7B,
|
|
||||||
0x1D, 0x61, 0x74, 0x89, 0xE4, 0xE3, 0xBD, 0x98, 0x1B, 0xC4, 0x51, 0x3B, 0xA4, 0xFA, 0xE0, 0x92,
|
|
||||||
0xF7, 0xBE, 0xF2, 0x4D, 0xBB, 0xFF, 0xAD, 0x4F, 0x6D, 0x68, 0xC2, 0x79, 0x40, 0xAA, 0x9B, 0x8F,
|
|
||||||
0x0C, 0x32, 0x4B, 0x5F, 0x3E, 0xAB, 0x59, 0x98, 0xB3, 0xF5, 0x1D, 0xAC, 0x5E, 0xBC, 0x78, 0xD3,
|
|
||||||
0x01, 0x6C, 0x64, 0x15, 0x2F, 0xD8, 0x71, 0xA6, 0x2D, 0x45, 0xE1, 0x22, 0x42, 0xE4, 0x4E, 0x04,
|
|
||||||
0x3C, 0x7D, 0xF4, 0x40, 0x21, 0xB4, 0x67, 0x05, 0xA8, 0xE2, 0xF3, 0x72, 0x87, 0x4C, 0x7D, 0xD9,
|
|
||||||
0x1B, 0x65, 0x97, 0xF3, 0xC2, 0xE3, 0xE4, 0xC8, 0xD2, 0xDE, 0xF6, 0xEF, 0xDC, 0xBB, 0x44, 0x08,
|
|
||||||
0x5E, 0xE2, 0x45, 0x27, 0x01, 0xB0, 0xF6, 0x43, 0xE7, 0x3A, 0xF6, 0xDC, 0x9D, 0xED, 0xF3, 0xC5,
|
|
||||||
0x0C, 0xB8, 0x9C, 0x98, 0x3A, 0xD8, 0x36, 0xEE, 0x96, 0x72, 0x67, 0xE7, 0x81, 0x91, 0xD5, 0x05,
|
|
||||||
0x0A, 0xE0, 0x82, 0xD5, 0x8F, 0xE8, 0xF9, 0xB0, 0xC9, 0xCF, 0x93, 0xE7, 0x04, 0xC5, 0xBC, 0x2B,
|
|
||||||
0x43, 0x56, 0x7E, 0xE8, 0x67, 0x7C, 0xE5, 0xFB, 0x49, 0xAD, 0x5E, 0x9F, 0x25, 0x13, 0xDE, 0x6E,
|
|
||||||
0x6E, 0xE9, 0xF1, 0xEC, 0x87, 0x0B, 0x59, 0x81, 0x76, 0x84, 0x76, 0xB3, 0x24, 0xAF, 0x30, 0xFD,
|
|
||||||
0x27, 0x8B, 0xAB, 0xD8, 0x00, 0x8B, 0x9B, 0x0C, 0xD2, 0xB2, 0x4E, 0x5E, 0x9D, 0x1D, 0x96, 0x01,
|
|
||||||
0x00, 0x67, 0xC1, 0x5F, 0x02, 0x20, 0xFD, 0x45, 0x6A, 0x01, 0x60, 0x58, 0x45, 0xCA, 0x47, 0x21,
|
|
||||||
0x90, 0x5A, 0xC4, 0x43, 0x26, 0x1A, 0xD7, 0xA5, 0x4A, 0xB2, 0x5D, 0x2B, 0x35, 0x49, 0xFB, 0xA5,
|
|
||||||
0x17, 0x92, 0x21, 0x1E, 0x93, 0x96, 0x67, 0xA2, 0x7E, 0x36, 0x7A, 0xDE, 0x5F, 0xBE, 0x7A, 0x58,
|
|
||||||
0x9D, 0xF8, 0x78, 0xA3, 0xFA, 0xC8, 0xD5, 0x17, 0xF0, 0x21, 0x97, 0x8C, 0x80, 0xB5, 0x4B, 0x3B,
|
|
||||||
0xBD, 0xBB, 0x41, 0x21, 0xA8, 0x50, 0x67, 0xF7, 0xE7, 0x19, 0x80, 0x10, 0x8E, 0xCE, 0x04, 0x18,
|
|
||||||
0x3F, 0x51, 0x6B, 0x77, 0xD8, 0x9E, 0x16, 0xAF, 0xEC, 0xEF, 0x48, 0x16, 0x4D, 0x9E, 0x85, 0x38,
|
|
||||||
0x18, 0x3E, 0xD4, 0x28, 0x87, 0x60, 0x2A, 0xF6, 0x7F, 0x09, 0x86, 0x6F, 0x9C, 0x3C, 0x3A, 0xFF,
|
|
||||||
0xAB, 0xD0, 0x61, 0xA2, 0x97, 0x0D, 0x71, 0x94, 0x7E, 0xFD, 0xB9, 0x80, 0x02, 0x89, 0x6A, 0xB3,
|
|
||||||
0x84, 0x6C, 0x2A, 0x77, 0x62, 0xBE, 0x0B, 0xF4, 0xAF, 0xAC, 0x7B, 0x7C, 0x8E, 0xCA, 0x01, 0xBA,
|
|
||||||
0x71, 0x78, 0x94, 0xFD, 0xB5, 0x39, 0xA4, 0x4D, 0x2F, 0x78, 0xCF, 0xCA, 0x92, 0x0C, 0x1A, 0x99,
|
|
||||||
0x48, 0x4C, 0x11, 0x96, 0xB5, 0x4E, 0x41, 0x28, 0xE4, 0xA6, 0xFE, 0x4B, 0x72, 0x91, 0xE7, 0xD4,
|
|
||||||
0xDD, 0x9F, 0x12, 0xE6, 0x29, 0x38, 0xCE, 0x45, 0xAE, 0x02, 0xB8, 0x24, 0xAE, 0xBD, 0xE9, 0x66,
|
|
||||||
0x08, 0x62, 0xA2, 0x2C, 0x2B, 0x00, 0xE2, 0x23, 0xD9, 0xC4, 0x48, 0xE4, 0xD3, 0xAC, 0xBB, 0x34,
|
|
||||||
0xC7, 0xF0, 0xE3, 0x4F, 0xB9, 0x30, 0xEA, 0xA2, 0x12, 0xF1, 0x30, 0x2C, 0x36, 0xDE, 0x48, 0xF2,
|
|
||||||
0xB0, 0x4C, 0x43, 0x3F, 0x2E, 0x58, 0xE4, 0x20, 0xE3, 0x58, 0xCD, 0x31, 0x22, 0xF0, 0xA2, 0x2A,
|
|
||||||
0xE6, 0x19, 0x90, 0x55, 0x86, 0xF6, 0x55, 0x79, 0xD1, 0xD7, 0x46, 0x2F, 0xC0, 0xDC, 0x99, 0xE8,
|
|
||||||
0xF3, 0x6A, 0xDF, 0x7F, 0xEB, 0x24, 0x4A, 0x1E, 0x5A, 0x75, 0xDE, 0x2F, 0x5C, 0x19, 0x61, 0x03,
|
|
||||||
0x53, 0x54, 0x6A, 0x3B, 0x18, 0x70, 0xB6, 0x4F, 0xF1, 0x9C, 0x0A, 0x59, 0x9D, 0x19, 0x92, 0x65,
|
|
||||||
0x8C, 0x83, 0x14, 0x2D, 0x44, 0x8A, 0x75, 0xA9, 0xF5, 0x90, 0xD2, 0x66, 0x4E, 0xFA, 0x69, 0x0F,
|
|
||||||
0x5B, 0x0B, 0x98, 0x65, 0xC8, 0x11, 0x42, 0x59, 0x7F, 0xDD, 0x1B, 0x75, 0x17, 0x31, 0x4C, 0x75,
|
|
||||||
0x58, 0xEB, 0x58, 0x63, 0x7D, 0xF2, 0xA6, 0xC2, 0x6E, 0xB7, 0x3F, 0x3E, 0x5E, 0x47, 0xAD, 0xB7,
|
|
||||||
0x04, 0xE8, 0x05, 0xF8, 0xB2, 0xCF, 0x19, 0xF3, 0xD2, 0x85, 0xFE, 0x3E, 0x3E, 0xB1, 0x62, 0x08,
|
|
||||||
0x2C, 0x10, 0x07, 0x0D, 0x73, 0x90, 0x17, 0xFA, 0x9B, 0x56, 0x02, 0x75, 0xF9, 0x51, 0xE0, 0xE9,
|
|
||||||
0x1A, 0x7B, 0x9F, 0xB3, 0xF3, 0x98, 0xB8, 0x1C, 0x9C, 0xE1, 0xD5, 0x35, 0xAE, 0xC8, 0x60, 0x48,
|
|
||||||
0x11, 0x09, 0x94, 0x6B, 0xD0, 0x8B, 0x15, 0xBC, 0x05, 0x68, 0xD3, 0x54, 0x8A, 0x51, 0x39, 0x5C,
|
|
||||||
0x42, 0x76, 0xCE, 0xD8, 0xAD, 0x89, 0x30, 0xC9, 0x05, 0x1C, 0xCC, 0x94, 0x3F, 0x0F, 0x90, 0x6F,
|
|
||||||
0x72, 0x2D, 0x85, 0x64, 0x9A, 0xB9, 0x23, 0xF9, 0x0B, 0xC3, 0x7C, 0x39, 0x0F, 0x97, 0x07, 0x97,
|
|
||||||
0xDA, 0x58, 0x48, 0x33, 0x05, 0x23, 0xB8, 0x82, 0xE8, 0xD3, 0x53, 0x89, 0xAF, 0x33, 0x80, 0x22,
|
|
||||||
0x84, 0x0C, 0x95, 0x5C, 0x67, 0xB8, 0x77, 0x0C, 0x5C, 0xA2, 0x5F, 0x3D, 0x58, 0x0F, 0x27, 0xF3,
|
|
||||||
0x2F, 0xAE, 0x48, 0xBD, 0x0B, 0x6F, 0x54, 0xFB, 0x67, 0x4C, 0xEA, 0x32, 0x27, 0xF1, 0xFA, 0xE2,
|
|
||||||
0xB0, 0xEC, 0x0B, 0x15, 0xB4, 0x70, 0xF6, 0x5C, 0xDD, 0x71, 0x60, 0xC3, 0xC1, 0xA8, 0x32, 0x65,
|
|
||||||
0xAC, 0x7A, 0x77, 0x41, 0xE5, 0xA9, 0x6B, 0x11, 0x81, 0xFA, 0x34, 0x8D, 0xFB, 0xC1, 0x80, 0x6E,
|
|
||||||
0xC4, 0x60, 0x30, 0x07, 0xD4, 0x8B, 0x67, 0xBD, 0xAA, 0x8C, 0x9C, 0x64, 0xAC, 0xDB, 0x0B, 0x24,
|
|
||||||
0x8B, 0x63, 0x6F, 0xE6, 0xBC, 0xE7, 0x33, 0xA4, 0x4A, 0x4C, 0xA7, 0x9F, 0x43, 0x53, 0xD2, 0xBB,
|
|
||||||
0x8F, 0x43, 0xC7, 0x3D, 0x78, 0x68, 0x3F, 0xA5, 0x3D, 0xCA, 0x69, 0x84, 0xA6, 0x97, 0x2D, 0xC0,
|
|
||||||
0x7D, 0x31, 0x34, 0x55, 0x1D, 0x07, 0xB1, 0x5F, 0x40, 0x5C, 0x93, 0xB0, 0xBC, 0x7C, 0xB0, 0xBC,
|
|
||||||
0xE7, 0x12, 0xEE, 0x6B, 0x2B, 0xD3, 0x4D, 0x67, 0x70, 0x3A, 0x9A, 0xF2, 0x3C, 0x7C, 0x81, 0xFA,
|
|
||||||
0xD7, 0xD9, 0x90, 0x91, 0x81, 0xB8, 0xB1, 0xF3, 0x48, 0x6A, 0x26, 0x4F, 0x0C, 0xCE, 0xB0, 0x9E,
|
|
||||||
0xFD, 0x4A, 0x3A, 0xAF, 0xAC, 0x5B, 0x3F, 0xBF, 0x44, 0x5A, 0xA3, 0x19, 0x1E, 0x4B, 0xE7, 0x36,
|
|
||||||
0x6A, 0xD7, 0x20, 0xAE, 0xD7, 0x7D, 0x3B, 0xE7, 0xFF, 0x3A, 0x86, 0x2E, 0xD0, 0x4A, 0x3E, 0xAF,
|
|
||||||
0x9F, 0x8E, 0x01, 0xBF, 0xF8, 0x4F, 0xC1, 0xE8, 0x6F, 0x74, 0xE1, 0x45, 0xD3, 0xF7, 0x04, 0x6A,
|
|
||||||
0x4B, 0x9D, 0xEC, 0x33, 0x27, 0x76, 0xD7, 0xC5, 0xE1, 0xB0, 0x3B, 0x0E, 0x23, 0xEC, 0xF0, 0x86,
|
|
||||||
0xD2, 0x1A, 0xBF, 0x3D, 0x04, 0x62, 0xB3, 0x6C, 0xB2, 0xEB, 0x17, 0x05, 0xA6, 0x0A, 0x8A, 0x7E,
|
|
||||||
0x83, 0x1C, 0xB6, 0x37, 0x09, 0xC6, 0x0B, 0x70, 0x3C, 0xB5, 0x93, 0x81, 0xD8, 0x93, 0xA0, 0x5F,
|
|
||||||
0x1E, 0x08, 0xE2, 0xC6, 0xE5, 0xC9, 0x72, 0xF1, 0xF1, 0xC1, 0xED, 0xD5, 0x58, 0x93, 0x83, 0xF8,
|
|
||||||
0x65, 0x67, 0x2E, 0x0D, 0xA9, 0xF1, 0x64, 0x12, 0xE6, 0x4C, 0xEA, 0x15, 0x3F, 0x8C, 0x1A, 0xB6,
|
|
||||||
0xBF, 0xF6, 0xB9, 0x52, 0x35, 0x09, 0xB0, 0xE6, 0xF7, 0xCD, 0xF1, 0xA5, 0xAA, 0x81, 0xD1, 0x81,
|
|
||||||
0x6F, 0xB4, 0xA9, 0x66, 0x1F, 0xFC, 0x48, 0xC0, 0xB6, 0xD1, 0x8B, 0x06, 0x2F, 0xF6, 0xEF, 0x1F,
|
|
||||||
0x0A, 0xE6, 0xCE, 0x3A, 0x4A, 0x55, 0xBF, 0x6D, 0xF9, 0x4D, 0xD4, 0x08, 0x45, 0x4B, 0xC3, 0x66,
|
|
||||||
0x19, 0x92, 0x10, 0xE1, 0x17, 0x8E, 0x28, 0x91, 0x16, 0xBF, 0x3C, 0xEE, 0xA3, 0xA6, 0x99, 0x92,
|
|
||||||
0x10, 0xE1, 0xF6, 0xCC, 0xAC, 0xB8, 0x65, 0x0B, 0x43, 0x66, 0xF8, 0xE3, 0xE5, 0x3F, 0x24, 0x89,
|
|
||||||
0x47, 0x5D, 0x78, 0x43, 0xD0, 0x61, 0x17, 0xBD, 0x5B, 0x64, 0x54, 0x08, 0x45, 0x59, 0x93, 0xF6,
|
|
||||||
0x95, 0x8A, 0x41, 0x51, 0x62, 0x4B, 0x51, 0x02, 0x30, 0x73, 0xC7, 0x87, 0xC5, 0x4B, 0xA2, 0x97,
|
|
||||||
0x0F, 0xE8, 0x46, 0x5F, 0x7E, 0x2A, 0xE1, 0x30, 0x20, 0xB0, 0xFA, 0xE7, 0xCE, 0x61, 0x42, 0x57,
|
|
||||||
0x6E, 0x21, 0xF3, 0x7A, 0xEC, 0xE3, 0x25, 0xC7, 0x25, 0xF3, 0x67, 0xA7, 0x57, 0x40, 0x00, 0x02,
|
|
||||||
0xCF, 0x1C, 0x80, 0x77, 0x67, 0xBD, 0x70, 0xA1, 0x19, 0x92, 0x31, 0x75, 0x93, 0x27, 0x27, 0xB6,
|
|
||||||
0x82, 0xE4, 0xEB, 0x1D, 0x78, 0x48, 0xE7, 0xA5, 0x5E, 0x57, 0xEF, 0x64, 0x28, 0x64, 0x1B, 0xF6,
|
|
||||||
0x11, 0xB2, 0x03, 0x9D, 0xB9, 0x18, 0x02, 0x27, 0xF7, 0xBE, 0x9D, 0x55, 0xFC, 0x00, 0xD2, 0xC7,
|
|
||||||
0xAE, 0xAD, 0x0B, 0xC5, 0xE9, 0x42, 0x41, 0x48, 0xD8, 0x32, 0xCF, 0xF6, 0x0F, 0xF5, 0xBC, 0x97,
|
|
||||||
0xC6, 0x99, 0x47, 0x76, 0xBD, 0x89, 0x06, 0x0F, 0x63, 0x0C, 0x51, 0xD4, 0x5E, 0xEA, 0x48, 0xA8,
|
|
||||||
0xA2, 0x56, 0x1C, 0x79, 0x84, 0x86, 0x40, 0x88, 0x41, 0x76, 0x55, 0xFC, 0xC2, 0xD7, 0xFD, 0xC9,
|
|
||||||
0xC7, 0x80, 0x61, 0x35, 0xA7, 0x43, 0x20, 0xF7, 0xEB, 0x6C, 0x66, 0x13, 0xB0, 0xEC, 0x02, 0x75,
|
|
||||||
0x3E, 0x4B, 0xAF, 0xB9, 0x5D, 0x40, 0xDA, 0xD6, 0x6E, 0x2D, 0x39, 0x54, 0xC2, 0x95, 0x35, 0x54,
|
|
||||||
0x25, 0x72, 0xE1, 0x78, 0xB8, 0xEB, 0xC1, 0x16, 0x58, 0x0F, 0x9C, 0x9B, 0xB4, 0xEA, 0x37, 0xEC,
|
|
||||||
0x3B, 0x11, 0xBA, 0xD5, 0x8A, 0xA9, 0xE3, 0x98, 0x00, 0x51, 0x1C, 0x14, 0xE0, 0x40, 0x96, 0xE5,
|
|
||||||
0xE9, 0xF2, 0x21, 0x22, 0xB1, 0x23, 0x60, 0x78, 0xD3, 0x17, 0xF8, 0x7A, 0xA5, 0xA8, 0xBA, 0x20,
|
|
||||||
0xD3, 0x15, 0x1E, 0x32, 0xE4, 0x5E, 0x15, 0x48, 0xAE, 0xA9, 0xE5, 0xB8, 0x33, 0xEC, 0xE8, 0xA2,
|
|
||||||
0x42, 0xAC, 0xBF, 0x10, 0x84, 0x53, 0x87, 0x19, 0xB4, 0x5F, 0x76, 0x4D, 0x01, 0x9D, 0x56, 0x74,
|
|
||||||
0xD9, 0x5C, 0x97, 0xE7, 0x88, 0xEA, 0x3A, 0xBF, 0xDC, 0x4C, 0x33, 0x8A, 0x16, 0xB9, 0x5B, 0xFA,
|
|
||||||
0xD8, 0x42, 0xA7, 0xBB, 0x3C, 0x04, 0x27, 0x78, 0x49, 0x81, 0x2A, 0x5A, 0x7D, 0x7C, 0x23, 0xA8,
|
|
||||||
0xBA, 0xF7, 0x9A, 0x9F, 0xD2, 0x66, 0x3E, 0x38, 0x3C, 0x75, 0xF9, 0xD1, 0x30, 0x26, 0x30, 0x6E,
|
|
||||||
0x5A, 0x6E, 0xDC, 0x6A, 0x69, 0x32, 0x50, 0x33, 0x47, 0x9E, 0xA4, 0xA8, 0x64, 0x66, 0xF0, 0x8A,
|
|
||||||
0xE4, 0xFD, 0x27, 0x6F, 0x51, 0x25, 0x8B, 0x43, 0x74, 0xC9, 0x8E, 0xBD, 0x88, 0x31, 0xBE, 0xEC,
|
|
||||||
0x65, 0xD2, 0xCB, 0x8D, 0x5A, 0x13, 0x48, 0x16, 0x8C, 0x61, 0x0B, 0x11, 0xF6, 0xC6, 0x66, 0xAE,
|
|
||||||
0xC3, 0xCC, 0x0C, 0xD2, 0xE1, 0x9F, 0x82, 0x41, 0x3F, 0x56, 0xF9, 0x73, 0xEF, 0xDC, 0x30, 0x50,
|
|
||||||
0xCF, 0xB6, 0x7F, 0xBC, 0xD0, 0xB3, 0x10, 0xAB, 0x24, 0xE4, 0xEC, 0xAD, 0x18, 0x8C, 0x39, 0x2D,
|
|
||||||
0x30, 0x4C, 0xC5, 0x40, 0x0D, 0xF6, 0xAC, 0xD6, 0x18, 0x5D, 0x96, 0xBF, 0x5F, 0x71, 0x75, 0x96,
|
|
||||||
0x22, 0x97, 0x0F, 0x02, 0x94, 0x6E, 0xA6, 0xAE, 0x6D, 0x8F, 0x1E, 0xCA, 0x12, 0x9B, 0x2A, 0x1C,
|
|
||||||
0xCE, 0xA9, 0xEE, 0xFD, 0x12, 0x8E, 0xFC, 0xED, 0x09, 0x33, 0xBA, 0xF4, 0x1A, 0x15, 0xF6, 0x9D,
|
|
||||||
0x87, 0x16, 0x43, 0x7C, 0x78, 0x57, 0xE1, 0x44, 0xC9, 0xEB, 0x1F, 0x58, 0x4D, 0xC1, 0x49, 0x11,
|
|
||||||
0x5C, 0xB2, 0x11, 0xA8, 0x55, 0x16, 0xF1, 0xC6, 0x50, 0xE9, 0x87, 0x89, 0xF6, 0xCF, 0xD8, 0x9C,
|
|
||||||
0x51, 0xA7, 0xBC, 0x5B, 0x31, 0x6D, 0x4D, 0x51, 0xD0, 0x4C, 0xBC, 0x0D, 0x58, 0x2D, 0x7B, 0x88,
|
|
||||||
0x7A, 0xF9, 0x8E, 0xD6, 0x40, 0x4D, 0xBB, 0xBE, 0xC4, 0xE5, 0x07, 0xFC, 0xD9, 0x7B, 0x6D, 0xA6,
|
|
||||||
0x42, 0x57, 0x8F, 0x02, 0x94, 0x4F, 0xE4, 0x2A, 0x65, 0xE2, 0x19, 0x5A, 0x50, 0xE1, 0x25, 0x65,
|
|
||||||
0x4A, 0x60, 0xC2, 0xCD, 0xA8, 0xEC, 0x05, 0x2E, 0x87, 0x7B, 0x95, 0xB7, 0x4F, 0xA0, 0x0B, 0x1B,
|
|
||||||
0x4A, 0x7F, 0x92, 0xC8, 0x90, 0xEE, 0x89, 0x1E, 0x10, 0xD2, 0x85, 0xE4, 0x9F, 0x63, 0xC8, 0x12,
|
|
||||||
0xBB, 0x4E, 0xB8, 0xCF, 0x0A, 0xEC, 0x18, 0x4E, 0xE6, 0x7C, 0xB3, 0x33, 0x26, 0xC7, 0x1F, 0xD2,
|
|
||||||
0x04, 0x23, 0xEA, 0x07, 0x0C, 0x5F, 0x90, 0xBD, 0xA7, 0x6A, 0x0F, 0x4A, 0xD6, 0x10, 0x01, 0x3C,
|
|
||||||
0x12, 0x29, 0x2E, 0x96, 0xC0, 0x4D, 0xBB, 0xBE, 0xE5, 0xA7, 0x83, 0xD5, 0x6A, 0x3C, 0xE3, 0x5B,
|
|
||||||
0xB8, 0xF2, 0x5C, 0x6D, 0x1F, 0xA6, 0xF3, 0x12, 0x24, 0xF6, 0xD6, 0x3B, 0x10, 0x14, 0x09, 0x07,
|
|
||||||
0x82, 0xE8, 0x30, 0x6A, 0x99, 0xDC, 0x95, 0x01, 0x9C, 0xD4, 0x68, 0x3B, 0xCA, 0x98, 0x12, 0xAB,
|
|
||||||
0x77, 0x25, 0x15, 0x7D, 0x10, 0x32, 0x45, 0x98, 0xCD, 0x7A, 0xDF, 0x71, 0x8A, 0x75, 0xC1, 0x1C,
|
|
||||||
0xD4, 0x68, 0x25, 0xEB, 0xBB, 0x54, 0x27, 0x6F, 0x2A, 0xF7, 0xB9, 0x98, 0x03, 0x27, 0xDE, 0x24,
|
|
||||||
0xA8, 0xBB, 0x98, 0xC2, 0x84, 0xFF, 0x9B, 0x51, 0xD8, 0x53, 0x50, 0xDA, 0xF5, 0x88, 0xAA, 0x87,
|
|
||||||
0x2F, 0xAE, 0xD6, 0xEA, 0x6B, 0xDE, 0xC8, 0xD7, 0xA7, 0x28, 0x65, 0x81, 0xE8, 0xB2, 0x3B, 0x1D,
|
|
||||||
0x4F, 0x75, 0x8F, 0x9F, 0x7A, 0x74, 0x8E, 0xC1, 0x5F, 0x9A, 0xA8, 0x9D, 0xFA, 0x03, 0xA3, 0x71,
|
|
||||||
0x9B, 0x37, 0x6D, 0xD5, 0x0B, 0xF5, 0xE1, 0xA1, 0x1B, 0x01, 0x6A, 0xC6, 0x67, 0xAA, 0xEA, 0x2C,
|
|
||||||
0x9D, 0xA4, 0xD2, 0x6E, 0xFC, 0xDE, 0x2E, 0x7F, 0x94, 0x69, 0xE5, 0x4A, 0xE0, 0x01, 0x48, 0x3C,
|
|
||||||
0x6B, 0xF7, 0x1E, 0xB6, 0x0B, 0x5F, 0xF9, 0x2E, 0x07, 0xC5, 0xE8, 0xAE, 0x37, 0x1B, 0xBC, 0x3C,
|
|
||||||
0xD8, 0xD5, 0x0B, 0x91, 0x9E, 0x80, 0x24, 0xF5, 0x06, 0x0C, 0x0E, 0x98, 0x07, 0x96, 0x2D, 0x19,
|
|
||||||
0xDC, 0x58, 0x93, 0xCC, 0xFB, 0x4E, 0xEB, 0xBD, 0x0F, 0xF5, 0xAF, 0x01, 0xFA, 0xF1, 0x7C, 0x43,
|
|
||||||
0x8C, 0xB8, 0x56, 0x3E, 0xBE, 0x77, 0x4E, 0x2B, 0xF7, 0xBB, 0xB7, 0x45, 0x47, 0xCD, 0xCC, 0xA6,
|
|
||||||
0x4C, 0x72, 0x7B, 0x6A, 0x2A, 0x70, 0x13, 0x07, 0xFD, 0xB8, 0x9C, 0x98, 0x3A, 0xD8, 0x23, 0x67,
|
|
||||||
0x5B, 0x34, 0xD5, 0x14, 0x0C, 0xAB, 0x77, 0x1F, 0xF8, 0x3D, 0x5A, 0x9F, 0x92, 0xB7, 0x2C, 0xAD,
|
|
||||||
0x31, 0xDE, 0x61, 0x07, 0xB3, 0x6B, 0xF7, 0x38, 0x15, 0x95, 0x46, 0x14, 0x48, 0x53, 0x69, 0x52,
|
|
||||||
0x66, 0x07, 0x6D, 0x83, 0x71, 0x8A, 0x67, 0x25, 0x20, 0x0F, 0xFE, 0xD7, 0x02, 0xD7, 0x6E, 0x2C,
|
|
||||||
0xD2, 0x1A, 0x0A, 0x5D, 0xFD, 0x0F, 0x74, 0xE3, 0xA4, 0x36, 0x07, 0x9A, 0xDF, 0xD4, 0x79, 0xBF,
|
|
||||||
0xEF, 0x59, 0xC0, 0x44, 0x52, 0x87, 0x9A, 0x6E, 0x1D, 0x0E, 0xEE, 0xDE, 0x2E, 0x1A, 0xA9, 0x8F,
|
|
||||||
0x3A, 0xC9, 0xBA, 0xEC, 0x99, 0x78, 0x2D, 0x55, 0x6B, 0x14, 0xC2, 0x06, 0xD5, 0xFC, 0x93, 0x53,
|
|
||||||
0x4D, 0x11, 0x8C, 0xF8, 0xFA, 0x79, 0x7C, 0xA6, 0x64, 0xAE, 0x61, 0xB8, 0x7B, 0x94, 0x56, 0xA6,
|
|
||||||
0x39, 0x78, 0x9A, 0xE5, 0xC7, 0xDF, 0x18, 0x63, 0x23, 0x9C, 0xFA, 0x66, 0xBB, 0xB7, 0x5A, 0x27,
|
|
||||||
0x4C, 0xD1, 0xA1, 0x83, 0x22, 0xB3, 0x52, 0x49, 0x35, 0xB0, 0x22, 0x83, 0x59, 0x12, 0x00, 0x16,
|
|
||||||
0x98, 0xDD, 0xAD, 0xC2, 0x94, 0xF9, 0xD3, 0x7B, 0x64, 0x7F, 0x44, 0x3E, 0x3C, 0x8B, 0x9A, 0x83,
|
|
||||||
0x9C, 0x69, 0x6B, 0xE4, 0xDF, 0x9F, 0xED, 0x54, 0x1F, 0xE5, 0x5D, 0x7A, 0x05, 0x82, 0xB3, 0xDD,
|
|
||||||
0xEF, 0xFC, 0x53, 0x96, 0xB0, 0x2C, 0x5A, 0xF8, 0xDF, 0x9C, 0x8B, 0x16, 0x4E, 0xDF, 0xDA, 0x4D,
|
|
||||||
0x09, 0x09, 0x69, 0x50, 0x03, 0x65, 0xD8, 0x73, 0x70, 0xE8, 0x86, 0xBF, 0xBB, 0x35, 0xCE, 0xB2,
|
|
||||||
0x46, 0xCB, 0x02, 0x00, 0x5B, 0xB4, 0xE2, 0xC6, 0x8F, 0x2F, 0x98, 0xAF, 0x87, 0x4B, 0x48, 0x45,
|
|
||||||
0xED, 0xCC, 0x1D, 0xE6, 0x58, 0xD6, 0xF2, 0x50, 0x25, 0x9F, 0x52, 0xC7, 0xCB, 0x8A, 0x17, 0x9D,
|
|
||||||
0x5B, 0xE5, 0xC8, 0xD7, 0x72, 0xB7, 0x52, 0xB2, 0xC4, 0x98, 0xE3, 0x7A, 0x17, 0x3E, 0xC6, 0x60,
|
|
||||||
0xA7, 0x97, 0xB0, 0xCF, 0x18, 0x81, 0x53, 0x84, 0x4C, 0xD5, 0x17, 0x32, 0x03, 0x13, 0x39, 0x51,
|
|
||||||
0x09, 0x10, 0xE3, 0x77, 0x49, 0x4F, 0x62, 0x01, 0xBF, 0x8C, 0x9A, 0xE0, 0x41, 0x9E, 0x89, 0x74,
|
|
||||||
0x36, 0xF9, 0x96, 0x86, 0x2E, 0x96, 0x1C, 0x4A, 0xB7, 0x2B, 0x4A, 0x97, 0xBC, 0x99, 0x40, 0xA3,
|
|
||||||
0xE0, 0x3D, 0xC8, 0xAD, 0x2F, 0xDF, 0x4F, 0x2C, 0xC4, 0x69, 0x82, 0x9F, 0x9B, 0x81, 0x0C, 0x61,
|
|
||||||
0x5C, 0xA5, 0x9D, 0x8C, 0x89, 0xC0, 0x2C, 0xB4, 0x4A, 0x33, 0x4E, 0xEB, 0xA2, 0x56, 0x40, 0xC0,
|
|
||||||
0xC2, 0x46, 0xAF, 0x6A, 0xFC, 0x67, 0xD1, 0x80, 0x5E, 0xC5, 0x6D, 0x84, 0x43, 0x27, 0x3F, 0x55,
|
|
||||||
0x15, 0x96, 0x6A, 0xA0, 0xA5, 0xDA, 0xB7, 0xFF, 0xB7, 0x75, 0x6E, 0x4C, 0x49, 0x91, 0x9D, 0x22,
|
|
||||||
0xA3, 0x46, 0xEA, 0xED, 0x9A, 0x00, 0xE2, 0x32, 0xC3, 0xD6, 0xA9, 0x71, 0x20, 0x55, 0xA3, 0x19,
|
|
||||||
0xED, 0xF8, 0x4F, 0xA7, 0x12, 0x9C, 0x66, 0x87, 0xAF, 0x4E, 0xB7, 0xF0, 0xDB, 0xBF, 0xEF, 0xF0,
|
|
||||||
0xF6, 0xAF, 0xEA, 0xDA, 0x09, 0xFE, 0xDE, 0x38, 0x5C, 0xA5, 0xA2, 0xDF, 0x99, 0x45, 0xA8, 0xE4,
|
|
||||||
0xE7, 0x92, 0xAC, 0x67, 0xAA, 0x4F, 0xBF, 0x77, 0x3E, 0xA2, 0x40, 0x49, 0x22, 0x4A, 0x1E, 0x3B,
|
|
||||||
0xAA, 0x70, 0x7F, 0x95, 0xAF, 0x37, 0x4B, 0xFC, 0x99, 0xE2, 0xE0, 0xBA, 0xD7, 0x34, 0xCE, 0x55,
|
|
||||||
0x88, 0x5B, 0x84, 0x1B, 0x57, 0xC4, 0x80, 0x03, 0x53, 0xC9, 0x2F, 0x93, 0x04, 0x4D, 0xD5, 0x96,
|
|
||||||
0xE5, 0x70, 0xA6, 0x6E, 0x63, 0x5D, 0x9D, 0x6C, 0xDB, 0x02, 0x0A, 0xA9, 0xDA, 0x8B, 0x53, 0xDC,
|
|
||||||
0xD9, 0x9A, 0xC5, 0x94, 0x2C, 0x91, 0x92, 0x2A, 0xDE, 0xBB, 0x8B, 0x13, 0xB9, 0x19, 0x96, 0x64,
|
|
||||||
0xCC, 0xF2, 0x64, 0x39, 0xB7, 0x75, 0x49, 0xE9, 0x86, 0xC2, 0x86, 0x62, 0xD9, 0x24, 0xD3, 0x81,
|
|
||||||
0x35, 0x49, 0xFC, 0xA0, 0xA5, 0xA0, 0x93, 0x05, 0x64, 0xB4, 0x1A, 0x57, 0xCE, 0x0C, 0x90, 0x02,
|
|
||||||
0x27, 0xC5, 0x7A, 0x2B, 0x5D, 0xAE, 0x3E, 0xD5, 0xDD, 0x10, 0x7C, 0x14, 0xEA, 0x3A, 0x08, 0xAC,
|
|
||||||
0x72, 0x4E, 0x90, 0x3D, 0x3B, 0x7C, 0x86, 0x2E, 0xEB, 0xD4, 0x06, 0x70, 0xE6, 0xC7, 0xFB, 0x5F,
|
|
||||||
0xBD, 0x18, 0xF4, 0x11, 0xA4, 0x1A, 0x93, 0xC3, 0xBE, 0xD9, 0xFB, 0x26, 0x48, 0x2F, 0x37, 0x3C,
|
|
||||||
0xD0, 0x03, 0x47, 0x1A, 0xF7, 0x62, 0x19, 0x24, 0x5C, 0xF4, 0xA8, 0x92, 0x20, 0x7A, 0xF2, 0x9E,
|
|
||||||
0x2A, 0xC5, 0x95, 0xA2, 0xFB, 0xA4, 0xEA, 0x85, 0xD8, 0x56, 0xB7, 0x70, 0xD1, 0x60, 0x30, 0xA5,
|
|
||||||
0x30, 0x82, 0x70, 0xDC, 0x7A, 0x65, 0x8A, 0x36, 0x3F, 0x5B, 0x0C, 0xAE, 0x54, 0x7C, 0xD3, 0x57,
|
|
||||||
0x84, 0x7B, 0x3A, 0x65, 0x18, 0x81, 0xEE, 0x05, 0x9B, 0x44, 0x4D, 0xB8, 0xDA, 0xA2, 0xA1, 0xC9,
|
|
||||||
0x15, 0xD3, 0x73, 0x03, 0x0E, 0x43, 0xE9, 0x8E, 0x15, 0xF9, 0xBE, 0xC6, 0xC5, 0x8A, 0xE5, 0xC0,
|
|
||||||
0x1E, 0xC2, 0x37, 0x9E, 0x2A, 0x26, 0xA5, 0xA0, 0xBD, 0x24, 0x5F, 0xB9, 0xC1, 0xAB, 0x34, 0x48,
|
|
||||||
0xB9, 0x5D, 0x98, 0xB4, 0x65, 0x18, 0xF3, 0x63, 0x19, 0x44, 0x1B, 0x11, 0x16, 0xFF, 0xDC, 0xF1,
|
|
||||||
0x79, 0x08, 0x86, 0x0F, 0x52, 0x98, 0x73, 0xC4, 0x92, 0x90, 0x2B, 0x47, 0x09, 0xD0, 0x43, 0x6C,
|
|
||||||
0x2F, 0x20, 0xEB, 0xDC, 0xDA, 0xC5, 0x08, 0x7B, 0x94, 0x42, 0x30, 0x6A, 0xC7, 0xDA, 0x8C, 0xC3,
|
|
||||||
0x76, 0xA7, 0xA5, 0xCC, 0x62, 0x13, 0x00, 0x60, 0x31, 0x58, 0x44, 0x9B, 0xF5, 0x64, 0x14, 0xF5,
|
|
||||||
0x11, 0xC5, 0x54, 0x52, 0x83, 0xD4, 0x73, 0x01, 0x16, 0x0E, 0xB3, 0x7A, 0x29, 0x69, 0x35, 0x56,
|
|
||||||
0xD4, 0xEE, 0x8A, 0x17, 0xA2, 0x99, 0x24, 0x9C, 0xD7, 0x8F, 0xDB, 0x55, 0xB5, 0x3E
|
|
||||||
};
|
|
@ -20,6 +20,14 @@
|
|||||||
#include "wait.h"
|
#include "wait.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include "pointing_device_internal.h"
|
||||||
|
|
||||||
|
const pointing_device_driver_t analog_joystick_pointing_device_driver = {
|
||||||
|
.init = analog_joystick_init,
|
||||||
|
.get_report = analog_joystick_get_report,
|
||||||
|
.set_cpi = NULL,
|
||||||
|
.get_cpi = NULL,
|
||||||
|
};
|
||||||
|
|
||||||
// Set Parameters
|
// Set Parameters
|
||||||
#ifndef ANALOG_JOYSTICK_AUTO_AXIS
|
#ifndef ANALOG_JOYSTICK_AUTO_AXIS
|
||||||
@ -145,3 +153,16 @@ void analog_joystick_init(void) {
|
|||||||
maxAxisValues[1] = yOrigin + 100;
|
maxAxisValues[1] = yOrigin + 100;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
report_mouse_t analog_joystick_get_report(report_mouse_t mouse_report) {
|
||||||
|
report_analog_joystick_t data = analog_joystick_read();
|
||||||
|
|
||||||
|
pd_dprintf("Raw ] X: %d, Y: %d\n", data.x, data.y);
|
||||||
|
|
||||||
|
mouse_report.x = data.x;
|
||||||
|
mouse_report.y = data.y;
|
||||||
|
|
||||||
|
mouse_report.buttons = pointing_device_handle_buttons(mouse_report.buttons, data.button, POINTING_DEVICE_BUTTON1);
|
||||||
|
|
||||||
|
return mouse_report;
|
||||||
|
}
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include "pointing_device.h"
|
||||||
|
|
||||||
#ifndef ANALOG_JOYSTICK_X_AXIS_PIN
|
#ifndef ANALOG_JOYSTICK_X_AXIS_PIN
|
||||||
# error No pin specified for X Axis
|
# error No pin specified for X Axis
|
||||||
@ -42,6 +43,8 @@
|
|||||||
# define ANALOG_JOYSTICK_SPEED_MAX 2
|
# define ANALOG_JOYSTICK_SPEED_MAX 2
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
const pointing_device_driver_t analog_joystick_pointing_device_driver;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int8_t x;
|
int8_t x;
|
||||||
int8_t y;
|
int8_t y;
|
||||||
@ -49,3 +52,4 @@ typedef struct {
|
|||||||
} report_analog_joystick_t;
|
} report_analog_joystick_t;
|
||||||
report_analog_joystick_t analog_joystick_read(void);
|
report_analog_joystick_t analog_joystick_read(void);
|
||||||
void analog_joystick_init(void);
|
void analog_joystick_init(void);
|
||||||
|
report_mouse_t analog_joystick_get_report(report_mouse_t mouse_report);
|
||||||
|
@ -98,6 +98,13 @@
|
|||||||
#define AZOTEQ_IQS5XX_INCH_TO_RESOLUTION_Y(inch) (DIVIDE_UNSIGNED_ROUND((inch) * (uint32_t)AZOTEQ_IQS5XX_HEIGHT_MM * 10, 254))
|
#define AZOTEQ_IQS5XX_INCH_TO_RESOLUTION_Y(inch) (DIVIDE_UNSIGNED_ROUND((inch) * (uint32_t)AZOTEQ_IQS5XX_HEIGHT_MM * 10, 254))
|
||||||
#define AZOTEQ_IQS5XX_RESOLUTION_Y_TO_INCH(px) (DIVIDE_UNSIGNED_ROUND((px) * (uint32_t)254, AZOTEQ_IQS5XX_HEIGHT_MM * 10))
|
#define AZOTEQ_IQS5XX_RESOLUTION_Y_TO_INCH(px) (DIVIDE_UNSIGNED_ROUND((px) * (uint32_t)254, AZOTEQ_IQS5XX_HEIGHT_MM * 10))
|
||||||
|
|
||||||
|
const pointing_device_driver_t azoteq_iqs5xx_pointing_device_driver = {
|
||||||
|
.init = azoteq_iqs5xx_init,
|
||||||
|
.get_report = azoteq_iqs5xx_get_report,
|
||||||
|
.set_cpi = azoteq_iqs5xx_set_cpi,
|
||||||
|
.get_cpi = azoteq_iqs5xx_get_cpi,
|
||||||
|
};
|
||||||
|
|
||||||
static uint16_t azoteq_iqs5xx_product_number = AZOTEQ_IQS5XX_UNKNOWN;
|
static uint16_t azoteq_iqs5xx_product_number = AZOTEQ_IQS5XX_UNKNOWN;
|
||||||
|
|
||||||
static struct {
|
static struct {
|
||||||
@ -312,3 +319,105 @@ void azoteq_iqs5xx_setup_resolution(void) {
|
|||||||
azoteq_iqs5xx_device_resolution_t.resolution_y = AZOTEQ_IQS5XX_RESOLUTION_Y;
|
azoteq_iqs5xx_device_resolution_t.resolution_y = AZOTEQ_IQS5XX_RESOLUTION_Y;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static i2c_status_t azoteq_iqs5xx_init_status = 1;
|
||||||
|
|
||||||
|
void azoteq_iqs5xx_init(void) {
|
||||||
|
i2c_init();
|
||||||
|
azoteq_iqs5xx_wake();
|
||||||
|
azoteq_iqs5xx_reset_suspend(true, false, true);
|
||||||
|
wait_ms(100);
|
||||||
|
azoteq_iqs5xx_wake();
|
||||||
|
if (azoteq_iqs5xx_get_product() != AZOTEQ_IQS5XX_UNKNOWN) {
|
||||||
|
azoteq_iqs5xx_setup_resolution();
|
||||||
|
azoteq_iqs5xx_init_status = azoteq_iqs5xx_set_report_rate(AZOTEQ_IQS5XX_REPORT_RATE, AZOTEQ_IQS5XX_ACTIVE, false);
|
||||||
|
azoteq_iqs5xx_init_status |= azoteq_iqs5xx_set_event_mode(false, false);
|
||||||
|
azoteq_iqs5xx_init_status |= azoteq_iqs5xx_set_reati(true, false);
|
||||||
|
#if defined(AZOTEQ_IQS5XX_ROTATION_90)
|
||||||
|
azoteq_iqs5xx_init_status |= azoteq_iqs5xx_set_xy_config(false, true, true, true, false);
|
||||||
|
#elif defined(AZOTEQ_IQS5XX_ROTATION_180)
|
||||||
|
azoteq_iqs5xx_init_status |= azoteq_iqs5xx_set_xy_config(true, true, false, true, false);
|
||||||
|
#elif defined(AZOTEQ_IQS5XX_ROTATION_270)
|
||||||
|
azoteq_iqs5xx_init_status |= azoteq_iqs5xx_set_xy_config(true, false, true, true, false);
|
||||||
|
#else
|
||||||
|
azoteq_iqs5xx_init_status |= azoteq_iqs5xx_set_xy_config(false, false, false, true, false);
|
||||||
|
#endif
|
||||||
|
azoteq_iqs5xx_init_status |= azoteq_iqs5xx_set_gesture_config(true);
|
||||||
|
wait_ms(AZOTEQ_IQS5XX_REPORT_RATE + 1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
report_mouse_t azoteq_iqs5xx_get_report(report_mouse_t mouse_report) {
|
||||||
|
report_mouse_t temp_report = {0};
|
||||||
|
static uint8_t previous_button_state = 0;
|
||||||
|
static uint8_t read_error_count = 0;
|
||||||
|
|
||||||
|
if (azoteq_iqs5xx_init_status == I2C_STATUS_SUCCESS) {
|
||||||
|
azoteq_iqs5xx_base_data_t base_data = {0};
|
||||||
|
#if !defined(POINTING_DEVICE_MOTION_PIN)
|
||||||
|
azoteq_iqs5xx_wake();
|
||||||
|
#endif
|
||||||
|
i2c_status_t status = azoteq_iqs5xx_get_base_data(&base_data);
|
||||||
|
bool ignore_movement = false;
|
||||||
|
|
||||||
|
if (status == I2C_STATUS_SUCCESS) {
|
||||||
|
// pd_dprintf("IQS5XX - previous cycle time: %d \n", base_data.previous_cycle_time);
|
||||||
|
read_error_count = 0;
|
||||||
|
if (base_data.gesture_events_0.single_tap || base_data.gesture_events_0.press_and_hold) {
|
||||||
|
pd_dprintf("IQS5XX - Single tap/hold.\n");
|
||||||
|
temp_report.buttons = pointing_device_handle_buttons(temp_report.buttons, true, POINTING_DEVICE_BUTTON1);
|
||||||
|
} else if (base_data.gesture_events_1.two_finger_tap) {
|
||||||
|
pd_dprintf("IQS5XX - Two finger tap.\n");
|
||||||
|
temp_report.buttons = pointing_device_handle_buttons(temp_report.buttons, true, POINTING_DEVICE_BUTTON2);
|
||||||
|
} else if (base_data.gesture_events_0.swipe_x_neg) {
|
||||||
|
pd_dprintf("IQS5XX - X-.\n");
|
||||||
|
temp_report.buttons = pointing_device_handle_buttons(temp_report.buttons, true, POINTING_DEVICE_BUTTON4);
|
||||||
|
ignore_movement = true;
|
||||||
|
} else if (base_data.gesture_events_0.swipe_x_pos) {
|
||||||
|
pd_dprintf("IQS5XX - X+.\n");
|
||||||
|
temp_report.buttons = pointing_device_handle_buttons(temp_report.buttons, true, POINTING_DEVICE_BUTTON5);
|
||||||
|
ignore_movement = true;
|
||||||
|
} else if (base_data.gesture_events_0.swipe_y_neg) {
|
||||||
|
pd_dprintf("IQS5XX - Y-.\n");
|
||||||
|
temp_report.buttons = pointing_device_handle_buttons(temp_report.buttons, true, POINTING_DEVICE_BUTTON6);
|
||||||
|
ignore_movement = true;
|
||||||
|
} else if (base_data.gesture_events_0.swipe_y_pos) {
|
||||||
|
pd_dprintf("IQS5XX - Y+.\n");
|
||||||
|
temp_report.buttons = pointing_device_handle_buttons(temp_report.buttons, true, POINTING_DEVICE_BUTTON3);
|
||||||
|
ignore_movement = true;
|
||||||
|
} else if (base_data.gesture_events_1.zoom) {
|
||||||
|
if (AZOTEQ_IQS5XX_COMBINE_H_L_BYTES(base_data.x.h, base_data.x.l) < 0) {
|
||||||
|
pd_dprintf("IQS5XX - Zoom out.\n");
|
||||||
|
temp_report.buttons = pointing_device_handle_buttons(temp_report.buttons, true, POINTING_DEVICE_BUTTON7);
|
||||||
|
} else if (AZOTEQ_IQS5XX_COMBINE_H_L_BYTES(base_data.x.h, base_data.x.l) > 0) {
|
||||||
|
pd_dprintf("IQS5XX - Zoom in.\n");
|
||||||
|
temp_report.buttons = pointing_device_handle_buttons(temp_report.buttons, true, POINTING_DEVICE_BUTTON8);
|
||||||
|
}
|
||||||
|
} else if (base_data.gesture_events_1.scroll) {
|
||||||
|
pd_dprintf("IQS5XX - Scroll.\n");
|
||||||
|
temp_report.h = CONSTRAIN_HID(AZOTEQ_IQS5XX_COMBINE_H_L_BYTES(base_data.x.h, base_data.x.l));
|
||||||
|
temp_report.v = CONSTRAIN_HID(AZOTEQ_IQS5XX_COMBINE_H_L_BYTES(base_data.y.h, base_data.y.l));
|
||||||
|
}
|
||||||
|
if (base_data.number_of_fingers == 1 && !ignore_movement) {
|
||||||
|
temp_report.x = CONSTRAIN_HID_XY(AZOTEQ_IQS5XX_COMBINE_H_L_BYTES(base_data.x.h, base_data.x.l));
|
||||||
|
temp_report.y = CONSTRAIN_HID_XY(AZOTEQ_IQS5XX_COMBINE_H_L_BYTES(base_data.y.h, base_data.y.l));
|
||||||
|
}
|
||||||
|
|
||||||
|
previous_button_state = temp_report.buttons;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
if (read_error_count > 10) {
|
||||||
|
read_error_count = 0;
|
||||||
|
previous_button_state = 0;
|
||||||
|
} else {
|
||||||
|
read_error_count++;
|
||||||
|
}
|
||||||
|
temp_report.buttons = previous_button_state;
|
||||||
|
pd_dprintf("IQS5XX - get report failed: %d \n", status);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pd_dprintf("IQS5XX - Init failed: %d \n", azoteq_iqs5xx_init_status);
|
||||||
|
}
|
||||||
|
|
||||||
|
return temp_report;
|
||||||
|
}
|
||||||
|
@ -176,6 +176,8 @@ typedef struct {
|
|||||||
# define POINTING_DEVICE_TASK_THROTTLE_MS AZOTEQ_IQS5XX_REPORT_RATE
|
# define POINTING_DEVICE_TASK_THROTTLE_MS AZOTEQ_IQS5XX_REPORT_RATE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
const pointing_device_driver_t azoteq_iqs5xx_pointing_device_driver;
|
||||||
|
|
||||||
void azoteq_iqs5xx_init(void);
|
void azoteq_iqs5xx_init(void);
|
||||||
i2c_status_t azoteq_iqs5xx_wake(void);
|
i2c_status_t azoteq_iqs5xx_wake(void);
|
||||||
report_mouse_t azoteq_iqs5xx_get_report(report_mouse_t mouse_report);
|
report_mouse_t azoteq_iqs5xx_get_report(report_mouse_t mouse_report);
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
// refer to documentation: Gen2 and Gen3 (Pinnacle ASIC) at https://www.cirque.com/documentation
|
// refer to documentation: Gen2 and Gen3 (Pinnacle ASIC) at https://www.cirque.com/documentation
|
||||||
|
|
||||||
#include "cirque_pinnacle.h"
|
#include "cirque_pinnacle.h"
|
||||||
|
#include "cirque_pinnacle_gestures.h"
|
||||||
#include "wait.h"
|
#include "wait.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
|
|
||||||
@ -350,3 +351,144 @@ pinnacle_data_t cirque_pinnacle_read_data(void) {
|
|||||||
result.valid = true;
|
result.valid = true;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef POINTING_DEVICE_GESTURES_CURSOR_GLIDE_ENABLE
|
||||||
|
static bool cursor_glide_enable = true;
|
||||||
|
|
||||||
|
static cursor_glide_context_t glide = {.config = {
|
||||||
|
.coef = 102, /* Good default friction coef */
|
||||||
|
.interval = 10, /* 100sps */
|
||||||
|
.trigger_px = 10, /* Default threshold in case of hover, set to 0 if you'd like */
|
||||||
|
}};
|
||||||
|
|
||||||
|
void cirque_pinnacle_enable_cursor_glide(bool enable) {
|
||||||
|
cursor_glide_enable = enable;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cirque_pinnacle_configure_cursor_glide(float trigger_px) {
|
||||||
|
glide.config.trigger_px = trigger_px;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CIRQUE_PINNACLE_POSITION_MODE
|
||||||
|
|
||||||
|
# ifdef POINTING_DEVICE_AUTO_MOUSE_ENABLE
|
||||||
|
static bool is_touch_down;
|
||||||
|
|
||||||
|
bool auto_mouse_activation(report_mouse_t mouse_report) {
|
||||||
|
return is_touch_down || mouse_report.x != 0 || mouse_report.y != 0 || mouse_report.h != 0 || mouse_report.v != 0 || mouse_report.buttons;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
report_mouse_t cirque_pinnacle_get_report(report_mouse_t mouse_report) {
|
||||||
|
uint16_t scale = cirque_pinnacle_get_scale();
|
||||||
|
pinnacle_data_t touchData = cirque_pinnacle_read_data();
|
||||||
|
mouse_xy_report_t report_x = 0, report_y = 0;
|
||||||
|
static uint16_t x = 0, y = 0, last_scale = 0;
|
||||||
|
|
||||||
|
# if defined(CIRQUE_PINNACLE_TAP_ENABLE)
|
||||||
|
mouse_report.buttons = pointing_device_handle_buttons(mouse_report.buttons, false, POINTING_DEVICE_BUTTON1);
|
||||||
|
# endif
|
||||||
|
# ifdef POINTING_DEVICE_GESTURES_CURSOR_GLIDE_ENABLE
|
||||||
|
cursor_glide_t glide_report = {0};
|
||||||
|
|
||||||
|
if (cursor_glide_enable) {
|
||||||
|
glide_report = cursor_glide_check(&glide);
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
if (!touchData.valid) {
|
||||||
|
# ifdef POINTING_DEVICE_GESTURES_CURSOR_GLIDE_ENABLE
|
||||||
|
if (cursor_glide_enable && glide_report.valid) {
|
||||||
|
report_x = glide_report.dx;
|
||||||
|
report_y = glide_report.dy;
|
||||||
|
goto mouse_report_update;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
return mouse_report;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (touchData.touchDown) {
|
||||||
|
pd_dprintf("cirque_pinnacle touchData x=%4d y=%4d z=%2d\n", touchData.xValue, touchData.yValue, touchData.zValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
# ifdef POINTING_DEVICE_AUTO_MOUSE_ENABLE
|
||||||
|
is_touch_down = touchData.touchDown;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
// Scale coordinates to arbitrary X, Y resolution
|
||||||
|
cirque_pinnacle_scale_data(&touchData, scale, scale);
|
||||||
|
|
||||||
|
if (!cirque_pinnacle_gestures(&mouse_report, touchData)) {
|
||||||
|
if (last_scale && scale == last_scale && x && y && touchData.xValue && touchData.yValue) {
|
||||||
|
report_x = CONSTRAIN_HID_XY((int16_t)(touchData.xValue - x));
|
||||||
|
report_y = CONSTRAIN_HID_XY((int16_t)(touchData.yValue - y));
|
||||||
|
}
|
||||||
|
x = touchData.xValue;
|
||||||
|
y = touchData.yValue;
|
||||||
|
last_scale = scale;
|
||||||
|
|
||||||
|
# ifdef POINTING_DEVICE_GESTURES_CURSOR_GLIDE_ENABLE
|
||||||
|
if (cursor_glide_enable) {
|
||||||
|
if (touchData.touchDown) {
|
||||||
|
cursor_glide_update(&glide, report_x, report_y, touchData.zValue);
|
||||||
|
} else if (!glide_report.valid) {
|
||||||
|
glide_report = cursor_glide_start(&glide);
|
||||||
|
if (glide_report.valid) {
|
||||||
|
report_x = glide_report.dx;
|
||||||
|
report_y = glide_report.dy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
# ifdef POINTING_DEVICE_GESTURES_CURSOR_GLIDE_ENABLE
|
||||||
|
mouse_report_update:
|
||||||
|
# endif
|
||||||
|
mouse_report.x = report_x;
|
||||||
|
mouse_report.y = report_y;
|
||||||
|
|
||||||
|
return mouse_report;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t cirque_pinnacle_get_cpi(void) {
|
||||||
|
return CIRQUE_PINNACLE_PX_TO_INCH(cirque_pinnacle_get_scale());
|
||||||
|
}
|
||||||
|
void cirque_pinnacle_set_cpi(uint16_t cpi) {
|
||||||
|
cirque_pinnacle_set_scale(CIRQUE_PINNACLE_INCH_TO_PX(cpi));
|
||||||
|
}
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
const pointing_device_driver_t cirque_pinnacle_pointing_device_driver = {
|
||||||
|
.init = cirque_pinnacle_init,
|
||||||
|
.get_report = cirque_pinnacle_get_report,
|
||||||
|
.set_cpi = cirque_pinnacle_set_cpi,
|
||||||
|
.get_cpi = cirque_pinnacle_get_cpi
|
||||||
|
};
|
||||||
|
// clang-format on
|
||||||
|
#else
|
||||||
|
report_mouse_t cirque_pinnacle_get_report(report_mouse_t mouse_report) {
|
||||||
|
pinnacle_data_t touchData = cirque_pinnacle_read_data();
|
||||||
|
|
||||||
|
// Scale coordinates to arbitrary X, Y resolution
|
||||||
|
cirque_pinnacle_scale_data(&touchData, cirque_pinnacle_get_scale(), cirque_pinnacle_get_scale());
|
||||||
|
|
||||||
|
if (touchData.valid) {
|
||||||
|
mouse_report.buttons = touchData.buttons;
|
||||||
|
mouse_report.x = CONSTRAIN_HID_XY(touchData.xDelta);
|
||||||
|
mouse_report.y = CONSTRAIN_HID_XY(touchData.yDelta);
|
||||||
|
mouse_report.v = touchData.wheelCount;
|
||||||
|
}
|
||||||
|
return mouse_report;
|
||||||
|
}
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
const pointing_device_driver_t cirque_pinnacle_pointing_device_driver = {
|
||||||
|
.init = cirque_pinnacle_init,
|
||||||
|
.get_report = cirque_pinnacle_get_report,
|
||||||
|
.set_cpi = cirque_pinnacle_set_scale,
|
||||||
|
.get_cpi = cirque_pinnacle_get_scale
|
||||||
|
};
|
||||||
|
// clang-format on
|
||||||
|
#endif
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include "pointing_device_internal.h"
|
#include "pointing_device_internal.h"
|
||||||
|
#include "pointing_device.h"
|
||||||
|
|
||||||
#ifndef CIRQUE_PINNACLE_TIMEOUT
|
#ifndef CIRQUE_PINNACLE_TIMEOUT
|
||||||
# define CIRQUE_PINNACLE_TIMEOUT 20 // I2C timeout in milliseconds
|
# define CIRQUE_PINNACLE_TIMEOUT 20 // I2C timeout in milliseconds
|
||||||
@ -109,6 +110,10 @@ typedef struct {
|
|||||||
#endif
|
#endif
|
||||||
} pinnacle_data_t;
|
} pinnacle_data_t;
|
||||||
|
|
||||||
|
#define cirque_pinnacle_i2c_pointing_device_driver cirque_pinnacle_pointing_device_driver
|
||||||
|
#define cirque_pinnacle_spi_pointing_device_driver cirque_pinnacle_pointing_device_driver
|
||||||
|
const pointing_device_driver_t cirque_pinnacle_pointing_device_driver;
|
||||||
|
|
||||||
void cirque_pinnacle_init(void);
|
void cirque_pinnacle_init(void);
|
||||||
void cirque_pinnacle_calibrate(void);
|
void cirque_pinnacle_calibrate(void);
|
||||||
void cirque_pinnacle_cursor_smoothing(bool enable);
|
void cirque_pinnacle_cursor_smoothing(bool enable);
|
||||||
@ -116,3 +121,6 @@ pinnacle_data_t cirque_pinnacle_read_data(void);
|
|||||||
void cirque_pinnacle_scale_data(pinnacle_data_t* coordinates, uint16_t xResolution, uint16_t yResolution);
|
void cirque_pinnacle_scale_data(pinnacle_data_t* coordinates, uint16_t xResolution, uint16_t yResolution);
|
||||||
uint16_t cirque_pinnacle_get_scale(void);
|
uint16_t cirque_pinnacle_get_scale(void);
|
||||||
void cirque_pinnacle_set_scale(uint16_t scale);
|
void cirque_pinnacle_set_scale(uint16_t scale);
|
||||||
|
uint16_t cirque_pinnacle_get_cpi(void);
|
||||||
|
void cirque_pinnacle_set_cpi(uint16_t cpi);
|
||||||
|
report_mouse_t cirque_pinnacle_get_report(report_mouse_t mouse_report);
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include "wait.h"
|
#include "wait.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "gpio.h"
|
#include "gpio.h"
|
||||||
|
#include "pointing_device_internal.h"
|
||||||
|
|
||||||
#define REG_PID1 0x00
|
#define REG_PID1 0x00
|
||||||
#define REG_PID2 0x01
|
#define REG_PID2 0x01
|
||||||
@ -50,6 +51,13 @@ void paw3204_serial_write(uint8_t reg_addr);
|
|||||||
uint8_t paw3204_read_reg(uint8_t reg_addr);
|
uint8_t paw3204_read_reg(uint8_t reg_addr);
|
||||||
void paw3204_write_reg(uint8_t reg_addr, uint8_t data);
|
void paw3204_write_reg(uint8_t reg_addr, uint8_t data);
|
||||||
|
|
||||||
|
const pointing_device_driver_t paw3204_pointing_device_driver = {
|
||||||
|
.init = paw3204_init,
|
||||||
|
.get_report = paw3204_get_report,
|
||||||
|
.set_cpi = paw3204_set_cpi,
|
||||||
|
.get_cpi = paw3204_get_cpi,
|
||||||
|
};
|
||||||
|
|
||||||
void paw3204_init(void) {
|
void paw3204_init(void) {
|
||||||
gpio_set_pin_output(PAW3204_SCLK_PIN); // setclockpin to output
|
gpio_set_pin_output(PAW3204_SCLK_PIN); // setclockpin to output
|
||||||
gpio_set_pin_input_high(PAW3204_SDIO_PIN); // set datapin input high
|
gpio_set_pin_input_high(PAW3204_SDIO_PIN); // set datapin input high
|
||||||
@ -170,3 +178,15 @@ uint16_t paw3204_get_cpi(void) {
|
|||||||
uint8_t read_pid_paw3204(void) {
|
uint8_t read_pid_paw3204(void) {
|
||||||
return paw3204_read_reg(REG_PID1);
|
return paw3204_read_reg(REG_PID1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
report_mouse_t paw3204_get_report(report_mouse_t mouse_report) {
|
||||||
|
report_paw3204_t data = paw3204_read();
|
||||||
|
if (data.isMotion) {
|
||||||
|
pd_dprintf("Raw ] X: %d, Y: %d\n", data.x, data.y);
|
||||||
|
|
||||||
|
mouse_report.x = data.x;
|
||||||
|
mouse_report.y = data.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
return mouse_report;
|
||||||
|
}
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include "pointing_device.h"
|
||||||
|
|
||||||
#ifndef PAW3204_SCLK_PIN
|
#ifndef PAW3204_SCLK_PIN
|
||||||
# ifdef POINTING_DEVICE_SCLK_PIN
|
# ifdef POINTING_DEVICE_SCLK_PIN
|
||||||
@ -40,6 +41,8 @@ typedef struct {
|
|||||||
bool isMotion;
|
bool isMotion;
|
||||||
} report_paw3204_t;
|
} report_paw3204_t;
|
||||||
|
|
||||||
|
const pointing_device_driver_t paw3204_pointing_device_driver;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Initializes the sensor so it is in a working state and ready to
|
* @brief Initializes the sensor so it is in a working state and ready to
|
||||||
* be polled for data.
|
* be polled for data.
|
||||||
@ -74,3 +77,5 @@ void paw3204_set_cpi(uint16_t cpi);
|
|||||||
* @return uint16_t Current CPI value of the sensor
|
* @return uint16_t Current CPI value of the sensor
|
||||||
*/
|
*/
|
||||||
uint16_t paw3204_get_cpi(void);
|
uint16_t paw3204_get_cpi(void);
|
||||||
|
|
||||||
|
report_mouse_t paw3204_get_report(report_mouse_t mouse_report);
|
||||||
|
@ -33,6 +33,13 @@
|
|||||||
|
|
||||||
static uint16_t precision = 128;
|
static uint16_t precision = 128;
|
||||||
|
|
||||||
|
const pointing_device_driver_t pimoroni_trackball_pointing_device_driver = {
|
||||||
|
.init = pimoroni_trackball_device_init,
|
||||||
|
.get_report = pimoroni_trackball_get_report,
|
||||||
|
.set_cpi = pimoroni_trackball_set_cpi,
|
||||||
|
.get_cpi = pimoroni_trackball_get_cpi,
|
||||||
|
};
|
||||||
|
|
||||||
uint16_t pimoroni_trackball_get_cpi(void) {
|
uint16_t pimoroni_trackball_get_cpi(void) {
|
||||||
return (precision * 125);
|
return (precision * 125);
|
||||||
}
|
}
|
||||||
@ -61,8 +68,8 @@ void pimoroni_trackball_set_rgbw(uint8_t r, uint8_t g, uint8_t b, uint8_t w) {
|
|||||||
pd_dprintf("Trackball RGBW i2c_status_t: %d\n", status);
|
pd_dprintf("Trackball RGBW i2c_status_t: %d\n", status);
|
||||||
}
|
}
|
||||||
|
|
||||||
i2c_status_t read_pimoroni_trackball(pimoroni_data_t* data) {
|
i2c_status_t read_pimoroni_trackball(pimoroni_data_t *data) {
|
||||||
i2c_status_t status = i2c_read_register(PIMORONI_TRACKBALL_ADDRESS << 1, PIMORONI_TRACKBALL_REG_LEFT, (uint8_t*)data, sizeof(*data), PIMORONI_TRACKBALL_TIMEOUT);
|
i2c_status_t status = i2c_read_register(PIMORONI_TRACKBALL_ADDRESS << 1, PIMORONI_TRACKBALL_REG_LEFT, (uint8_t *)data, sizeof(*data), PIMORONI_TRACKBALL_TIMEOUT);
|
||||||
|
|
||||||
#ifdef POINTING_DEVICE_DEBUG
|
#ifdef POINTING_DEVICE_DEBUG
|
||||||
static uint16_t d_timer;
|
static uint16_t d_timer;
|
||||||
@ -92,3 +99,50 @@ int16_t pimoroni_trackball_get_offsets(uint8_t negative_dir, uint8_t positive_di
|
|||||||
uint16_t magnitude = (scale * offset * offset * precision) >> 7;
|
uint16_t magnitude = (scale * offset * offset * precision) >> 7;
|
||||||
return isnegative ? -(int16_t)(magnitude) : (int16_t)(magnitude);
|
return isnegative ? -(int16_t)(magnitude) : (int16_t)(magnitude);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mouse_xy_report_t pimoroni_trackball_adapt_values(xy_clamp_range_t *offset) {
|
||||||
|
if (*offset > XY_REPORT_MAX) {
|
||||||
|
*offset -= XY_REPORT_MAX;
|
||||||
|
return (mouse_xy_report_t)XY_REPORT_MAX;
|
||||||
|
} else if (*offset < XY_REPORT_MIN) {
|
||||||
|
*offset += XY_REPORT_MAX;
|
||||||
|
return (mouse_xy_report_t)XY_REPORT_MIN;
|
||||||
|
} else {
|
||||||
|
mouse_xy_report_t temp_return = *offset;
|
||||||
|
*offset = 0;
|
||||||
|
return temp_return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
report_mouse_t pimoroni_trackball_get_report(report_mouse_t mouse_report) {
|
||||||
|
static uint16_t debounce = 0;
|
||||||
|
static uint8_t error_count = 0;
|
||||||
|
pimoroni_data_t pimoroni_data = {0};
|
||||||
|
static xy_clamp_range_t x_offset = 0, y_offset = 0;
|
||||||
|
|
||||||
|
if (error_count < PIMORONI_TRACKBALL_ERROR_COUNT) {
|
||||||
|
i2c_status_t status = read_pimoroni_trackball(&pimoroni_data);
|
||||||
|
|
||||||
|
if (status == I2C_STATUS_SUCCESS) {
|
||||||
|
error_count = 0;
|
||||||
|
|
||||||
|
if (!(pimoroni_data.click & 128)) {
|
||||||
|
mouse_report.buttons = pointing_device_handle_buttons(mouse_report.buttons, false, POINTING_DEVICE_BUTTON1);
|
||||||
|
if (!debounce) {
|
||||||
|
x_offset += pimoroni_trackball_get_offsets(pimoroni_data.right, pimoroni_data.left, PIMORONI_TRACKBALL_SCALE);
|
||||||
|
y_offset += pimoroni_trackball_get_offsets(pimoroni_data.down, pimoroni_data.up, PIMORONI_TRACKBALL_SCALE);
|
||||||
|
mouse_report.x = pimoroni_trackball_adapt_values(&x_offset);
|
||||||
|
mouse_report.y = pimoroni_trackball_adapt_values(&y_offset);
|
||||||
|
} else {
|
||||||
|
debounce--;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mouse_report.buttons = pointing_device_handle_buttons(mouse_report.buttons, true, POINTING_DEVICE_BUTTON1);
|
||||||
|
debounce = PIMORONI_TRACKBALL_DEBOUNCE_CYCLES;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
error_count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return mouse_report;
|
||||||
|
}
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "report.h"
|
#include "report.h"
|
||||||
#include "i2c_master.h"
|
#include "i2c_master.h"
|
||||||
|
#include "pointing_device.h"
|
||||||
|
|
||||||
#ifndef PIMORONI_TRACKBALL_ADDRESS
|
#ifndef PIMORONI_TRACKBALL_ADDRESS
|
||||||
# define PIMORONI_TRACKBALL_ADDRESS 0x0A
|
# define PIMORONI_TRACKBALL_ADDRESS 0x0A
|
||||||
@ -49,9 +50,12 @@ typedef struct {
|
|||||||
uint8_t click;
|
uint8_t click;
|
||||||
} pimoroni_data_t;
|
} pimoroni_data_t;
|
||||||
|
|
||||||
void pimoroni_trackball_device_init(void);
|
const pointing_device_driver_t pimoroni_trackball_pointing_device_driver;
|
||||||
void pimoroni_trackball_set_rgbw(uint8_t red, uint8_t green, uint8_t blue, uint8_t white);
|
|
||||||
int16_t pimoroni_trackball_get_offsets(uint8_t negative_dir, uint8_t positive_dir, uint8_t scale);
|
void pimoroni_trackball_device_init(void);
|
||||||
uint16_t pimoroni_trackball_get_cpi(void);
|
void pimoroni_trackball_set_rgbw(uint8_t red, uint8_t green, uint8_t blue, uint8_t white);
|
||||||
void pimoroni_trackball_set_cpi(uint16_t cpi);
|
int16_t pimoroni_trackball_get_offsets(uint8_t negative_dir, uint8_t positive_dir, uint8_t scale);
|
||||||
i2c_status_t read_pimoroni_trackball(pimoroni_data_t* data);
|
uint16_t pimoroni_trackball_get_cpi(void);
|
||||||
|
void pimoroni_trackball_set_cpi(uint16_t cpi);
|
||||||
|
i2c_status_t read_pimoroni_trackball(pimoroni_data_t* data);
|
||||||
|
report_mouse_t pimoroni_trackball_get_report(report_mouse_t mouse_report);
|
||||||
|
@ -21,6 +21,14 @@
|
|||||||
#include "wait.h"
|
#include "wait.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "gpio.h"
|
#include "gpio.h"
|
||||||
|
#include "pointing_device_internal.h"
|
||||||
|
|
||||||
|
const pointing_device_driver_t pmw3320_pointing_device_drivera = {
|
||||||
|
.init = pmw3320_init,
|
||||||
|
.get_report = pmw3320_get_report,
|
||||||
|
.set_cpi = pmw3320_set_cpi,
|
||||||
|
.get_cpi = pmw3320_get_cpi,
|
||||||
|
};
|
||||||
|
|
||||||
void pmw3320_init(void) {
|
void pmw3320_init(void) {
|
||||||
// Initialize sensor serial pins.
|
// Initialize sensor serial pins.
|
||||||
@ -190,3 +198,15 @@ bool pmw3320_check_signature(void) {
|
|||||||
|
|
||||||
return (pid == 0x3b && pid2 == 0xc4);
|
return (pid == 0x3b && pid2 == 0xc4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
report_mouse_t pmw3320_get_report(report_mouse_t mouse_report) {
|
||||||
|
report_pmw3320_t data = pmw3320_read_burst();
|
||||||
|
|
||||||
|
if (data.dx != 0 || data.dy != 0) {
|
||||||
|
pd_dprintf("Raw ] X: %d, Y: %d\n", data.dx, data.dy);
|
||||||
|
mouse_report.x = (mouse_xy_report_t)data.dx;
|
||||||
|
mouse_report.y = (mouse_xy_report_t)data.dy;
|
||||||
|
}
|
||||||
|
|
||||||
|
return mouse_report;
|
||||||
|
}
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include "pointing_device.h"
|
||||||
|
|
||||||
#define constrain(amt, low, high) ((amt) < (low) ? (low) : ((amt) > (high) ? (high) : (amt)))
|
#define constrain(amt, low, high) ((amt) < (low) ? (low) : ((amt) > (high) ? (high) : (amt)))
|
||||||
|
|
||||||
@ -54,6 +55,8 @@ typedef struct {
|
|||||||
int8_t dy;
|
int8_t dy;
|
||||||
} report_pmw3320_t;
|
} report_pmw3320_t;
|
||||||
|
|
||||||
|
const pointing_device_driver_t pmw3320_pointing_device_driver;
|
||||||
|
|
||||||
// A bunch of functions to implement the PMW3320-specific serial protocol.
|
// A bunch of functions to implement the PMW3320-specific serial protocol.
|
||||||
// Mostly taken from ADNS5050 driver.
|
// Mostly taken from ADNS5050 driver.
|
||||||
// Note that the "serial.h" driver is insufficient, because it does not
|
// Note that the "serial.h" driver is insufficient, because it does not
|
||||||
@ -69,6 +72,7 @@ void pmw3320_set_cpi(uint16_t cpi);
|
|||||||
uint16_t pmw3320_get_cpi(void);
|
uint16_t pmw3320_get_cpi(void);
|
||||||
int8_t convert_twoscomp(uint8_t data);
|
int8_t convert_twoscomp(uint8_t data);
|
||||||
bool pmw3320_check_signature(void);
|
bool pmw3320_check_signature(void);
|
||||||
|
report_mouse_t pmw3320_get_report(report_mouse_t mouse_report);
|
||||||
|
|
||||||
#if !defined(PMW3320_CPI)
|
#if !defined(PMW3320_CPI)
|
||||||
# define PMW3320_CPI 1000
|
# define PMW3320_CPI 1000
|
||||||
|
@ -31,265 +31,4 @@ void pmw33xx_set_cpi(uint8_t sensor, uint16_t cpi) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// PID, Inverse PID, SROM version
|
// PID, Inverse PID, SROM version
|
||||||
const uint8_t pmw33xx_firmware_signature[3] PROGMEM = {0x42, 0xBD, 0x04};
|
const uint8_t pmw33xx_firmware_signature[2] PROGMEM = {0x42, 0xBD};
|
||||||
|
|
||||||
// Firmware Blob for PMW3360
|
|
||||||
// clang-format off
|
|
||||||
const uint8_t pmw33xx_firmware_data[PMW33XX_FIRMWARE_LENGTH] PROGMEM = {
|
|
||||||
0x01, 0x04, 0x8E, 0x96, 0x6E, 0x77, 0x3E, 0xFE, 0x7E, 0x5F, 0x1D, 0xB8, 0xF2, 0x66, 0x4E, 0xFF,
|
|
||||||
0x5D, 0x19, 0xB0, 0xC2, 0x04, 0x69, 0x54, 0x2A, 0xD6, 0x2E, 0xBF, 0xDD, 0x19, 0xB0, 0xC3, 0xE5,
|
|
||||||
0x29, 0xB1, 0xE0, 0x23, 0xA5, 0xA9, 0xB1, 0xC1, 0x00, 0x82, 0x67, 0x4C, 0x1A, 0x97, 0x8D, 0x79,
|
|
||||||
0x51, 0x20, 0xC7, 0x06, 0x8E, 0x7C, 0x7C, 0x7A, 0x76, 0x4F, 0xFD, 0x59, 0x30, 0xE2, 0x46, 0x0E,
|
|
||||||
0x9E, 0xBE, 0xDF, 0x1D, 0x99, 0x91, 0xA0, 0xA5, 0xA1, 0xA9, 0xD0, 0x22, 0xC6, 0xEF, 0x5C, 0x1B,
|
|
||||||
0x95, 0x89, 0x90, 0xA2, 0xA7, 0xCC, 0xFB, 0x55, 0x28, 0xB3, 0xE4, 0x4A, 0xF7, 0x6C, 0x3B, 0xF4,
|
|
||||||
0x6A, 0x56, 0x2E, 0xDE, 0x1F, 0x9D, 0xB8, 0xD3, 0x05, 0x88, 0x92, 0xA6, 0xCE, 0x1E, 0xBE, 0xDF,
|
|
||||||
0x1D, 0x99, 0xB0, 0xE2, 0x46, 0xEF, 0x5C, 0x07, 0x11, 0x5D, 0x98, 0x0B, 0x9D, 0x94, 0x97, 0xEE,
|
|
||||||
0x4E, 0x45, 0x33, 0x6B, 0x44, 0xC7, 0x29, 0x56, 0x27, 0x30, 0xC6, 0xA7, 0xD5, 0xF2, 0x56, 0xDF,
|
|
||||||
0xB4, 0x38, 0x62, 0xCB, 0xA0, 0xB6, 0xE3, 0x0F, 0x84, 0x06, 0x24, 0x05, 0x65, 0x6F, 0x76, 0x89,
|
|
||||||
0xB5, 0x77, 0x41, 0x27, 0x82, 0x66, 0x65, 0x82, 0xCC, 0xD5, 0xE6, 0x20, 0xD5, 0x27, 0x17, 0xC5,
|
|
||||||
0xF8, 0x03, 0x23, 0x7C, 0x5F, 0x64, 0xA5, 0x1D, 0xC1, 0xD6, 0x36, 0xCB, 0x4C, 0xD4, 0xDB, 0x66,
|
|
||||||
0xD7, 0x8B, 0xB1, 0x99, 0x7E, 0x6F, 0x4C, 0x36, 0x40, 0x06, 0xD6, 0xEB, 0xD7, 0xA2, 0xE4, 0xF4,
|
|
||||||
0x95, 0x51, 0x5A, 0x54, 0x96, 0xD5, 0x53, 0x44, 0xD7, 0x8C, 0xE0, 0xB9, 0x40, 0x68, 0xD2, 0x18,
|
|
||||||
0xE9, 0xDD, 0x9A, 0x23, 0x92, 0x48, 0xEE, 0x7F, 0x43, 0xAF, 0xEA, 0x77, 0x38, 0x84, 0x8C, 0x0A,
|
|
||||||
0x72, 0xAF, 0x69, 0xF8, 0xDD, 0xF1, 0x24, 0x83, 0xA3, 0xF8, 0x4A, 0xBF, 0xF5, 0x94, 0x13, 0xDB,
|
|
||||||
0xBB, 0xD8, 0xB4, 0xB3, 0xA0, 0xFB, 0x45, 0x50, 0x60, 0x30, 0x59, 0x12, 0x31, 0x71, 0xA2, 0xD3,
|
|
||||||
0x13, 0xE7, 0xFA, 0xE7, 0xCE, 0x0F, 0x63, 0x15, 0x0B, 0x6B, 0x94, 0xBB, 0x37, 0x83, 0x26, 0x05,
|
|
||||||
0x9D, 0xFB, 0x46, 0x92, 0xFC, 0x0A, 0x15, 0xD1, 0x0D, 0x73, 0x92, 0xD6, 0x8C, 0x1B, 0x8C, 0xB8,
|
|
||||||
0x55, 0x8A, 0xCE, 0xBD, 0xFE, 0x8E, 0xFC, 0xED, 0x09, 0x12, 0x83, 0x91, 0x82, 0x51, 0x31, 0x23,
|
|
||||||
0xFB, 0xB4, 0x0C, 0x76, 0xAD, 0x7C, 0xD9, 0xB4, 0x4B, 0xB2, 0x67, 0x14, 0x09, 0x9C, 0x7F, 0x0C,
|
|
||||||
0x18, 0xBA, 0x3B, 0xD6, 0x8E, 0x14, 0x2A, 0xE4, 0x1B, 0x52, 0x9F, 0x2B, 0x7D, 0xE1, 0xFB, 0x6A,
|
|
||||||
0x33, 0x02, 0xFA, 0xAC, 0x5A, 0xF2, 0x3E, 0x88, 0x7E, 0xAE, 0xD1, 0xF3, 0x78, 0xE8, 0x05, 0xD1,
|
|
||||||
0xE3, 0xDC, 0x21, 0xF6, 0xE1, 0x9A, 0xBD, 0x17, 0x0E, 0xD9, 0x46, 0x9B, 0x88, 0x03, 0xEA, 0xF6,
|
|
||||||
0x66, 0xBE, 0x0E, 0x1B, 0x50, 0x49, 0x96, 0x40, 0x97, 0xF1, 0xF1, 0xE4, 0x80, 0xA6, 0x6E, 0xE8,
|
|
||||||
0x77, 0x34, 0xBF, 0x29, 0x40, 0x44, 0xC2, 0xFF, 0x4E, 0x98, 0xD3, 0x9C, 0xA3, 0x32, 0x2B, 0x76,
|
|
||||||
0x51, 0x04, 0x09, 0xE7, 0xA9, 0xD1, 0xA6, 0x32, 0xB1, 0x23, 0x53, 0xE2, 0x47, 0xAB, 0xD6, 0xF5,
|
|
||||||
0x69, 0x5C, 0x3E, 0x5F, 0xFA, 0xAE, 0x45, 0x20, 0xE5, 0xD2, 0x44, 0xFF, 0x39, 0x32, 0x6D, 0xFD,
|
|
||||||
0x27, 0x57, 0x5C, 0xFD, 0xF0, 0xDE, 0xC1, 0xB5, 0x99, 0xE5, 0xF5, 0x1C, 0x77, 0x01, 0x75, 0xC5,
|
|
||||||
0x6D, 0x58, 0x92, 0xF2, 0xB2, 0x47, 0x00, 0x01, 0x26, 0x96, 0x7A, 0x30, 0xFF, 0xB7, 0xF0, 0xEF,
|
|
||||||
0x77, 0xC1, 0x8A, 0x5D, 0xDC, 0xC0, 0xD1, 0x29, 0x30, 0x1E, 0x77, 0x38, 0x7A, 0x94, 0xF1, 0xB8,
|
|
||||||
0x7A, 0x7E, 0xEF, 0xA4, 0xD1, 0xAC, 0x31, 0x4A, 0xF2, 0x5D, 0x64, 0x3D, 0xB2, 0xE2, 0xF0, 0x08,
|
|
||||||
0x99, 0xFC, 0x70, 0xEE, 0x24, 0xA7, 0x7E, 0xEE, 0x1E, 0x20, 0x69, 0x7D, 0x44, 0xBF, 0x87, 0x42,
|
|
||||||
0xDF, 0x88, 0x3B, 0x0C, 0xDA, 0x42, 0xC9, 0x04, 0xF9, 0x45, 0x50, 0xFC, 0x83, 0x8F, 0x11, 0x6A,
|
|
||||||
0x72, 0xBC, 0x99, 0x95, 0xF0, 0xAC, 0x3D, 0xA7, 0x3B, 0xCD, 0x1C, 0xE2, 0x88, 0x79, 0x37, 0x11,
|
|
||||||
0x5F, 0x39, 0x89, 0x95, 0x0A, 0x16, 0x84, 0x7A, 0xF6, 0x8A, 0xA4, 0x28, 0xE4, 0xED, 0x83, 0x80,
|
|
||||||
0x3B, 0xB1, 0x23, 0xA5, 0x03, 0x10, 0xF4, 0x66, 0xEA, 0xBB, 0x0C, 0x0F, 0xC5, 0xEC, 0x6C, 0x69,
|
|
||||||
0xC5, 0xD3, 0x24, 0xAB, 0xD4, 0x2A, 0xB7, 0x99, 0x88, 0x76, 0x08, 0xA0, 0xA8, 0x95, 0x7C, 0xD8,
|
|
||||||
0x38, 0x6D, 0xCD, 0x59, 0x02, 0x51, 0x4B, 0xF1, 0xB5, 0x2B, 0x50, 0xE3, 0xB6, 0xBD, 0xD0, 0x72,
|
|
||||||
0xCF, 0x9E, 0xFD, 0x6E, 0xBB, 0x44, 0xC8, 0x24, 0x8A, 0x77, 0x18, 0x8A, 0x13, 0x06, 0xEF, 0x97,
|
|
||||||
0x7D, 0xFA, 0x81, 0xF0, 0x31, 0xE6, 0xFA, 0x77, 0xED, 0x31, 0x06, 0x31, 0x5B, 0x54, 0x8A, 0x9F,
|
|
||||||
0x30, 0x68, 0xDB, 0xE2, 0x40, 0xF8, 0x4E, 0x73, 0xFA, 0xAB, 0x74, 0x8B, 0x10, 0x58, 0x13, 0xDC,
|
|
||||||
0xD2, 0xE6, 0x78, 0xD1, 0x32, 0x2E, 0x8A, 0x9F, 0x2C, 0x58, 0x06, 0x48, 0x27, 0xC5, 0xA9, 0x5E,
|
|
||||||
0x81, 0x47, 0x89, 0x46, 0x21, 0x91, 0x03, 0x70, 0xA4, 0x3E, 0x88, 0x9C, 0xDA, 0x33, 0x0A, 0xCE,
|
|
||||||
0xBC, 0x8B, 0x8E, 0xCF, 0x9F, 0xD3, 0x71, 0x80, 0x43, 0xCF, 0x6B, 0xA9, 0x51, 0x83, 0x76, 0x30,
|
|
||||||
0x82, 0xC5, 0x6A, 0x85, 0x39, 0x11, 0x50, 0x1A, 0x82, 0xDC, 0x1E, 0x1C, 0xD5, 0x7D, 0xA9, 0x71,
|
|
||||||
0x99, 0x33, 0x47, 0x19, 0x97, 0xB3, 0x5A, 0xB1, 0xDF, 0xED, 0xA4, 0xF2, 0xE6, 0x26, 0x84, 0xA2,
|
|
||||||
0x28, 0x9A, 0x9E, 0xDF, 0xA6, 0x6A, 0xF4, 0xD6, 0xFC, 0x2E, 0x5B, 0x9D, 0x1A, 0x2A, 0x27, 0x68,
|
|
||||||
0xFB, 0xC1, 0x83, 0x21, 0x4B, 0x90, 0xE0, 0x36, 0xDD, 0x5B, 0x31, 0x42, 0x55, 0xA0, 0x13, 0xF7,
|
|
||||||
0xD0, 0x89, 0x53, 0x71, 0x99, 0x57, 0x09, 0x29, 0xC5, 0xF3, 0x21, 0xF8, 0x37, 0x2F, 0x40, 0xF3,
|
|
||||||
0xD4, 0xAF, 0x16, 0x08, 0x36, 0x02, 0xFC, 0x77, 0xC5, 0x8B, 0x04, 0x90, 0x56, 0xB9, 0xC9, 0x67,
|
|
||||||
0x9A, 0x99, 0xE8, 0x00, 0xD3, 0x86, 0xFF, 0x97, 0x2D, 0x08, 0xE9, 0xB7, 0xB3, 0x91, 0xBC, 0xDF,
|
|
||||||
0x45, 0xC6, 0xED, 0x0F, 0x8C, 0x4C, 0x1E, 0xE6, 0x5B, 0x6E, 0x38, 0x30, 0xE4, 0xAA, 0xE3, 0x95,
|
|
||||||
0xDE, 0xB9, 0xE4, 0x9A, 0xF5, 0xB2, 0x55, 0x9A, 0x87, 0x9B, 0xF6, 0x6A, 0xB2, 0xF2, 0x77, 0x9A,
|
|
||||||
0x31, 0xF4, 0x7A, 0x31, 0xD1, 0x1D, 0x04, 0xC0, 0x7C, 0x32, 0xA2, 0x9E, 0x9A, 0xF5, 0x62, 0xF8,
|
|
||||||
0x27, 0x8D, 0xBF, 0x51, 0xFF, 0xD3, 0xDF, 0x64, 0x37, 0x3F, 0x2A, 0x6F, 0x76, 0x3A, 0x7D, 0x77,
|
|
||||||
0x06, 0x9E, 0x77, 0x7F, 0x5E, 0xEB, 0x32, 0x51, 0xF9, 0x16, 0x66, 0x9A, 0x09, 0xF3, 0xB0, 0x08,
|
|
||||||
0xA4, 0x70, 0x96, 0x46, 0x30, 0xFF, 0xDA, 0x4F, 0xE9, 0x1B, 0xED, 0x8D, 0xF8, 0x74, 0x1F, 0x31,
|
|
||||||
0x92, 0xB3, 0x73, 0x17, 0x36, 0xDB, 0x91, 0x30, 0xD6, 0x88, 0x55, 0x6B, 0x34, 0x77, 0x87, 0x7A,
|
|
||||||
0xE7, 0xEE, 0x06, 0xC6, 0x1C, 0x8C, 0x19, 0x0C, 0x48, 0x46, 0x23, 0x5E, 0x9C, 0x07, 0x5C, 0xBF,
|
|
||||||
0xB4, 0x7E, 0xD6, 0x4F, 0x74, 0x9C, 0xE2, 0xC5, 0x50, 0x8B, 0xC5, 0x8B, 0x15, 0x90, 0x60, 0x62,
|
|
||||||
0x57, 0x29, 0xD0, 0x13, 0x43, 0xA1, 0x80, 0x88, 0x91, 0x00, 0x44, 0xC7, 0x4D, 0x19, 0x86, 0xCC,
|
|
||||||
0x2F, 0x2A, 0x75, 0x5A, 0xFC, 0xEB, 0x97, 0x2A, 0x70, 0xE3, 0x78, 0xD8, 0x91, 0xB0, 0x4F, 0x99,
|
|
||||||
0x07, 0xA3, 0x95, 0xEA, 0x24, 0x21, 0xD5, 0xDE, 0x51, 0x20, 0x93, 0x27, 0x0A, 0x30, 0x73, 0xA8,
|
|
||||||
0xFF, 0x8A, 0x97, 0xE9, 0xA7, 0x6A, 0x8E, 0x0D, 0xE8, 0xF0, 0xDF, 0xEC, 0xEA, 0xB4, 0x6C, 0x1D,
|
|
||||||
0x39, 0x2A, 0x62, 0x2D, 0x3D, 0x5A, 0x8B, 0x65, 0xF8, 0x90, 0x05, 0x2E, 0x7E, 0x91, 0x2C, 0x78,
|
|
||||||
0xEF, 0x8E, 0x7A, 0xC1, 0x2F, 0xAC, 0x78, 0xEE, 0xAF, 0x28, 0x45, 0x06, 0x4C, 0x26, 0xAF, 0x3B,
|
|
||||||
0xA2, 0xDB, 0xA3, 0x93, 0x06, 0xB5, 0x3C, 0xA5, 0xD8, 0xEE, 0x8F, 0xAF, 0x25, 0xCC, 0x3F, 0x85,
|
|
||||||
0x68, 0x48, 0xA9, 0x62, 0xCC, 0x97, 0x8F, 0x7F, 0x2A, 0xEA, 0xE0, 0x15, 0x0A, 0xAD, 0x62, 0x07,
|
|
||||||
0xBD, 0x45, 0xF8, 0x41, 0xD8, 0x36, 0xCB, 0x4C, 0xDB, 0x6E, 0xE6, 0x3A, 0xE7, 0xDA, 0x15, 0xE9,
|
|
||||||
0x29, 0x1E, 0x12, 0x10, 0xA0, 0x14, 0x2C, 0x0E, 0x3D, 0xF4, 0xBF, 0x39, 0x41, 0x92, 0x75, 0x0B,
|
|
||||||
0x25, 0x7B, 0xA3, 0xCE, 0x39, 0x9C, 0x15, 0x64, 0xC8, 0xFA, 0x3D, 0xEF, 0x73, 0x27, 0xFE, 0x26,
|
|
||||||
0x2E, 0xCE, 0xDA, 0x6E, 0xFD, 0x71, 0x8E, 0xDD, 0xFE, 0x76, 0xEE, 0xDC, 0x12, 0x5C, 0x02, 0xC5,
|
|
||||||
0x3A, 0x4E, 0x4E, 0x4F, 0xBF, 0xCA, 0x40, 0x15, 0xC7, 0x6E, 0x8D, 0x41, 0xF1, 0x10, 0xE0, 0x4F,
|
|
||||||
0x7E, 0x97, 0x7F, 0x1C, 0xAE, 0x47, 0x8E, 0x6B, 0xB1, 0x25, 0x31, 0xB0, 0x73, 0xC7, 0x1B, 0x97,
|
|
||||||
0x79, 0xF9, 0x80, 0xD3, 0x66, 0x22, 0x30, 0x07, 0x74, 0x1E, 0xE4, 0xD0, 0x80, 0x21, 0xD6, 0xEE,
|
|
||||||
0x6B, 0x6C, 0x4F, 0xBF, 0xF5, 0xB7, 0xD9, 0x09, 0x87, 0x2F, 0xA9, 0x14, 0xBE, 0x27, 0xD9, 0x72,
|
|
||||||
0x50, 0x01, 0xD4, 0x13, 0x73, 0xA6, 0xA7, 0x51, 0x02, 0x75, 0x25, 0xE1, 0xB3, 0x45, 0x34, 0x7D,
|
|
||||||
0xA8, 0x8E, 0xEB, 0xF3, 0x16, 0x49, 0xCB, 0x4F, 0x8C, 0xA1, 0xB9, 0x36, 0x85, 0x39, 0x75, 0x5D,
|
|
||||||
0x08, 0x00, 0xAE, 0xEB, 0xF6, 0xEA, 0xD7, 0x13, 0x3A, 0x21, 0x5A, 0x5F, 0x30, 0x84, 0x52, 0x26,
|
|
||||||
0x95, 0xC9, 0x14, 0xF2, 0x57, 0x55, 0x6B, 0xB1, 0x10, 0xC2, 0xE1, 0xBD, 0x3B, 0x51, 0xC0, 0xB7,
|
|
||||||
0x55, 0x4C, 0x71, 0x12, 0x26, 0xC7, 0x0D, 0xF9, 0x51, 0xA4, 0x38, 0x02, 0x05, 0x7F, 0xB8, 0xF1,
|
|
||||||
0x72, 0x4B, 0xBF, 0x71, 0x89, 0x14, 0xF3, 0x77, 0x38, 0xD9, 0x71, 0x24, 0xF3, 0x00, 0x11, 0xA1,
|
|
||||||
0xD8, 0xD4, 0x69, 0x27, 0x08, 0x37, 0x35, 0xC9, 0x11, 0x9D, 0x90, 0x1C, 0x0E, 0xE7, 0x1C, 0xFF,
|
|
||||||
0x2D, 0x1E, 0xE8, 0x92, 0xE1, 0x18, 0x10, 0x95, 0x7C, 0xE0, 0x80, 0xF4, 0x96, 0x43, 0x21, 0xF9,
|
|
||||||
0x75, 0x21, 0x64, 0x38, 0xDD, 0x9F, 0x1E, 0x95, 0x16, 0xDA, 0x56, 0x1D, 0x4F, 0x9A, 0x53, 0xB2,
|
|
||||||
0xE2, 0xE4, 0x18, 0xCB, 0x6B, 0x1A, 0x65, 0xEB, 0x56, 0xC6, 0x3B, 0xE5, 0xFE, 0xD8, 0x26, 0x3F,
|
|
||||||
0x3A, 0x84, 0x59, 0x72, 0x66, 0xA2, 0xF3, 0x75, 0xFF, 0xFB, 0x60, 0xB3, 0x22, 0xAD, 0x3F, 0x2D,
|
|
||||||
0x6B, 0xF9, 0xEB, 0xEA, 0x05, 0x7C, 0xD8, 0x8F, 0x6D, 0x2C, 0x98, 0x9E, 0x2B, 0x93, 0xF1, 0x5E,
|
|
||||||
0x46, 0xF0, 0x87, 0x49, 0x29, 0x73, 0x68, 0xD7, 0x7F, 0xF9, 0xF0, 0xE5, 0x7D, 0xDB, 0x1D, 0x75,
|
|
||||||
0x19, 0xF3, 0xC4, 0x58, 0x9B, 0x17, 0x88, 0xA8, 0x92, 0xE0, 0xBE, 0xBD, 0x8B, 0x1D, 0x8D, 0x9F,
|
|
||||||
0x56, 0x76, 0xAD, 0xAF, 0x29, 0xE2, 0xD9, 0xD5, 0x52, 0xF6, 0xB5, 0x56, 0x35, 0x57, 0x3A, 0xC8,
|
|
||||||
0xE1, 0x56, 0x43, 0x19, 0x94, 0xD3, 0x04, 0x9B, 0x6D, 0x35, 0xD8, 0x0B, 0x5F, 0x4D, 0x19, 0x8E,
|
|
||||||
0xEC, 0xFA, 0x64, 0x91, 0x0A, 0x72, 0x20, 0x2B, 0xBC, 0x1A, 0x4A, 0xFE, 0x8B, 0xFD, 0xBB, 0xED,
|
|
||||||
0x1B, 0x23, 0xEA, 0xAD, 0x72, 0x82, 0xA1, 0x29, 0x99, 0x71, 0xBD, 0xF0, 0x95, 0xC1, 0x03, 0xDD,
|
|
||||||
0x7B, 0xC2, 0xB2, 0x3C, 0x28, 0x54, 0xD3, 0x68, 0xA4, 0x72, 0xC8, 0x66, 0x96, 0xE0, 0xD1, 0xD8,
|
|
||||||
0x7F, 0xF8, 0xD1, 0x26, 0x2B, 0xF7, 0xAD, 0xBA, 0x55, 0xCA, 0x15, 0xB9, 0x32, 0xC3, 0xE5, 0x88,
|
|
||||||
0x97, 0x8E, 0x5C, 0xFB, 0x92, 0x25, 0x8B, 0xBF, 0xA2, 0x45, 0x55, 0x7A, 0xA7, 0x6F, 0x8B, 0x57,
|
|
||||||
0x5B, 0xCF, 0x0E, 0xCB, 0x1D, 0xFB, 0x20, 0x82, 0x77, 0xA8, 0x8C, 0xCC, 0x16, 0xCE, 0x1D, 0xFA,
|
|
||||||
0xDE, 0xCC, 0x0B, 0x62, 0xFE, 0xCC, 0xE1, 0xB7, 0xF0, 0xC3, 0x81, 0x64, 0x73, 0x40, 0xA0, 0xC2,
|
|
||||||
0x4D, 0x89, 0x11, 0x75, 0x33, 0x55, 0x33, 0x8D, 0xE8, 0x4A, 0xFD, 0xEA, 0x6E, 0x30, 0x0B, 0xD7,
|
|
||||||
0x31, 0x2C, 0xDE, 0x47, 0xE3, 0xBF, 0xF8, 0x55, 0x42, 0xE2, 0x7F, 0x59, 0xE5, 0x17, 0xEF, 0x99,
|
|
||||||
0x34, 0x69, 0x91, 0xB1, 0x23, 0x8E, 0x20, 0x87, 0x2D, 0xA8, 0xFE, 0xD5, 0x8A, 0xF3, 0x84, 0x3A,
|
|
||||||
0xF0, 0x37, 0xE4, 0x09, 0x00, 0x54, 0xEE, 0x67, 0x49, 0x93, 0xE4, 0x81, 0x70, 0xE3, 0x90, 0x4D,
|
|
||||||
0xEF, 0xFE, 0x41, 0xB7, 0x99, 0x7B, 0xC1, 0x83, 0xBA, 0x62, 0x12, 0x6F, 0x7D, 0xDE, 0x6B, 0xAF,
|
|
||||||
0xDA, 0x16, 0xF9, 0x55, 0x51, 0xEE, 0xA6, 0x0C, 0x2B, 0x02, 0xA3, 0xFD, 0x8D, 0xFB, 0x30, 0x17,
|
|
||||||
0xE4, 0x6F, 0xDF, 0x36, 0x71, 0xC4, 0xCA, 0x87, 0x25, 0x48, 0xB0, 0x47, 0xEC, 0xEA, 0xB4, 0xBF,
|
|
||||||
0xA5, 0x4D, 0x9B, 0x9F, 0x02, 0x93, 0xC4, 0xE3, 0xE4, 0xE8, 0x42, 0x2D, 0x68, 0x81, 0x15, 0x0A,
|
|
||||||
0xEB, 0x84, 0x5B, 0xD6, 0xA8, 0x74, 0xFB, 0x7D, 0x1D, 0xCB, 0x2C, 0xDA, 0x46, 0x2A, 0x76, 0x62,
|
|
||||||
0xCE, 0xBC, 0x5C, 0x9E, 0x8B, 0xE7, 0xCF, 0xBE, 0x78, 0xF5, 0x7C, 0xEB, 0xB3, 0x3A, 0x9C, 0xAA,
|
|
||||||
0x6F, 0xCC, 0x72, 0xD1, 0x59, 0xF2, 0x11, 0x23, 0xD6, 0x3F, 0x48, 0xD1, 0xB7, 0xCE, 0xB0, 0xBF,
|
|
||||||
0xCB, 0xEA, 0x80, 0xDE, 0x57, 0xD4, 0x5E, 0x97, 0x2F, 0x75, 0xD1, 0x50, 0x8E, 0x80, 0x2C, 0x66,
|
|
||||||
0x79, 0xBF, 0x72, 0x4B, 0xBD, 0x8A, 0x81, 0x6C, 0xD3, 0xE1, 0x01, 0xDC, 0xD2, 0x15, 0x26, 0xC5,
|
|
||||||
0x36, 0xDA, 0x2C, 0x1A, 0xC0, 0x27, 0x94, 0xED, 0xB7, 0x9B, 0x85, 0x0B, 0x5E, 0x80, 0x97, 0xC5,
|
|
||||||
0xEC, 0x4F, 0xEC, 0x88, 0x5D, 0x50, 0x07, 0x35, 0x47, 0xDC, 0x0B, 0x3B, 0x3D, 0xDD, 0x60, 0xAF,
|
|
||||||
0xA8, 0x5D, 0x81, 0x38, 0x24, 0x25, 0x5D, 0x5C, 0x15, 0xD1, 0xDE, 0xB3, 0xAB, 0xEC, 0x05, 0x69,
|
|
||||||
0xEF, 0x83, 0xED, 0x57, 0x54, 0xB8, 0x64, 0x64, 0x11, 0x16, 0x32, 0x69, 0xDA, 0x9F, 0x2D, 0x7F,
|
|
||||||
0x36, 0xBB, 0x44, 0x5A, 0x34, 0xE8, 0x7F, 0xBF, 0x03, 0xEB, 0x00, 0x7F, 0x59, 0x68, 0x22, 0x79,
|
|
||||||
0xCF, 0x73, 0x6C, 0x2C, 0x29, 0xA7, 0xA1, 0x5F, 0x38, 0xA1, 0x1D, 0xF0, 0x20, 0x53, 0xE0, 0x1A,
|
|
||||||
0x63, 0x14, 0x58, 0x71, 0x10, 0xAA, 0x08, 0x0C, 0x3E, 0x16, 0x1A, 0x60, 0x22, 0x82, 0x7F, 0xBA,
|
|
||||||
0xA4, 0x43, 0xA0, 0xD0, 0xAC, 0x1B, 0xD5, 0x6B, 0x64, 0xB5, 0x14, 0x93, 0x31, 0x9E, 0x53, 0x50,
|
|
||||||
0xD0, 0x57, 0x66, 0xEE, 0x5A, 0x4F, 0xFB, 0x03, 0x2A, 0x69, 0x58, 0x76, 0xF1, 0x83, 0xF7, 0x4E,
|
|
||||||
0xBA, 0x8C, 0x42, 0x06, 0x60, 0x5D, 0x6D, 0xCE, 0x60, 0x88, 0xAE, 0xA4, 0xC3, 0xF1, 0x03, 0xA5,
|
|
||||||
0x4B, 0x98, 0xA1, 0xFF, 0x67, 0xE1, 0xAC, 0xA2, 0xB8, 0x62, 0xD7, 0x6F, 0xA0, 0x31, 0xB4, 0xD2,
|
|
||||||
0x77, 0xAF, 0x21, 0x10, 0x06, 0xC6, 0x9A, 0xFF, 0x1D, 0x09, 0x17, 0x0E, 0x5F, 0xF1, 0xAA, 0x54,
|
|
||||||
0x34, 0x4B, 0x45, 0x8A, 0x87, 0x63, 0xA6, 0xDC, 0xF9, 0x24, 0x30, 0x67, 0xC6, 0xB2, 0xD6, 0x61,
|
|
||||||
0x33, 0x69, 0xEE, 0x50, 0x61, 0x57, 0x28, 0xE7, 0x7E, 0xEE, 0xEC, 0x3A, 0x5A, 0x73, 0x4E, 0xA8,
|
|
||||||
0x8D, 0xE4, 0x18, 0xEA, 0xEC, 0x41, 0x64, 0xC8, 0xE2, 0xE8, 0x66, 0xB6, 0x2D, 0xB6, 0xFB, 0x6A,
|
|
||||||
0x6C, 0x16, 0xB3, 0xDD, 0x46, 0x43, 0xB9, 0x73, 0x00, 0x6A, 0x71, 0xED, 0x4E, 0x9D, 0x25, 0x1A,
|
|
||||||
0xC3, 0x3C, 0x4A, 0x95, 0x15, 0x99, 0x35, 0x81, 0x14, 0x02, 0xD6, 0x98, 0x9B, 0xEC, 0xD8, 0x23,
|
|
||||||
0x3B, 0x84, 0x29, 0xAF, 0x0C, 0x99, 0x83, 0xA6, 0x9A, 0x34, 0x4F, 0xFA, 0xE8, 0xD0, 0x3C, 0x4B,
|
|
||||||
0xD0, 0xFB, 0xB6, 0x68, 0xB8, 0x9E, 0x8F, 0xCD, 0xF7, 0x60, 0x2D, 0x7A, 0x22, 0xE5, 0x7D, 0xAB,
|
|
||||||
0x65, 0x1B, 0x95, 0xA7, 0xA8, 0x7F, 0xB6, 0x77, 0x47, 0x7B, 0x5F, 0x8B, 0x12, 0x72, 0xD0, 0xD4,
|
|
||||||
0x91, 0xEF, 0xDE, 0x19, 0x50, 0x3C, 0xA7, 0x8B, 0xC4, 0xA9, 0xB3, 0x23, 0xCB, 0x76, 0xE6, 0x81,
|
|
||||||
0xF0, 0xC1, 0x04, 0x8F, 0xA3, 0xB8, 0x54, 0x5B, 0x97, 0xAC, 0x19, 0xFF, 0x3F, 0x55, 0x27, 0x2F,
|
|
||||||
0xE0, 0x1D, 0x42, 0x9B, 0x57, 0xFC, 0x4B, 0x4E, 0x0F, 0xCE, 0x98, 0xA9, 0x43, 0x57, 0x03, 0xBD,
|
|
||||||
0xE7, 0xC8, 0x94, 0xDF, 0x6E, 0x36, 0x73, 0x32, 0xB4, 0xEF, 0x2E, 0x85, 0x7A, 0x6E, 0xFC, 0x6C,
|
|
||||||
0x18, 0x82, 0x75, 0x35, 0x90, 0x07, 0xF3, 0xE4, 0x9F, 0x3E, 0xDC, 0x68, 0xF3, 0xB5, 0xF3, 0x19,
|
|
||||||
0x80, 0x92, 0x06, 0x99, 0xA2, 0xE8, 0x6F, 0xFF, 0x2E, 0x7F, 0xAE, 0x42, 0xA4, 0x5F, 0xFB, 0xD4,
|
|
||||||
0x0E, 0x81, 0x2B, 0xC3, 0x04, 0xFF, 0x2B, 0xB3, 0x74, 0x4E, 0x36, 0x5B, 0x9C, 0x15, 0x00, 0xC6,
|
|
||||||
0x47, 0x2B, 0xE8, 0x8B, 0x3D, 0xF1, 0x9C, 0x03, 0x9A, 0x58, 0x7F, 0x9B, 0x9C, 0xBF, 0x85, 0x49,
|
|
||||||
0x79, 0x35, 0x2E, 0x56, 0x7B, 0x41, 0x14, 0x39, 0x47, 0x83, 0x26, 0xAA, 0x07, 0x89, 0x98, 0x11,
|
|
||||||
0x1B, 0x86, 0xE7, 0x73, 0x7A, 0xD8, 0x7D, 0x78, 0x61, 0x53, 0xE9, 0x79, 0xF5, 0x36, 0x8D, 0x44,
|
|
||||||
0x92, 0x84, 0xF9, 0x13, 0x50, 0x58, 0x3B, 0xA4, 0x6A, 0x36, 0x65, 0x49, 0x8E, 0x3C, 0x0E, 0xF1,
|
|
||||||
0x6F, 0xD2, 0x84, 0xC4, 0x7E, 0x8E, 0x3F, 0x39, 0xAE, 0x7C, 0x84, 0xF1, 0x63, 0x37, 0x8E, 0x3C,
|
|
||||||
0xCC, 0x3E, 0x44, 0x81, 0x45, 0xF1, 0x4B, 0xB9, 0xED, 0x6B, 0x36, 0x5D, 0xBB, 0x20, 0x60, 0x1A,
|
|
||||||
0x0F, 0xA3, 0xAA, 0x55, 0x77, 0x3A, 0xA9, 0xAE, 0x37, 0x4D, 0xBA, 0xB8, 0x86, 0x6B, 0xBC, 0x08,
|
|
||||||
0x50, 0xF6, 0xCC, 0xA4, 0xBD, 0x1D, 0x40, 0x72, 0xA5, 0x86, 0xFA, 0xE2, 0x10, 0xAE, 0x3D, 0x58,
|
|
||||||
0x4B, 0x97, 0xF3, 0x43, 0x74, 0xA9, 0x9E, 0xEB, 0x21, 0xB7, 0x01, 0xA4, 0x86, 0x93, 0x97, 0xEE,
|
|
||||||
0x2F, 0x4F, 0x3B, 0x86, 0xA1, 0x41, 0x6F, 0x41, 0x26, 0x90, 0x78, 0x5C, 0x7F, 0x30, 0x38, 0x4B,
|
|
||||||
0x3F, 0xAA, 0xEC, 0xED, 0x5C, 0x6F, 0x0E, 0xAD, 0x43, 0x87, 0xFD, 0x93, 0x35, 0xE6, 0x01, 0xEF,
|
|
||||||
0x41, 0x26, 0x90, 0x99, 0x9E, 0xFB, 0x19, 0x5B, 0xAD, 0xD2, 0x91, 0x8A, 0xE0, 0x46, 0xAF, 0x65,
|
|
||||||
0xFA, 0x4F, 0x84, 0xC1, 0xA1, 0x2D, 0xCF, 0x45, 0x8B, 0xD3, 0x85, 0x50, 0x55, 0x7C, 0xF9, 0x67,
|
|
||||||
0x88, 0xD4, 0x4E, 0xE9, 0xD7, 0x6B, 0x61, 0x54, 0xA1, 0xA4, 0xA6, 0xA2, 0xC2, 0xBF, 0x30, 0x9C,
|
|
||||||
0x40, 0x9F, 0x5F, 0xD7, 0x69, 0x2B, 0x24, 0x82, 0x5E, 0xD9, 0xD6, 0xA7, 0x12, 0x54, 0x1A, 0xF7,
|
|
||||||
0x55, 0x9F, 0x76, 0x50, 0xA9, 0x95, 0x84, 0xE6, 0x6B, 0x6D, 0xB5, 0x96, 0x54, 0xD6, 0xCD, 0xB3,
|
|
||||||
0xA1, 0x9B, 0x46, 0xA7, 0x94, 0x4D, 0xC4, 0x94, 0xB4, 0x98, 0xE3, 0xE1, 0xE2, 0x34, 0xD5, 0x33,
|
|
||||||
0x16, 0x07, 0x54, 0xCD, 0xB7, 0x77, 0x53, 0xDB, 0x4F, 0x4D, 0x46, 0x9D, 0xE9, 0xD4, 0x9C, 0x8A,
|
|
||||||
0x36, 0xB6, 0xB8, 0x38, 0x26, 0x6C, 0x0E, 0xFF, 0x9C, 0x1B, 0x43, 0x8B, 0x80, 0xCC, 0xB9, 0x3D,
|
|
||||||
0xDA, 0xC7, 0xF1, 0x8A, 0xF2, 0x6D, 0xB8, 0xD7, 0x74, 0x2F, 0x7E, 0x1E, 0xB7, 0xD3, 0x4A, 0xB4,
|
|
||||||
0xAC, 0xFC, 0x79, 0x48, 0x6C, 0xBC, 0x96, 0xB6, 0x94, 0x46, 0x57, 0x2D, 0xB0, 0xA3, 0xFC, 0x1E,
|
|
||||||
0xB9, 0x52, 0x60, 0x85, 0x2D, 0x41, 0xD0, 0x43, 0x01, 0x1E, 0x1C, 0xD5, 0x7D, 0xFC, 0xF3, 0x96,
|
|
||||||
0x0D, 0xC7, 0xCB, 0x2A, 0x29, 0x9A, 0x93, 0xDD, 0x88, 0x2D, 0x37, 0x5D, 0xAA, 0xFB, 0x49, 0x68,
|
|
||||||
0xA0, 0x9C, 0x50, 0x86, 0x7F, 0x68, 0x56, 0x57, 0xF9, 0x79, 0x18, 0x39, 0xD4, 0xE0, 0x01, 0x84,
|
|
||||||
0x33, 0x61, 0xCA, 0xA5, 0xD2, 0xD6, 0xE4, 0xC9, 0x8A, 0x4A, 0x23, 0x44, 0x4E, 0xBC, 0xF0, 0xDC,
|
|
||||||
0x24, 0xA1, 0xA0, 0xC4, 0xE2, 0x07, 0x3C, 0x10, 0xC4, 0xB5, 0x25, 0x4B, 0x65, 0x63, 0xF4, 0x80,
|
|
||||||
0xE7, 0xCF, 0x61, 0xB1, 0x71, 0x82, 0x21, 0x87, 0x2C, 0xF5, 0x91, 0x00, 0x32, 0x0C, 0xEC, 0xA9,
|
|
||||||
0xB5, 0x9A, 0x74, 0x85, 0xE3, 0x36, 0x8F, 0x76, 0x4F, 0x9C, 0x6D, 0xCE, 0xBC, 0xAD, 0x0A, 0x4B,
|
|
||||||
0xED, 0x76, 0x04, 0xCB, 0xC3, 0xB9, 0x33, 0x9E, 0x01, 0x93, 0x96, 0x69, 0x7D, 0xC5, 0xA2, 0x45,
|
|
||||||
0x79, 0x9B, 0x04, 0x5C, 0x84, 0x09, 0xED, 0x88, 0x43, 0xC7, 0xAB, 0x93, 0x14, 0x26, 0xA1, 0x40,
|
|
||||||
0xB5, 0xCE, 0x4E, 0xBF, 0x2A, 0x42, 0x85, 0x3E, 0x2C, 0x3B, 0x54, 0xE8, 0x12, 0x1F, 0x0E, 0x97,
|
|
||||||
0x59, 0xB2, 0x27, 0x89, 0xFA, 0xF2, 0xDF, 0x8E, 0x68, 0x59, 0xDC, 0x06, 0xBC, 0xB6, 0x85, 0x0D,
|
|
||||||
0x06, 0x22, 0xEC, 0xB1, 0xCB, 0xE5, 0x04, 0xE6, 0x3D, 0xB3, 0xB0, 0x41, 0x73, 0x08, 0x3F, 0x3C,
|
|
||||||
0x58, 0x86, 0x63, 0xEB, 0x50, 0xEE, 0x1D, 0x2C, 0x37, 0x74, 0xA9, 0xD3, 0x18, 0xA3, 0x47, 0x6E,
|
|
||||||
0x93, 0x54, 0xAD, 0x0A, 0x5D, 0xB8, 0x2A, 0x55, 0x5D, 0x78, 0xF6, 0xEE, 0xBE, 0x8E, 0x3C, 0x76,
|
|
||||||
0x69, 0xB9, 0x40, 0xC2, 0x34, 0xEC, 0x2A, 0xB9, 0xED, 0x7E, 0x20, 0xE4, 0x8D, 0x00, 0x38, 0xC7,
|
|
||||||
0xE6, 0x8F, 0x44, 0xA8, 0x86, 0xCE, 0xEB, 0x2A, 0xE9, 0x90, 0xF1, 0x4C, 0xDF, 0x32, 0xFB, 0x73,
|
|
||||||
0x1B, 0x6D, 0x92, 0x1E, 0x95, 0xFE, 0xB4, 0xDB, 0x65, 0xDF, 0x4D, 0x23, 0x54, 0x89, 0x48, 0xBF,
|
|
||||||
0x4A, 0x2E, 0x70, 0xD6, 0xD7, 0x62, 0xB4, 0x33, 0x29, 0xB1, 0x3A, 0x33, 0x4C, 0x23, 0x6D, 0xA6,
|
|
||||||
0x76, 0xA5, 0x21, 0x63, 0x48, 0xE6, 0x90, 0x5D, 0xED, 0x90, 0x95, 0x0B, 0x7A, 0x84, 0xBE, 0xB8,
|
|
||||||
0x0D, 0x5E, 0x63, 0x0C, 0x62, 0x26, 0x4C, 0x14, 0x5A, 0xB3, 0xAC, 0x23, 0xA4, 0x74, 0xA7, 0x6F,
|
|
||||||
0x33, 0x30, 0x05, 0x60, 0x01, 0x42, 0xA0, 0x28, 0xB7, 0xEE, 0x19, 0x38, 0xF1, 0x64, 0x80, 0x82,
|
|
||||||
0x43, 0xE1, 0x41, 0x27, 0x1F, 0x1F, 0x90, 0x54, 0x7A, 0xD5, 0x23, 0x2E, 0xD1, 0x3D, 0xCB, 0x28,
|
|
||||||
0xBA, 0x58, 0x7F, 0xDC, 0x7C, 0x91, 0x24, 0xE9, 0x28, 0x51, 0x83, 0x6E, 0xC5, 0x56, 0x21, 0x42,
|
|
||||||
0xED, 0xA0, 0x56, 0x22, 0xA1, 0x40, 0x80, 0x6B, 0xA8, 0xF7, 0x94, 0xCA, 0x13, 0x6B, 0x0C, 0x39,
|
|
||||||
0xD9, 0xFD, 0xE9, 0xF3, 0x6F, 0xA6, 0x9E, 0xFC, 0x70, 0x8A, 0xB3, 0xBC, 0x59, 0x3C, 0x1E, 0x1D,
|
|
||||||
0x6C, 0xF9, 0x7C, 0xAF, 0xF9, 0x88, 0x71, 0x95, 0xEB, 0x57, 0x00, 0xBD, 0x9F, 0x8C, 0x4F, 0xE1,
|
|
||||||
0x24, 0x83, 0xC5, 0x22, 0xEA, 0xFD, 0xD3, 0x0C, 0xE2, 0x17, 0x18, 0x7C, 0x6A, 0x4C, 0xDE, 0x77,
|
|
||||||
0xB4, 0x53, 0x9B, 0x4C, 0x81, 0xCD, 0x23, 0x60, 0xAA, 0x0E, 0x25, 0x73, 0x9C, 0x02, 0x79, 0x32,
|
|
||||||
0x30, 0xDF, 0x74, 0xDF, 0x75, 0x19, 0xF4, 0xA5, 0x14, 0x5C, 0xF7, 0x7A, 0xA8, 0xA5, 0x91, 0x84,
|
|
||||||
0x7C, 0x60, 0x03, 0x06, 0x3B, 0xCD, 0x50, 0xB6, 0x27, 0x9C, 0xFE, 0xB1, 0xDD, 0xCC, 0xD3, 0xB0,
|
|
||||||
0x59, 0x24, 0xB2, 0xCA, 0xE2, 0x1C, 0x81, 0x22, 0x9D, 0x07, 0x8F, 0x8E, 0xB9, 0xBE, 0x4E, 0xFA,
|
|
||||||
0xFC, 0x39, 0x65, 0xBA, 0xBF, 0x9D, 0x12, 0x37, 0x5E, 0x97, 0x7E, 0xF3, 0x89, 0xF5, 0x5D, 0xF5,
|
|
||||||
0xE3, 0x09, 0x8C, 0x62, 0xB5, 0x20, 0x9D, 0x0C, 0x53, 0x8A, 0x68, 0x1B, 0xD2, 0x8F, 0x75, 0x17,
|
|
||||||
0x5D, 0xD4, 0xE5, 0xDA, 0x75, 0x62, 0x19, 0x14, 0x6A, 0x26, 0x2D, 0xEB, 0xF8, 0xAF, 0x37, 0xF0,
|
|
||||||
0x6C, 0xA4, 0x55, 0xB1, 0xBC, 0xE2, 0x33, 0xC0, 0x9A, 0xCA, 0xB0, 0x11, 0x49, 0x4F, 0x68, 0x9B,
|
|
||||||
0x3B, 0x6B, 0x3C, 0xCC, 0x13, 0xF6, 0xC7, 0x85, 0x61, 0x68, 0x42, 0xAE, 0xBB, 0xDD, 0xCD, 0x45,
|
|
||||||
0x16, 0x29, 0x1D, 0xEA, 0xDB, 0xC8, 0x03, 0x94, 0x3C, 0xEE, 0x4F, 0x82, 0x11, 0xC3, 0xEC, 0x28,
|
|
||||||
0xBD, 0x97, 0x05, 0x99, 0xDE, 0xD7, 0xBB, 0x5E, 0x22, 0x1F, 0xD4, 0xEB, 0x64, 0xD9, 0x92, 0xD9,
|
|
||||||
0x85, 0xB7, 0x6A, 0x05, 0x6A, 0xE4, 0x24, 0x41, 0xF1, 0xCD, 0xF0, 0xD8, 0x3F, 0xF8, 0x9E, 0x0E,
|
|
||||||
0xCD, 0x0B, 0x7A, 0x70, 0x6B, 0x5A, 0x75, 0x0A, 0x6A, 0x33, 0x88, 0xEC, 0x17, 0x75, 0x08, 0x70,
|
|
||||||
0x10, 0x2F, 0x24, 0xCF, 0xC4, 0xE9, 0x42, 0x00, 0x61, 0x94, 0xCA, 0x1F, 0x3A, 0x76, 0x06, 0xFA,
|
|
||||||
0xD2, 0x48, 0x81, 0xF0, 0x77, 0x60, 0x03, 0x45, 0xD9, 0x61, 0xF4, 0xA4, 0x6F, 0x3D, 0xD9, 0x30,
|
|
||||||
0xC3, 0x04, 0x6B, 0x54, 0x2A, 0xB7, 0xEC, 0x3B, 0xF4, 0x4B, 0xF5, 0x68, 0x52, 0x26, 0xCE, 0xFF,
|
|
||||||
0x5D, 0x19, 0x91, 0xA0, 0xA3, 0xA5, 0xA9, 0xB1, 0xE0, 0x23, 0xC4, 0x0A, 0x77, 0x4D, 0xF9, 0x51,
|
|
||||||
0x20, 0xA3, 0xA5, 0xA9, 0xB1, 0xC1, 0x00, 0x82, 0x86, 0x8E, 0x7F, 0x5D, 0x19, 0x91, 0xA0, 0xA3,
|
|
||||||
0xC4, 0xEB, 0x54, 0x0B, 0x75, 0x68, 0x52, 0x07, 0x8C, 0x9A, 0x97, 0x8D, 0x79, 0x70, 0x62, 0x46,
|
|
||||||
0xEF, 0x5C, 0x1B, 0x95, 0x89, 0x71, 0x41, 0xE1, 0x21, 0xA1, 0xA1, 0xA1, 0xC0, 0x02, 0x67, 0x4C,
|
|
||||||
0x1A, 0xB6, 0xCF, 0xFD, 0x78, 0x53, 0x24, 0xAB, 0xB5, 0xC9, 0xF1, 0x60, 0x23, 0xA5, 0xC8, 0x12,
|
|
||||||
0x87, 0x6D, 0x58, 0x13, 0x85, 0x88, 0x92, 0x87, 0x6D, 0x58, 0x32, 0xC7, 0x0C, 0x9A, 0x97, 0xAC,
|
|
||||||
0xDA, 0x36, 0xEE, 0x5E, 0x3E, 0xDF, 0x1D, 0xB8, 0xF2, 0x66, 0x2F, 0xBD, 0xF8, 0x72, 0x47, 0xED,
|
|
||||||
0x58, 0x13, 0x85, 0x88, 0x92, 0x87, 0x8C, 0x7B, 0x55, 0x09, 0x90, 0xA2, 0xC6, 0xEF, 0x3D, 0xF8,
|
|
||||||
0x53, 0x24, 0xAB, 0xD4, 0x2A, 0xB7, 0xEC, 0x5A, 0x36, 0xEE, 0x5E, 0x3E, 0xDF, 0x3C, 0xFA, 0x76,
|
|
||||||
0x4F, 0xFD, 0x59, 0x30, 0xE2, 0x46, 0xEF, 0x3D, 0xF8, 0x53, 0x05, 0x69, 0x31, 0xC1, 0x00, 0x82,
|
|
||||||
0x86, 0x8E, 0x7F, 0x5D, 0x19, 0xB0, 0xE2, 0x27, 0xCC, 0xFB, 0x74, 0x4B, 0x14, 0x8B, 0x94, 0x8B,
|
|
||||||
0x75, 0x68, 0x33, 0xC5, 0x08, 0x92, 0x87, 0x8C, 0x9A, 0xB6, 0xCF, 0x1C, 0xBA, 0xD7, 0x0D, 0x98,
|
|
||||||
0xB2, 0xE6, 0x2F, 0xDC, 0x1B, 0x95, 0x89, 0x71, 0x60, 0x23, 0xC4, 0x0A, 0x96, 0x8F, 0x9C, 0xBA,
|
|
||||||
0xF6, 0x6E, 0x3F, 0xFC, 0x5B, 0x15, 0xA8, 0xD2, 0x26, 0xAF, 0xBD, 0xF8, 0x72, 0x66, 0x2F, 0xDC,
|
|
||||||
0x1B, 0xB4, 0xCB, 0x14, 0x8B, 0x94, 0xAA, 0xB7, 0xCD, 0xF9, 0x51, 0x01, 0x80, 0x82, 0x86, 0x6F,
|
|
||||||
0x3D, 0xD9, 0x30, 0xE2, 0x27, 0xCC, 0xFB, 0x74, 0x4B, 0x14, 0xAA, 0xB7, 0xCD, 0xF9, 0x70, 0x43,
|
|
||||||
0x04, 0x6B, 0x35, 0xC9, 0xF1, 0x60, 0x23, 0xA5, 0xC8, 0xF3, 0x45, 0x08, 0x92, 0x87, 0x6D, 0x58,
|
|
||||||
0x32, 0xE6, 0x2F, 0xBD, 0xF8, 0x72, 0x66, 0x4E, 0x1E, 0xBE, 0xFE, 0x7E, 0x7E, 0x7E, 0x5F, 0x1D,
|
|
||||||
0x99, 0x91, 0xA0, 0xA3, 0xC4, 0x0A, 0x77, 0x4D, 0x18, 0x93, 0xA4, 0xAB, 0xD4, 0x0B, 0x75, 0x49,
|
|
||||||
0x10, 0xA2, 0xC6, 0xEF, 0x3D, 0xF8, 0x53, 0x24, 0xAB, 0xB5, 0xE8, 0x33, 0xE4, 0x4A, 0x16, 0xAE,
|
|
||||||
0xDE, 0x1F, 0xBC, 0xDB, 0x15, 0xA8, 0xB3, 0xC5, 0x08, 0x73, 0x45, 0xE9, 0x31, 0xC1, 0xE1, 0x21,
|
|
||||||
0xA1, 0xA1, 0xA1, 0xC0, 0x02, 0x86, 0x6F, 0x5C, 0x3A, 0xD7, 0x0D, 0x98, 0x93, 0xA4, 0xCA, 0x16,
|
|
||||||
0xAE, 0xDE, 0x1F, 0x9D, 0x99, 0xB0, 0xE2, 0x46, 0xEF, 0x3D, 0xF8, 0x72, 0x47, 0x0C, 0x9A, 0xB6,
|
|
||||||
0xCF, 0xFD, 0x59, 0x11, 0xA0, 0xA3, 0xA5, 0xC8, 0xF3, 0x45, 0x08, 0x92, 0x87, 0x6D, 0x39, 0xF0,
|
|
||||||
0x43, 0x04, 0x8A, 0x96, 0xAE, 0xDE, 0x3E, 0xDF, 0x1D, 0x99, 0x91, 0xA0, 0xC2, 0x06, 0x6F, 0x3D,
|
|
||||||
0xF8, 0x72, 0x47, 0x0C, 0x9A, 0x97, 0x8D, 0x98, 0x93, 0x85, 0x88, 0x73, 0x45, 0xE9, 0x31, 0xE0,
|
|
||||||
0x23, 0xA5, 0xA9, 0xD0, 0x03, 0x84, 0x8A, 0x96, 0xAE, 0xDE, 0x1F, 0xBC, 0xDB, 0x15, 0xA8, 0xD2,
|
|
||||||
0x26, 0xCE, 0xFF, 0x5D, 0x19, 0x91, 0x81, 0x80, 0x82, 0x67, 0x2D, 0xD8, 0x13, 0xA4, 0xAB, 0xD4,
|
|
||||||
0x0B, 0x94, 0xAA, 0xB7, 0xCD, 0xF9, 0x51, 0x20, 0xA3, 0xA5, 0xC8, 0xF3, 0x45, 0xE9, 0x50, 0x22,
|
|
||||||
0xC6, 0xEF, 0x5C, 0x3A, 0xD7, 0x0D, 0x98, 0x93, 0x85, 0x88, 0x73, 0x64, 0x4A, 0xF7, 0x4D, 0xF9,
|
|
||||||
0x51, 0x20, 0xA3, 0xC4, 0x0A, 0x96, 0xAE, 0xDE, 0x3E, 0xFE, 0x7E, 0x7E, 0x7E, 0x5F, 0x3C, 0xFA,
|
|
||||||
0x76, 0x4F, 0xFD, 0x78, 0x72, 0x66, 0x2F, 0xBD, 0xD9, 0x30, 0xC3, 0xE5, 0x48, 0x12, 0x87, 0x8C,
|
|
||||||
0x7B, 0x55, 0x28, 0xD2, 0x07, 0x8C, 0x9A, 0x97, 0xAC, 0xDA, 0x17, 0x8D, 0x79, 0x51, 0x20, 0xA3,
|
|
||||||
0xC4, 0xEB, 0x54, 0x0B, 0x94, 0x8B, 0x94, 0xAA, 0xD6, 0x2E, 0xBF, 0xFC, 0x5B, 0x15, 0xA8, 0xD2,
|
|
||||||
0x26, 0xAF, 0xDC, 0x1B, 0xB4, 0xEA, 0x37, 0xEC, 0x3B, 0xF4, 0x6A, 0x37, 0xCD, 0x18, 0x93, 0x85,
|
|
||||||
0x69, 0x31, 0xC1, 0xE1, 0x40, 0xE3, 0x25, 0xC8, 0x12, 0x87, 0x8C, 0x9A, 0xB6, 0xCF, 0xFD, 0x59,
|
|
||||||
0x11, 0xA0, 0xC2, 0x06, 0x8E, 0x7F, 0x5D, 0x38, 0xF2, 0x47, 0x0C, 0x7B, 0x74, 0x6A, 0x37, 0xEC,
|
|
||||||
0x5A, 0x36, 0xEE, 0x3F, 0xFC, 0x7A, 0x76, 0x4F, 0x1C, 0x9B, 0x95, 0x89, 0x71, 0x41, 0x00, 0x63,
|
|
||||||
0x44, 0xEB, 0x54, 0x2A, 0xD6, 0x0F, 0x9C, 0xBA, 0xD7, 0x0D, 0x98, 0x93, 0x85, 0x69, 0x31, 0xC1,
|
|
||||||
0x00, 0x82, 0x86, 0x8E, 0x9E, 0xBE, 0xDF, 0x3C, 0xFA, 0x57, 0x2C, 0xDA, 0x36, 0xEE, 0x3F, 0xFC,
|
|
||||||
0x5B, 0x15, 0x89, 0x71, 0x41, 0x00, 0x82, 0x86, 0x8E, 0x7F, 0x5D, 0x38, 0xF2, 0x47, 0xED, 0x58,
|
|
||||||
0x13, 0xA4, 0xCA, 0xF7, 0x4D, 0xF9, 0x51, 0x01, 0x80, 0x63, 0x44, 0xEB, 0x54, 0x2A, 0xD6, 0x2E,
|
|
||||||
0xBF, 0xDD, 0x19, 0x91, 0xA0, 0xA3, 0xA5, 0xA9, 0xB1, 0xE0, 0x42, 0x06, 0x8E, 0x7F, 0x5D, 0x19,
|
|
||||||
0x91, 0xA0, 0xA3, 0xC4, 0x0A, 0x96, 0x8F, 0x7D, 0x78, 0x72, 0x47, 0x0C, 0x7B, 0x74, 0x6A, 0x56,
|
|
||||||
0x2E, 0xDE, 0x1F, 0xBC, 0xFA, 0x57, 0x0D, 0x79, 0x51, 0x01, 0x61, 0x21, 0xA1, 0xC0, 0xE3, 0x25,
|
|
||||||
0xA9, 0xB1, 0xC1, 0xE1, 0x40, 0x02, 0x67, 0x4C, 0x1A, 0x97, 0x8D, 0x98, 0x93, 0xA4, 0xAB, 0xD4,
|
|
||||||
0x2A, 0xD6, 0x0F, 0x9C, 0x9B, 0xB4, 0xCB, 0x14, 0xAA, 0xB7, 0xCD, 0xF9, 0x51, 0x20, 0xA3, 0xC4,
|
|
||||||
0xEB, 0x35, 0xC9, 0xF1, 0x60, 0x42, 0x06, 0x8E, 0x7F, 0x7C, 0x7A, 0x76, 0x6E, 0x3F, 0xFC, 0x7A,
|
|
||||||
0x76, 0x6E, 0x5E, 0x3E, 0xFE, 0x7E, 0x5F, 0x3C, 0xDB, 0x15, 0x89, 0x71, 0x41, 0xE1, 0x21, 0xC0,
|
|
||||||
0xE3, 0x44, 0xEB, 0x54, 0x2A, 0xB7, 0xCD, 0xF9, 0x70, 0x62, 0x27, 0xAD, 0xD8, 0x32, 0xC7, 0x0C,
|
|
||||||
0x7B, 0x74, 0x4B, 0x14, 0xAA, 0xB7, 0xEC, 0x3B, 0xD5, 0x28, 0xD2, 0x07, 0x6D, 0x39, 0xD1, 0x20,
|
|
||||||
0xC2, 0xE7, 0x4C, 0x1A, 0x97, 0x8D, 0x98, 0xB2, 0xC7, 0x0C, 0x59, 0x28, 0xF3, 0x9B
|
|
||||||
};
|
|
||||||
|
@ -28,285 +28,5 @@ void pmw33xx_set_cpi(uint8_t sensor, uint16_t cpi) {
|
|||||||
pmw33xx_write(sensor, REG_Resolution_L, cpival & 0xFF);
|
pmw33xx_write(sensor, REG_Resolution_L, cpival & 0xFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
// PID, Inverse PID, SROM version
|
// PID, Inverse PID
|
||||||
const uint8_t pmw33xx_firmware_signature[3] PROGMEM = {0x42, 0xBD, 0x04};
|
const uint8_t pmw33xx_firmware_signature[2] PROGMEM = {0x42, 0xBD};
|
||||||
|
|
||||||
// Firmware Blob for PMW3389
|
|
||||||
// clang-format off
|
|
||||||
const uint8_t pmw33xx_firmware_data[PMW33XX_FIRMWARE_LENGTH] PROGMEM = {
|
|
||||||
0x01, 0xe8, 0xba, 0x26, 0x0b, 0xb2, 0xbe, 0xfe, 0x7e, 0x5f, 0x3c, 0xdb, 0x15, 0xa8, 0xb3,
|
|
||||||
0xe4, 0x2b, 0xb5, 0xe8, 0x53, 0x07, 0x6d, 0x3b, 0xd1, 0x20, 0xc2, 0x06, 0x6f, 0x3d, 0xd9,
|
|
||||||
0x11, 0xa0, 0xc2, 0xe7, 0x2d, 0xb9, 0xd1, 0x20, 0xa3, 0xa5, 0xc8, 0xf3, 0x64, 0x4a, 0xf7,
|
|
||||||
0x4d, 0x18, 0x93, 0xa4, 0xca, 0xf7, 0x6c, 0x5a, 0x36, 0xee, 0x5e, 0x3e, 0xfe, 0x7e, 0x7e,
|
|
||||||
0x5f, 0x1d, 0x99, 0xb0, 0xc3, 0xe5, 0x29, 0xd3, 0x03, 0x65, 0x48, 0x12, 0x87, 0x6d, 0x58,
|
|
||||||
0x32, 0xe6, 0x2f, 0xdc, 0x3a, 0xf2, 0x4f, 0xfd, 0x59, 0x11, 0x81, 0x61, 0x21, 0xc0, 0x02,
|
|
||||||
0x86, 0x8e, 0x7f, 0x5d, 0x38, 0xf2, 0x47, 0x0c, 0x7b, 0x55, 0x28, 0xb3, 0xe4, 0x4a, 0x16,
|
|
||||||
0xab, 0xbf, 0xdd, 0x38, 0xf2, 0x66, 0x4e, 0xff, 0x5d, 0x19, 0x91, 0xa0, 0xa3, 0xa5, 0xc8,
|
|
||||||
0x12, 0xa6, 0xaf, 0xdc, 0x3a, 0xd1, 0x41, 0x60, 0x75, 0x58, 0x24, 0x92, 0xd4, 0x72, 0x6c,
|
|
||||||
0xe0, 0x2f, 0xfd, 0x23, 0x8d, 0x1c, 0x5b, 0xb2, 0x97, 0x36, 0x3d, 0x0b, 0xa2, 0x49, 0xb1,
|
|
||||||
0x58, 0xf2, 0x1f, 0xc0, 0xcb, 0xf8, 0x41, 0x4f, 0xcd, 0x1e, 0x6b, 0x39, 0xa7, 0x2b, 0xe9,
|
|
||||||
0x30, 0x16, 0x83, 0xd2, 0x0e, 0x47, 0x8f, 0xe3, 0xb1, 0xdf, 0xa2, 0x15, 0xdb, 0x5d, 0x30,
|
|
||||||
0xc5, 0x1a, 0xab, 0x31, 0x99, 0xf3, 0xfa, 0xb2, 0x86, 0x69, 0xad, 0x7a, 0xe8, 0xa7, 0x18,
|
|
||||||
0x6a, 0xcc, 0xc8, 0x65, 0x23, 0x87, 0xa8, 0x5f, 0xf5, 0x21, 0x59, 0x75, 0x09, 0x71, 0x45,
|
|
||||||
0x55, 0x25, 0x4b, 0xda, 0xa1, 0xc3, 0xf7, 0x41, 0xab, 0x59, 0xd9, 0x74, 0x12, 0x55, 0x5f,
|
|
||||||
0xbc, 0xaf, 0xd9, 0xfd, 0xb0, 0x1e, 0xa3, 0x0f, 0xff, 0xde, 0x11, 0x16, 0x6a, 0xae, 0x0e,
|
|
||||||
0xe1, 0x5d, 0x3c, 0x10, 0x43, 0x9a, 0xa1, 0x0b, 0x24, 0x8f, 0x0d, 0x7f, 0x0b, 0x5e, 0x4c,
|
|
||||||
0x42, 0xa4, 0x84, 0x2c, 0x40, 0xd0, 0x55, 0x39, 0xe6, 0x4b, 0xf8, 0x9b, 0x2f, 0xdc, 0x28,
|
|
||||||
0xff, 0xfa, 0xb5, 0x85, 0x19, 0xe5, 0x28, 0xa1, 0x77, 0xaa, 0x73, 0xf3, 0x03, 0xc7, 0x62,
|
|
||||||
0xa6, 0x91, 0x18, 0xc9, 0xb0, 0xcd, 0x05, 0xdc, 0xca, 0x81, 0x26, 0x1a, 0x47, 0x40, 0xda,
|
|
||||||
0x36, 0x7d, 0x6a, 0x53, 0xc8, 0x5a, 0x77, 0x5d, 0x19, 0xa4, 0x1b, 0x23, 0x83, 0xd0, 0xb2,
|
|
||||||
0xaa, 0x0e, 0xbf, 0x77, 0x4e, 0x3a, 0x3b, 0x59, 0x00, 0x31, 0x0d, 0x02, 0x1b, 0x88, 0x7a,
|
|
||||||
0xd4, 0xbd, 0x9d, 0xcc, 0x58, 0x04, 0x69, 0xf6, 0x3b, 0xca, 0x42, 0xe2, 0xfd, 0xc3, 0x3d,
|
|
||||||
0x39, 0xc5, 0xd0, 0x71, 0xe4, 0xc8, 0xb7, 0x3e, 0x3f, 0xc8, 0xe9, 0xca, 0xc9, 0x3f, 0x04,
|
|
||||||
0x4e, 0x1b, 0x79, 0xca, 0xa5, 0x61, 0xc2, 0xed, 0x1d, 0xa6, 0xda, 0x5a, 0xe9, 0x7f, 0x65,
|
|
||||||
0x8c, 0xbe, 0x12, 0x6e, 0xa4, 0x5b, 0x33, 0x2f, 0x84, 0x28, 0x9c, 0x1c, 0x88, 0x2d, 0xff,
|
|
||||||
0x07, 0xbf, 0xa6, 0xd7, 0x5a, 0x88, 0x86, 0xb0, 0x3f, 0xf6, 0x31, 0x5b, 0x11, 0x6d, 0xf5,
|
|
||||||
0x58, 0xeb, 0x58, 0x02, 0x9e, 0xb5, 0x9a, 0xb1, 0xff, 0x25, 0x9d, 0x8b, 0x4f, 0xb6, 0x0a,
|
|
||||||
0xf9, 0xea, 0x3e, 0x3f, 0x21, 0x09, 0x65, 0x21, 0x22, 0xfe, 0x3d, 0x4e, 0x11, 0x5b, 0x9e,
|
|
||||||
0x5a, 0x59, 0x8b, 0xdd, 0xd8, 0xce, 0xd6, 0xd9, 0x59, 0xd2, 0x1e, 0xfd, 0xef, 0x0d, 0x1b,
|
|
||||||
0xd9, 0x61, 0x7f, 0xd7, 0x2d, 0xad, 0x62, 0x09, 0xe5, 0x22, 0x63, 0xea, 0xc7, 0x31, 0xd9,
|
|
||||||
0xa1, 0x38, 0x80, 0x5c, 0xa7, 0x32, 0x82, 0xec, 0x1b, 0xa2, 0x49, 0x5a, 0x06, 0xd2, 0x7c,
|
|
||||||
0xc9, 0x96, 0x57, 0xbb, 0x17, 0x75, 0xfc, 0x7a, 0x8f, 0x0d, 0x77, 0xb5, 0x7a, 0x8e, 0x3e,
|
|
||||||
0xf4, 0xba, 0x2f, 0x69, 0x13, 0x26, 0xd6, 0xd9, 0x21, 0x60, 0x2f, 0x21, 0x3e, 0x87, 0xee,
|
|
||||||
0xfd, 0x87, 0x16, 0x0d, 0xc8, 0x08, 0x00, 0x25, 0x71, 0xac, 0x2c, 0x03, 0x2a, 0x37, 0x2d,
|
|
||||||
0xb3, 0x34, 0x09, 0x91, 0xe3, 0x06, 0x2c, 0x38, 0x37, 0x95, 0x3b, 0x17, 0x7a, 0xaf, 0xac,
|
|
||||||
0x99, 0x55, 0xab, 0x41, 0x39, 0x5f, 0x8e, 0xa6, 0x43, 0x80, 0x03, 0x88, 0x6f, 0x7d, 0xbd,
|
|
||||||
0x5a, 0xb4, 0x2b, 0x32, 0x23, 0x5a, 0xa9, 0x31, 0x32, 0x39, 0x4c, 0x5b, 0xf4, 0x6b, 0xaf,
|
|
||||||
0x66, 0x6f, 0x3c, 0x8e, 0x2d, 0x82, 0x97, 0x9f, 0x4a, 0x01, 0xdc, 0x99, 0x98, 0x00, 0xec,
|
|
||||||
0x38, 0x7a, 0x79, 0x70, 0xa6, 0x85, 0xd6, 0x21, 0x63, 0x0d, 0x45, 0x9a, 0x2e, 0x5e, 0xa7,
|
|
||||||
0xb1, 0xea, 0x66, 0x6a, 0xbc, 0x62, 0x2d, 0x7b, 0x7d, 0x85, 0xea, 0x95, 0x2f, 0xc0, 0xe8,
|
|
||||||
0x6f, 0x35, 0xa0, 0x3a, 0x02, 0x25, 0xbc, 0xb2, 0x5f, 0x5c, 0x43, 0x96, 0xcc, 0x26, 0xd2,
|
|
||||||
0x16, 0xb4, 0x96, 0x73, 0xd7, 0x13, 0xc7, 0xae, 0x53, 0x15, 0x31, 0x89, 0x68, 0x66, 0x6d,
|
|
||||||
0x2c, 0x92, 0x1f, 0xcc, 0x5b, 0xa7, 0x8f, 0x5d, 0xbb, 0xc9, 0xdb, 0xe8, 0x3b, 0x9d, 0x61,
|
|
||||||
0x74, 0x8b, 0x05, 0xa1, 0x58, 0x52, 0x68, 0xee, 0x3d, 0x39, 0x79, 0xa0, 0x9b, 0xdd, 0xe1,
|
|
||||||
0x55, 0xc9, 0x60, 0xeb, 0xad, 0xb8, 0x5b, 0xc2, 0x5a, 0xb5, 0x2c, 0x18, 0x55, 0xa9, 0x50,
|
|
||||||
0xc3, 0xf6, 0x72, 0x5f, 0xcc, 0xe2, 0xf4, 0x55, 0xb5, 0xd6, 0xb5, 0x4a, 0x99, 0xa5, 0x28,
|
|
||||||
0x74, 0x97, 0x18, 0xe8, 0xc0, 0x84, 0x89, 0x50, 0x03, 0x86, 0x4d, 0x1a, 0xb7, 0x09, 0x90,
|
|
||||||
0xa2, 0x01, 0x04, 0xbb, 0x73, 0x62, 0xcb, 0x97, 0x22, 0x70, 0x5d, 0x52, 0x41, 0x8e, 0xd9,
|
|
||||||
0x90, 0x15, 0xaa, 0xab, 0x0a, 0x31, 0x65, 0xb4, 0xda, 0xd0, 0xee, 0x24, 0xc9, 0x41, 0x91,
|
|
||||||
0x1e, 0xbc, 0x46, 0x70, 0x40, 0x9d, 0xda, 0x0e, 0x2a, 0xe4, 0xb2, 0x4c, 0x9f, 0xf2, 0xfc,
|
|
||||||
0xf3, 0x84, 0x17, 0x44, 0x1e, 0xd7, 0xca, 0x23, 0x1f, 0x3f, 0x5a, 0x22, 0x3d, 0xaf, 0x9b,
|
|
||||||
0x2d, 0xfc, 0x41, 0xad, 0x26, 0xb4, 0x45, 0x67, 0x0b, 0x80, 0x0e, 0xf9, 0x61, 0x37, 0xec,
|
|
||||||
0x3b, 0xf4, 0x4b, 0x14, 0xdf, 0x5a, 0x0c, 0x3a, 0x50, 0x0b, 0x14, 0x0c, 0x72, 0xae, 0xc6,
|
|
||||||
0xc5, 0xec, 0x35, 0x53, 0x2d, 0x59, 0xed, 0x91, 0x74, 0xe2, 0xc4, 0xc8, 0xf2, 0x25, 0x6b,
|
|
||||||
0x97, 0x6f, 0xc9, 0x76, 0xce, 0xa9, 0xb1, 0x99, 0x8f, 0x5a, 0x92, 0x3b, 0xc4, 0x8d, 0x54,
|
|
||||||
0x50, 0x40, 0x72, 0xd6, 0x90, 0x83, 0xfc, 0xe5, 0x49, 0x8b, 0x17, 0xf5, 0xfd, 0x6b, 0x8d,
|
|
||||||
0x32, 0x02, 0xe9, 0x0a, 0xfe, 0xbf, 0x00, 0x6b, 0xa3, 0xad, 0x5f, 0x09, 0x4b, 0x97, 0x2b,
|
|
||||||
0x00, 0x58, 0x65, 0x2e, 0x07, 0x49, 0x0a, 0x3b, 0x6b, 0x2e, 0x50, 0x6c, 0x1d, 0xac, 0xb7,
|
|
||||||
0x6a, 0x26, 0xd8, 0x13, 0xa4, 0xca, 0x16, 0xae, 0xab, 0x93, 0xb9, 0x1c, 0x1c, 0xb4, 0x47,
|
|
||||||
0x6a, 0x38, 0x36, 0x17, 0x27, 0xc9, 0x7f, 0xc7, 0x64, 0xcb, 0x89, 0x58, 0xc5, 0x61, 0xc2,
|
|
||||||
0xc6, 0xea, 0x15, 0x0b, 0x34, 0x0c, 0x5d, 0x61, 0x76, 0x6e, 0x2b, 0x62, 0x40, 0x92, 0xa3,
|
|
||||||
0x6c, 0xef, 0xf4, 0xe4, 0xc3, 0xa1, 0xa8, 0xf5, 0x94, 0x79, 0x0d, 0xd1, 0x3d, 0xcb, 0x3d,
|
|
||||||
0x40, 0xb6, 0xd0, 0xf0, 0x10, 0x54, 0xd8, 0x47, 0x25, 0x51, 0xc5, 0x41, 0x79, 0x00, 0xe5,
|
|
||||||
0xa0, 0x72, 0xde, 0xbb, 0x3b, 0x62, 0x17, 0xf6, 0xbc, 0x5d, 0x00, 0x76, 0x2e, 0xa7, 0x3b,
|
|
||||||
0xb6, 0xf1, 0x98, 0x72, 0x59, 0x2a, 0x73, 0xb0, 0x21, 0xd6, 0x49, 0xe0, 0xc0, 0xd5, 0xeb,
|
|
||||||
0x02, 0x7d, 0x4b, 0x41, 0x28, 0x70, 0x2d, 0xec, 0x2b, 0x71, 0x1f, 0x0b, 0xb9, 0x71, 0x63,
|
|
||||||
0x06, 0xe6, 0xbc, 0x60, 0xbb, 0xf4, 0x9a, 0x62, 0x43, 0x09, 0x18, 0x4e, 0x93, 0x06, 0x4d,
|
|
||||||
0x76, 0xfa, 0x7f, 0xbd, 0x02, 0xe4, 0x50, 0x91, 0x12, 0xe5, 0x86, 0xff, 0x64, 0x1e, 0xaf,
|
|
||||||
0x7e, 0xb3, 0xb2, 0xde, 0x89, 0xc1, 0xa2, 0x6f, 0x40, 0x7b, 0x41, 0x51, 0x63, 0xea, 0x25,
|
|
||||||
0xd1, 0x97, 0x57, 0x92, 0xa8, 0x45, 0xa1, 0xa5, 0x45, 0x21, 0x43, 0x7f, 0x83, 0x15, 0x29,
|
|
||||||
0xd0, 0x30, 0x53, 0x32, 0xb4, 0x5a, 0x17, 0x96, 0xbc, 0xc2, 0x68, 0xa9, 0xb7, 0xaf, 0xac,
|
|
||||||
0xdf, 0xf1, 0xe3, 0x89, 0xba, 0x24, 0x79, 0x54, 0xc6, 0x14, 0x07, 0x1c, 0x1e, 0x0d, 0x3a,
|
|
||||||
0x6b, 0xe5, 0x3d, 0x4e, 0x10, 0x60, 0x96, 0xec, 0x6c, 0xda, 0x47, 0xae, 0x03, 0x25, 0x39,
|
|
||||||
0x1d, 0x74, 0xc8, 0xac, 0x6a, 0xf2, 0x6b, 0x05, 0x2a, 0x9a, 0xe7, 0xe8, 0x92, 0xd6, 0xc2,
|
|
||||||
0x6d, 0xfa, 0xe8, 0xa7, 0x9d, 0x5f, 0x48, 0xc9, 0x75, 0xf1, 0x66, 0x6a, 0xdb, 0x5d, 0x9a,
|
|
||||||
0xcd, 0x27, 0xdd, 0xb9, 0x24, 0x04, 0x9c, 0x18, 0xc2, 0x6d, 0x0c, 0x91, 0x34, 0x48, 0x42,
|
|
||||||
0x6f, 0xe9, 0x59, 0x70, 0xc4, 0x7e, 0x81, 0x0e, 0x32, 0x0a, 0x93, 0x48, 0xb0, 0xc0, 0x15,
|
|
||||||
0x9e, 0x05, 0xac, 0x36, 0x16, 0xcb, 0x59, 0x65, 0xa0, 0x83, 0xdf, 0x3e, 0xda, 0xfb, 0x1d,
|
|
||||||
0x1a, 0xdb, 0x65, 0xec, 0x9a, 0xc6, 0xc3, 0x8e, 0x3c, 0x45, 0xfd, 0xc8, 0xf5, 0x1c, 0x6a,
|
|
||||||
0x67, 0x0d, 0x8f, 0x99, 0x7d, 0x30, 0x21, 0x8c, 0xea, 0x22, 0x87, 0x65, 0xc9, 0xb2, 0x4c,
|
|
||||||
0xe4, 0x1b, 0x46, 0xba, 0x54, 0xbd, 0x7c, 0xca, 0xd5, 0x8f, 0x5b, 0xa5, 0x01, 0x04, 0xd8,
|
|
||||||
0x0a, 0x16, 0xbf, 0xb9, 0x50, 0x2e, 0x37, 0x2f, 0x64, 0xf3, 0x70, 0x11, 0x02, 0x05, 0x31,
|
|
||||||
0x9b, 0xa0, 0xb2, 0x01, 0x5e, 0x4f, 0x19, 0xc9, 0xd4, 0xea, 0xa1, 0x79, 0x54, 0x53, 0xa7,
|
|
||||||
0xde, 0x2f, 0x49, 0xd3, 0xd1, 0x63, 0xb5, 0x03, 0x15, 0x4e, 0xbf, 0x04, 0xb3, 0x26, 0x8b,
|
|
||||||
0x20, 0xb2, 0x45, 0xcf, 0xcd, 0x5b, 0x82, 0x32, 0x88, 0x61, 0xa7, 0xa8, 0xb2, 0xa0, 0x72,
|
|
||||||
0x96, 0xc0, 0xdb, 0x2b, 0xe2, 0x5f, 0xba, 0xe3, 0xf5, 0x8a, 0xde, 0xf1, 0x18, 0x01, 0x16,
|
|
||||||
0x40, 0xd9, 0x86, 0x12, 0x09, 0x18, 0x1b, 0x05, 0x0c, 0xb1, 0xb5, 0x47, 0xe2, 0x43, 0xab,
|
|
||||||
0xfe, 0x92, 0x63, 0x7e, 0x95, 0x2b, 0xf0, 0xaf, 0xe1, 0xf1, 0xc3, 0x4a, 0xff, 0x2b, 0x09,
|
|
||||||
0xbb, 0x4a, 0x0e, 0x9a, 0xc4, 0xd8, 0x64, 0x7d, 0x83, 0xa0, 0x4f, 0x44, 0xdb, 0xc4, 0xa8,
|
|
||||||
0x58, 0xef, 0xfc, 0x9e, 0x77, 0xf9, 0xa6, 0x8f, 0x58, 0x8b, 0x12, 0xf4, 0xe9, 0x81, 0x12,
|
|
||||||
0x47, 0x51, 0x41, 0x83, 0xef, 0xf6, 0x73, 0xbc, 0x8e, 0x0f, 0x4c, 0x8f, 0x4e, 0x69, 0x90,
|
|
||||||
0x77, 0x29, 0x5d, 0x92, 0xb0, 0x6d, 0x06, 0x67, 0x29, 0x60, 0xbd, 0x4b, 0x17, 0xc8, 0x89,
|
|
||||||
0x69, 0x28, 0x29, 0xd6, 0x78, 0xcb, 0x11, 0x4c, 0xba, 0x8b, 0x68, 0xae, 0x7e, 0x9f, 0xef,
|
|
||||||
0x95, 0xda, 0xe2, 0x9e, 0x7f, 0xe9, 0x55, 0xe5, 0xe1, 0xe2, 0xb7, 0xe6, 0x5f, 0xbb, 0x2c,
|
|
||||||
0xa2, 0xe6, 0xee, 0xc7, 0x0a, 0x60, 0xa9, 0xd1, 0x80, 0xdf, 0x7f, 0xd6, 0x97, 0xab, 0x1d,
|
|
||||||
0x22, 0x25, 0xfc, 0x79, 0x23, 0xe0, 0xae, 0xc5, 0xef, 0x16, 0xa4, 0xa1, 0x0f, 0x92, 0xa9,
|
|
||||||
0xc7, 0xe3, 0x3a, 0x55, 0xdf, 0x62, 0x49, 0xd9, 0xf5, 0x84, 0x49, 0xc5, 0x90, 0x34, 0xd3,
|
|
||||||
0xe1, 0xac, 0x99, 0x21, 0xb1, 0x02, 0x76, 0x4a, 0xfa, 0xd4, 0xbb, 0xa4, 0x9c, 0xa2, 0xe2,
|
|
||||||
0xcb, 0x3d, 0x3b, 0x14, 0x75, 0x60, 0xd1, 0x02, 0xb4, 0xa3, 0xb4, 0x72, 0x06, 0xf9, 0x19,
|
|
||||||
0x9c, 0xe2, 0xe4, 0xa7, 0x0f, 0x25, 0x88, 0xc6, 0x86, 0xd6, 0x8c, 0x74, 0x4e, 0x6e, 0xfc,
|
|
||||||
0xa8, 0x48, 0x9e, 0xa7, 0x9d, 0x1a, 0x4b, 0x37, 0x09, 0xc8, 0xb0, 0x10, 0xbe, 0x6f, 0xfe,
|
|
||||||
0xa3, 0xc4, 0x7a, 0xb5, 0x3d, 0xe8, 0x30, 0xf1, 0x0d, 0xa0, 0xb2, 0x44, 0xfc, 0x9b, 0x8c,
|
|
||||||
0xf8, 0x61, 0xed, 0x81, 0xd1, 0x62, 0x11, 0xb4, 0xe1, 0xd5, 0x39, 0x52, 0x89, 0xd3, 0xa8,
|
|
||||||
0x49, 0x31, 0xdf, 0xb6, 0xf9, 0x91, 0xf4, 0x1c, 0x9d, 0x09, 0x95, 0x40, 0x56, 0xe7, 0xe3,
|
|
||||||
0xcd, 0x5c, 0x92, 0xc1, 0x1d, 0x6b, 0xe9, 0x78, 0x6f, 0x8e, 0x94, 0x42, 0x66, 0xa2, 0xaa,
|
|
||||||
0xd3, 0xc8, 0x2e, 0xe3, 0xf6, 0x07, 0x72, 0x0b, 0x6b, 0x1e, 0x7b, 0xb9, 0x7c, 0xe0, 0xa0,
|
|
||||||
0xbc, 0xd9, 0x25, 0xdf, 0x87, 0xa8, 0x5f, 0x9c, 0xcc, 0xf0, 0xdb, 0x42, 0x8e, 0x07, 0x31,
|
|
||||||
0x13, 0x01, 0x66, 0x32, 0xd1, 0xb8, 0xd6, 0xe3, 0x5e, 0x12, 0x76, 0x61, 0xd3, 0x38, 0x89,
|
|
||||||
0xe6, 0x17, 0x6f, 0xa5, 0xf2, 0x71, 0x0e, 0xa5, 0xe2, 0x88, 0x30, 0xbb, 0xbe, 0x8a, 0xea,
|
|
||||||
0xc7, 0x62, 0xc4, 0xcf, 0xb8, 0xcd, 0x33, 0x8d, 0x3d, 0x3e, 0xb5, 0x60, 0x3a, 0x03, 0x92,
|
|
||||||
0xe4, 0x6d, 0x1b, 0xe0, 0xb4, 0x84, 0x08, 0x55, 0x88, 0xa7, 0x3a, 0xb9, 0x3d, 0x43, 0xc3,
|
|
||||||
0xc0, 0xfa, 0x07, 0x6a, 0xca, 0x94, 0xad, 0x99, 0x55, 0xf1, 0xf1, 0xc0, 0x23, 0x87, 0x1d,
|
|
||||||
0x3d, 0x1c, 0xd1, 0x66, 0xa0, 0x57, 0x10, 0x52, 0xa2, 0x7f, 0xbe, 0xf9, 0x88, 0xb6, 0x02,
|
|
||||||
0xbf, 0x08, 0x23, 0xa9, 0x0c, 0x63, 0x17, 0x2a, 0xae, 0xf5, 0xf7, 0xb7, 0x21, 0x83, 0x92,
|
|
||||||
0x31, 0x23, 0x0d, 0x20, 0xc3, 0xc2, 0x05, 0x21, 0x62, 0x8e, 0x45, 0xe8, 0x14, 0xc1, 0xda,
|
|
||||||
0x75, 0xb8, 0xf8, 0x92, 0x01, 0xd0, 0x5d, 0x18, 0x9f, 0x99, 0x11, 0x19, 0xf5, 0x35, 0xe8,
|
|
||||||
0x7f, 0x20, 0x88, 0x8c, 0x05, 0x75, 0xf5, 0xd7, 0x40, 0x17, 0xbb, 0x1e, 0x36, 0x52, 0xd9,
|
|
||||||
0xa4, 0x9c, 0xc2, 0x9d, 0x42, 0x81, 0xd8, 0xc7, 0x8a, 0xe7, 0x4c, 0x81, 0xe0, 0xb7, 0x57,
|
|
||||||
0xed, 0x48, 0x8b, 0xf0, 0x97, 0x15, 0x61, 0xd9, 0x2c, 0x7c, 0x45, 0xaf, 0xc2, 0xcd, 0xfc,
|
|
||||||
0xaa, 0x13, 0xad, 0x59, 0xcc, 0xb2, 0xb2, 0x6e, 0xdd, 0x63, 0x9c, 0x32, 0x0f, 0xec, 0x83,
|
|
||||||
0xbe, 0x78, 0xac, 0x91, 0x44, 0x1a, 0x1f, 0xea, 0xfd, 0x5d, 0x8e, 0xb4, 0xc0, 0x84, 0xd4,
|
|
||||||
0xac, 0xb4, 0x87, 0x5f, 0xac, 0xef, 0xdf, 0xcd, 0x12, 0x56, 0xc8, 0xcd, 0xfe, 0xc5, 0xda,
|
|
||||||
0xd3, 0xc1, 0x69, 0xf3, 0x61, 0x05, 0xea, 0x25, 0xe2, 0x12, 0x05, 0x8f, 0x39, 0x08, 0x08,
|
|
||||||
0x7c, 0x37, 0xb6, 0x7e, 0x5b, 0xd8, 0xb1, 0x0e, 0xf2, 0xdb, 0x4b, 0xf1, 0xad, 0x90, 0x01,
|
|
||||||
0x57, 0xcd, 0xa0, 0xb4, 0x52, 0xe8, 0xf3, 0xd7, 0x8a, 0xbd, 0x4f, 0x9f, 0x21, 0x40, 0x72,
|
|
||||||
0xa4, 0xfc, 0x0b, 0x01, 0x2b, 0x2f, 0xb6, 0x4c, 0x95, 0x2d, 0x35, 0x33, 0x41, 0x6b, 0xa0,
|
|
||||||
0x93, 0xe7, 0x2c, 0xf2, 0xd3, 0x72, 0x8b, 0xf4, 0x4f, 0x15, 0x3c, 0xaf, 0xd6, 0x12, 0xde,
|
|
||||||
0x3f, 0x83, 0x3f, 0xff, 0xf8, 0x7f, 0xf6, 0xcc, 0xa6, 0x7f, 0xc9, 0x9a, 0x6e, 0x1f, 0xc1,
|
|
||||||
0x0c, 0xfb, 0xee, 0x9c, 0xe7, 0xaf, 0xc9, 0x26, 0x54, 0xef, 0xb0, 0x39, 0xef, 0xb2, 0xe9,
|
|
||||||
0x23, 0xc4, 0xef, 0xd1, 0xa1, 0xa4, 0x25, 0x24, 0x6f, 0x8d, 0x6a, 0xe5, 0x8a, 0x32, 0x3a,
|
|
||||||
0xaf, 0xfc, 0xda, 0xce, 0x18, 0x25, 0x42, 0x07, 0x4d, 0x45, 0x8b, 0xdf, 0x85, 0xcf, 0x55,
|
|
||||||
0xb2, 0x24, 0xfe, 0x9c, 0x69, 0x74, 0xa7, 0x6e, 0xa0, 0xce, 0xc0, 0x39, 0xf4, 0x86, 0xc6,
|
|
||||||
0x8d, 0xae, 0xb9, 0x48, 0x64, 0x13, 0x0b, 0x40, 0x81, 0xa2, 0xc9, 0xa8, 0x85, 0x51, 0xee,
|
|
||||||
0x9f, 0xcf, 0xa2, 0x8c, 0x19, 0x52, 0x48, 0xe2, 0xc1, 0xa8, 0x58, 0xb4, 0x10, 0x24, 0x06,
|
|
||||||
0x58, 0x51, 0xfc, 0xb9, 0x12, 0xec, 0xfd, 0x73, 0xb4, 0x6d, 0x84, 0xfa, 0x06, 0x8b, 0x05,
|
|
||||||
0x0b, 0x2d, 0xd6, 0xd6, 0x1f, 0x29, 0x82, 0x9f, 0x19, 0x12, 0x1e, 0xb2, 0x04, 0x8f, 0x7f,
|
|
||||||
0x4d, 0xbd, 0x30, 0x2e, 0xe3, 0xe0, 0x88, 0x29, 0xc5, 0x93, 0xd6, 0x6c, 0x1f, 0x29, 0x45,
|
|
||||||
0x91, 0xa7, 0x58, 0xcd, 0x05, 0x17, 0xd6, 0x6d, 0xb3, 0xca, 0x66, 0xcc, 0x3c, 0x4a, 0x74,
|
|
||||||
0xfd, 0x08, 0x10, 0xa6, 0x99, 0x92, 0x10, 0xd2, 0x85, 0xab, 0x6e, 0x1d, 0x0e, 0x8b, 0x26,
|
|
||||||
0x46, 0xd1, 0x6c, 0x84, 0xc0, 0x26, 0x43, 0x59, 0x68, 0xf0, 0x13, 0x1d, 0xfb, 0xe3, 0xd1,
|
|
||||||
0xd2, 0xb4, 0x71, 0x9e, 0xf2, 0x59, 0x6a, 0x33, 0x29, 0x79, 0xd2, 0xd7, 0x26, 0xf1, 0xae,
|
|
||||||
0x78, 0x9e, 0x1f, 0x0f, 0x3f, 0xe3, 0xe8, 0xd0, 0x27, 0x78, 0x77, 0xf6, 0xac, 0x9c, 0x56,
|
|
||||||
0x39, 0x73, 0x8a, 0x6b, 0x2f, 0x34, 0x78, 0xb1, 0x11, 0xdb, 0xa4, 0x5c, 0x80, 0x01, 0x71,
|
|
||||||
0x6a, 0xc2, 0xd1, 0x2e, 0x5e, 0x76, 0x28, 0x70, 0x93, 0xae, 0x3e, 0x78, 0xb0, 0x1f, 0x0f,
|
|
||||||
0xda, 0xbf, 0xfb, 0x8a, 0x67, 0x65, 0x4f, 0x91, 0xed, 0x49, 0x75, 0x78, 0x62, 0xa2, 0x93,
|
|
||||||
0xb5, 0x70, 0x7f, 0x4d, 0x08, 0x4e, 0x79, 0x61, 0xa8, 0x5f, 0x7f, 0xb4, 0x65, 0x9f, 0x91,
|
|
||||||
0x54, 0x3a, 0xe8, 0x50, 0x33, 0xd3, 0xd5, 0x8a, 0x7c, 0xf3, 0x9e, 0x8b, 0x77, 0x7b, 0xc6,
|
|
||||||
0xc6, 0x0c, 0x45, 0x95, 0x1f, 0xb0, 0xd0, 0x0b, 0x27, 0x4a, 0xfd, 0xc7, 0xf7, 0x0d, 0x5a,
|
|
||||||
0x43, 0xc9, 0x7d, 0x35, 0xb0, 0x7d, 0xc4, 0x9c, 0x57, 0x1e, 0x76, 0x0d, 0xf1, 0x95, 0x30,
|
|
||||||
0x71, 0xcc, 0xb3, 0x66, 0x3b, 0x63, 0xa8, 0x6c, 0xa3, 0x43, 0xa0, 0x24, 0xcc, 0xb7, 0x53,
|
|
||||||
0xfe, 0xfe, 0xbc, 0x6e, 0x60, 0x89, 0xaf, 0x16, 0x21, 0xc8, 0x91, 0x6a, 0x89, 0xce, 0x80,
|
|
||||||
0x2c, 0xf1, 0x59, 0xce, 0xc3, 0x60, 0x61, 0x3b, 0x0b, 0x19, 0xfe, 0x99, 0xac, 0x65, 0x90,
|
|
||||||
0x15, 0x12, 0x05, 0xac, 0x7e, 0xff, 0x98, 0x7b, 0x66, 0x64, 0x0e, 0x4b, 0x5b, 0xaa, 0x8d,
|
|
||||||
0x3b, 0xd2, 0x56, 0xcf, 0x99, 0x39, 0xee, 0x22, 0x81, 0xd0, 0x60, 0x06, 0x66, 0x20, 0x81,
|
|
||||||
0x48, 0x3c, 0x6f, 0x3a, 0x77, 0xba, 0xcb, 0x52, 0xac, 0x79, 0x56, 0xaf, 0xe9, 0x16, 0x17,
|
|
||||||
0x0a, 0xa3, 0x82, 0x08, 0xd5, 0x3c, 0x97, 0xcb, 0x09, 0xff, 0x7f, 0xf9, 0x4f, 0x60, 0x05,
|
|
||||||
0xb9, 0x53, 0x26, 0xaa, 0xb8, 0x50, 0xaa, 0x19, 0x25, 0xae, 0x5f, 0xea, 0x8a, 0xd0, 0x89,
|
|
||||||
0x12, 0x80, 0x43, 0x50, 0x24, 0x12, 0x21, 0x14, 0xcd, 0x77, 0xeb, 0x21, 0xcc, 0x5c, 0x09,
|
|
||||||
0x64, 0xf3, 0xc7, 0xcb, 0xc5, 0x4b, 0xc3, 0xe7, 0xed, 0xe7, 0x86, 0x2c, 0x1d, 0x8e, 0x19,
|
|
||||||
0x52, 0x9b, 0x2a, 0x0c, 0x18, 0x72, 0x0b, 0x1e, 0x1b, 0xb0, 0x0f, 0x42, 0x99, 0x04, 0xae,
|
|
||||||
0xd5, 0xb7, 0x89, 0x1a, 0xb9, 0x4f, 0xd6, 0xaf, 0xf3, 0xc9, 0x93, 0x6f, 0xb0, 0x60, 0x83,
|
|
||||||
0x6e, 0x6b, 0xd1, 0x5f, 0x3f, 0x1a, 0x83, 0x1e, 0x24, 0x00, 0x87, 0xb5, 0x3e, 0xdb, 0xf9,
|
|
||||||
0x4d, 0xa7, 0x16, 0x2e, 0x19, 0x5b, 0x8f, 0x1b, 0x0d, 0x47, 0x72, 0x42, 0xe9, 0x0a, 0x11,
|
|
||||||
0x08, 0x2d, 0x88, 0x1c, 0xbc, 0xc7, 0xb4, 0xbe, 0x29, 0x4d, 0x03, 0x5e, 0xec, 0xdf, 0xf3,
|
|
||||||
0x3d, 0x2f, 0xe8, 0x1d, 0x9a, 0xd2, 0xd1, 0xab, 0x41, 0x3d, 0x87, 0x11, 0x45, 0xb0, 0x0d,
|
|
||||||
0x46, 0xf5, 0xe8, 0x95, 0x62, 0x1c, 0x68, 0xf7, 0xa6, 0x5b, 0x39, 0x4e, 0xbf, 0x47, 0xba,
|
|
||||||
0x5d, 0x7f, 0xb7, 0x6a, 0xf4, 0xba, 0x1d, 0x69, 0xf6, 0xa4, 0xe7, 0xe4, 0x6b, 0x3b, 0x0d,
|
|
||||||
0x23, 0x16, 0x4a, 0xb2, 0x68, 0xf0, 0xb2, 0x0d, 0x09, 0x17, 0x6a, 0x63, 0x8c, 0x83, 0xd3,
|
|
||||||
0xbd, 0x05, 0xc9, 0xf6, 0xf0, 0xa1, 0x31, 0x0b, 0x2c, 0xac, 0x83, 0xac, 0x80, 0x34, 0x32,
|
|
||||||
0xb4, 0xec, 0xd0, 0xbc, 0x54, 0x82, 0x9a, 0xc8, 0xf6, 0xa0, 0x7d, 0xc6, 0x79, 0x73, 0xf4,
|
|
||||||
0x20, 0x99, 0xf3, 0xb4, 0x01, 0xde, 0x91, 0x27, 0xf2, 0xc0, 0xdc, 0x81, 0x00, 0x4e, 0x7e,
|
|
||||||
0x07, 0x99, 0xc8, 0x3a, 0x51, 0xbc, 0x38, 0xd6, 0x8a, 0xa2, 0xde, 0x3b, 0x6a, 0x8c, 0x1a,
|
|
||||||
0x7c, 0x81, 0x0f, 0x3a, 0x1f, 0xe4, 0x05, 0x7b, 0x20, 0x35, 0x6b, 0xa5, 0x6a, 0xa7, 0xe7,
|
|
||||||
0xbc, 0x9c, 0x20, 0xec, 0x00, 0x15, 0xe2, 0x51, 0xaf, 0x77, 0xeb, 0x29, 0x3c, 0x7d, 0x2e,
|
|
||||||
0x00, 0x5c, 0x81, 0x21, 0xfa, 0x35, 0x6f, 0x40, 0xef, 0xfb, 0xd1, 0x3f, 0xcc, 0x9d, 0x55,
|
|
||||||
0x53, 0xfb, 0x5a, 0xa5, 0x56, 0x89, 0x0b, 0x52, 0xeb, 0x57, 0x73, 0x4f, 0x1b, 0x67, 0x24,
|
|
||||||
0xcb, 0xb8, 0x6a, 0x10, 0x69, 0xd6, 0xfb, 0x52, 0x40, 0xff, 0x20, 0xa5, 0xf3, 0x72, 0xe1,
|
|
||||||
0x3d, 0xa4, 0x8c, 0x81, 0x66, 0x16, 0x0d, 0x5d, 0xad, 0xa8, 0x50, 0x25, 0x78, 0x31, 0x77,
|
|
||||||
0x0c, 0x57, 0xe4, 0xe9, 0x15, 0x2d, 0xdb, 0x07, 0x87, 0xc8, 0xb0, 0x43, 0xde, 0xfc, 0xfe,
|
|
||||||
0xa9, 0xeb, 0xf5, 0xb0, 0xd3, 0x7b, 0xe9, 0x1f, 0x6e, 0xca, 0xe4, 0x03, 0x95, 0xc5, 0xd1,
|
|
||||||
0x59, 0x72, 0x63, 0xf0, 0x86, 0x54, 0xe8, 0x16, 0x62, 0x0b, 0x35, 0x29, 0xc2, 0x68, 0xd0,
|
|
||||||
0xd6, 0x3e, 0x90, 0x60, 0x57, 0x1d, 0xc9, 0xed, 0x3f, 0xed, 0xb0, 0x2f, 0x7e, 0x97, 0x02,
|
|
||||||
0x51, 0xec, 0xee, 0x6f, 0x82, 0x74, 0x76, 0x7f, 0xfb, 0xd6, 0xc4, 0xc3, 0xdd, 0xe8, 0xb1,
|
|
||||||
0x60, 0xfc, 0xc6, 0xb9, 0x0d, 0x6a, 0x33, 0x78, 0xc6, 0xc1, 0xbf, 0x86, 0x2c, 0x50, 0xcc,
|
|
||||||
0x9a, 0x70, 0x8e, 0x7b, 0xec, 0xab, 0x95, 0xac, 0x53, 0xa0, 0x4b, 0x07, 0x88, 0xaf, 0x42,
|
|
||||||
0xed, 0x19, 0x8d, 0xf6, 0x32, 0x17, 0x48, 0x47, 0x1d, 0x41, 0x6f, 0xfe, 0x2e, 0xa7, 0x8f,
|
|
||||||
0x4b, 0xa0, 0x51, 0xf3, 0xbf, 0x02, 0x0a, 0x48, 0x58, 0xf7, 0xa1, 0x6d, 0xea, 0xa5, 0x13,
|
|
||||||
0x5a, 0x5b, 0xea, 0x0c, 0x9e, 0x52, 0x4f, 0x9e, 0xb9, 0x71, 0x7f, 0x23, 0x83, 0xda, 0x1b,
|
|
||||||
0x86, 0x9a, 0x41, 0x29, 0xda, 0x70, 0xe7, 0x64, 0xa1, 0x7b, 0xd5, 0x0a, 0x22, 0x0d, 0x5c,
|
|
||||||
0x40, 0xc4, 0x81, 0x07, 0x25, 0x35, 0x4a, 0x1c, 0x10, 0xdb, 0x45, 0x0a, 0xff, 0x36, 0xd4,
|
|
||||||
0xe0, 0xeb, 0x5f, 0x68, 0xd6, 0x67, 0xc6, 0xd0, 0x8b, 0x76, 0x1a, 0x7d, 0x59, 0x42, 0xa1,
|
|
||||||
0xcb, 0x96, 0x4d, 0x84, 0x09, 0x9a, 0x3d, 0xe0, 0x52, 0x85, 0x6e, 0x48, 0x90, 0x85, 0x2a,
|
|
||||||
0x63, 0xb2, 0x69, 0xd2, 0x00, 0x43, 0x31, 0x37, 0xb3, 0x52, 0xaf, 0x62, 0xfa, 0xc1, 0xe0,
|
|
||||||
0x03, 0xfb, 0x62, 0xaa, 0x88, 0xc9, 0xb2, 0x2c, 0xd5, 0xa8, 0xf5, 0xa5, 0x4c, 0x12, 0x59,
|
|
||||||
0x4e, 0x06, 0x5e, 0x9b, 0x15, 0x66, 0x11, 0xb2, 0x27, 0x92, 0xdc, 0x98, 0x59, 0xde, 0xdf,
|
|
||||||
0xfa, 0x9a, 0x32, 0x2e, 0xc0, 0x5d, 0x3c, 0x33, 0x41, 0x6d, 0xaf, 0xb2, 0x25, 0x23, 0x14,
|
|
||||||
0xa5, 0x7b, 0xc7, 0x9b, 0x68, 0xf3, 0xda, 0xeb, 0xe3, 0xa9, 0xe2, 0x6f, 0x0e, 0x1d, 0x1c,
|
|
||||||
0xba, 0x55, 0xb6, 0x34, 0x6a, 0x93, 0x1f, 0x1f, 0xb8, 0x34, 0xc8, 0x84, 0x08, 0xb1, 0x6b,
|
|
||||||
0x6a, 0x28, 0x74, 0x74, 0xe5, 0xeb, 0x75, 0xe9, 0x7c, 0xd8, 0xba, 0xd8, 0x42, 0xa5, 0xee,
|
|
||||||
0x1f, 0x80, 0xd9, 0x96, 0xb2, 0x2e, 0xe7, 0xbf, 0xba, 0xeb, 0xd1, 0x69, 0xbb, 0x8f, 0xfd,
|
|
||||||
0x5a, 0x63, 0x8f, 0x39, 0x7f, 0xdf, 0x1d, 0x37, 0xd2, 0x18, 0x35, 0x9d, 0xb6, 0xcc, 0xe4,
|
|
||||||
0x27, 0x81, 0x89, 0x38, 0x38, 0x68, 0x33, 0xe7, 0x78, 0xd8, 0x76, 0xf5, 0xee, 0xd0, 0x4a,
|
|
||||||
0x07, 0x69, 0x19, 0x7a, 0xad, 0x18, 0xb1, 0x94, 0x61, 0x45, 0x53, 0xa2, 0x48, 0xda, 0x96,
|
|
||||||
0x4a, 0xf9, 0xee, 0x94, 0x2a, 0x1f, 0x6e, 0x18, 0x3c, 0x92, 0x46, 0xd1, 0x1a, 0x28, 0x18,
|
|
||||||
0x32, 0x1f, 0x3a, 0x45, 0xbe, 0x04, 0x35, 0x92, 0xe5, 0xa3, 0xcb, 0xb5, 0x2e, 0x32, 0x43,
|
|
||||||
0xac, 0x65, 0x17, 0x89, 0x99, 0x15, 0x03, 0x9e, 0xb1, 0x23, 0x2f, 0xed, 0x76, 0x4d, 0xd8,
|
|
||||||
0xac, 0x21, 0x40, 0xc4, 0x99, 0x4e, 0x65, 0x71, 0x2c, 0xb3, 0x45, 0xab, 0xfb, 0xe7, 0x72,
|
|
||||||
0x39, 0x56, 0x30, 0x6d, 0xfb, 0x74, 0xeb, 0x99, 0xf3, 0xcd, 0x57, 0x5c, 0x78, 0x75, 0xe9,
|
|
||||||
0x8d, 0xc3, 0xa2, 0xfb, 0x5d, 0xe0, 0x90, 0xc5, 0x55, 0xad, 0x91, 0x53, 0x4e, 0x9e, 0xbd,
|
|
||||||
0x8c, 0x49, 0xa4, 0xa4, 0x69, 0x10, 0x0c, 0xc5, 0x76, 0xe9, 0x25, 0x86, 0x8d, 0x66, 0x23,
|
|
||||||
0xa8, 0xdb, 0x5c, 0xe8, 0xd9, 0x30, 0xe1, 0x15, 0x7b, 0xc0, 0x99, 0x0f, 0x03, 0xec, 0xaa,
|
|
||||||
0x12, 0xef, 0xce, 0xd4, 0xea, 0x55, 0x5c, 0x08, 0x86, 0xf4, 0xf4, 0xb0, 0x83, 0x42, 0x95,
|
|
||||||
0x37, 0xb6, 0x38, 0xe0, 0x2b, 0x54, 0x89, 0xbd, 0x4e, 0x20, 0x9d, 0x3f, 0xc3, 0x4b, 0xb7,
|
|
||||||
0xec, 0xfa, 0x5a, 0x14, 0x03, 0xcb, 0x64, 0xc8, 0x34, 0x4a, 0x4b, 0x6e, 0xf8, 0x6e, 0x56,
|
|
||||||
0xf6, 0xdd, 0x5f, 0xa1, 0x24, 0xe2, 0xd4, 0xd0, 0x82, 0x64, 0x1f, 0x8e, 0x9b, 0xfa, 0xb4,
|
|
||||||
0xcb, 0xdb, 0x0a, 0xe8, 0x15, 0xfc, 0x15, 0xab, 0x4b, 0x18, 0xbf, 0xd4, 0x42, 0x14, 0x48,
|
|
||||||
0x82, 0x85, 0xdd, 0xeb, 0x49, 0x1b, 0x0b, 0x0b, 0x05, 0xe9, 0xb4, 0xa1, 0x33, 0x0a, 0x5d,
|
|
||||||
0x0e, 0x6c, 0x4b, 0xc0, 0xd6, 0x6c, 0x7c, 0xfb, 0x69, 0x0b, 0x53, 0x19, 0xe4, 0xf3, 0x35,
|
|
||||||
0xfc, 0xbe, 0xa1, 0x34, 0x02, 0x09, 0x4f, 0x74, 0x86, 0x92, 0xcd, 0x5d, 0x1a, 0xc1, 0x27,
|
|
||||||
0x0c, 0xf2, 0xc5, 0xcf, 0xdd, 0x23, 0x93, 0x02, 0xbd, 0x41, 0x5e, 0x42, 0xf0, 0xa0, 0x9d,
|
|
||||||
0x0c, 0x72, 0xc8, 0xec, 0x32, 0x0a, 0x8a, 0xfd, 0x3d, 0x5a, 0x41, 0x27, 0x0c, 0x88, 0x59,
|
|
||||||
0xad, 0x94, 0x2e, 0xef, 0x5d, 0x8f, 0xc7, 0xdf, 0x66, 0xe4, 0xdd, 0x56, 0x6c, 0x7b, 0xca,
|
|
||||||
0x55, 0x81, 0xae, 0xae, 0x5c, 0x1b, 0x1a, 0xab, 0xae, 0x99, 0x8d, 0xcc, 0x42, 0x97, 0x59,
|
|
||||||
0xf4, 0x14, 0x3f, 0x75, 0xc6, 0xd1, 0x88, 0xba, 0xaa, 0x84, 0x4a, 0xd0, 0x34, 0x08, 0x3b,
|
|
||||||
0x7d, 0xdb, 0x15, 0x06, 0xb0, 0x5c, 0xbd, 0x40, 0xf5, 0xa8, 0xec, 0xae, 0x36, 0x40, 0xdd,
|
|
||||||
0x90, 0x1c, 0x3e, 0x0d, 0x7e, 0x73, 0xc7, 0xc2, 0xc5, 0x6a, 0xff, 0x52, 0x05, 0x7f, 0xbe,
|
|
||||||
0xd0, 0x92, 0xfd, 0xb3, 0x6f, 0xff, 0x5d, 0xb7, 0x97, 0x64, 0x73, 0x7b, 0xca, 0xd1, 0x98,
|
|
||||||
0x24, 0x6b, 0x0b, 0x01, 0x68, 0xdd, 0x27, 0x85, 0x85, 0xb5, 0x83, 0xc1, 0xe0, 0x50, 0x64,
|
|
||||||
0xc7, 0xaf, 0xf1, 0xc6, 0x4d, 0xb1, 0xef, 0xc9, 0xb4, 0x0a, 0x6d, 0x65, 0xf3, 0x47, 0xcc,
|
|
||||||
0xa3, 0x02, 0x21, 0x0c, 0xbe, 0x22, 0x29, 0x05, 0xcf, 0x5f, 0xe8, 0x94, 0x6c, 0xe5, 0xdc,
|
|
||||||
0xc4, 0xdf, 0xbe, 0x3e, 0xa8, 0xb4, 0x18, 0xb0, 0x99, 0xb8, 0x6f, 0xff, 0x5d, 0xb9, 0xfd,
|
|
||||||
0x3b, 0x5d, 0x16, 0xbf, 0x3e, 0xd8, 0xb3, 0xd8, 0x08, 0x34, 0xf6, 0x47, 0x35, 0x5b, 0x72,
|
|
||||||
0x1a, 0x33, 0xad, 0x52, 0x5d, 0xb8, 0xd0, 0x77, 0xc6, 0xab, 0xba, 0x55, 0x09, 0x5f, 0x02,
|
|
||||||
0xf8, 0xd4, 0x5f, 0x53, 0x06, 0x91, 0xcd, 0x74, 0x42, 0xae, 0x54, 0x91, 0x81, 0x62, 0x13,
|
|
||||||
0x6f, 0xd8, 0xa9, 0x77, 0xc3, 0x6c, 0xcb, 0xf1, 0x29, 0x5a, 0xcc, 0xda, 0x35, 0xbd, 0x52,
|
|
||||||
0x23, 0xbe, 0x59, 0xeb, 0x12, 0x6d, 0xb7, 0x53, 0xee, 0xfc, 0xb4, 0x1b, 0x13, 0x5e, 0xba,
|
|
||||||
0x16, 0x7c, 0xc5, 0xf3, 0xe3, 0x6d, 0x07, 0x78, 0xf5, 0x2b, 0x21, 0x05, 0x88, 0x4c, 0xc0,
|
|
||||||
0xa1, 0xe3, 0x36, 0x10, 0xf8, 0x1b, 0xd8, 0x17, 0xfb, 0x6a, 0x4e, 0xd8, 0xb3, 0x47, 0x2d,
|
|
||||||
0x99, 0xbd, 0xbb, 0x5d, 0x37, 0x7d, 0xba, 0xf1, 0xe1, 0x7c, 0xc0, 0xc5, 0x54, 0x62, 0x7f,
|
|
||||||
0xcf, 0x5a, 0x4a, 0x93, 0xcc, 0xf1, 0x1b, 0x34, 0xc8, 0xa6, 0x05, 0x4c, 0x55, 0x8b, 0x54,
|
|
||||||
0x84, 0xd5, 0x77, 0xeb, 0xc0, 0x6d, 0x3a, 0x29, 0xbd, 0x75, 0x61, 0x09, 0x9a, 0x2c, 0xbb,
|
|
||||||
0xf7, 0x18, 0x79, 0x34, 0x90, 0x24, 0xa5, 0x81, 0x70, 0x87, 0xc5, 0x02, 0x7c, 0xba, 0xd4,
|
|
||||||
0x5e, 0x14, 0x8e, 0xe4, 0xed, 0xa2, 0x61, 0x6a, 0xb9, 0x6e, 0xb5, 0x4a, 0xb9, 0x01, 0x46,
|
|
||||||
0xf4, 0xcf, 0xbc, 0x09, 0x2f, 0x27, 0x4b, 0xbd, 0x86, 0x7a, 0x10, 0xe1, 0xd4, 0xc8, 0xd9,
|
|
||||||
0x20, 0x8d, 0x8a, 0x63, 0x00, 0x63, 0x44, 0xeb, 0x54, 0x0b, 0x75, 0x49, 0x10, 0xa2, 0xa7,
|
|
||||||
0xad, 0xb9, 0xd1, 0x01, 0x80, 0x63, 0x25, 0xc8, 0x12, 0xa6, 0xce, 0x1e, 0xbe, 0xfe, 0x7e,
|
|
||||||
0x5f, 0x3c, 0xdb, 0x34, 0xea, 0x37, 0xec, 0x3b, 0xd5, 0x28, 0xd2, 0x07, 0x8c, 0x9a, 0xb6,
|
|
||||||
0xee, 0x5e, 0x3e, 0xdf, 0x1d, 0x99, 0xb0, 0xe2, 0x46, 0xef, 0x5c, 0x1b, 0xb4, 0xea, 0x56,
|
|
||||||
0x2e, 0xde, 0x1f, 0x9d, 0xb8, 0xd3, 0x24, 0xab, 0xd4, 0x2a, 0xd6, 0x2e, 0xde, 0x1f, 0x9d,
|
|
||||||
0xb8, 0xf2, 0x66, 0x2f, 0xbd, 0xf8, 0x72, 0x66, 0x4e, 0x1e, 0x9f, 0x9d, 0xb8, 0xf2, 0x47,
|
|
||||||
0x0c, 0x9a, 0xb6, 0xee, 0x3f, 0xfc, 0x7a, 0x57, 0x0d, 0x79, 0x70, 0x62, 0x27, 0xad, 0xb9,
|
|
||||||
0xd1, 0x01, 0x61, 0x40, 0x02, 0x67, 0x2d, 0xd8, 0x32, 0xe6, 0x2f, 0xdc, 0x3a, 0xd7, 0x2c,
|
|
||||||
0xbb, 0xf4, 0x4b, 0xf5, 0x49, 0xf1, 0x60, 0x23, 0xc4, 0x0a, 0x77, 0x4d, 0xf9, 0x51, 0x01,
|
|
||||||
0x80, 0x63, 0x25, 0xa9, 0xb1, 0xe0, 0x42, 0xe7, 0x4c, 0x1a, 0x97, 0xac, 0xbb, 0xf4, 0x6a,
|
|
||||||
0x37, 0xcd, 0x18, 0xb2, 0xe6, 0x2f, 0xdc, 0x1b, 0x95, 0xa8, 0xd2, 0x07, 0x6d, 0x58, 0x32,
|
|
||||||
0xe6, 0x4e, 0x1e, 0x9f, 0xbc, 0xfa, 0x57, 0x0d, 0x79, 0x51, 0x20, 0xc2, 0x06, 0x6f, 0x5c,
|
|
||||||
0x1b, 0x95, 0xa8, 0xb3, 0xc5, 0xe9, 0x31, 0xe0, 0x23, 0xc4, 0x0a, 0x77, 0x4d, 0x18, 0x93,
|
|
||||||
0x85, 0x69, 0x31, 0xc1, 0xe1, 0x21, 0xc0, 0xe3, 0x44, 0x0a, 0x77, 0x6c, 0x5a, 0x17, 0x8d,
|
|
||||||
0x98, 0x93, 0xa4, 0xab, 0xd4, 0x2a, 0xb7, 0xec, 0x5a, 0x17, 0xac, 0xbb, 0xf4, 0x4b, 0x14,
|
|
||||||
0xaa, 0xb7, 0xec, 0x3b, 0xd5, 0x28, 0xb3, 0xc5, 0xe9, 0x31, 0xc1, 0x00, 0x82, 0x67, 0x4c,
|
|
||||||
0xfb, 0x55, 0x28, 0xd2, 0x26, 0xaf, 0xbd, 0xd9, 0x11, 0x81, 0x61, 0x21, 0xa1, 0xa1, 0xc0,
|
|
||||||
0x02, 0x86, 0x6f, 0x5c, 0x1b, 0xb4, 0xcb, 0x14, 0x8b, 0x94, 0xaa, 0xd6, 0x2e, 0xbf, 0xdd,
|
|
||||||
0x19, 0xb0, 0xe2, 0x46, 0x0e, 0x7f, 0x7c, 0x5b, 0x15, 0x89, 0x90, 0x83, 0x84, 0x6b, 0x54,
|
|
||||||
0x0b, 0x75, 0x68, 0x52, 0x07, 0x6d, 0x58, 0x32, 0xc7, 0xed, 0x58, 0x32, 0xc7, 0xed, 0x58,
|
|
||||||
0x32, 0xe6, 0x4e, 0xff, 0x7c, 0x7a, 0x76, 0x6e, 0x3f, 0xdd, 0x38, 0xd3, 0x05, 0x88, 0x92,
|
|
||||||
0xa6, 0xaf, 0xdc, 0x1b, 0xb4, 0xcb, 0xf5, 0x68, 0x52, 0x07, 0x8c, 0x7b, 0x55, 0x09, 0x90,
|
|
||||||
0x83, 0x84, 0x6b, 0x54, 0x2a, 0xb7, 0xec, 0x3b, 0xd5, 0x09, 0x90, 0xa2, 0xc6, 0x0e, 0x7f,
|
|
||||||
0x7c, 0x7a, 0x57, 0x0d, 0x98, 0xb2, 0xc7, 0xed, 0x58, 0x32, 0xc7, 0x0c, 0x7b, 0x74, 0x4b,
|
|
||||||
0x14, 0x8b, 0x94, 0xaa, 0xb7, 0xcd, 0x18, 0x93, 0xa4, 0xca, 0x16, 0xae, 0xbf, 0xdd, 0x19,
|
|
||||||
0xb0, 0xe2, 0x46, 0x0e, 0x7f, 0x5d, 0x19, 0x91, 0x81, 0x80, 0x63, 0x44, 0xeb, 0x35, 0xc9,
|
|
||||||
0x10, 0x83, 0x65, 0x48, 0x12, 0xa6, 0xce, 0x1e, 0x9f, 0xbc, 0xdb, 0x15, 0x89, 0x71, 0x60,
|
|
||||||
0x23, 0xc4, 0xeb, 0x54, 0x2a, 0xb7, 0xec, 0x5a, 0x36, 0xcf, 0x81, 0x10, 0xac, 0x74
|
|
||||||
};
|
|
||||||
|
|
||||||
// clang-format off
|
|
||||||
|
@ -17,8 +17,6 @@
|
|||||||
#define PMW33XX_CPI_MIN 50
|
#define PMW33XX_CPI_MIN 50
|
||||||
#define PMW33XX_CPI_MAX 16000
|
#define PMW33XX_CPI_MAX 16000
|
||||||
|
|
||||||
#define PMW33XX_FIRMWARE_LENGTH 4094
|
|
||||||
|
|
||||||
// PMW3389 register addresses
|
// PMW3389 register addresses
|
||||||
// clang-format off
|
// clang-format off
|
||||||
#define REG_Product_ID 0x00
|
#define REG_Product_ID 0x00
|
||||||
|
@ -15,8 +15,7 @@
|
|||||||
#include "spi_master.h"
|
#include "spi_master.h"
|
||||||
#include "progmem.h"
|
#include "progmem.h"
|
||||||
|
|
||||||
extern const uint8_t pmw33xx_firmware_data[PMW33XX_FIRMWARE_LENGTH] PROGMEM;
|
extern const uint8_t pmw33xx_firmware_signature[2] PROGMEM;
|
||||||
extern const uint8_t pmw33xx_firmware_signature[3] PROGMEM;
|
|
||||||
|
|
||||||
static const pin_t cs_pins_left[] = PMW33XX_CS_PINS;
|
static const pin_t cs_pins_left[] = PMW33XX_CS_PINS;
|
||||||
static const pin_t cs_pins_right[] = PMW33XX_CS_PINS_RIGHT;
|
static const pin_t cs_pins_right[] = PMW33XX_CS_PINS_RIGHT;
|
||||||
@ -27,6 +26,21 @@ static bool in_burst_right[ARRAY_SIZE(cs_pins_right)] = {0};
|
|||||||
bool __attribute__((cold)) pmw33xx_upload_firmware(uint8_t sensor);
|
bool __attribute__((cold)) pmw33xx_upload_firmware(uint8_t sensor);
|
||||||
bool __attribute__((cold)) pmw33xx_check_signature(uint8_t sensor);
|
bool __attribute__((cold)) pmw33xx_check_signature(uint8_t sensor);
|
||||||
|
|
||||||
|
const pointing_device_driver_t pmw33xx_pointing_device_driver = {
|
||||||
|
.init = pmw33xx_init_wrapper,
|
||||||
|
.get_report = pmw33xx_get_report,
|
||||||
|
.set_cpi = pmw33xx_set_cpi_wrapper,
|
||||||
|
.get_cpi = pmw33xx_get_cpi_wrapper,
|
||||||
|
};
|
||||||
|
|
||||||
|
uint16_t __attribute__((weak)) pmw33xx_srom_get_length(void) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t __attribute__((weak)) pmw33xx_srom_get_byte(uint16_t position) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void pmw33xx_set_cpi_all_sensors(uint16_t cpi) {
|
void pmw33xx_set_cpi_all_sensors(uint16_t cpi) {
|
||||||
for (uint8_t sensor = 0; sensor < pmw33xx_number_of_sensors; sensor++) {
|
for (uint8_t sensor = 0; sensor < pmw33xx_number_of_sensors; sensor++) {
|
||||||
pmw33xx_set_cpi(sensor, cpi);
|
pmw33xx_set_cpi(sensor, cpi);
|
||||||
@ -89,10 +103,9 @@ uint8_t pmw33xx_read(uint8_t sensor, uint8_t reg_addr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool pmw33xx_check_signature(uint8_t sensor) {
|
bool pmw33xx_check_signature(uint8_t sensor) {
|
||||||
uint8_t signature_dump[3] = {
|
uint8_t signature_dump[2] = {
|
||||||
pmw33xx_read(sensor, REG_Product_ID),
|
pmw33xx_read(sensor, REG_Product_ID),
|
||||||
pmw33xx_read(sensor, REG_Inverse_Product_ID),
|
pmw33xx_read(sensor, REG_Inverse_Product_ID),
|
||||||
pmw33xx_read(sensor, REG_SROM_ID),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return memcmp(pmw33xx_firmware_signature, signature_dump, sizeof(signature_dump)) == 0;
|
return memcmp(pmw33xx_firmware_signature, signature_dump, sizeof(signature_dump)) == 0;
|
||||||
@ -115,10 +128,12 @@ bool pmw33xx_upload_firmware(uint8_t sensor) {
|
|||||||
spi_write(REG_SROM_Load_Burst | 0x80);
|
spi_write(REG_SROM_Load_Burst | 0x80);
|
||||||
wait_us(15);
|
wait_us(15);
|
||||||
|
|
||||||
for (size_t i = 0; i < PMW33XX_FIRMWARE_LENGTH; i++) {
|
for (size_t i = 0; i < pmw33xx_srom_get_length(); i++) {
|
||||||
spi_write(pgm_read_byte(pmw33xx_firmware_data + i));
|
spi_write(pmw33xx_srom_get_byte(i));
|
||||||
wait_us(15);
|
wait_us(15);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spi_stop();
|
||||||
wait_us(200);
|
wait_us(200);
|
||||||
|
|
||||||
pmw33xx_read(sensor, REG_SROM_ID);
|
pmw33xx_read(sensor, REG_SROM_ID);
|
||||||
@ -154,12 +169,14 @@ bool pmw33xx_init(uint8_t sensor) {
|
|||||||
pmw33xx_read(sensor, REG_Delta_Y_L);
|
pmw33xx_read(sensor, REG_Delta_Y_L);
|
||||||
pmw33xx_read(sensor, REG_Delta_Y_H);
|
pmw33xx_read(sensor, REG_Delta_Y_H);
|
||||||
|
|
||||||
#ifdef PMW33XX_UPLOAD_SROM
|
if (pmw33xx_srom_get_length() != 0) {
|
||||||
if (!pmw33xx_upload_firmware(sensor)) {
|
if (!pmw33xx_upload_firmware(sensor)) {
|
||||||
pd_dprintf("PMW33XX (%d): firmware upload failed!\n", sensor);
|
pd_dprintf("PMW33XX (%d): firmware upload failed!\n", sensor);
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pd_dprintf("PMW33XX (%d): firmware upload skipped.\n", sensor);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
spi_stop();
|
spi_stop();
|
||||||
|
|
||||||
@ -218,3 +235,38 @@ pmw33xx_report_t pmw33xx_read_burst(uint8_t sensor) {
|
|||||||
|
|
||||||
return report;
|
return report;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void pmw33xx_init_wrapper(void) {
|
||||||
|
pmw33xx_init(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void pmw33xx_set_cpi_wrapper(uint16_t cpi) {
|
||||||
|
pmw33xx_set_cpi(0, cpi);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t pmw33xx_get_cpi_wrapper(void) {
|
||||||
|
return pmw33xx_get_cpi(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
report_mouse_t pmw33xx_get_report(report_mouse_t mouse_report) {
|
||||||
|
pmw33xx_report_t report = pmw33xx_read_burst(0);
|
||||||
|
static bool in_motion = false;
|
||||||
|
|
||||||
|
if (report.motion.b.is_lifted) {
|
||||||
|
return mouse_report;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!report.motion.b.is_motion) {
|
||||||
|
in_motion = false;
|
||||||
|
return mouse_report;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!in_motion) {
|
||||||
|
in_motion = true;
|
||||||
|
pd_dprintf("PWM3360 (0): starting motion\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
mouse_report.x = CONSTRAIN_HID_XY(report.delta_x);
|
||||||
|
mouse_report.y = CONSTRAIN_HID_XY(report.delta_y);
|
||||||
|
return mouse_report;
|
||||||
|
}
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "spi_master.h"
|
#include "spi_master.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
#include "pointing_device.h"
|
||||||
|
|
||||||
#if defined(POINTING_DEVICE_DRIVER_pmw3360)
|
#if defined(POINTING_DEVICE_DRIVER_pmw3360)
|
||||||
# include "pmw3360.h"
|
# include "pmw3360.h"
|
||||||
@ -102,6 +103,10 @@ _Static_assert(sizeof((pmw33xx_report_t){0}.motion) == 1, "pmw33xx_report_t.moti
|
|||||||
|
|
||||||
#define CONSTRAIN(amt, low, high) ((amt) < (low) ? (low) : ((amt) > (high) ? (high) : (amt)))
|
#define CONSTRAIN(amt, low, high) ((amt) < (low) ? (low) : ((amt) > (high) ? (high) : (amt)))
|
||||||
|
|
||||||
|
#define pmw3360_pointing_device_driver pmw33xx_pointing_device_driver;
|
||||||
|
#define pmw3389_pointing_device_driver pmw33xx_pointing_device_driver;
|
||||||
|
const pointing_device_driver_t pmw33xx_pointing_device_driver;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Initializes the given sensor so it is in a working state and ready to
|
* @brief Initializes the given sensor so it is in a working state and ready to
|
||||||
* be polled for data.
|
* be polled for data.
|
||||||
@ -170,3 +175,8 @@ uint8_t pmw33xx_read(uint8_t sensor, uint8_t reg_addr);
|
|||||||
* @return false Write failed, do not proceed operation
|
* @return false Write failed, do not proceed operation
|
||||||
*/
|
*/
|
||||||
bool pmw33xx_write(uint8_t sensor, uint8_t reg_addr, uint8_t data);
|
bool pmw33xx_write(uint8_t sensor, uint8_t reg_addr, uint8_t data);
|
||||||
|
|
||||||
|
void pmw33xx_init_wrapper(void);
|
||||||
|
void pmw33xx_set_cpi_wrapper(uint16_t cpi);
|
||||||
|
uint16_t pmw33xx_get_cpi_wrapper(void);
|
||||||
|
report_mouse_t pmw33xx_get_report(report_mouse_t mouse_report);
|
||||||
|
15
drivers/ws2812.c
Normal file
15
drivers/ws2812.c
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// Copyright 2024 QMK
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include "ws2812.h"
|
||||||
|
|
||||||
|
#if defined(WS2812_RGBW)
|
||||||
|
void ws2812_rgb_to_rgbw(ws2812_led_t *led) {
|
||||||
|
// Determine lowest value in all three colors, put that into
|
||||||
|
// the white channel and then shift all colors by that amount
|
||||||
|
led->w = MIN(led->r, MIN(led->g, led->b));
|
||||||
|
led->r -= led->w;
|
||||||
|
led->g -= led->w;
|
||||||
|
led->b -= led->w;
|
||||||
|
}
|
||||||
|
#endif
|
@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "quantum/color.h"
|
#include "util.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The WS2812 datasheets define T1H 900ns, T0H 350ns, T1L 350ns, T0L 900ns. Hence, by default, these
|
* The WS2812 datasheets define T1H 900ns, T0H 350ns, T1L 350ns, T0L 900ns. Hence, by default, these
|
||||||
@ -62,17 +62,36 @@
|
|||||||
# define WS2812_LED_COUNT RGB_MATRIX_LED_COUNT
|
# define WS2812_LED_COUNT RGB_MATRIX_LED_COUNT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void ws2812_init(void);
|
#define WS2812_BYTE_ORDER_RGB 0
|
||||||
|
#define WS2812_BYTE_ORDER_GRB 1
|
||||||
|
#define WS2812_BYTE_ORDER_BGR 2
|
||||||
|
|
||||||
/* User Interface
|
#ifndef WS2812_BYTE_ORDER
|
||||||
*
|
# define WS2812_BYTE_ORDER WS2812_BYTE_ORDER_GRB
|
||||||
* Input:
|
#endif
|
||||||
* ledarray: An array of GRB data describing the LED colors
|
|
||||||
* number_of_leds: The number of LEDs to write
|
typedef struct PACKED ws2812_led_t {
|
||||||
*
|
#if (WS2812_BYTE_ORDER == WS2812_BYTE_ORDER_GRB)
|
||||||
* The functions will perform the following actions:
|
uint8_t g;
|
||||||
* - Set the data-out pin as output
|
uint8_t r;
|
||||||
* - Send out the LED data
|
uint8_t b;
|
||||||
* - Wait 50us to reset the LEDs
|
#elif (WS2812_BYTE_ORDER == WS2812_BYTE_ORDER_RGB)
|
||||||
*/
|
uint8_t r;
|
||||||
void ws2812_setleds(rgb_led_t *ledarray, uint16_t number_of_leds);
|
uint8_t g;
|
||||||
|
uint8_t b;
|
||||||
|
#elif (WS2812_BYTE_ORDER == WS2812_BYTE_ORDER_BGR)
|
||||||
|
uint8_t b;
|
||||||
|
uint8_t g;
|
||||||
|
uint8_t r;
|
||||||
|
#endif
|
||||||
|
#ifdef WS2812_RGBW
|
||||||
|
uint8_t w;
|
||||||
|
#endif
|
||||||
|
} ws2812_led_t;
|
||||||
|
|
||||||
|
void ws2812_init(void);
|
||||||
|
void ws2812_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
|
||||||
|
void ws2812_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
|
||||||
|
void ws2812_flush(void);
|
||||||
|
|
||||||
|
void ws2812_rgb_to_rgbw(ws2812_led_t *led);
|
||||||
|
@ -32,3 +32,5 @@
|
|||||||
#define USB_INTR_ENABLE_BIT PCIE
|
#define USB_INTR_ENABLE_BIT PCIE
|
||||||
#define USB_INTR_PENDING_BIT PCIF
|
#define USB_INTR_PENDING_BIT PCIF
|
||||||
#define USB_INTR_VECTOR SIG_PIN_CHANGE
|
#define USB_INTR_VECTOR SIG_PIN_CHANGE
|
||||||
|
|
||||||
|
#define WS2812_LED_COUNT 1
|
||||||
|
@ -6,13 +6,13 @@
|
|||||||
|
|
||||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
[0] = LAYOUT_ortho_1x1(
|
[0] = LAYOUT_ortho_1x1(
|
||||||
RGB_HUI
|
UG_HUEU
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
switch (keycode) {
|
switch (keycode) {
|
||||||
case RGB_HUI:
|
case QK_UNDERGLOW_HUE_UP:
|
||||||
rgblite_increase_hue();
|
rgblite_increase_hue();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -10,15 +10,15 @@ static inline void rgblite_init(void) {
|
|||||||
ws2812_init();
|
ws2812_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void rgblite_setrgb(RGB rgb) {
|
static inline void rgblite_setrgb(rgb_t rgb) {
|
||||||
rgb_led_t leds[RGBLIGHT_LED_COUNT] = {{.r = rgb.r, .g = rgb.g, .b = rgb.b}};
|
ws2812_set_color_all(rgb.r, rgb.g, rgb.b);
|
||||||
ws2812_setleds(leds, RGBLIGHT_LED_COUNT);
|
ws2812_flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rgblite_increase_hue(void) {
|
static void rgblite_increase_hue(void) {
|
||||||
static uint8_t state = 0;
|
static uint8_t state = 0;
|
||||||
|
|
||||||
HSV hsv = { 255, 255, 255 };
|
hsv_t hsv = { 255, 255, 255 };
|
||||||
hsv.h = state;
|
hsv.h = state;
|
||||||
state = (state + 8) % 256;
|
state = (state + 8) % 256;
|
||||||
|
|
||||||
|
@ -146,8 +146,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
*/
|
*/
|
||||||
[_ADJUST] = LAYOUT_ortho_4x12(
|
[_ADJUST] = LAYOUT_ortho_4x12(
|
||||||
_______, QK_BOOT, RGBRST, _______, _______, _______, _______, QWERTY, COLEMAK, DVORAK, _______, KC_INS,
|
_______, QK_BOOT, RGBRST, _______, _______, _______, _______, QWERTY, COLEMAK, DVORAK, _______, KC_INS,
|
||||||
_______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, AG_NORM, AG_SWAP, KC_MINS, KC_EQL, KC_PSCR, KC_SCRL, KC_PAUS,
|
_______, UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, AG_NORM, AG_SWAP, KC_MINS, KC_EQL, KC_PSCR, KC_SCRL, KC_PAUS,
|
||||||
RGB_RMOD,RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______, _______, _______, KC_PGUP, _______,
|
UG_PREV, UG_NEXT, UG_HUED, UG_SATD, UG_VALD, _______, _______, _______, _______, _______, KC_PGUP, _______,
|
||||||
_______, _______, _______, EISU, EISU, EISU, KANA, KANA, KANA, KC_HOME, KC_PGDN, KC_END
|
_______, _______, _______, EISU, EISU, EISU, KANA, KANA, KANA, KC_HOME, KC_PGDN, KC_END
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
@ -246,7 +246,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
//led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released
|
//led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released
|
||||||
case RGB_RMOD:
|
case QK_UNDERGLOW_MODE_PREVIOUS:
|
||||||
#if defined(RGBLIGHT_ENABLE)
|
#if defined(RGBLIGHT_ENABLE)
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
rgblight_mode_noeeprom(RGB_current_config.mode);
|
rgblight_mode_noeeprom(RGB_current_config.mode);
|
||||||
@ -257,7 +257,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RGB_MOD:
|
case QK_UNDERGLOW_MODE_NEXT:
|
||||||
#if defined(RGBLIGHT_ENABLE)
|
#if defined(RGBLIGHT_ENABLE)
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
rgblight_mode_noeeprom(RGB_current_config.mode);
|
rgblight_mode_noeeprom(RGB_current_config.mode);
|
||||||
|
@ -18,8 +18,5 @@
|
|||||||
|
|
||||||
#include_next <mcuconf.h>
|
#include_next <mcuconf.h>
|
||||||
|
|
||||||
#undef STM32_PWM_USE_ADVANCED
|
|
||||||
#define STM32_PWM_USE_ADVANCED TRUE
|
|
||||||
|
|
||||||
#undef STM32_PWM_USE_TIM1
|
#undef STM32_PWM_USE_TIM1
|
||||||
#define STM32_PWM_USE_TIM1 TRUE
|
#define STM32_PWM_USE_TIM1 TRUE
|
||||||
|
@ -18,8 +18,5 @@
|
|||||||
|
|
||||||
#include_next <mcuconf.h>
|
#include_next <mcuconf.h>
|
||||||
|
|
||||||
#undef STM32_PWM_USE_ADVANCED
|
|
||||||
#define STM32_PWM_USE_ADVANCED TRUE
|
|
||||||
|
|
||||||
#undef STM32_PWM_USE_TIM1
|
#undef STM32_PWM_USE_TIM1
|
||||||
#define STM32_PWM_USE_TIM1 TRUE
|
#define STM32_PWM_USE_TIM1 TRUE
|
||||||
|
@ -18,8 +18,5 @@
|
|||||||
|
|
||||||
#include_next <mcuconf.h>
|
#include_next <mcuconf.h>
|
||||||
|
|
||||||
#undef STM32_PWM_USE_ADVANCED
|
|
||||||
#define STM32_PWM_USE_ADVANCED TRUE
|
|
||||||
|
|
||||||
#undef STM32_PWM_USE_TIM1
|
#undef STM32_PWM_USE_TIM1
|
||||||
#define STM32_PWM_USE_TIM1 TRUE
|
#define STM32_PWM_USE_TIM1 TRUE
|
||||||
|
@ -21,9 +21,6 @@
|
|||||||
#undef STM32_I2C_USE_I2C1
|
#undef STM32_I2C_USE_I2C1
|
||||||
#define STM32_I2C_USE_I2C1 TRUE
|
#define STM32_I2C_USE_I2C1 TRUE
|
||||||
|
|
||||||
#undef STM32_PWM_USE_ADVANCED
|
|
||||||
#define STM32_PWM_USE_ADVANCED TRUE
|
|
||||||
|
|
||||||
#undef STM32_PWM_USE_TIM3
|
#undef STM32_PWM_USE_TIM3
|
||||||
#define STM32_PWM_USE_TIM3 TRUE
|
#define STM32_PWM_USE_TIM3 TRUE
|
||||||
|
|
||||||
|
@ -21,9 +21,6 @@
|
|||||||
#undef STM32_I2C_USE_I2C1
|
#undef STM32_I2C_USE_I2C1
|
||||||
#define STM32_I2C_USE_I2C1 TRUE
|
#define STM32_I2C_USE_I2C1 TRUE
|
||||||
|
|
||||||
#undef STM32_PWM_USE_ADVANCED
|
|
||||||
#define STM32_PWM_USE_ADVANCED TRUE
|
|
||||||
|
|
||||||
#undef STM32_PWM_USE_TIM3
|
#undef STM32_PWM_USE_TIM3
|
||||||
#define STM32_PWM_USE_TIM3 TRUE
|
#define STM32_PWM_USE_TIM3 TRUE
|
||||||
|
|
||||||
|
@ -21,9 +21,6 @@
|
|||||||
#undef STM32_I2C_USE_I2C1
|
#undef STM32_I2C_USE_I2C1
|
||||||
#define STM32_I2C_USE_I2C1 TRUE
|
#define STM32_I2C_USE_I2C1 TRUE
|
||||||
|
|
||||||
#undef STM32_PWM_USE_ADVANCED
|
|
||||||
#define STM32_PWM_USE_ADVANCED TRUE
|
|
||||||
|
|
||||||
#undef STM32_PWM_USE_TIM3
|
#undef STM32_PWM_USE_TIM3
|
||||||
#define STM32_PWM_USE_TIM3 TRUE
|
#define STM32_PWM_USE_TIM3 TRUE
|
||||||
|
|
||||||
|
@ -18,8 +18,5 @@
|
|||||||
|
|
||||||
#include_next <mcuconf.h>
|
#include_next <mcuconf.h>
|
||||||
|
|
||||||
#undef STM32_PWM_USE_ADVANCED
|
|
||||||
#define STM32_PWM_USE_ADVANCED TRUE
|
|
||||||
|
|
||||||
#undef STM32_PWM_USE_TIM1
|
#undef STM32_PWM_USE_TIM1
|
||||||
#define STM32_PWM_USE_TIM1 TRUE
|
#define STM32_PWM_USE_TIM1 TRUE
|
||||||
|
@ -18,8 +18,5 @@
|
|||||||
|
|
||||||
#include_next <mcuconf.h>
|
#include_next <mcuconf.h>
|
||||||
|
|
||||||
#undef STM32_PWM_USE_ADVANCED
|
|
||||||
#define STM32_PWM_USE_ADVANCED TRUE
|
|
||||||
|
|
||||||
#undef STM32_PWM_USE_TIM1
|
#undef STM32_PWM_USE_TIM1
|
||||||
#define STM32_PWM_USE_TIM1 TRUE
|
#define STM32_PWM_USE_TIM1 TRUE
|
||||||
|
@ -18,8 +18,5 @@
|
|||||||
|
|
||||||
#include_next <mcuconf.h>
|
#include_next <mcuconf.h>
|
||||||
|
|
||||||
#undef STM32_PWM_USE_ADVANCED
|
|
||||||
#define STM32_PWM_USE_ADVANCED TRUE
|
|
||||||
|
|
||||||
#undef STM32_PWM_USE_TIM1
|
#undef STM32_PWM_USE_TIM1
|
||||||
#define STM32_PWM_USE_TIM1 TRUE
|
#define STM32_PWM_USE_TIM1 TRUE
|
||||||
|
@ -167,7 +167,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
|
|||||||
eeconfig_update_keymap(&keymap_config);
|
eeconfig_update_keymap(&keymap_config);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
case RGB_TOG:
|
case QK_RGB_MATRIX_TOGGLE:
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
switch (rgb_matrix_get_flags()) {
|
switch (rgb_matrix_get_flags()) {
|
||||||
case LED_FLAG_ALL: {
|
case LED_FLAG_ALL: {
|
||||||
|
@ -47,11 +47,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
|
|
||||||
[WIN_FN] = LAYOUT_tkl_ansi( /* FN */
|
[WIN_FN] = LAYOUT_tkl_ansi( /* FN */
|
||||||
_______, KC_MYCM, KC_MAIL, KC_WSCH, KC_WHOM, KC_MSEL, KC_MPLY, KC_MPRV, KC_MNXT, _______,_______, _______, _______, _______, _______, _______,
|
_______, KC_MYCM, KC_MAIL, KC_WSCH, KC_WHOM, KC_MSEL, KC_MPLY, KC_MPRV, KC_MNXT, _______,_______, _______, _______, _______, _______, _______,
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPD, RGB_SPI, _______, _______, _______, _______,
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_SPDU, _______, _______, _______, _______,
|
||||||
_______, _______,TG(WIN_W),_______, _______, _______, _______, _______, _______, DF(MAC_B),_______,_______, _______, RGB_MOD, _______, _______, _______,
|
_______, _______,TG(WIN_W),_______, _______, _______, _______, _______, _______, DF(MAC_B),_______,_______, _______, RM_NEXT, _______, _______, _______,
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, _______, _______, RGB_HUI,
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, RM_TOGG, _______, _______, RM_HUEU,
|
||||||
_______, _______, _______, KC_CALC, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, RGB_VAI,
|
_______, _______, _______, KC_CALC, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, RM_VALU,
|
||||||
_______, GU_TOGG, _______, _______, _______, _______, _______, _______, RGB_SAD, RGB_VAD, RGB_SAI),
|
_______, GU_TOGG, _______, _______, _______, _______, _______, _______, RM_SATD, RM_VALD, RM_SATU),
|
||||||
|
|
||||||
[MAC_B] = LAYOUT_tkl_ansi( /* Base */
|
[MAC_B] = LAYOUT_tkl_ansi( /* Base */
|
||||||
KC_ESC, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, KC_F5, KC_F6, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_PSCR, KC_SCRL, KC_PAUS,
|
KC_ESC, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, KC_F5, KC_F6, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_PSCR, KC_SCRL, KC_PAUS,
|
||||||
@ -70,10 +70,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
_______, _______, _______, _______, _______, _______, MO(MAC_FN), _______, KC_A, KC_S, KC_D),
|
_______, _______, _______, _______, _______, _______, MO(MAC_FN), _______, KC_A, KC_S, KC_D),
|
||||||
[MAC_FN] = LAYOUT_tkl_ansi( /* FN */
|
[MAC_FN] = LAYOUT_tkl_ansi( /* FN */
|
||||||
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, _______, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______,
|
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, _______, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______,
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPD, RGB_SPI, _______, _______, _______, _______,
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_SPDU, _______, _______, _______, _______,
|
||||||
_______, _______,TG(MAC_W),_______, _______, _______, _______, _______, _______, DF(WIN_B),_______,_______, _______, RGB_MOD, _______, _______, _______,
|
_______, _______,TG(MAC_W),_______, _______, _______, _______, _______, _______, DF(WIN_B),_______,_______, _______, RM_NEXT, _______, _______, _______,
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, _______, _______, RGB_HUI,
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, RM_TOGG, _______, _______, RM_HUEU,
|
||||||
_______, _______, _______, KC_CALC, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, RGB_VAI,
|
_______, _______, _______, KC_CALC, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, RM_VALU,
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, RGB_SAD, RGB_VAD, RGB_SAI)
|
_______, _______, _______, _______, _______, _______, _______, _______, RM_SATD, RM_VALD, RM_SATU)
|
||||||
};
|
};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
@ -150,13 +150,10 @@ const snled27351_led_t PROGMEM g_snled27351_leds[SNLED27351_LED_COUNT] = {
|
|||||||
void keyboard_pre_init_kb(void) {
|
void keyboard_pre_init_kb(void) {
|
||||||
gpio_set_pin_output(LED_WIN_LOCK_PIN); // LED3 Win Lock
|
gpio_set_pin_output(LED_WIN_LOCK_PIN); // LED3 Win Lock
|
||||||
gpio_write_pin_low(LED_WIN_LOCK_PIN);
|
gpio_write_pin_low(LED_WIN_LOCK_PIN);
|
||||||
|
|
||||||
keyboard_pre_init_user();
|
keyboard_pre_init_user();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool led_update_kb(led_t led_state) {
|
void housekeeping_task_kb(void){
|
||||||
bool res = led_update_user(led_state);
|
gpio_write_pin(LED_WIN_LOCK_PIN, keymap_config.no_gui);
|
||||||
if (res) {
|
|
||||||
gpio_write_pin(LED_WIN_LOCK_PIN, keymap_config.no_gui);
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
|
@ -211,7 +211,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
|
|||||||
ap2_led_reset_foreground_color();
|
ap2_led_reset_foreground_color();
|
||||||
return false;
|
return false;
|
||||||
#ifdef RGB_MATRIX_ENABLE
|
#ifdef RGB_MATRIX_ENABLE
|
||||||
case RGB_TOG:
|
case QK_RGB_MATRIX_TOGGLE:
|
||||||
if(rgb_matrix_is_enabled()) ap2_led_disable();
|
if(rgb_matrix_is_enabled()) ap2_led_disable();
|
||||||
else ap2_led_enable();
|
else ap2_led_enable();
|
||||||
return true;
|
return true;
|
||||||
|
@ -61,11 +61,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
),
|
),
|
||||||
[_ADJUST] = LAYOUT(
|
[_ADJUST] = LAYOUT(
|
||||||
//,-----------------------------------------------. ,-----------------------------------------------.
|
//,-----------------------------------------------. ,-----------------------------------------------.
|
||||||
KC_TRNS, RGBRST,RGB_TOG, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
|
KC_TRNS, RGBRST,UG_TOGG, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
|
||||||
//|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
|
//|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
|
||||||
KC_TRNS,RGB_HUI,RGB_SAI,RGB_VAI,AG_SWAP, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
|
KC_TRNS,UG_HUEU,UG_SATU,UG_VALU,AG_SWAP, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
|
||||||
//|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
|
//|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
|
||||||
KC_TRNS,RGB_HUD,RGB_SAD,RGB_VAD,AG_NORM, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
|
KC_TRNS,UG_HUED,UG_SATD,UG_VALD,AG_NORM, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
|
||||||
//|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
|
//|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
|
||||||
KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS,
|
KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS,
|
||||||
//|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
|
//|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
|
||||||
@ -116,7 +116,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
case RGB_MOD:
|
case QK_UNDERGLOW_TOGGLE:
|
||||||
#ifdef RGBLIGHT_ENABLE
|
#ifdef RGBLIGHT_ENABLE
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
rgblight_mode(RGB_current_mode);
|
rgblight_mode(RGB_current_mode);
|
||||||
|
40
keyboards/arrayperipherals/vector/keyboard.json
Normal file
40
keyboards/arrayperipherals/vector/keyboard.json
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"manufacturer": "Array Peripherals",
|
||||||
|
"keyboard_name": "The Vector",
|
||||||
|
"maintainer": "daviddoan",
|
||||||
|
"bootloader": "atmel-dfu",
|
||||||
|
"encoder": {
|
||||||
|
"rotary": [
|
||||||
|
{"pin_a": "F0", "pin_b": "F1"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"features": {
|
||||||
|
"bootmagic": true,
|
||||||
|
"encoder": true,
|
||||||
|
"extrakey": true,
|
||||||
|
"mousekey": true
|
||||||
|
},
|
||||||
|
"matrix_pins": {
|
||||||
|
"direct": [
|
||||||
|
["D4", "C6", "D7", "E6", "F7"]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"processor": "atmega32u4",
|
||||||
|
"url": "https://arrayperipherals.com",
|
||||||
|
"usb": {
|
||||||
|
"device_version": "1.0.0",
|
||||||
|
"pid": "0x4F47",
|
||||||
|
"vid": "0x4152"
|
||||||
|
},
|
||||||
|
"layouts": {
|
||||||
|
"LAYOUT": {
|
||||||
|
"layout": [
|
||||||
|
{"label": "k01", "matrix": [0, 0], "x": 0, "y": 0},
|
||||||
|
{"label": "k02", "matrix": [0, 1], "x": 1, "y": 0},
|
||||||
|
{"label": "k03", "matrix": [0, 2], "x": 2, "y": 0},
|
||||||
|
{"label": "k04", "matrix": [0, 3], "x": 3, "y": 0},
|
||||||
|
{"label": "k05", "matrix": [0, 4], "x": 4.25, "y": 0}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
36
keyboards/arrayperipherals/vector/keymaps/default/keymap.c
Normal file
36
keyboards/arrayperipherals/vector/keymaps/default/keymap.c
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2024 David Doan <daviddoan1995@gmail.com>
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
|
||||||
|
[0] = LAYOUT(
|
||||||
|
KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, TG(1)
|
||||||
|
),
|
||||||
|
|
||||||
|
[1] = LAYOUT(
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TG(1)
|
||||||
|
),
|
||||||
|
};
|
||||||
|
|
||||||
|
#if defined(ENCODER_MAP_ENABLE)
|
||||||
|
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
|
||||||
|
[0] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU)},
|
||||||
|
[1] = {ENCODER_CCW_CW(KC_TRNS, KC_TRNS)},
|
||||||
|
};
|
||||||
|
#endif // ENCODER_MAP_ENABLE
|
@ -0,0 +1 @@
|
|||||||
|
ENCODER_MAP_ENABLE = yes
|
26
keyboards/arrayperipherals/vector/readme.md
Normal file
26
keyboards/arrayperipherals/vector/readme.md
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# The Vector Macropad
|
||||||
|
|
||||||
|
![The Vector](https://i.imgur.com/rmy76bp.png)
|
||||||
|
|
||||||
|
A small (1x4) macropad with a rotary. [More info at arrayperipherals.com](https://www.arrayperipherals.com/)
|
||||||
|
|
||||||
|
* Keyboard Maintainer: [David Doan](https://github.com/daviddoan)
|
||||||
|
* Hardware Supported: Custom PCB with Atmega32u4 processor
|
||||||
|
* Hardware Availability: [arrayperipherals.com](https://www.arrayperipherals.com/)
|
||||||
|
|
||||||
|
Make example for this keyboard (after setting up your build environment):
|
||||||
|
|
||||||
|
make arrayperipherals/vector:default
|
||||||
|
|
||||||
|
Flashing example for this keyboard:
|
||||||
|
|
||||||
|
make arrayperipherals/vector: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:
|
||||||
|
|
||||||
|
* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (left most from the rotary)
|
||||||
|
* **Physical reset button**: Briefly double press the button on the back of the PCB
|
32
keyboards/atset/at2/keyboard.json
Normal file
32
keyboards/atset/at2/keyboard.json
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"manufacturer": "Atset",
|
||||||
|
"keyboard_name": "AT2",
|
||||||
|
"maintainer": "qmk",
|
||||||
|
"board": "GENERIC_RP_RP2040",
|
||||||
|
"processor": "RP2040",
|
||||||
|
"bootloader": "rp2040",
|
||||||
|
"diode_direction": "COL2ROW",
|
||||||
|
"usb": {
|
||||||
|
"vid": "0x4141",
|
||||||
|
"pid": "0x6174",
|
||||||
|
"device_version": "1.0.0"
|
||||||
|
},
|
||||||
|
"features": {
|
||||||
|
"bootmagic": true,
|
||||||
|
"extrakey": true,
|
||||||
|
"mousekey": true,
|
||||||
|
"nkro": true
|
||||||
|
},
|
||||||
|
"matrix_pins": {
|
||||||
|
"cols": ["GP19", "GP20"],
|
||||||
|
"rows": ["GP28"]
|
||||||
|
},
|
||||||
|
"layouts": {
|
||||||
|
"LAYOUT": {
|
||||||
|
"layout": [
|
||||||
|
{"matrix": [0, 0], "x": 0, "y": 0},
|
||||||
|
{"matrix": [0, 1], "x": 1, "y": 0}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
10
keyboards/atset/at2/keymaps/default/keymap.c
Normal file
10
keyboards/atset/at2/keymaps/default/keymap.c
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||||
|
|
||||||
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
[0] = LAYOUT(
|
||||||
|
KC_MUTE, KC_MPLY
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
24
keyboards/atset/at2/readme.md
Normal file
24
keyboards/atset/at2/readme.md
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# ATSET AT2
|
||||||
|
|
||||||
|
A special 2 key keyboard powered by QMK.
|
||||||
|
|
||||||
|
* Keyboard Maintainer: [ATSET](https://github.com/anubhavd7)
|
||||||
|
* Hardware Supported: ATSET AT2 (https://imgur.com/a/yBbVwef)
|
||||||
|
https://www.atsetmediscience.com/atset-at2-9949007.html
|
||||||
|
Make example for this keyboard (after setting up your build environment):
|
||||||
|
|
||||||
|
make atset/at2:default
|
||||||
|
|
||||||
|
Flashing example for this keyboard:
|
||||||
|
|
||||||
|
make atset/at2: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:
|
||||||
|
|
||||||
|
* **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**: Briefly press the button on the back of the PCB - some may have pads you must short instead
|
||||||
|
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
|
@ -20,6 +20,3 @@
|
|||||||
|
|
||||||
#undef STM32_PWM_USE_TIM1
|
#undef STM32_PWM_USE_TIM1
|
||||||
#define STM32_PWM_USE_TIM1 TRUE
|
#define STM32_PWM_USE_TIM1 TRUE
|
||||||
|
|
||||||
#undef STM32_PWM_USE_ADVANCED
|
|
||||||
#define STM32_PWM_USE_ADVANCED TRUE
|
|
||||||
|
@ -5,8 +5,8 @@ RGB_MATRIX_EFFECT(my_party_rocks)
|
|||||||
|
|
||||||
bool my_party_rocks(effect_params_t* params) {
|
bool my_party_rocks(effect_params_t* params) {
|
||||||
RGB_MATRIX_USE_LIMITS(led_min, led_max);
|
RGB_MATRIX_USE_LIMITS(led_min, led_max);
|
||||||
HSV hsv = {rand() & 0xFF, rand() & 0xFF, rgb_matrix_config.hsv.v};
|
hsv_t hsv = {rand() & 0xFF, rand() & 0xFF, rgb_matrix_config.hsv.v};
|
||||||
RGB rgb = rgb_matrix_hsv_to_rgb(hsv);
|
rgb_t rgb = rgb_matrix_hsv_to_rgb(hsv);
|
||||||
// rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
|
// rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
|
||||||
rgb_matrix_set_color_all(rgb.r, rgb.g, rgb.b);
|
rgb_matrix_set_color_all(rgb.r, rgb.g, rgb.b);
|
||||||
return rgb_matrix_check_finished_leds(led_max);
|
return rgb_matrix_check_finished_leds(led_max);
|
||||||
|
@ -34,13 +34,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
//,------------------------------------------------------------------------| |---------------------------------------------------------------------------.
|
//,------------------------------------------------------------------------| |---------------------------------------------------------------------------.
|
||||||
KC_ESC, KC_GRAVE, 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_ESC, KC_GRAVE, 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,
|
||||||
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
RGB_MOD, 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,
|
UG_NEXT, 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,
|
||||||
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
RGB_M_G, 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,
|
RGB_M_G, 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,
|
||||||
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
RGB_M_X, 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, KC_RSFT,
|
RGB_M_X, 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, KC_RSFT,
|
||||||
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
RGB_TOG, KC_LCTL, KC_LALT, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RCTL, MO(_FN)
|
UG_TOGG, KC_LCTL, KC_LALT, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RCTL, MO(_FN)
|
||||||
//`------------------------------------------------------------------------| |---------------------------------------------------------------------------'
|
//`------------------------------------------------------------------------| |---------------------------------------------------------------------------'
|
||||||
),
|
),
|
||||||
|
|
||||||
@ -64,9 +64,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_RST, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_RST, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
||||||
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_TOG, RGB_MOD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, UG_TOGG, UG_NEXT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
||||||
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_VAD, RGB_VAI, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, XXXXXXX, XXXXXXX,
|
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, UG_VALD, UG_VALU, UG_HUED, UG_HUEU, UG_SATD, UG_SATU, XXXXXXX, XXXXXXX,
|
||||||
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
|
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
|
||||||
//`-----------------------------------------------------------------| |---------------------------------------------------------------------------'
|
//`-----------------------------------------------------------------| |---------------------------------------------------------------------------'
|
||||||
@ -80,7 +80,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||||||
bool result = false;
|
bool result = false;
|
||||||
switch (keycode) {
|
switch (keycode) {
|
||||||
#ifdef RGBLIGHT_ENABLE
|
#ifdef RGBLIGHT_ENABLE
|
||||||
case RGB_MOD:
|
case QK_UNDERGLOW_TOGGLE:
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
rgblight_mode(RGB_current_mode);
|
rgblight_mode(RGB_current_mode);
|
||||||
rgblight_step();
|
rgblight_step();
|
||||||
|
@ -34,13 +34,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
//,------------------------------------------------------------------------| |---------------------------------------------------------------------------.
|
//,------------------------------------------------------------------------| |---------------------------------------------------------------------------.
|
||||||
KC_ESC, KC_GRAVE, 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_ESC, KC_GRAVE, 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,
|
||||||
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
RGB_MOD, 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,
|
UG_NEXT, 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,
|
||||||
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
RGB_M_G, 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,
|
RGB_M_G, 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,
|
||||||
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
RGB_M_X, 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, KC_RSFT,
|
RGB_M_X, 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, KC_RSFT,
|
||||||
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
RGB_TOG, KC_LCTL,KC_LALT, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RCTL, MO(_FN)
|
UG_TOGG, KC_LCTL,KC_LALT, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RCTL, MO(_FN)
|
||||||
//`------------------------------------------------------------------------| |---------------------------------------------------------------------------'
|
//`------------------------------------------------------------------------| |---------------------------------------------------------------------------'
|
||||||
),
|
),
|
||||||
|
|
||||||
@ -64,9 +64,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_RST, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_RST, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
||||||
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_TOG, RGB_MOD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, UG_TOGG, UG_NEXT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
||||||
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_VAD, RGB_VAI, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, XXXXXXX, XXXXXXX,
|
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, UG_VALD, UG_VALU, UG_HUED, UG_HUEU, UG_SATD, UG_SATU, XXXXXXX, XXXXXXX,
|
||||||
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
|
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
|
||||||
//`-------------------------------------------------------------------------| |---------------------------------------------------------------------------'
|
//`-------------------------------------------------------------------------| |---------------------------------------------------------------------------'
|
||||||
@ -80,7 +80,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||||||
bool result = false;
|
bool result = false;
|
||||||
switch (keycode) {
|
switch (keycode) {
|
||||||
#ifdef RGBLIGHT_ENABLE
|
#ifdef RGBLIGHT_ENABLE
|
||||||
case RGB_MOD:
|
case QK_UNDERGLOW_MODE_NEXT:
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
rgblight_mode(RGB_current_mode);
|
rgblight_mode(RGB_current_mode);
|
||||||
rgblight_step();
|
rgblight_step();
|
||||||
|
@ -48,13 +48,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
//,------------------------------------------------------------------------| |---------------------------------------------------------------------------.
|
//,------------------------------------------------------------------------| |---------------------------------------------------------------------------.
|
||||||
KC_ESC, KC_GRAVE, 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_ESC, KC_GRAVE, 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,
|
||||||
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
RGB_MOD, 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,
|
UG_NEXT, 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,
|
||||||
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
RGB_M_G, 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,
|
RGB_M_G, 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,
|
||||||
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
RGB_M_X, 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, KC_RSFT,
|
RGB_M_X, 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, KC_RSFT,
|
||||||
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
RGB_TOG, KC_LCTL, KC_LALT, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RCTL, MO(_FN)
|
UG_TOGG, KC_LCTL, KC_LALT, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RCTL, MO(_FN)
|
||||||
//`------------------------------------------------------------------------| |---------------------------------------------------------------------------'
|
//`------------------------------------------------------------------------| |---------------------------------------------------------------------------'
|
||||||
),
|
),
|
||||||
|
|
||||||
@ -90,13 +90,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
//,-------------------------------------------------------------------------| |---------------------------------------------------------------------------.
|
//,-------------------------------------------------------------------------| |---------------------------------------------------------------------------.
|
||||||
KC_ESC, KC_GRAVE, 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_ESC, KC_GRAVE, 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,
|
||||||
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
RGB_MOD, 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,
|
UG_NEXT, 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,
|
||||||
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
RGB_M_G, 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,
|
RGB_M_G, 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,
|
||||||
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
RGB_M_X, 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, KC_RSFT,
|
RGB_M_X, 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, KC_RSFT,
|
||||||
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
RGB_TOG, KC_LCTL, KC_LALT, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RCTL, MO(_FN)
|
UG_TOGG, KC_LCTL, KC_LALT, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RCTL, MO(_FN)
|
||||||
//`-------------------------------------------------------------------------| |---------------------------------------------------------------------------'
|
//`-------------------------------------------------------------------------| |---------------------------------------------------------------------------'
|
||||||
),
|
),
|
||||||
|
|
||||||
@ -104,13 +104,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
//,-------------------------------------------------------------------------| |---------------------------------------------------------------------------.
|
//,-------------------------------------------------------------------------| |---------------------------------------------------------------------------.
|
||||||
KC_ESC, KC_GRAVE, 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_ESC, KC_GRAVE, 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,
|
||||||
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
RGB_MOD, 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,
|
UG_NEXT, 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,
|
||||||
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
RGB_M_G, 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,
|
RGB_M_G, 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,
|
||||||
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
RGB_M_X, 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, KC_RSFT,
|
RGB_M_X, 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, KC_RSFT,
|
||||||
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
RGB_TOG, KC_LCTL, KC_LALT, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RCTL, MO(_FN)
|
UG_TOGG, KC_LCTL, KC_LALT, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RCTL, MO(_FN)
|
||||||
//`-----------------------------------------------------------------| |---------------------------------------------------------------------------'
|
//`-----------------------------------------------------------------| |---------------------------------------------------------------------------'
|
||||||
),
|
),
|
||||||
|
|
||||||
@ -120,9 +120,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_RST, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_RST, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
||||||
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_TOG, RGB_MOD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, UG_TOGG, UG_NEXT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
||||||
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_VAD, RGB_VAI, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, XXXXXXX, XXXXXXX,
|
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, UG_VALD, UG_VALU, UG_HUED, UG_HUEU, UG_SATD, UG_SATU, XXXXXXX, XXXXXXX,
|
||||||
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
|
||||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
|
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
|
||||||
//`-----------------------------------------------------------------| |---------------------------------------------------------------------------'
|
//`-----------------------------------------------------------------| |---------------------------------------------------------------------------'
|
||||||
@ -164,7 +164,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||||||
bool result = false;
|
bool result = false;
|
||||||
switch (keycode) {
|
switch (keycode) {
|
||||||
#ifdef RGBLIGHT_ENABLE
|
#ifdef RGBLIGHT_ENABLE
|
||||||
case RGB_MOD:
|
case QK_UNDERGLOW_MODE_NEXT:
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
rgblight_mode(RGB_current_mode);
|
rgblight_mode(RGB_current_mode);
|
||||||
rgblight_step();
|
rgblight_step();
|
||||||
|
@ -29,7 +29,6 @@
|
|||||||
#define WS2812_EXTERNAL_PULLUP
|
#define WS2812_EXTERNAL_PULLUP
|
||||||
#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1
|
#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1
|
||||||
#define WS2812_PWM_DMA_CHANNEL 3
|
#define WS2812_PWM_DMA_CHANNEL 3
|
||||||
#define WS2812_PWM_TARGET_PERIOD 800000
|
|
||||||
|
|
||||||
/* Serial configuration for split keyboard. */
|
/* Serial configuration for split keyboard. */
|
||||||
#define SERIAL_USART_TX_PIN A9
|
#define SERIAL_USART_TX_PIN A9
|
||||||
|
@ -27,7 +27,6 @@
|
|||||||
#define WS2812_EXTERNAL_PULLUP
|
#define WS2812_EXTERNAL_PULLUP
|
||||||
#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1
|
#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1
|
||||||
#define WS2812_PWM_DMA_CHANNEL 3
|
#define WS2812_PWM_DMA_CHANNEL 3
|
||||||
#define WS2812_PWM_TARGET_PERIOD 800000
|
|
||||||
|
|
||||||
/* Serial configuration for split keyboard. */
|
/* Serial configuration for split keyboard. */
|
||||||
#define SERIAL_USART_TX_PIN A9
|
#define SERIAL_USART_TX_PIN A9
|
||||||
|
@ -29,7 +29,6 @@
|
|||||||
#define WS2812_EXTERNAL_PULLUP
|
#define WS2812_EXTERNAL_PULLUP
|
||||||
#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1
|
#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1
|
||||||
#define WS2812_PWM_DMA_CHANNEL 3
|
#define WS2812_PWM_DMA_CHANNEL 3
|
||||||
#define WS2812_PWM_TARGET_PERIOD 800000
|
|
||||||
|
|
||||||
/* Serial configuration for split keyboard. */
|
/* Serial configuration for split keyboard. */
|
||||||
#define SERIAL_USART_TX_PIN A9
|
#define SERIAL_USART_TX_PIN A9
|
||||||
|
@ -34,13 +34,6 @@
|
|||||||
|
|
||||||
/* RGB matrix support. */
|
/* RGB matrix support. */
|
||||||
#ifdef RGB_MATRIX_ENABLE
|
#ifdef RGB_MATRIX_ENABLE
|
||||||
# ifndef __arm__
|
|
||||||
// Disable control of RGB matrix by keycodes (must use firmware implementation
|
|
||||||
// to control the feature).
|
|
||||||
# define RGB_MATRIX_DISABLE_KEYCODES
|
|
||||||
# else // __arm__
|
|
||||||
// Enable all animations on ARM boards since they have plenty of memory
|
|
||||||
// available for it.
|
|
||||||
# define ENABLE_RGB_MATRIX_ALPHAS_MODS
|
# define ENABLE_RGB_MATRIX_ALPHAS_MODS
|
||||||
# define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
|
# define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
|
||||||
# define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
|
# define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
|
||||||
@ -81,5 +74,4 @@
|
|||||||
# define ENABLE_RGB_MATRIX_MULTISPLASH
|
# define ENABLE_RGB_MATRIX_MULTISPLASH
|
||||||
# define ENABLE_RGB_MATRIX_SOLID_SPLASH
|
# define ENABLE_RGB_MATRIX_SOLID_SPLASH
|
||||||
# define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH
|
# define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH
|
||||||
# endif // !__arm__
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -51,36 +51,36 @@ bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
|
|||||||
|
|
||||||
uint8_t layer = get_highest_layer(layer_state);
|
uint8_t layer = get_highest_layer(layer_state);
|
||||||
if (layer > 0) {
|
if (layer > 0) {
|
||||||
HSV hsv = rgb_matrix_get_hsv();
|
hsv_t hsv = rgb_matrix_get_hsv();
|
||||||
switch (get_highest_layer(layer_state)) {
|
switch (get_highest_layer(layer_state)) {
|
||||||
case 1:
|
case 1:
|
||||||
hsv = (HSV){HSV_BLUE};
|
hsv = (hsv_t){HSV_BLUE};
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
hsv = (HSV){HSV_AZURE};
|
hsv = (hsv_t){HSV_AZURE};
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
hsv = (HSV){HSV_ORANGE};
|
hsv = (hsv_t){HSV_ORANGE};
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
hsv = (HSV){HSV_GREEN};
|
hsv = (hsv_t){HSV_GREEN};
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
hsv = (HSV){HSV_TEAL};
|
hsv = (hsv_t){HSV_TEAL};
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
hsv = (HSV){HSV_PURPLE};
|
hsv = (hsv_t){HSV_PURPLE};
|
||||||
break;
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
default:
|
default:
|
||||||
hsv = (HSV){HSV_RED};
|
hsv = (hsv_t){HSV_RED};
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (hsv.v > rgb_matrix_get_val()) {
|
if (hsv.v > rgb_matrix_get_val()) {
|
||||||
hsv.v = MIN(rgb_matrix_get_val() + 22, 255);
|
hsv.v = MIN(rgb_matrix_get_val() + 22, 255);
|
||||||
}
|
}
|
||||||
RGB rgb = hsv_to_rgb(hsv);
|
rgb_t rgb = hsv_to_rgb(hsv);
|
||||||
|
|
||||||
for (uint8_t i = led_min; i < led_max; i++) {
|
for (uint8_t i = led_min; i < led_max; i++) {
|
||||||
if (HAS_FLAGS(g_led_config.flags[i], LED_FLAG_UNDERGLOW)) {
|
if (HAS_FLAGS(g_led_config.flags[i], LED_FLAG_UNDERGLOW)) {
|
||||||
|
@ -29,7 +29,6 @@
|
|||||||
#define WS2812_EXTERNAL_PULLUP
|
#define WS2812_EXTERNAL_PULLUP
|
||||||
#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1
|
#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1
|
||||||
#define WS2812_PWM_DMA_CHANNEL 3
|
#define WS2812_PWM_DMA_CHANNEL 3
|
||||||
#define WS2812_PWM_TARGET_PERIOD 800000
|
|
||||||
|
|
||||||
/* Serial configuration for split keyboard. */
|
/* Serial configuration for split keyboard. */
|
||||||
#define SERIAL_USART_TX_PIN A9
|
#define SERIAL_USART_TX_PIN A9
|
||||||
|
@ -29,7 +29,6 @@
|
|||||||
#define WS2812_EXTERNAL_PULLUP
|
#define WS2812_EXTERNAL_PULLUP
|
||||||
#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1
|
#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1
|
||||||
#define WS2812_PWM_DMA_CHANNEL 3
|
#define WS2812_PWM_DMA_CHANNEL 3
|
||||||
#define WS2812_PWM_TARGET_PERIOD 800000
|
|
||||||
|
|
||||||
/* Serial configuration for split keyboard. */
|
/* Serial configuration for split keyboard. */
|
||||||
#define SERIAL_USART_TX_PIN A9
|
#define SERIAL_USART_TX_PIN A9
|
||||||
|
@ -29,7 +29,6 @@
|
|||||||
#define WS2812_EXTERNAL_PULLUP
|
#define WS2812_EXTERNAL_PULLUP
|
||||||
#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1
|
#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1
|
||||||
#define WS2812_PWM_DMA_CHANNEL 3
|
#define WS2812_PWM_DMA_CHANNEL 3
|
||||||
#define WS2812_PWM_TARGET_PERIOD 800000
|
|
||||||
|
|
||||||
/* Serial configuration for split keyboard. */
|
/* Serial configuration for split keyboard. */
|
||||||
#define SERIAL_USART_TX_PIN A9
|
#define SERIAL_USART_TX_PIN A9
|
||||||
|
@ -87,8 +87,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
*/
|
*/
|
||||||
[RGB] = LAYOUT(
|
[RGB] = LAYOUT(
|
||||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
||||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, TAP_ANIM,XXXXXXX,
|
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, TAP_ANIM,XXXXXXX,
|
||||||
_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_MOD, RGB_HUI, RGB_SAD, RGB_VAD, RGB_RST, XXXXXXX,
|
_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, UG_NEXT, UG_HUED, UG_SATD, UG_VALD, RGB_RST, XXXXXXX,
|
||||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
|
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -98,7 +98,7 @@ bool isTapAnim = false;
|
|||||||
|
|
||||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
switch (keycode) {
|
switch (keycode) {
|
||||||
case RGB_MOD:
|
case QK_UNDERGLOW_MODE_NEXT:
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
isTapAnim = false;
|
isTapAnim = false;
|
||||||
}
|
}
|
||||||
|
@ -18,8 +18,5 @@
|
|||||||
|
|
||||||
#include_next <mcuconf.h>
|
#include_next <mcuconf.h>
|
||||||
|
|
||||||
#undef STM32_PWM_USE_ADVANCED
|
|
||||||
#define STM32_PWM_USE_ADVANCED TRUE
|
|
||||||
|
|
||||||
#undef STM32_PWM_USE_TIM1
|
#undef STM32_PWM_USE_TIM1
|
||||||
#define STM32_PWM_USE_TIM1 TRUE
|
#define STM32_PWM_USE_TIM1 TRUE
|
||||||
|
@ -1,16 +1,8 @@
|
|||||||
#include QMK_KEYBOARD_H
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
// Each layer gets a name for readability, which is then used in the keymap matrix below.
|
enum layer_names {
|
||||||
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
|
_BASE,
|
||||||
// Layer names don't all need to be of the same length, obviously, and you can also skip them
|
_FN
|
||||||
// entirely and just use numbers.
|
|
||||||
#define _BASE 0
|
|
||||||
#define _FN 1
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
enum custom_keycodes {
|
|
||||||
TG_GUI = SAFE_RANGE
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
@ -27,17 +19,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
_______, UG_NEXT, UG_HUEU, UG_SATU, UG_VALU, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, KC_MUTE, KC_END,
|
_______, UG_NEXT, UG_HUEU, UG_SATU, UG_VALU, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, KC_MUTE, KC_END,
|
||||||
_______, UG_TOGG, UG_HUED, UG_SATD, UG_VALD, _______, _______, _______, _______, _______, _______, _______, _______,
|
_______, UG_TOGG, UG_HUED, UG_SATD, UG_VALD, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLU,
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLU,
|
||||||
_______, TG_GUI,_______, QK_BOOT, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT
|
_______, GU_TOGG, _______, QK_BOOT, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|
||||||
if(record->event.pressed) {
|
|
||||||
switch(keycode) {
|
|
||||||
case TG_GUI:
|
|
||||||
keymap_config.no_gui ^= 1;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
@ -164,7 +164,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
|
|||||||
}
|
}
|
||||||
switch (keycode) {
|
switch (keycode) {
|
||||||
#ifdef RGB_MATRIX_ENABLE
|
#ifdef RGB_MATRIX_ENABLE
|
||||||
case RGB_TOG:
|
case QK_RGB_MATRIX_TOGGLE:
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
switch (rgb_matrix_get_flags()) {
|
switch (rgb_matrix_get_flags()) {
|
||||||
case LED_FLAG_ALL: {
|
case LED_FLAG_ALL: {
|
||||||
|
@ -37,11 +37,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
|
|
||||||
[WIN_FN] = LAYOUT( /* FN */
|
[WIN_FN] = LAYOUT( /* FN */
|
||||||
_______, KC_MSEL, KC_VOLD, KC_VOLU, KC_MUTE, KC_MSTP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MAIL, KC_WHOM, KC_CALC, KC_WSCH, KC_INS, _______,
|
_______, KC_MSEL, KC_VOLD, KC_VOLU, KC_MUTE, KC_MSTP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MAIL, KC_WHOM, KC_CALC, KC_WSCH, KC_INS, _______,
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPD, RGB_SPI, RGB_TOG, KC_END,
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_SPDU, RM_TOGG, KC_END,
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SAD, RGB_SAI, RGB_MOD, _______,
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SATD, RM_SATU, RM_NEXT, _______,
|
||||||
_______, _______,DF(MAC_B),_______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_MOD, _______, _______,
|
_______, _______,DF(MAC_B),_______, _______, _______, _______, _______, _______, _______, _______, _______, RM_NEXT, _______, _______,
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI,
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_VALU,
|
||||||
_______, GU_TOGG, _______, EE_CLR, _______, _______, _______, RGB_HUD, RGB_VAD, RGB_HUD),
|
_______, GU_TOGG, _______, EE_CLR, _______, _______, _______, RM_HUED, RM_VALD, RM_HUEU),
|
||||||
|
|
||||||
[MAC_B] = LAYOUT( /* Base */
|
[MAC_B] = LAYOUT( /* Base */
|
||||||
KC_ESC, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, KC_F5, KC_F6, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD,KC_VOLU, KC_DEL, KC_MUTE,
|
KC_ESC, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, KC_F5, KC_F6, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD,KC_VOLU, KC_DEL, KC_MUTE,
|
||||||
@ -53,11 +53,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
|
|
||||||
[MAC_FN] = LAYOUT( /* FN */
|
[MAC_FN] = LAYOUT( /* FN */
|
||||||
_______, 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_INS, _______,
|
_______, 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_INS, _______,
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPD, RGB_SPI, RGB_TOG, KC_END,
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_SPDU, RM_TOGG, KC_END,
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SAD, RGB_SAI, RGB_MOD, _______,
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SATD, RM_SATU, RM_NEXT, _______,
|
||||||
_______,DF(WIN_B),_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_MOD, _______, _______,
|
_______,DF(WIN_B),_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_NEXT, _______, _______,
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI,
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_VALU,
|
||||||
_______, _______, _______, EE_CLR, _______, _______, _______, RGB_HUD, RGB_VAD, RGB_HUD)
|
_______, _______, _______, EE_CLR, _______, _______, _______, RM_HUED, RM_VALD, RM_HUEU)
|
||||||
};
|
};
|
||||||
|
|
||||||
#if defined(ENCODER_MAP_ENABLE)
|
#if defined(ENCODER_MAP_ENABLE)
|
||||||
|
@ -5,7 +5,7 @@ RGB_MATRIX_EFFECT(my_party_rocks)
|
|||||||
|
|
||||||
# ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
# ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
||||||
|
|
||||||
static HSV my_solid_reactive_multiwide_col_math(HSV hsv, int16_t dx, int16_t dy, uint8_t dist, uint16_t tick) {
|
static hsv_t my_solid_reactive_multiwide_col_math(hsv_t hsv, int16_t dx, int16_t dy, uint8_t dist, uint16_t tick) {
|
||||||
uint16_t effect = tick + dist;
|
uint16_t effect = tick + dist;
|
||||||
dx = dx < 0 ? dx * -1 : dx;
|
dx = dx < 0 ? dx * -1 : dx;
|
||||||
dx = dx * 16 > 255 ? 255 : dx * 16;
|
dx = dx * 16 > 255 ? 255 : dx * 16;
|
||||||
@ -27,7 +27,7 @@ bool my_solid_reactive_col(effect_params_t* params) {
|
|||||||
uint16_t max_tick = 65535 / rgb_matrix_config.speed;
|
uint16_t max_tick = 65535 / rgb_matrix_config.speed;
|
||||||
for (uint8_t i = led_min; i < led_max; i++) {
|
for (uint8_t i = led_min; i < led_max; i++) {
|
||||||
RGB_MATRIX_TEST_LED_FLAGS();
|
RGB_MATRIX_TEST_LED_FLAGS();
|
||||||
HSV hsv = rgb_matrix_config.hsv;
|
hsv_t hsv = rgb_matrix_config.hsv;
|
||||||
uint16_t tick = max_tick;
|
uint16_t tick = max_tick;
|
||||||
// Reverse search to find most recent key hit
|
// Reverse search to find most recent key hit
|
||||||
for (int8_t j = g_last_hit_tracker.count - 1; j >= 0; j--) {
|
for (int8_t j = g_last_hit_tracker.count - 1; j >= 0; j--) {
|
||||||
@ -39,7 +39,7 @@ bool my_solid_reactive_col(effect_params_t* params) {
|
|||||||
|
|
||||||
uint16_t offset = scale16by8(tick, rgb_matrix_config.speed);
|
uint16_t offset = scale16by8(tick, rgb_matrix_config.speed);
|
||||||
hsv.h += qsub8(130, offset);
|
hsv.h += qsub8(130, offset);
|
||||||
RGB rgb = rgb_matrix_hsv_to_rgb(hsv);
|
rgb_t rgb = rgb_matrix_hsv_to_rgb(hsv);
|
||||||
rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
|
rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
|
||||||
}
|
}
|
||||||
return led_max < RGB_MATRIX_LED_COUNT;
|
return led_max < RGB_MATRIX_LED_COUNT;
|
||||||
@ -47,8 +47,8 @@ bool my_solid_reactive_col(effect_params_t* params) {
|
|||||||
|
|
||||||
bool my_party_rocks(effect_params_t* params) {
|
bool my_party_rocks(effect_params_t* params) {
|
||||||
RGB_MATRIX_USE_LIMITS(led_min, led_max);
|
RGB_MATRIX_USE_LIMITS(led_min, led_max);
|
||||||
HSV hsv = {rand() & 0xFF, rand() & 0xFF, rgb_matrix_config.hsv.v};
|
hsv_t hsv = {rand() & 0xFF, rand() & 0xFF, rgb_matrix_config.hsv.v};
|
||||||
RGB rgb = rgb_matrix_hsv_to_rgb(hsv);
|
rgb_t rgb = rgb_matrix_hsv_to_rgb(hsv);
|
||||||
// rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
|
// rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
|
||||||
rgb_matrix_set_color_all(rgb.r, rgb.g, rgb.b);
|
rgb_matrix_set_color_all(rgb.r, rgb.g, rgb.b);
|
||||||
return led_max < RGB_MATRIX_LED_COUNT;
|
return led_max < RGB_MATRIX_LED_COUNT;
|
||||||
|
@ -2,3 +2,7 @@ CUSTOM_MATRIX = lite
|
|||||||
ANALOG_DRIVER_REQUIRED = yes
|
ANALOG_DRIVER_REQUIRED = yes
|
||||||
VPATH += keyboards/cipulot/common
|
VPATH += keyboards/cipulot/common
|
||||||
SRC += matrix.c ec_board.c ec_switch_matrix.c
|
SRC += matrix.c ec_board.c ec_switch_matrix.c
|
||||||
|
|
||||||
|
ifeq ($(strip $(VIA_ENABLE)), yes)
|
||||||
|
SRC += via_ec.c
|
||||||
|
endif
|
@ -17,6 +17,10 @@
|
|||||||
#include "ec_switch_matrix.h"
|
#include "ec_switch_matrix.h"
|
||||||
#include "keyboard.h"
|
#include "keyboard.h"
|
||||||
|
|
||||||
|
#ifdef SPLIT_KEYBOARD
|
||||||
|
# include "transactions.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
void eeconfig_init_kb(void) {
|
void eeconfig_init_kb(void) {
|
||||||
// Default values
|
// Default values
|
||||||
eeprom_ec_config.actuation_mode = DEFAULT_ACTUATION_MODE;
|
eeprom_ec_config.actuation_mode = DEFAULT_ACTUATION_MODE;
|
||||||
@ -57,8 +61,14 @@ void keyboard_post_init_kb(void) {
|
|||||||
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_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_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]);
|
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]);
|
||||||
|
ec_config.rescaled_mode_1_actuation_offset[row][col] = rescale(ec_config.mode_1_actuation_offset, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
|
||||||
|
ec_config.rescaled_mode_1_release_offset[row][col] = rescale(ec_config.mode_1_release_offset, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef SPLIT_KEYBOARD
|
||||||
|
transaction_register_rpc(RPC_ID_VIA_CMD, via_cmd_slave_handler);
|
||||||
|
#endif
|
||||||
|
|
||||||
keyboard_post_init_user();
|
keyboard_post_init_user();
|
||||||
}
|
}
|
||||||
|
@ -37,8 +37,14 @@ 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_sizes[] = AMUX_COL_CHANNELS_SIZES;
|
||||||
const pin_t amux_n_col_channels[][AMUX_MAX_COLS_COUNT] = {AMUX_COL_CHANNELS};
|
const pin_t amux_n_col_channels[][AMUX_MAX_COLS_COUNT] = {AMUX_COL_CHANNELS};
|
||||||
|
|
||||||
|
#ifdef UNUSED_POSITIONS_LIST
|
||||||
|
const uint8_t UNUSED_POSITIONS[][2] = UNUSED_POSITIONS_LIST;
|
||||||
|
# define UNUSED_POSITIONS_COUNT ARRAY_SIZE(UNUSED_POSITIONS)
|
||||||
|
#endif
|
||||||
|
|
||||||
#define AMUX_SEL_PINS_COUNT ARRAY_SIZE(amux_sel_pins)
|
#define AMUX_SEL_PINS_COUNT ARRAY_SIZE(amux_sel_pins)
|
||||||
#define EXPECTED_AMUX_SEL_PINS_COUNT ceil(log2(AMUX_MAX_COLS_COUNT)
|
#define EXPECTED_AMUX_SEL_PINS_COUNT ceil(log2(AMUX_MAX_COLS_COUNT)
|
||||||
|
|
||||||
// Checks for the correctness of the configuration
|
// 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");
|
_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
|
// Check that number of select pins is enough to select all the channels
|
||||||
@ -70,6 +76,16 @@ void init_amux(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Disable all the unused rows
|
||||||
|
void disable_unused_row(uint8_t row) {
|
||||||
|
// disable all the other rows apart from the current selected one
|
||||||
|
for (uint8_t idx = 0; idx < MATRIX_ROWS; idx++) {
|
||||||
|
if (idx != row) {
|
||||||
|
gpio_write_pin_low(row_pins[idx]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Select the multiplexer channel of the specified multiplexer
|
// Select the multiplexer channel of the specified multiplexer
|
||||||
void select_amux_channel(uint8_t channel, uint8_t col) {
|
void select_amux_channel(uint8_t channel, uint8_t col) {
|
||||||
// Get the channel for the specified multiplexer
|
// Get the channel for the specified multiplexer
|
||||||
@ -158,6 +174,10 @@ void ec_noise_floor(void) {
|
|||||||
sum += amux_n_col_sizes[i];
|
sum += amux_n_col_sizes[i];
|
||||||
uint8_t adjusted_col = col + sum;
|
uint8_t adjusted_col = col + sum;
|
||||||
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
|
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
|
||||||
|
#ifdef UNUSED_POSITIONS_LIST
|
||||||
|
if (is_unused_position(row, adjusted_col)) continue;
|
||||||
|
#endif
|
||||||
|
disable_unused_row(row);
|
||||||
ec_config.noise_floor[row][adjusted_col] += ec_readkey_raw(amux, row, col);
|
ec_config.noise_floor[row][adjusted_col] += ec_readkey_raw(amux, row, col);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -180,11 +200,15 @@ bool ec_matrix_scan(matrix_row_t current_matrix[]) {
|
|||||||
for (uint8_t amux = 0; amux < AMUX_COUNT; amux++) {
|
for (uint8_t amux = 0; amux < AMUX_COUNT; amux++) {
|
||||||
disable_unused_amux(amux);
|
disable_unused_amux(amux);
|
||||||
for (uint8_t col = 0; col < amux_n_col_sizes[amux]; col++) {
|
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++) {
|
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
|
||||||
uint8_t sum = 0;
|
#ifdef UNUSED_POSITIONS_LIST
|
||||||
for (uint8_t i = 0; i < (amux > 0 ? amux : 0); i++)
|
if (is_unused_position(row, adjusted_col)) continue;
|
||||||
sum += amux_n_col_sizes[i];
|
#endif
|
||||||
uint8_t adjusted_col = col + sum;
|
disable_unused_row(row);
|
||||||
sw_value[row][adjusted_col] = ec_readkey_raw(amux, row, col);
|
sw_value[row][adjusted_col] = ec_readkey_raw(amux, row, col);
|
||||||
|
|
||||||
if (ec_config.bottoming_calibration) {
|
if (ec_config.bottoming_calibration) {
|
||||||
@ -266,7 +290,7 @@ bool ec_update_key(matrix_row_t* current_row, uint8_t row, uint8_t col, uint16_t
|
|||||||
uprintf("Key pressed: %d, %d, %d\n", row, col, sw_value);
|
uprintf("Key pressed: %d, %d, %d\n", row, col, sw_value);
|
||||||
}
|
}
|
||||||
// Has key moved up enough to be released?
|
// Has key moved up enough to be released?
|
||||||
else if (sw_value < ec_config.extremum[row][col] - ec_config.mode_1_release_offset) {
|
else if (sw_value < ec_config.extremum[row][col] - ec_config.rescaled_mode_1_release_offset[row][col]) {
|
||||||
ec_config.extremum[row][col] = sw_value;
|
ec_config.extremum[row][col] = sw_value;
|
||||||
*current_row &= ~(1 << col);
|
*current_row &= ~(1 << col);
|
||||||
uprintf("Key released: %d, %d, %d\n", row, col, sw_value);
|
uprintf("Key released: %d, %d, %d\n", row, col, sw_value);
|
||||||
@ -280,7 +304,7 @@ bool ec_update_key(matrix_row_t* current_row, uint8_t row, uint8_t col, uint16_t
|
|||||||
ec_config.extremum[row][col] = sw_value;
|
ec_config.extremum[row][col] = sw_value;
|
||||||
}
|
}
|
||||||
// Has key moved down enough to be pressed?
|
// Has key moved down enough to be pressed?
|
||||||
else if (sw_value > ec_config.extremum[row][col] + ec_config.mode_1_actuation_offset) {
|
else if (sw_value > ec_config.extremum[row][col] + ec_config.rescaled_mode_1_actuation_offset[row][col]) {
|
||||||
ec_config.extremum[row][col] = sw_value;
|
ec_config.extremum[row][col] = sw_value;
|
||||||
*current_row |= (1 << col);
|
*current_row |= (1 << col);
|
||||||
uprintf("Key pressed: %d, %d, %d\n", row, col, sw_value);
|
uprintf("Key pressed: %d, %d, %d\n", row, col, sw_value);
|
||||||
@ -312,6 +336,18 @@ void ec_print_matrix(void) {
|
|||||||
print("\n");
|
print("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if the position is unused
|
||||||
|
#ifdef UNUSED_POSITIONS_LIST
|
||||||
|
bool is_unused_position(uint8_t row, uint8_t col) {
|
||||||
|
for (uint8_t i = 0; i < UNUSED_POSITIONS_COUNT; i++) {
|
||||||
|
if (UNUSED_POSITIONS[i][0] == row && UNUSED_POSITIONS[i][1] == col) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Rescale the value to a different range
|
// 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) {
|
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;
|
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user