Skip to content

Commit 602073f

Browse files
mjboguszrodrigob
authored andcommitted
[Keyboard] Add Atlantis PS17 (qmk#19952)
1 parent f929ef1 commit 602073f

File tree

10 files changed

+390
-0
lines changed

10 files changed

+390
-0
lines changed

keyboards/atlantis/ps17/config.h

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// Copyright 2023 mjbogusz (@mjbogusz)
2+
// SPDX-License-Identifier: GPL-2.0-or-later
3+
4+
#pragma once
5+
6+
/* Indicator LEDs */
7+
#define LED_INDICATOR_0_PIN D0
8+
#define LED_INDICATOR_1_PIN D5
9+
#define LED_INDICATOR_2_PIN D4
10+
11+
/* RGB matrix */
12+
#define RGB_DI_PIN B7
13+
#define RGB_MATRIX_LED_COUNT 28
14+
#define RGB_MATRIX_KEYPRESSES
15+
#define RGB_DISABLE_WHEN_USB_SUSPENDED
16+
17+
#ifdef RGB_MATRIX_ENABLE
18+
// RGB Matrix Animation modes. Explicitly enabled
19+
// For full list of effects, see:
20+
// https://docs.qmk.fm/#/feature_rgb_matrix?id=rgb-matrix-effects
21+
#define ENABLE_RGB_MATRIX_SOLID_COLOR
22+
// #define ENABLE_RGB_MATRIX_ALPHAS_MODS
23+
// #define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
24+
// #define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
25+
// #define ENABLE_RGB_MATRIX_BREATHING
26+
// #define ENABLE_RGB_MATRIX_BAND_SAT
27+
// #define ENABLE_RGB_MATRIX_BAND_VAL
28+
// #define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
29+
// #define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
30+
// #define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT
31+
// #define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL
32+
#define ENABLE_RGB_MATRIX_CYCLE_ALL
33+
// #define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
34+
// #define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN
35+
// #define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
36+
// #define ENABLE_RGB_MATRIX_CYCLE_OUT_IN
37+
// #define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
38+
#define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL
39+
// #define ENABLE_RGB_MATRIX_CYCLE_SPIRAL
40+
// #define ENABLE_RGB_MATRIX_DUAL_BEACON
41+
#define ENABLE_RGB_MATRIX_RAINBOW_BEACON
42+
// #define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS
43+
// #define ENABLE_RGB_MATRIX_RAINDROPS
44+
// #define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
45+
// #define ENABLE_RGB_MATRIX_HUE_BREATHING
46+
// #define ENABLE_RGB_MATRIX_HUE_PENDULUM
47+
// #define ENABLE_RGB_MATRIX_HUE_WAVE
48+
// #define ENABLE_RGB_MATRIX_PIXEL_FRACTAL
49+
// #define ENABLE_RGB_MATRIX_PIXEL_FLOW
50+
#define ENABLE_RGB_MATRIX_PIXEL_RAIN
51+
// #define ENABLE_RGB_MATRIX_TYPING_HEATMAP
52+
// #define ENABLE_RGB_MATRIX_DIGITAL_RAIN
53+
#endif

keyboards/atlantis/ps17/info.json

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
{
2+
"manufacturer": "Atlantis",
3+
"keyboard_name": "PS17",
4+
"maintainer": "mjbogusz",
5+
"url": "https://qmk.fm/keyboards/",
6+
"processor": "atmega32u4",
7+
"bootloader": "atmel-dfu",
8+
"bootloader_instructions": "To reset the board into bootloader mode, tap the Reset switch mounted on the bottom of the PCB.",
9+
"usb": {
10+
"device_version": "1.0.0",
11+
"pid": "0x414B",
12+
"vid": "0x0015"
13+
},
14+
"features": {
15+
"bootmagic": false,
16+
"command": false,
17+
"console": false,
18+
"extrakey": true,
19+
"mousekey": true,
20+
"nkro": true,
21+
"encoder": true,
22+
"rgb_matrix": true
23+
},
24+
"diode_direction": "COL2ROW",
25+
"matrix_pins": {
26+
"cols": ["F6", "F7", "D3", "D6"],
27+
"rows": ["F0", "B4", "B5", "B6", "C6", "C7", "NO_PIN", "NO_PIN", "NO_PIN", "NO_PIN", "NO_PIN"]
28+
},
29+
"encoder": {
30+
"rotary": [{
31+
"pin_a": "D2",
32+
"pin_b": "D1"
33+
}]
34+
},
35+
"layouts": {
36+
"LAYOUT": {
37+
"layout": [
38+
{ "matrix": [0, 1], "x": 0, "y": 0},
39+
40+
{ "matrix": [1, 0], "x": 0, "y": 1.5},
41+
{ "matrix": [1, 1], "x": 1, "y": 1.5},
42+
{ "matrix": [1, 2], "x": 2, "y": 1.5},
43+
{ "matrix": [1, 3], "x": 3, "y": 1.5},
44+
45+
{ "matrix": [2, 0], "x": 0, "y": 2.5},
46+
{ "matrix": [2, 1], "x": 1, "y": 2.5},
47+
{ "matrix": [2, 2], "x": 2, "y": 2.5},
48+
{ "matrix": [2, 3], "x": 3, "y": 2.5, "h": 2},
49+
50+
{ "matrix": [3, 0], "x": 0, "y": 3.5},
51+
{ "matrix": [3, 1], "x": 1, "y": 3.5},
52+
{ "matrix": [3, 2], "x": 2, "y": 3.5},
53+
54+
{ "matrix": [4, 0], "x": 0, "y": 4.5},
55+
{ "matrix": [4, 1], "x": 1, "y": 4.5},
56+
{ "matrix": [4, 2], "x": 2, "y": 4.5},
57+
{ "matrix": [4, 3], "x": 3, "y": 4.5, "h": 2},
58+
59+
{ "matrix": [5, 0], "x": 0, "y": 5.5, "w": 2},
60+
{ "matrix": [5, 2], "x": 2, "y": 5.5}
61+
]
62+
}
63+
},
64+
"rgb_matrix": {
65+
"driver": "WS2812",
66+
"center_point": [126, 126],
67+
"layout": [
68+
{ "flags": 4, "matrix": [1, 0], "x": 74, "y": 165 },
69+
{ "flags": 4, "matrix": [1, 1], "x": 108, "y": 165 },
70+
{ "flags": 4, "matrix": [1, 2], "x": 144, "y": 165 },
71+
{ "flags": 4, "matrix": [1, 3], "x": 179, "y": 165 },
72+
{ "flags": 4, "matrix": [2, 0], "x": 74, "y": 129 },
73+
{ "flags": 4, "matrix": [2, 1], "x": 109, "y": 129 },
74+
{ "flags": 4, "matrix": [2, 2], "x": 143, "y": 129 },
75+
{ "flags": 4, "matrix": [2, 3], "x": 188, "y": 121 },
76+
{ "flags": 4, "matrix": [3, 0], "x": 74, "y": 95 },
77+
{ "flags": 4, "matrix": [3, 1], "x": 109, "y": 95 },
78+
{ "flags": 4, "matrix": [3, 2], "x": 143, "y": 95 },
79+
{ "flags": 4, "matrix": [4, 0], "x": 73, "y": 60 },
80+
{ "flags": 4, "matrix": [4, 1], "x": 109, "y": 60 },
81+
{ "flags": 4, "matrix": [4, 2], "x": 144, "y": 60 },
82+
{ "flags": 4, "matrix": [4, 3], "x": 188, "y": 51 },
83+
{ "flags": 4, "matrix": [5, 0], "x": 91, "y": 25 },
84+
{ "flags": 4, "matrix": [5, 2], "x": 144, "y": 25 },
85+
86+
{ "flags": 2, "x": 61, "y": 26},
87+
{ "flags": 2, "x": 61, "y": 88},
88+
{ "flags": 2, "x": 61, "y": 158},
89+
{ "flags": 2, "x": 61, "y": 197},
90+
{ "flags": 2, "x": 61, "y": 232},
91+
{ "flags": 2, "x": 192, "y": 232},
92+
{ "flags": 2, "x": 192, "y": 196},
93+
{ "flags": 2, "x": 192, "y": 158},
94+
{ "flags": 2, "x": 192, "y": 87},
95+
{ "flags": 2, "x": 183, "y": 26},
96+
{ "flags": 2, "x": 127, "y": 24}
97+
]
98+
}
99+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// Copyright 2023 mjbogusz (@mjbogusz)
2+
// SPDX-License-Identifier: GPL-2.0-or-later
3+
4+
#include QMK_KEYBOARD_H
5+
6+
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
7+
// Default layer: numpad + volume control
8+
[0] = LAYOUT(
9+
KC_MUTE,
10+
TO(1), KC_PSLS, KC_PAST, KC_PMNS,
11+
KC_KP_7, KC_KP_8, KC_KP_9, KC_PPLS,
12+
KC_KP_4, KC_KP_5, KC_KP_6,
13+
KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT,
14+
KC_KP_0, KC_PDOT
15+
),
16+
[1] = LAYOUT(
17+
RGB_MOD,
18+
TO(2), KC_TRNS, KC_TRNS, KC_TRNS,
19+
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
20+
KC_TRNS, KC_TRNS, KC_TRNS,
21+
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
22+
KC_TRNS, KC_TRNS
23+
),
24+
[2] = LAYOUT(
25+
RGB_MOD,
26+
TO(3), KC_TRNS, KC_TRNS, KC_TRNS,
27+
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
28+
KC_TRNS, KC_TRNS, KC_TRNS,
29+
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
30+
KC_TRNS, KC_TRNS
31+
),
32+
[3] = LAYOUT(
33+
RGB_MOD,
34+
TO(0), KC_TRNS, KC_TRNS, KC_TRNS,
35+
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
36+
KC_TRNS, KC_TRNS, KC_TRNS,
37+
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
38+
KC_TRNS, KC_TRNS
39+
),
40+
};
41+
42+
#if defined(ENCODER_MAP_ENABLE)
43+
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
44+
[0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
45+
[1] = { ENCODER_CCW_CW(RGB_HUI, RGB_HUD) },
46+
[2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
47+
[3] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
48+
};
49+
#endif
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// Copyright 2023 mjbogusz (@mjbogusz)
2+
// SPDX-License-Identifier: GPL-2.0-or-later
3+
4+
#include QMK_KEYBOARD_H
5+
6+
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
7+
// Default layer: numpad + volume control
8+
[0] = LAYOUT(
9+
KC_MUTE,
10+
TO(1), KC_PSLS, KC_PAST, KC_PMNS,
11+
KC_KP_7, KC_KP_8, KC_KP_9, KC_PPLS,
12+
KC_KP_4, KC_KP_5, KC_KP_6,
13+
KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT,
14+
KC_KP_0, KC_PDOT
15+
),
16+
[1] = LAYOUT(
17+
KC_MUTE,
18+
TO(2), XXXXXXX, XXXXXXX, KC_VOLD,
19+
XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLU,
20+
KC_MRWD, KC_MPLY, KC_MFFD,
21+
KC_MPRV, KC_MSTP, KC_MNXT, KC_MSEL,
22+
XXXXXXX, XXXXXXX
23+
),
24+
[2] = LAYOUT(
25+
RGB_MOD,
26+
TO(3), KC_TRNS, KC_TRNS, KC_TRNS,
27+
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
28+
KC_TRNS, KC_TRNS, KC_TRNS,
29+
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
30+
KC_TRNS, KC_TRNS
31+
),
32+
[3] = LAYOUT(
33+
KC_TRNS,
34+
TO(0), KC_TRNS, KC_TRNS, KC_TRNS,
35+
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
36+
KC_TRNS, KC_TRNS, KC_TRNS,
37+
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
38+
KC_TRNS, KC_TRNS
39+
),
40+
};
41+
42+
#if defined(ENCODER_MAP_ENABLE)
43+
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
44+
[0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
45+
[1] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
46+
[2] = { ENCODER_CCW_CW(RGB_HUI, RGB_HUD) },
47+
[3] = { ENCODER_CCW_CW(RGB_HUI, RGB_HUD) },
48+
};
49+
#endif
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ENCODER_MAP_ENABLE = yes
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// Copyright 2023 mjbogusz (@mjbogusz)
2+
// SPDX-License-Identifier: GPL-2.0-or-later
3+
4+
#include QMK_KEYBOARD_H
5+
6+
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
7+
// Default layer: numpad + volume control
8+
[0] = LAYOUT(
9+
KC_MUTE,
10+
TO(1), KC_PSLS, KC_PAST, KC_PMNS,
11+
KC_KP_7, KC_KP_8, KC_KP_9, KC_PPLS,
12+
KC_KP_4, KC_KP_5, KC_KP_6,
13+
KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT,
14+
KC_KP_0, KC_PDOT
15+
),
16+
[1] = LAYOUT(
17+
RGB_MOD,
18+
TO(2), KC_TRNS, KC_TRNS, KC_TRNS,
19+
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
20+
KC_TRNS, KC_TRNS, KC_TRNS,
21+
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
22+
KC_TRNS, KC_TRNS
23+
),
24+
[2] = LAYOUT(
25+
KC_TRNS,
26+
TO(3), KC_TRNS, KC_TRNS, KC_TRNS,
27+
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
28+
KC_TRNS, KC_TRNS, KC_TRNS,
29+
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
30+
KC_TRNS, KC_TRNS
31+
),
32+
[3] = LAYOUT(
33+
KC_TRNS,
34+
TO(0), KC_TRNS, KC_TRNS, KC_TRNS,
35+
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
36+
KC_TRNS, KC_TRNS, KC_TRNS,
37+
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
38+
KC_TRNS, KC_TRNS
39+
),
40+
};
41+
42+
#if defined(ENCODER_MAP_ENABLE)
43+
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
44+
[0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
45+
[1] = { ENCODER_CCW_CW(RGB_HUI, RGB_HUD) },
46+
[2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
47+
[3] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
48+
};
49+
#endif
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
ENCODER_MAP_ENABLE = yes
2+
VIA_ENABLE = yes

keyboards/atlantis/ps17/ps17.c

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// Copyright 2023 mjbogusz (@mjbogusz)
2+
// SPDX-License-Identifier: GPL-2.0-or-later
3+
4+
#include "quantum.h"
5+
6+
layer_state_t layer_state_set_kb(layer_state_t state) {
7+
/* Display current layer using indicator LEDs */
8+
writePin(LED_INDICATOR_0_PIN, !IS_LAYER_ON_STATE(state, 1));
9+
writePin(LED_INDICATOR_1_PIN, !IS_LAYER_ON_STATE(state, 2));
10+
writePin(LED_INDICATOR_2_PIN, !IS_LAYER_ON_STATE(state, 3));
11+
return layer_state_set_user(state);
12+
}
13+
14+
void keyboard_pre_init_kb(void) {
15+
/* Set indicator LEDs as outputs */
16+
setPinOutput(LED_INDICATOR_0_PIN);
17+
setPinOutput(LED_INDICATOR_1_PIN);
18+
setPinOutput(LED_INDICATOR_2_PIN);
19+
keyboard_pre_init_user();
20+
}
21+
22+
#if defined(ENCODER_ENABLE)
23+
bool encoder_update_kb(uint8_t index, bool clockwise) {
24+
if (!encoder_update_user(index, clockwise)) {
25+
/* Don't process further events if user function exists and returns false */
26+
return false;
27+
}
28+
29+
/* Ignore index - only one encoder on this board */
30+
if (clockwise) {
31+
tap_code_delay(KC_VOLU, 10);
32+
} else {
33+
tap_code_delay(KC_VOLD, 10);
34+
}
35+
return false;
36+
}
37+
#endif
38+
39+
#ifdef RGB_MATRIX_ENABLE
40+
void suspend_power_down_kb(void) {
41+
/* Disable indicator LEDs when going to sleep */
42+
writePin(LED_INDICATOR_0_PIN, 1);
43+
writePin(LED_INDICATOR_1_PIN, 1);
44+
writePin(LED_INDICATOR_2_PIN, 1);
45+
suspend_power_down_user();
46+
}
47+
48+
void suspend_wakeup_init_kb(void) {
49+
/* Restore indicator LEDs state */
50+
layer_state_set_kb(layer_state);
51+
suspend_wakeup_init_user();
52+
}
53+
#endif

keyboards/atlantis/ps17/readme.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# atlantis/ps17
2+
3+
![atlantis/ps17](https://i.imgur.com/5qGIv2Kh.jpg)
4+
5+
A 17-key hot-swap numpad/macropad with an EC11 clickable rotary encoder (knob) and RGB backlight and underglow
6+
7+
* Keyboard Maintainer: [mjbogusz](https://github.com/mjbogusz)
8+
* Hardware Supported: Atlantis PS17
9+
* Hardware Availability: [AliExpress, SpiderIsland Tech Co., Ltd Store](https://www.aliexpress.com/item/1005003058226085.html)
10+
* Additional photos:
11+
* [Full size](https://i.imgur.com/5qGIv2K.jpg)
12+
* [PCB front](https://i.imgur.com/OmGBqvC.jpg)
13+
* [PCB back](https://i.imgur.com/rvoZZ5f.jpg)
14+
15+
Make example for this keyboard (after setting up your build environment):
16+
17+
make atlantis/ps17:default
18+
19+
Flashing example for this keyboard:
20+
21+
make atlantis/ps17:default:flash
22+
23+
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).
24+
25+
## Bootloader
26+
27+
Enter the bootloader in 3 ways:
28+
29+
* **Physical reset button**: Briefly press the button on the back of the PCB
30+
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
31+
32+
## Attributions
33+
34+
Pin mapping and LED physical layout based on [Solartempest work](https://github.com/solartempest/qmk_firmware/tree/master/keyboards/solartempest/ps17)

keyboards/atlantis/ps17/rules.mk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
LTO_ENABLE = yes

0 commit comments

Comments
 (0)