diff options
author | QMK Bot <hello@qmk.fm> | 2021-03-25 12:11:36 +0000 |
---|---|---|
committer | QMK Bot <hello@qmk.fm> | 2021-03-25 12:11:36 +0000 |
commit | 2df1b124a72fa02bfa5cb0db9752a64097b5ff9e (patch) | |
tree | 6d6c311765c81910592dc356da1074d34d04a4f0 /keyboards/ploopyco/trackball_nano | |
parent | f2729e897400fa4c7f1f1e18780db7718b9ae7a6 (diff) | |
parent | 816f2f9cc234b5a98512a483b2781b1c2875f24f (diff) |
Merge remote-tracking branch 'origin/master' into develop
Diffstat (limited to 'keyboards/ploopyco/trackball_nano')
-rw-r--r-- | keyboards/ploopyco/trackball_nano/config.h | 48 | ||||
-rw-r--r-- | keyboards/ploopyco/trackball_nano/info.json | 13 | ||||
-rw-r--r-- | keyboards/ploopyco/trackball_nano/keymaps/default/keymap.c | 23 | ||||
-rw-r--r-- | keyboards/ploopyco/trackball_nano/keymaps/default/readme.md | 3 | ||||
-rw-r--r-- | keyboards/ploopyco/trackball_nano/readme.md | 54 | ||||
-rw-r--r-- | keyboards/ploopyco/trackball_nano/rev1_001/config.h | 37 | ||||
-rw-r--r-- | keyboards/ploopyco/trackball_nano/rev1_001/readme.md | 1 | ||||
-rw-r--r-- | keyboards/ploopyco/trackball_nano/rev1_001/rev1_001.h | 22 | ||||
-rw-r--r-- | keyboards/ploopyco/trackball_nano/rev1_001/rules.mk | 0 | ||||
-rw-r--r-- | keyboards/ploopyco/trackball_nano/rules.mk | 32 | ||||
-rw-r--r-- | keyboards/ploopyco/trackball_nano/trackball_nano.c | 211 | ||||
-rw-r--r-- | keyboards/ploopyco/trackball_nano/trackball_nano.h | 53 |
12 files changed, 497 insertions, 0 deletions
diff --git a/keyboards/ploopyco/trackball_nano/config.h b/keyboards/ploopyco/trackball_nano/config.h new file mode 100644 index 0000000000..54fe840ceb --- /dev/null +++ b/keyboards/ploopyco/trackball_nano/config.h @@ -0,0 +1,48 @@ +/* Copyright 2021 Colin Lam (Ploopy Corporation) + * Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com> + * Copyright 2019 Sunjun Kim + * Copyright 2019 Hiroyuki Okada + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x5043 +#define PRODUCT_ID 0x1EAB +#define DEVICE_VER 0x0001 +#define MANUFACTURER PloopyCo +#define PRODUCT Trackball Nano + +/* key matrix size */ +#define MATRIX_ROWS 1 +#define MATRIX_COLS 1 + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCE 0 + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +#define NO_ACTION_MACRO +#define NO_ACTION_FUNCTION + +/* Much more so than a keyboard, speed matters for a mouse. So we'll go for as high + a polling rate as possible. */ +#define USB_POLLING_INTERVAL_MS 1 +#define USB_MAX_POWER_CONSUMPTION 100 diff --git a/keyboards/ploopyco/trackball_nano/info.json b/keyboards/ploopyco/trackball_nano/info.json new file mode 100644 index 0000000000..a788ce9eb1 --- /dev/null +++ b/keyboards/ploopyco/trackball_nano/info.json @@ -0,0 +1,13 @@ +{ + "keyboard_name": "Ploopy Trackball Nano", + "url": "www.ploopy.co", + "maintainer": "ploopyco", + "manufacturer": "Ploopy Corporation", + "layouts": { + "LAYOUT": { + "layout": [ + {"x":0, "y":0} + ] + } + } +} diff --git a/keyboards/ploopyco/trackball_nano/keymaps/default/keymap.c b/keyboards/ploopyco/trackball_nano/keymaps/default/keymap.c new file mode 100644 index 0000000000..1140c30a1d --- /dev/null +++ b/keyboards/ploopyco/trackball_nano/keymaps/default/keymap.c @@ -0,0 +1,23 @@ +/* Copyright 2021 Colin Lam (Ploopy Corporation) + * Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com> + * Copyright 2019 Sunjun Kim + * Copyright 2019 Hiroyuki Okada + * + * 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 + +// safe range starts at `PLOOPY_SAFE_RANGE` instead. + +// placeholder file so it will compile
\ No newline at end of file diff --git a/keyboards/ploopyco/trackball_nano/keymaps/default/readme.md b/keyboards/ploopyco/trackball_nano/keymaps/default/readme.md new file mode 100644 index 0000000000..ebb90d2999 --- /dev/null +++ b/keyboards/ploopyco/trackball_nano/keymaps/default/readme.md @@ -0,0 +1,3 @@ +The default keymap for the Ploopy Trackball Mini. + +Note that kits bought from PloopyCo actually ship with the VIA keymap, not this one.
\ No newline at end of file diff --git a/keyboards/ploopyco/trackball_nano/readme.md b/keyboards/ploopyco/trackball_nano/readme.md new file mode 100644 index 0000000000..8a293602a8 --- /dev/null +++ b/keyboards/ploopyco/trackball_nano/readme.md @@ -0,0 +1,54 @@ + + +# Ploopy Trackball Nano + +![Ploopyco Trackball Nano](https://www.ploopy.co/uploads/b/113cb4122f867acc306a72a2741c5237a9b1d0db13abfe4e8e394cd466c4a311/_MG_7710_1614037372.jpg) + +It's a DIY, QMK Powered Trackball...Nano! + +* Maintainer: [PloopyCo](https://github.com/ploopyco) +* Key contributors: [Drashna Jael're](https://github.com/drashna/), [Germ](https://github.com/germ/) +* Hardware Supported: ATMega32u4 16MHz(5v) +* Hardware Availability: [Store](https://ploopy.co/nano-trackball), [GitHub](https://github.com/ploopyco/nano-trackball) + +Make example for this trackball (after setting up your build environment): + + make ploopyco/trackball_nano/rev1_001:default:flash + make ploopyco/trackball_nano/rev1_001:via: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). + +## Hardware Reset Button + +The Ploopy Nano has a handy bootloader reset mechanism: two via pins on the board, designated by the reference designator `MCU.J.X BOOTLOADER`. If you stick an uninsulated paperclip or a pair of metal tweezers into both holes and plug in the Nano, it will start in bootloader mode. + +## Revisions + +Occasionally, new revisions of the PCB will be released. Every board comes with a designator that looks something like `R1.001`. + +Match the firmware that you flash onto the board with the designator on the board. + +# Customzing your Ploopy Nano Trackball + +You can change the DPI/CPI or speed of the trackball by calling `adns_set_cpi` at any time. Additionally, there is a `DPI_CONFIG` macro that will cycle through an array of options for the DPI. This is set to 375, 750, and 1375, but can be changed. 750 is the default. + +To configure/set your own array, there are two defines to use, `PLOOPY_DPI_OPTIONS` to set the array, and `PLOOPY_DPI_DEFAULT`. + +```c +#define PLOOPY_DPI_OPTIONS { CPI375, CPI750, CPI1375} +#define PLOOPY_DPI_DEFAULT 1 +``` + +The `PLOOPY_DPI_OPTIONS` array sets the values that you want to be able to cycle through, and the order they are in. The "default" define lets the firmware know which of these options is the default and should be loaded by default. + +The `DPI_CONFIG` macro will cycle through the values in the array, each time you hit it. It stores this value in persistent memory, so it will load it the next time the device powers up. + +## Fuse settings + +When flashing the bootloader, use the following fuse settings: + +| Fuse | Setting | +|----------|-------------| +| Low | `0x5E` | +| High | `0x99` | +| Extended | `0xC3` |
\ No newline at end of file diff --git a/keyboards/ploopyco/trackball_nano/rev1_001/config.h b/keyboards/ploopyco/trackball_nano/rev1_001/config.h new file mode 100644 index 0000000000..63780ef048 --- /dev/null +++ b/keyboards/ploopyco/trackball_nano/rev1_001/config.h @@ -0,0 +1,37 @@ +/* Copyright 2021 Colin Lam (Ploopy Corporation) + * Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com> + * Copyright 2019 Sunjun Kim + * Copyright 2019 Hiroyuki Okada + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#pragma once + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * + */ +#define DIRECT_PINS {} + +// These pins are not broken out, and cannot be used normally. +// They are set as output and pulled high, by default +#define UNUSED_PINS \ + { B5, B6, C7, D0, D1, D2, D3, D4, D5, D6, D7, E6, F1, F3, F5, F6, F7 } diff --git a/keyboards/ploopyco/trackball_nano/rev1_001/readme.md b/keyboards/ploopyco/trackball_nano/rev1_001/readme.md new file mode 100644 index 0000000000..052a17f396 --- /dev/null +++ b/keyboards/ploopyco/trackball_nano/rev1_001/readme.md @@ -0,0 +1 @@ +See the main readme for more details. This is just here for when future revisions of the board are released. diff --git a/keyboards/ploopyco/trackball_nano/rev1_001/rev1_001.h b/keyboards/ploopyco/trackball_nano/rev1_001/rev1_001.h new file mode 100644 index 0000000000..4f34e17dd4 --- /dev/null +++ b/keyboards/ploopyco/trackball_nano/rev1_001/rev1_001.h @@ -0,0 +1,22 @@ +/* Copyright 2021 Colin Lam (Ploopy Corporation) + * Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com> + * Copyright 2019 Sunjun Kim + * Copyright 2019 Hiroyuki Okada + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#pragma once + +#include "trackball_mini.h" diff --git a/keyboards/ploopyco/trackball_nano/rev1_001/rules.mk b/keyboards/ploopyco/trackball_nano/rev1_001/rules.mk new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/keyboards/ploopyco/trackball_nano/rev1_001/rules.mk diff --git a/keyboards/ploopyco/trackball_nano/rules.mk b/keyboards/ploopyco/trackball_nano/rules.mk new file mode 100644 index 0000000000..0286194b9f --- /dev/null +++ b/keyboards/ploopyco/trackball_nano/rules.mk @@ -0,0 +1,32 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency +F_CPU = 16000000 + +# Bootloader selection +BOOTLOADER = atmel-dfu + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration +EXTRAKEY_ENABLE = yes # Audio control and System control +CONSOLE_ENABLE = yes # Console for debug +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth +AUDIO_ENABLE = no # Audio output +POINTING_DEVICE_ENABLE = yes +MOUSEKEY_ENABLE = no # Mouse keys + +QUANTUM_LIB_SRC += analog.c +SRC += adns5050.c opt_encoder.c + +DEFAULT_FOLDER = ploopyco/trackball_nano/rev1_001 diff --git a/keyboards/ploopyco/trackball_nano/trackball_nano.c b/keyboards/ploopyco/trackball_nano/trackball_nano.c new file mode 100644 index 0000000000..93cb60bd4b --- /dev/null +++ b/keyboards/ploopyco/trackball_nano/trackball_nano.c @@ -0,0 +1,211 @@ +/* Copyright 2021 Colin Lam (Ploopy Corporation) + * Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com> + * Copyright 2019 Sunjun Kim + * Copyright 2019 Hiroyuki Okada + * + * 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 "trackball_nano.h" + +#ifndef OPT_DEBOUNCE +# define OPT_DEBOUNCE 5 // (ms) Time between scroll events +#endif + +#ifndef SCROLL_BUTT_DEBOUNCE +# define SCROLL_BUTT_DEBOUNCE 100 // (ms) Time between scroll events +#endif + +#ifndef OPT_THRES +# define OPT_THRES 150 // (0-1024) Threshold for actication +#endif + +#ifndef OPT_SCALE +# define OPT_SCALE 1 // Multiplier for wheel +#endif + +#ifndef PLOOPY_DPI_OPTIONS +# define PLOOPY_DPI_OPTIONS { CPI375, CPI750, CPI1375 } +# ifndef PLOOPY_DPI_DEFAULT +# define PLOOPY_DPI_DEFAULT 2 +# endif +#endif + +#ifndef PLOOPY_DPI_DEFAULT +# define PLOOPY_DPI_DEFAULT 1 +#endif + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; + +// Transformation constants for delta-X and delta-Y +const static float ADNS_X_TRANSFORM = -1.0; +const static float ADNS_Y_TRANSFORM = 1.0; + +keyboard_config_t keyboard_config; +uint16_t dpi_array[] = PLOOPY_DPI_OPTIONS; +#define DPI_OPTION_SIZE (sizeof(dpi_array) / sizeof(uint16_t)) + +// TODO: Implement libinput profiles +// https://wayland.freedesktop.org/libinput/doc/latest/pointer-acceleration.html +// Compile time accel selection +// Valid options are ACC_NONE, ACC_LINEAR, ACC_CUSTOM, ACC_QUADRATIC + +// Trackball State +bool is_scroll_clicked = false; +bool BurstState = false; // init burst state for Trackball module +uint16_t MotionStart = 0; // Timer for accel, 0 is resting state +uint16_t lastScroll = 0; // Previous confirmed wheel event +uint16_t lastMidClick = 0; // Stops scrollwheel from being read if it was pressed +uint8_t OptLowPin = OPT_ENC1; +bool debug_encoder = false; + +__attribute__((weak)) void process_wheel_user(report_mouse_t* mouse_report, int16_t h, int16_t v) { + // There's no scroller on this device. + return; +} + +__attribute__((weak)) void process_wheel(report_mouse_t* mouse_report) { + // There's no scroller on this device. + return; +} + +__attribute__((weak)) void process_mouse_user(report_mouse_t* mouse_report, int16_t x, int16_t y) { + // x and y are swapped + // the sensor is rotated + // by 90 degrees + int16_t temp = x; + x = y; + y = temp; + + // Apply delta-X and delta-Y transformations. + float xt = (float) x * ADNS_X_TRANSFORM; + float yt = (float) y * ADNS_Y_TRANSFORM; + + int16_t xti = xt; + int16_t yti = yt; + + mouse_report->x = xti; + mouse_report->y = yti; +} + +__attribute__((weak)) void process_mouse(report_mouse_t* mouse_report) { + report_adns_t data = adns_read_burst(); + + if (data.dx != 0 || data.dy != 0) { + if (debug_mouse) + dprintf("Raw ] X: %d, Y: %d\n", data.dx, data.dy); + + process_mouse_user(mouse_report, data.dx, data.dy); + } +} + +bool process_record_kb(uint16_t keycode, keyrecord_t* record) { + xprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed); + + // Update Timer to prevent accidental scrolls + if ((record->event.key.col == 1) && (record->event.key.row == 0)) { + lastMidClick = timer_read(); + is_scroll_clicked = record->event.pressed; + } + + if (!process_record_user(keycode, record)) + return false; + + if (keycode == DPI_CONFIG && record->event.pressed) { + keyboard_config.dpi_config = (keyboard_config.dpi_config + 1) % DPI_OPTION_SIZE; + eeconfig_update_kb(keyboard_config.raw); + adns_set_cpi(dpi_array[keyboard_config.dpi_config]); + } + +/* If Mousekeys is disabled, then use handle the mouse button + * keycodes. This makes things simpler, and allows usage of + * the keycodes in a consistent manner. But only do this if + * Mousekeys is not enable, so it's not handled twice. + */ +#ifndef MOUSEKEY_ENABLE + if (IS_MOUSEKEY_BUTTON(keycode)) { + report_mouse_t currentReport = pointing_device_get_report(); + if (record->event.pressed) { + currentReport.buttons |= 1 << (keycode - KC_MS_BTN1); + } else { + currentReport.buttons &= ~(1 << (keycode - KC_MS_BTN1)); + } + pointing_device_set_report(currentReport); + pointing_device_send(); + } +#endif + + return true; +} + +// Hardware Setup +void keyboard_pre_init_kb(void) { + // debug_enable = true; + // debug_matrix = true; + debug_mouse = true; + // debug_encoder = true; + + setPinInput(OPT_ENC1); + setPinInput(OPT_ENC2); + + /* Ground all output pins connected to ground. This provides additional + * pathways to ground. If you're messing with this, know this: driving ANY + * of these pins high will cause a short. On the MCU. Ka-blooey. + */ +#ifdef UNUSED_PINS + const pin_t unused_pins[] = UNUSED_PINS; + + for (uint8_t i = 0; i < (sizeof(unused_pins) / sizeof(pin_t)); i++) { + setPinOutput(unused_pins[i]); + writePinLow(unused_pins[i]); + } +#endif + + keyboard_pre_init_user(); +} + +void pointing_device_init(void) { + adns_init(); + opt_encoder_init(); +} + +void pointing_device_task(void) { + report_mouse_t mouse_report = pointing_device_get_report(); + process_wheel(&mouse_report); + process_mouse(&mouse_report); + pointing_device_set_report(mouse_report); + pointing_device_send(); +} + +void eeconfig_init_kb(void) { + keyboard_config.dpi_config = PLOOPY_DPI_DEFAULT; + eeconfig_update_kb(keyboard_config.raw); + eeconfig_init_user(); +} + +void matrix_init_kb(void) { + // is safe to just read DPI setting since matrix init + // comes before pointing device init. + keyboard_config.raw = eeconfig_read_kb(); + if (keyboard_config.dpi_config > DPI_OPTION_SIZE) { + eeconfig_init_kb(); + } + matrix_init_user(); +} + +void keyboard_post_init_kb(void) { + adns_set_cpi(dpi_array[keyboard_config.dpi_config]); + + keyboard_post_init_user(); +} diff --git a/keyboards/ploopyco/trackball_nano/trackball_nano.h b/keyboards/ploopyco/trackball_nano/trackball_nano.h new file mode 100644 index 0000000000..4bffb04607 --- /dev/null +++ b/keyboards/ploopyco/trackball_nano/trackball_nano.h @@ -0,0 +1,53 @@ +/* Copyright 2021 Colin Lam (Ploopy Corporation) + * Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com> + * Copyright 2019 Sunjun Kim + * Copyright 2019 Hiroyuki Okada + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#pragma once + +#include "quantum.h" +#include "adns5050.h" +#include "analog.h" +#include "opt_encoder.h" +#include "pointing_device.h" + +// Sensor defs +#define OPT_ENC1 F0 +#define OPT_ENC2 F4 +#define OPT_ENC1_MUX 0 +#define OPT_ENC2_MUX 4 + +void process_mouse(report_mouse_t* mouse_report); +void process_mouse_user(report_mouse_t* mouse_report, int16_t x, int16_t y); +void process_wheel(report_mouse_t* mouse_report); +void process_wheel_user(report_mouse_t* mouse_report, int16_t h, int16_t v); + +#define LAYOUT(k00) {{ KC_NO }} + +typedef union { + uint32_t raw; + struct { + uint8_t dpi_config; + }; +} keyboard_config_t; + +extern keyboard_config_t keyboard_config; + +enum ploopy_keycodes { + DPI_CONFIG = SAFE_RANGE, + PLOOPY_SAFE_RANGE, +}; |