diff --git a/keyboards/atlantis/ps17/config.h b/keyboards/atlantis/ps17/config.h new file mode 100644 index 0000000000..5638e334bd --- /dev/null +++ b/keyboards/atlantis/ps17/config.h @@ -0,0 +1,53 @@ +// Copyright 2023 mjbogusz (@mjbogusz) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +/* Indicator LEDs */ +#define LED_INDICATOR_0_PIN D0 +#define LED_INDICATOR_1_PIN D5 +#define LED_INDICATOR_2_PIN D4 + +/* RGB matrix */ +#define RGB_DI_PIN B7 +#define RGB_MATRIX_LED_COUNT 28 +#define RGB_MATRIX_KEYPRESSES +#define RGB_DISABLE_WHEN_USB_SUSPENDED + +#ifdef RGB_MATRIX_ENABLE + // RGB Matrix Animation modes. Explicitly enabled + // For full list of effects, see: + // https://docs.qmk.fm/#/feature_rgb_matrix?id=rgb-matrix-effects + #define ENABLE_RGB_MATRIX_SOLID_COLOR + // #define ENABLE_RGB_MATRIX_ALPHAS_MODS + // #define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN + // #define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT + // #define ENABLE_RGB_MATRIX_BREATHING + // #define ENABLE_RGB_MATRIX_BAND_SAT + // #define ENABLE_RGB_MATRIX_BAND_VAL + // #define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT + // #define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL + // #define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT + // #define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL + #define ENABLE_RGB_MATRIX_CYCLE_ALL + // #define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT + // #define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN + // #define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON + // #define ENABLE_RGB_MATRIX_CYCLE_OUT_IN + // #define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL + #define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL + // #define ENABLE_RGB_MATRIX_CYCLE_SPIRAL + // #define ENABLE_RGB_MATRIX_DUAL_BEACON + #define ENABLE_RGB_MATRIX_RAINBOW_BEACON + // #define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS + // #define ENABLE_RGB_MATRIX_RAINDROPS + // #define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS + // #define ENABLE_RGB_MATRIX_HUE_BREATHING + // #define ENABLE_RGB_MATRIX_HUE_PENDULUM + // #define ENABLE_RGB_MATRIX_HUE_WAVE + // #define ENABLE_RGB_MATRIX_PIXEL_FRACTAL + // #define ENABLE_RGB_MATRIX_PIXEL_FLOW + #define ENABLE_RGB_MATRIX_PIXEL_RAIN + // #define ENABLE_RGB_MATRIX_TYPING_HEATMAP + // #define ENABLE_RGB_MATRIX_DIGITAL_RAIN +#endif diff --git a/keyboards/atlantis/ps17/info.json b/keyboards/atlantis/ps17/info.json new file mode 100644 index 0000000000..5b025c83f7 --- /dev/null +++ b/keyboards/atlantis/ps17/info.json @@ -0,0 +1,99 @@ +{ + "manufacturer": "Atlantis", + "keyboard_name": "PS17", + "maintainer": "mjbogusz", + "url": "https://qmk.fm/keyboards/", + "processor": "atmega32u4", + "bootloader": "atmel-dfu", + "bootloader_instructions": "To reset the board into bootloader mode, tap the Reset switch mounted on the bottom of the PCB.", + "usb": { + "device_version": "1.0.0", + "pid": "0x414B", + "vid": "0x0015" + }, + "features": { + "bootmagic": false, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true, + "encoder": true, + "rgb_matrix": true + }, + "diode_direction": "COL2ROW", + "matrix_pins": { + "cols": ["F6", "F7", "D3", "D6"], + "rows": ["F0", "B4", "B5", "B6", "C6", "C7", "NO_PIN", "NO_PIN", "NO_PIN", "NO_PIN", "NO_PIN"] + }, + "encoder": { + "rotary": [{ + "pin_a": "D2", + "pin_b": "D1" + }] + }, + "layouts": { + "LAYOUT": { + "layout": [ + { "matrix": [0, 1], "x": 0, "y": 0}, + + { "matrix": [1, 0], "x": 0, "y": 1.5}, + { "matrix": [1, 1], "x": 1, "y": 1.5}, + { "matrix": [1, 2], "x": 2, "y": 1.5}, + { "matrix": [1, 3], "x": 3, "y": 1.5}, + + { "matrix": [2, 0], "x": 0, "y": 2.5}, + { "matrix": [2, 1], "x": 1, "y": 2.5}, + { "matrix": [2, 2], "x": 2, "y": 2.5}, + { "matrix": [2, 3], "x": 3, "y": 2.5, "h": 2}, + + { "matrix": [3, 0], "x": 0, "y": 3.5}, + { "matrix": [3, 1], "x": 1, "y": 3.5}, + { "matrix": [3, 2], "x": 2, "y": 3.5}, + + { "matrix": [4, 0], "x": 0, "y": 4.5}, + { "matrix": [4, 1], "x": 1, "y": 4.5}, + { "matrix": [4, 2], "x": 2, "y": 4.5}, + { "matrix": [4, 3], "x": 3, "y": 4.5, "h": 2}, + + { "matrix": [5, 0], "x": 0, "y": 5.5, "w": 2}, + { "matrix": [5, 2], "x": 2, "y": 5.5} + ] + } + }, + "rgb_matrix": { + "driver": "WS2812", + "center_point": [126, 126], + "layout": [ + { "flags": 4, "matrix": [1, 0], "x": 74, "y": 165 }, + { "flags": 4, "matrix": [1, 1], "x": 108, "y": 165 }, + { "flags": 4, "matrix": [1, 2], "x": 144, "y": 165 }, + { "flags": 4, "matrix": [1, 3], "x": 179, "y": 165 }, + { "flags": 4, "matrix": [2, 0], "x": 74, "y": 129 }, + { "flags": 4, "matrix": [2, 1], "x": 109, "y": 129 }, + { "flags": 4, "matrix": [2, 2], "x": 143, "y": 129 }, + { "flags": 4, "matrix": [2, 3], "x": 188, "y": 121 }, + { "flags": 4, "matrix": [3, 0], "x": 74, "y": 95 }, + { "flags": 4, "matrix": [3, 1], "x": 109, "y": 95 }, + { "flags": 4, "matrix": [3, 2], "x": 143, "y": 95 }, + { "flags": 4, "matrix": [4, 0], "x": 73, "y": 60 }, + { "flags": 4, "matrix": [4, 1], "x": 109, "y": 60 }, + { "flags": 4, "matrix": [4, 2], "x": 144, "y": 60 }, + { "flags": 4, "matrix": [4, 3], "x": 188, "y": 51 }, + { "flags": 4, "matrix": [5, 0], "x": 91, "y": 25 }, + { "flags": 4, "matrix": [5, 2], "x": 144, "y": 25 }, + + { "flags": 2, "x": 61, "y": 26}, + { "flags": 2, "x": 61, "y": 88}, + { "flags": 2, "x": 61, "y": 158}, + { "flags": 2, "x": 61, "y": 197}, + { "flags": 2, "x": 61, "y": 232}, + { "flags": 2, "x": 192, "y": 232}, + { "flags": 2, "x": 192, "y": 196}, + { "flags": 2, "x": 192, "y": 158}, + { "flags": 2, "x": 192, "y": 87}, + { "flags": 2, "x": 183, "y": 26}, + { "flags": 2, "x": 127, "y": 24} + ] + } +} diff --git a/keyboards/atlantis/ps17/keymaps/default/keymap.c b/keyboards/atlantis/ps17/keymaps/default/keymap.c new file mode 100644 index 0000000000..b5d36f02a7 --- /dev/null +++ b/keyboards/atlantis/ps17/keymaps/default/keymap.c @@ -0,0 +1,49 @@ +// Copyright 2023 mjbogusz (@mjbogusz) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // Default layer: numpad + volume control + [0] = LAYOUT( + KC_MUTE, + TO(1), KC_PSLS, KC_PAST, KC_PMNS, + KC_KP_7, KC_KP_8, KC_KP_9, KC_PPLS, + KC_KP_4, KC_KP_5, KC_KP_6, + KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT, + KC_KP_0, KC_PDOT + ), + [1] = LAYOUT( + RGB_MOD, + TO(2), KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ), + [2] = LAYOUT( + RGB_MOD, + TO(3), KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ), + [3] = LAYOUT( + RGB_MOD, + TO(0), KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ), +}; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = { + [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [1] = { ENCODER_CCW_CW(RGB_HUI, RGB_HUD) }, + [2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, + [3] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, +}; +#endif diff --git a/keyboards/atlantis/ps17/keymaps/multimedia/keymap.c b/keyboards/atlantis/ps17/keymaps/multimedia/keymap.c new file mode 100644 index 0000000000..32d20ef86c --- /dev/null +++ b/keyboards/atlantis/ps17/keymaps/multimedia/keymap.c @@ -0,0 +1,49 @@ +// Copyright 2023 mjbogusz (@mjbogusz) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // Default layer: numpad + volume control + [0] = LAYOUT( + KC_MUTE, + TO(1), KC_PSLS, KC_PAST, KC_PMNS, + KC_KP_7, KC_KP_8, KC_KP_9, KC_PPLS, + KC_KP_4, KC_KP_5, KC_KP_6, + KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT, + KC_KP_0, KC_PDOT + ), + [1] = LAYOUT( + KC_MUTE, + TO(2), XXXXXXX, XXXXXXX, KC_VOLD, + XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLU, + KC_MRWD, KC_MPLY, KC_MFFD, + KC_MPRV, KC_MSTP, KC_MNXT, KC_MSEL, + XXXXXXX, XXXXXXX + ), + [2] = LAYOUT( + RGB_MOD, + TO(3), KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ), + [3] = LAYOUT( + KC_TRNS, + TO(0), KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ), +}; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = { + [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [1] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [2] = { ENCODER_CCW_CW(RGB_HUI, RGB_HUD) }, + [3] = { ENCODER_CCW_CW(RGB_HUI, RGB_HUD) }, +}; +#endif diff --git a/keyboards/atlantis/ps17/keymaps/multimedia/rules.mk b/keyboards/atlantis/ps17/keymaps/multimedia/rules.mk new file mode 100644 index 0000000000..ee32568148 --- /dev/null +++ b/keyboards/atlantis/ps17/keymaps/multimedia/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/atlantis/ps17/keymaps/via/keymap.c b/keyboards/atlantis/ps17/keymaps/via/keymap.c new file mode 100644 index 0000000000..93a158172d --- /dev/null +++ b/keyboards/atlantis/ps17/keymaps/via/keymap.c @@ -0,0 +1,49 @@ +// Copyright 2023 mjbogusz (@mjbogusz) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // Default layer: numpad + volume control + [0] = LAYOUT( + KC_MUTE, + TO(1), KC_PSLS, KC_PAST, KC_PMNS, + KC_KP_7, KC_KP_8, KC_KP_9, KC_PPLS, + KC_KP_4, KC_KP_5, KC_KP_6, + KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT, + KC_KP_0, KC_PDOT + ), + [1] = LAYOUT( + RGB_MOD, + TO(2), KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ), + [2] = LAYOUT( + KC_TRNS, + TO(3), KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ), + [3] = LAYOUT( + KC_TRNS, + TO(0), KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS + ), +}; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = { + [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [1] = { ENCODER_CCW_CW(RGB_HUI, RGB_HUD) }, + [2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, + [3] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, +}; +#endif diff --git a/keyboards/atlantis/ps17/keymaps/via/rules.mk b/keyboards/atlantis/ps17/keymaps/via/rules.mk new file mode 100644 index 0000000000..715838ecc5 --- /dev/null +++ b/keyboards/atlantis/ps17/keymaps/via/rules.mk @@ -0,0 +1,2 @@ +ENCODER_MAP_ENABLE = yes +VIA_ENABLE = yes diff --git a/keyboards/atlantis/ps17/ps17.c b/keyboards/atlantis/ps17/ps17.c new file mode 100644 index 0000000000..ccac1ce923 --- /dev/null +++ b/keyboards/atlantis/ps17/ps17.c @@ -0,0 +1,53 @@ +// Copyright 2023 mjbogusz (@mjbogusz) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" + +layer_state_t layer_state_set_kb(layer_state_t state) { + /* Display current layer using indicator LEDs */ + writePin(LED_INDICATOR_0_PIN, !IS_LAYER_ON_STATE(state, 1)); + writePin(LED_INDICATOR_1_PIN, !IS_LAYER_ON_STATE(state, 2)); + writePin(LED_INDICATOR_2_PIN, !IS_LAYER_ON_STATE(state, 3)); + return layer_state_set_user(state); +} + +void keyboard_pre_init_kb(void) { + /* Set indicator LEDs as outputs */ + setPinOutput(LED_INDICATOR_0_PIN); + setPinOutput(LED_INDICATOR_1_PIN); + setPinOutput(LED_INDICATOR_2_PIN); + keyboard_pre_init_user(); +} + +#if defined(ENCODER_ENABLE) +bool encoder_update_kb(uint8_t index, bool clockwise) { + if (!encoder_update_user(index, clockwise)) { + /* Don't process further events if user function exists and returns false */ + return false; + } + + /* Ignore index - only one encoder on this board */ + if (clockwise) { + tap_code_delay(KC_VOLU, 10); + } else { + tap_code_delay(KC_VOLD, 10); + } + return false; +} +#endif + +#ifdef RGB_MATRIX_ENABLE +void suspend_power_down_kb(void) { + /* Disable indicator LEDs when going to sleep */ + writePin(LED_INDICATOR_0_PIN, 1); + writePin(LED_INDICATOR_1_PIN, 1); + writePin(LED_INDICATOR_2_PIN, 1); + suspend_power_down_user(); +} + +void suspend_wakeup_init_kb(void) { + /* Restore indicator LEDs state */ + layer_state_set_kb(layer_state); + suspend_wakeup_init_user(); +} +#endif diff --git a/keyboards/atlantis/ps17/readme.md b/keyboards/atlantis/ps17/readme.md new file mode 100644 index 0000000000..69d735739b --- /dev/null +++ b/keyboards/atlantis/ps17/readme.md @@ -0,0 +1,34 @@ +# atlantis/ps17 + +![atlantis/ps17](https://i.imgur.com/5qGIv2Kh.jpg) + +A 17-key hot-swap numpad/macropad with an EC11 clickable rotary encoder (knob) and RGB backlight and underglow + +* Keyboard Maintainer: [mjbogusz](https://github.com/mjbogusz) +* Hardware Supported: Atlantis PS17 +* Hardware Availability: [AliExpress, SpiderIsland Tech Co., Ltd Store](https://www.aliexpress.com/item/1005003058226085.html) +* Additional photos: + * [Full size](https://i.imgur.com/5qGIv2K.jpg) + * [PCB front](https://i.imgur.com/OmGBqvC.jpg) + * [PCB back](https://i.imgur.com/rvoZZ5f.jpg) + +Make example for this keyboard (after setting up your build environment): + + make atlantis/ps17:default + +Flashing example for this keyboard: + + make atlantis/ps17: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: + +* **Physical reset button**: Briefly press the button on the back of the PCB +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available + +## Attributions + +Pin mapping and LED physical layout based on [Solartempest work](https://github.com/solartempest/qmk_firmware/tree/master/keyboards/solartempest/ps17) diff --git a/keyboards/atlantis/ps17/rules.mk b/keyboards/atlantis/ps17/rules.mk new file mode 100644 index 0000000000..4da205a168 --- /dev/null +++ b/keyboards/atlantis/ps17/rules.mk @@ -0,0 +1 @@ +LTO_ENABLE = yes