aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSleepdealer <35879391+Sleepdealr@users.noreply.github.com>2021-11-16 14:30:21 -0500
committerGitHub <noreply@github.com>2021-11-16 11:30:21 -0800
commitf3897f55b5cc254b30aef73cd08a8d9ba42e6fc0 (patch)
tree567607edc97d5e501211028b4cabad8c44f4d408
parent053a970cba9a69747c69943611c43d24a327ab23 (diff)
downloadqmk_firmware-f3897f55b5cc254b30aef73cd08a8d9ba42e6fc0.tar.gz
qmk_firmware-f3897f55b5cc254b30aef73cd08a8d9ba42e6fc0.zip
[Keyboard] Add FootFingers Puca (#14837)
-rw-r--r--keyboards/ffkeebs/puca/config.h69
-rw-r--r--keyboards/ffkeebs/puca/info.json37
-rw-r--r--keyboards/ffkeebs/puca/keymaps/default/keymap.c52
-rw-r--r--keyboards/ffkeebs/puca/puca.c133
-rw-r--r--keyboards/ffkeebs/puca/puca.h41
-rw-r--r--keyboards/ffkeebs/puca/readme.md23
-rw-r--r--keyboards/ffkeebs/puca/rules.mk25
7 files changed, 380 insertions, 0 deletions
diff --git a/keyboards/ffkeebs/puca/config.h b/keyboards/ffkeebs/puca/config.h
new file mode 100644
index 000000000..29bb9a782
--- /dev/null
+++ b/keyboards/ffkeebs/puca/config.h
@@ -0,0 +1,69 @@
1/*
2Copyright 2021 Sleepdealer
3
4This program is free software: you can redistribute it and/or modify
5it under the terms of the GNU General Public License as published by
6the Free Software Foundation, either version 2 of the License, or
7(at your option) any later version.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12GNU General Public License for more details.
13
14You should have received a copy of the GNU General Public License
15along with this program. If not, see <http://www.gnu.org/licenses/>.
16*/
17
18#pragma once
19
20#include "config_common.h"
21
22/* USB Device descriptor parameter */
23#define VENDOR_ID 0x4646 // FF
24#define PRODUCT_ID 0x0002
25#define DEVICE_VER 0x0001
26#define MANUFACTURER FootFingers
27#define PRODUCT Puca
28
29#define MATRIX_ROWS 6
30#define MATRIX_COLS 5
31 // 0 , 1 , 2 , 3 , 4 , 5
32#define MATRIX_ROW_PINS { B4, E6, D7, B5, C6, F6}
33#define MATRIX_COL_PINS { F7, B1, B3, B2, B6}
34
35#define DIODE_DIRECTION COL2ROW
36
37#ifdef RGBLIGHT_ENABLE
38 #define RGB_DI_PIN D4
39
40 #define RGBLIGHT_EFFECT_BREATHING
41 #define RGBLIGHT_EFFECT_RAINBOW_MOOD
42 #define RGBLIGHT_EFFECT_RAINBOW_SWIRL
43 #define RGBLIGHT_EFFECT_SNAKE
44 #define RGBLIGHT_EFFECT_KNIGHT
45 #define RGBLIGHT_EFFECT_CHRISTMAS
46 #define RGBLIGHT_EFFECT_STATIC_GRADIENT
47 #define RGBLIGHT_EFFECT_RGB_TEST
48 #define RGBLIGHT_EFFECT_ALTERNATING
49 #define RGBLIGHT_EFFECT_TWINKLE
50 #define RGBLIGHT_DEFAULT_MODE RGBLIGHT_MODE_STATIC_LIGHT
51 #define RGBLED_NUM 8
52#endif
53
54
55#define ENCODERS_PAD_A { F4 }
56#define ENCODERS_PAD_B { F5 }
57
58/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
59#define DEBOUNCE 5
60
61/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
62#define LOCKING_SUPPORT_ENABLE
63/* Locking resynchronize hack */
64#define LOCKING_RESYNC_ENABLE
65
66/* disable these deprecated features by default */
67#define NO_ACTION_MACRO
68#define NO_ACTION_FUNCTION
69
diff --git a/keyboards/ffkeebs/puca/info.json b/keyboards/ffkeebs/puca/info.json
new file mode 100644
index 000000000..0b5b957e6
--- /dev/null
+++ b/keyboards/ffkeebs/puca/info.json
@@ -0,0 +1,37 @@
1{
2 "keyboard_name": "Puca",
3 "url": "https://ffkeebs.com/collections/puca/",
4 "maintainer": "Sleepdealr",
5 "layouts": {
6 "LAYOUT": {
7 "layout": [
8 { "label": "Rotary", "x": 0.5, "y": 0 },
9 { "label": "Pg Up", "x": 2, "y": 0 },
10 { "label": "Pg Dn", "x": 3, "y": 0 },
11 { "label": "Layer Toggle", "x": 0, "y": 1.25 },
12 { "label": "/", "x": 1, "y": 1.25 },
13 { "label": "*", "x": 2, "y": 1.25 },
14 { "label": "-", "x": 3, "y": 1.25 },
15 { "label": "7", "x": 0, "y": 2.25 },
16 { "label": "8", "x": 1, "y": 2.25 },
17 { "label": "9", "x": 2, "y": 2.25 },
18 { "label": "+", "x": 3, "y": 2.25, "h": 2 },
19 { "label": "+", "x": 4, "y": 2.25 },
20 { "label": "4", "x": 0, "y": 3.25 },
21 { "label": "5", "x": 1, "y": 3.25 },
22 { "label": "6", "x": 2, "y": 3.25 },
23 { "label": "|", "x": 4, "y": 3.25 },
24 { "label": "1", "x": 0, "y": 4.25 },
25 { "label": "2", "x": 1, "y": 4.25 },
26 { "label": "3", "x": 2, "y": 4.25 },
27 { "label": "Enter", "x": 3, "y": 4.25, "h": 2 },
28 { "label": "Enter", "x": 4, "y": 4.25 },
29 { "label": "0", "x": 0, "y": 5.25, "w": 2 },
30 { "label": ".", "x": 2, "y": 5.25 },
31 { "label": ".", "x": 4, "y": 5.25 },
32 { "label": "0", "x": 0, "y": 6.25 },
33 { "label": "00", "x": 1, "y": 6.25 }
34 ]
35 }
36 }
37}
diff --git a/keyboards/ffkeebs/puca/keymaps/default/keymap.c b/keyboards/ffkeebs/puca/keymaps/default/keymap.c
new file mode 100644
index 000000000..fb8a6bc7c
--- /dev/null
+++ b/keyboards/ffkeebs/puca/keymaps/default/keymap.c
@@ -0,0 +1,52 @@
1/* Copyright 2021 Sleepdealer
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16#include QMK_KEYBOARD_H
17
18// 00 Functionality
19enum custom_keycodes {
20 MC_00 = SAFE_RANGE,
21};
22
23bool process_record_user(uint16_t keycode, keyrecord_t *record) {
24 switch (keycode) {
25 case MC_00:
26 if (record->event.pressed) {
27 SEND_STRING("00");
28 }
29 break;
30 }
31 return true;
32};
33
34
35const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
36 LAYOUT(
37 KC_MUTE, KC_PGUP, KC_PGDN,
38 TG(1), KC_PSLS, KC_PAST, KC_PMNS,
39 KC_P7, KC_P8, KC_P9, KC_PPLS, KC_PPLS,
40 KC_P4, KC_P5, KC_P6, KC_PIPE,
41 KC_P1, KC_P2, KC_P3, KC_ENTER, KC_ENTER,
42 KC_P0, MC_00, KC_PDOT, KC_PDOT,
43 KC_P0),
44 LAYOUT(
45 KC_TRNS, RGB_HUI, RGB_VAI,
46 TG(1), RGB_TOG, RGB_HUD, RGB_VAD,
47 KC_PGUP, KC_UP, KC_PGDN, RGB_MOD, RGB_MOD,
48 KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS,
49 KC_INS, KC_HOME, KC_END, RGB_RMOD, RGB_RMOD,
50 KC_ESC, KC_TRNS, KC_DEL, KC_TRNS,
51 KC_ESC)
52};
diff --git a/keyboards/ffkeebs/puca/puca.c b/keyboards/ffkeebs/puca/puca.c
new file mode 100644
index 000000000..e08ac0cb3
--- /dev/null
+++ b/keyboards/ffkeebs/puca/puca.c
@@ -0,0 +1,133 @@
1/* Copyright 2021 Sleepdealer
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16#include "puca.h"
17
18bool encoder_update_kb(uint8_t index, bool clockwise) {
19 if (!encoder_update_user(index, clockwise)) { return false; }
20 if (clockwise) {
21 tap_code_delay(KC_VOLU, 10); // Right
22 } else {
23 tap_code_delay(KC_VOLD, 10); // Left
24 }
25 return false;
26}
27
28
29// OLED
30#ifdef OLED_ENABLE
31__attribute__((weak)) oled_rotation_t oled_init_user(oled_rotation_t rotation) { return OLED_ROTATION_270; }
32__attribute__((weak)) void oled_task_user(void) {
33// WPM-responsive animation stuff here
34# define IDLE_FRAMES 2
35# define ANIM_FRAME_DURATION 400 // how long each frame lasts in ms
36// #define SLEEP_TIMER 60000 // should sleep after this period of 0 wpm, needs fixing
37# define ANIM_SIZE 636 // number of bytes in array, minimize for adequate firmware size, max is 1024
38 static uint32_t anim_timer = 0;
39 static uint8_t current_idle_frame = 0;
40 // Credit to u/Pop-X- for the initial code. You can find his commit here https://github.com/qmk/qmk_firmware/pull/9264/files#diff-303f6e3a7a5ee54be0a9a13630842956R196-R333.
41 static const char PROGMEM idle[IDLE_FRAMES][ANIM_SIZE] = {{
42 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
43 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
44 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x60, 0x60, 0x18, 0x18, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
45 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x18, 0x18, 0x60, 0x60, 0x80, 0x80, 0x00, 0x00, 0x00,
46 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00,
47 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00,
48 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x0c, 0x0c, 0x0c, 0x0c,
49 0x0c, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00,
50 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x06, 0x18, 0x18, 0x60, 0x60, 0x18, 0x18, 0x60, 0x60,
51 0x80, 0x80, 0x60, 0x60, 0x80, 0x80, 0x60, 0x60, 0x18, 0x18, 0x06, 0x07, 0x01, 0x00, 0x00, 0x00,
52 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
53 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
54 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
55 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
56 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
57 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
58 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
59 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
60 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
61 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
62 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
63 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
64 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
65 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
66 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
67 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
68 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
69 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
70 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
71 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
72 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
73 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
74 },{
75 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
76 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
77 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfc, 0x03, 0x03, 0x00, 0x00, 0xf8, 0xf8, 0x00, 0x00, 0x00, 0x00,
78 0x00, 0xf8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0xfc, 0xfc, 0x00, 0x00, 0x00,
79 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x60, 0x60, 0x60, 0x60,
80 0x60, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00,
81 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x30, 0x30, 0xc0, 0xc0, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00,
82 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0x30, 0x3f, 0x0f, 0x00, 0x00, 0x00,
83 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03,
84 0x0c, 0x0c, 0x03, 0x03, 0x0c, 0x0c, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
85 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
86 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
87 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
88 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
89 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
90 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
91 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
92 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
93 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
94 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
95 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
96 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
97 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
98 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
99 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
100 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
102 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
103 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
104 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
106 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
107 }};
108
109 void animation_phase(void) {
110 current_idle_frame = (current_idle_frame + 1) % IDLE_FRAMES;
111 oled_write_raw_P(idle[abs((IDLE_FRAMES - 1) - current_idle_frame)], ANIM_SIZE);
112 }
113 if (timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) {
114 anim_timer = timer_read32();
115 animation_phase();
116 }
117
118 oled_set_cursor(0, 6);
119 oled_write_P(PSTR("PUCA\nPAD\n"), false);
120 oled_write_P(PSTR("-----\n"), false);
121 // Host Keyboard Layer Status
122 oled_write_P(PSTR("MODE\n"), false);
123 oled_write_P(PSTR("\n"), false);
124 switch (get_highest_layer(layer_state)) {
125 case 0:
126 oled_write_P(PSTR("BASE\n"), false);
127 break;
128 case 1:
129 oled_write_P(PSTR("FUNC\n"), false);
130 break;
131 }
132}
133#endif \ No newline at end of file
diff --git a/keyboards/ffkeebs/puca/puca.h b/keyboards/ffkeebs/puca/puca.h
new file mode 100644
index 000000000..bc17c9f36
--- /dev/null
+++ b/keyboards/ffkeebs/puca/puca.h
@@ -0,0 +1,41 @@
1/* Copyright 2021 Sleepdealer
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#pragma once
18
19// K24 is 2U Plus
20// K44 is 2u Enter
21// K54 is 2u 0
22
23
24#include "quantum.h"
25
26#define LAYOUT( \
27 K00, K02, K03, \
28 K10, K11, K12, K13, \
29 K20, K21, K22, K23, K24,\
30 K30, K31, K32, K33, \
31 K40, K41, K42, K43, K44,\
32 K50, K51, K52, K53, \
33 K54 \
34) { \
35 { K00, KC_NO, K02, K03, KC_NO }, \
36 { K10, K11, K12, K13, KC_NO }, \
37 { K20, K21, K22, K23, K24 }, \
38 { K30, K31, K32, K33, KC_NO }, \
39 { K40, K41, K42, K43, K44 }, \
40 { K50, K51, K52, K53, K54 }, \
41}
diff --git a/keyboards/ffkeebs/puca/readme.md b/keyboards/ffkeebs/puca/readme.md
new file mode 100644
index 000000000..ff0b2c49a
--- /dev/null
+++ b/keyboards/ffkeebs/puca/readme.md
@@ -0,0 +1,23 @@
1# Puca Pad
2
3* Keyboard Maintainer: [Sleepdealer](https://github.com/Sleepdealr)
4* Hardware Supported: Puca Pad
5* Hardware Availability: Puca GB
6
7## Bootloader
8
9Enter the bootloader in 3 ways:
10
11* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (the encoder)
12* **Physical reset button**: Briefly press the button on the front of the PCB - some may have pads you must short instead
13* **Keycode in layout**: Press the key mapped to `RESET` if it is available
14
15Make example for this keyboard (after setting up your build environment):
16
17 make ffkeebs/puca:default
18
19Flashing example for this keyboard:
20
21 make ffkeebs/puca:default:flash
22
23See 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).
diff --git a/keyboards/ffkeebs/puca/rules.mk b/keyboards/ffkeebs/puca/rules.mk
new file mode 100644
index 000000000..b27ecc458
--- /dev/null
+++ b/keyboards/ffkeebs/puca/rules.mk
@@ -0,0 +1,25 @@
1# MCU name
2MCU = atmega32u4
3
4# Bootloader selection
5BOOTLOADER = caterina
6
7# Build Options
8# change yes to no to disable
9#
10BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
11MOUSEKEY_ENABLE = no # Mouse keys
12EXTRAKEY_ENABLE = yes # Audio control and System control
13CONSOLE_ENABLE = no # Console for debug
14COMMAND_ENABLE = no # Commands for debug and configuration
15# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
16SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
17# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
18NKRO_ENABLE = no # USB Nkey Rollover
19BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
20RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
21
22ENCODER_ENABLE = yes #Rotary encoder
23
24OLED_ENABLE = yes #OLED
25LTO_ENABLE = yes # Enable Link Time Optimization to reduce firmware size