From 80b4cf683696f04f59dd998bb6dd031e65d87572 Mon Sep 17 00:00:00 2001
From: Vino Rodrigues <366673+vinorodrigues@users.noreply.github.com>
Date: Sun, 24 Dec 2023 16:21:06 +1100
Subject: [PATCH 01/31] initial attempt at a bluetooth driver framework
---
builddefs/common_features.mk | 6 +-
...{bluefruit_le.cpp => bluefruit_le_spi.cpp} | 0
drivers/bluetooth/bluetooth.c | 92 ++++++++++++-------
drivers/bluetooth/bluetooth.h | 68 ++++++++------
drivers/bluetooth/bluetooth_legacy.c | 58 ++++++++++++
drivers/bluetooth/bluetooth_legacy.h | 56 +++++++++++
drivers/bluetooth/outputselect.c | 70 --------------
drivers/bluetooth/outputselect.h | 34 -------
keyboards/bioi/bluetooth_custom.c | 11 +++
.../promethium/keymaps/default/keymap.c | 18 ++--
keyboards/nek_type_a/matrix.c | 4 +-
quantum/keyboard.c | 4 +-
quantum/quantum.c | 8 +-
tmk_core/protocol/host.c | 47 +++++++---
14 files changed, 278 insertions(+), 198 deletions(-)
rename drivers/bluetooth/{bluefruit_le.cpp => bluefruit_le_spi.cpp} (100%)
create mode 100644 drivers/bluetooth/bluetooth_legacy.c
create mode 100644 drivers/bluetooth/bluetooth_legacy.h
delete mode 100644 drivers/bluetooth/outputselect.c
delete mode 100644 drivers/bluetooth/outputselect.h
diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk
index 5e93480e4d05..18daef1e1ab3 100644
--- a/builddefs/common_features.mk
+++ b/builddefs/common_features.mk
@@ -884,18 +884,16 @@ ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
OPT_DEFS += -DBLUETOOTH_$(strip $(shell echo $(BLUETOOTH_DRIVER) | tr '[:lower:]' '[:upper:]'))
NO_USB_STARTUP_CHECK := yes
COMMON_VPATH += $(DRIVER_PATH)/bluetooth
- SRC += outputselect.c
+ SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c
ifeq ($(strip $(BLUETOOTH_DRIVER)), bluefruit_le)
SPI_DRIVER_REQUIRED = yes
ANALOG_DRIVER_REQUIRED = yes
- SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c
- SRC += $(DRIVER_PATH)/bluetooth/bluefruit_le.cpp
+ SRC += $(DRIVER_PATH)/bluetooth/bluefruit_le_spi.cpp
endif
ifeq ($(strip $(BLUETOOTH_DRIVER)), rn42)
UART_DRIVER_REQUIRED = yes
- SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c
SRC += $(DRIVER_PATH)/bluetooth/rn42.c
endif
endif
diff --git a/drivers/bluetooth/bluefruit_le.cpp b/drivers/bluetooth/bluefruit_le_spi.cpp
similarity index 100%
rename from drivers/bluetooth/bluefruit_le.cpp
rename to drivers/bluetooth/bluefruit_le_spi.cpp
diff --git a/drivers/bluetooth/bluetooth.c b/drivers/bluetooth/bluetooth.c
index d5382401e7e5..649acdbdc30b 100644
--- a/drivers/bluetooth/bluetooth.c
+++ b/drivers/bluetooth/bluetooth.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2022
+ * Copyright 2024
*
* 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
@@ -15,48 +15,74 @@
* along with this program. If not, see .
*/
+
+#include
+#include
#include "bluetooth.h"
+#include "usb_util.h"
-#if defined(BLUETOOTH_BLUEFRUIT_LE)
-# include "bluefruit_le.h"
-#elif defined(BLUETOOTH_RN42)
-# include "rn42.h"
-#endif
+/* Each driver needs to define the struct
+ * const rgb_matrix_driver_t rgb_matrix_driver;
+ * All members (except `task`, `.detect_output` and `system`) must be provided.
+ * Keyboard custom drivers can define this in their own files, it should only
+ * be here if shared between boards.
+ */
-void bluetooth_init(void) {
#if defined(BLUETOOTH_BLUEFRUIT_LE)
- bluefruit_le_init();
+const bluetooth_driver_t bluetooth_driver = {
+ .init = bluefruit_le_init,
+ .task = bluefruit_le_task,
+ .is_connected = bluefruit_le_is_connected,
+ .send_keyboard = bluefruit_le_send_keyboard,
+ .send_mouse = bluefruit_le_send_mouse,
+ .send_consumer = bluefruit_le_send_consumer,
+ .send_system = NULL,
+};
+# ifdef ENABLE_NKRO
+# error BlueFruit LE does not support NKRO, do not declare `ENABLE_NKRO`
+# endif
+
#elif defined(BLUETOOTH_RN42)
- rn42_init();
-#endif
-}
+const bluetooth_driver_t bluetooth_driver = {
+ .init = rn42_init,
+ .task = NULL,
+ .is_connected = NULL,
+ .send_keyboard = rn42_send_keyboard,
+ .send_mouse = rn42_send_mouse,
+ .send_consumer = rn42_send_consumer,
+ .send_system = NULL,
+};
+# ifdef ENABLE_NKRO
+# error RN42 does not support NKRO, do not declare `ENABLE_NKRO`
+# endif
-void bluetooth_task(void) {
-#if defined(BLUETOOTH_BLUEFRUIT_LE)
- bluefruit_le_task();
#endif
-}
-void bluetooth_send_keyboard(report_keyboard_t *report) {
-#if defined(BLUETOOTH_BLUEFRUIT_LE)
- bluefruit_le_send_keyboard(report);
-#elif defined(BLUETOOTH_RN42)
- rn42_send_keyboard(report);
-#endif
+send_output_t desired_send_output = SEND_OUTPUT_DEFAULT;
+
+void set_send_output(send_output_t send_output) {
+ set_send_output_kb(send_output);
+ desired_send_output = send_output;
}
-void bluetooth_send_mouse(report_mouse_t *report) {
-#if defined(BLUETOOTH_BLUEFRUIT_LE)
- bluefruit_le_send_mouse(report);
-#elif defined(BLUETOOTH_RN42)
- rn42_send_mouse(report);
-#endif
+__attribute__((weak)) void set_send_output_kb(send_output_t send_output) {
+ set_send_output_user(send_output);
}
-void bluetooth_send_consumer(uint16_t usage) {
-#if defined(BLUETOOTH_BLUEFRUIT_LE)
- bluefruit_le_send_consumer(usage);
-#elif defined(BLUETOOTH_RN42)
- rn42_send_consumer(usage);
-#endif
+__attribute__((weak)) void set_send_output_user(send_output_t send_output) {} // do nothing
+
+send_output_t get_send_output(void) {
+ if (desired_send_output == SEND_OUTPUT_AUTO) {
+ // only if USB is **disconnected**
+ if (usb_connected_state()) {
+ return SEND_OUTPUT_USB;
+ }
+ if ((NULL != (*bluetooth_driver.is_connected)) && (bluetooth_driver.is_connected())) {
+ return SEND_OUTPUT_BLUETOOTH;
+ } else {
+ return SEND_OUTPUT_NONE;
+ }
+ } else {
+ return desired_send_output;
+ }
}
diff --git a/drivers/bluetooth/bluetooth.h b/drivers/bluetooth/bluetooth.h
index 2e4d0df5381a..851ad35bec36 100644
--- a/drivers/bluetooth/bluetooth.h
+++ b/drivers/bluetooth/bluetooth.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2022
+ * Copyright 2024
*
* 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
@@ -18,35 +18,49 @@
#pragma once
#include
+#include
#include "report.h"
-/**
- * \brief Initialize the Bluetooth system.
- */
-void bluetooth_init(void);
+#if defined(BLUETOOTH_BLUEFRUIT_LE)
+# include "bluefruit_le.h"
+#elif defined(BLUETOOTH_RN42)
+# include "rn42.h"
+#endif
-/**
- * \brief Perform housekeeping tasks.
- */
-void bluetooth_task(void);
+typedef enum send_output_t {
+ SEND_OUTPUT_AUTO,
+ SEND_OUTPUT_NONE,
+ SEND_OUTPUT_USB,
+ SEND_OUTPUT_BLUETOOTH,
+ SEND_OUTPUT_BOTH
+} send_output_t;
-/**
- * \brief Send a keyboard report.
- *
- * \param report The keyboard report to send.
- */
-void bluetooth_send_keyboard(report_keyboard_t *report);
+#ifndef SEND_OUTPUT_DEFAULT
+# define SEND_OUTPUT_DEFAULT SEND_OUTPUT_AUTO
+#endif
-/**
- * \brief Send a mouse report.
- *
- * \param report The mouse report to send.
- */
-void bluetooth_send_mouse(report_mouse_t *report);
+typedef struct {
+ /* Initialize the Bluetooth system. */
+ void (*init)(void);
+ /* Perform housekeeping tasks. */
+ void (*task)(void);
+ /* Detects if BT is connected, also used by `SEND_OUTPUT_AUTO` */
+ bool (*is_connected)(void);
+ /* Send a keyboard report. */
+ void (*send_keyboard)(report_keyboard_t *report);
+ /* Send a NKRO report. (Optional & dependant on `NKRO_ENABLE` ) */
+ void (*send_nkro)(report_keyboard_t *report);
+ /* Send a mouse report. */
+ void (*send_mouse)(report_mouse_t *report);
+ /* Send a consumer usage. */
+ void (*send_consumer)(uint16_t usage);
+ /* Send a system usage (Optional) */
+ void (*send_system)(uint16_t usage);
+} bluetooth_driver_t;
-/**
- * \brief Send a consumer usage.
- *
- * \param usage The consumer usage to send.
- */
-void bluetooth_send_consumer(uint16_t usage);
+void set_send_output(send_output_t send_output);
+void set_send_output_kb(send_output_t send_output);
+void set_send_output_user(send_output_t send_output);
+send_output_t get_send_output(void);
+
+extern const bluetooth_driver_t bluetooth_driver;
diff --git a/drivers/bluetooth/bluetooth_legacy.c b/drivers/bluetooth/bluetooth_legacy.c
new file mode 100644
index 000000000000..0b46fe0fc6b6
--- /dev/null
+++ b/drivers/bluetooth/bluetooth_legacy.c
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2022
+ *
+ * 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 .
+ */
+
+/** DEPRECATED: Provided for backward compatibility */
+
+#include
+#include "bluetooth.h"
+#include "bluetooth_legacy.h"
+
+__attribute__((weak)) void bluetooth_init(void) {
+ bluetooth_driver.init();
+}
+
+__attribute__((weak)) void bluetooth_task(void) {
+ if (NULL != (*bluetooth_driver.task)) {
+ bluetooth_driver.task();
+ }
+}
+
+__attribute__((weak)) void bluetooth_send_keyboard(report_keyboard_t *report) {
+ bluetooth_driver.send_keyboard(report);
+}
+
+#ifdef NKRO_ENABLE
+__attribute__((weak)) void bluetooth_send_nkro(report_keyboard_t *report) {
+ if (NULL != (*bluetooth_driver.send_nkro)) {
+ bluetooth_driver.send_nkro(report);
+ }
+}
+#endif
+
+__attribute__((weak)) void bluetooth_send_mouse(report_mouse_t *report) {
+ bluetooth_driver.send_mouse(report);
+}
+
+__attribute__((weak)) void bluetooth_send_consumer(uint16_t usage) {
+ bluetooth_driver.send_consumer(usage);
+}
+
+__attribute__((weak)) void bluetooth_send_system(uint16_t usage) {
+ if (NULL != (*bluetooth_driver.send_system)) {
+ bluetooth_driver.send_system(usage);
+ }
+}
diff --git a/drivers/bluetooth/bluetooth_legacy.h b/drivers/bluetooth/bluetooth_legacy.h
new file mode 100644
index 000000000000..ba5837255278
--- /dev/null
+++ b/drivers/bluetooth/bluetooth_legacy.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2022
+ *
+ * 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 .
+ */
+
+/** DEPRECATED: Provided for backward compatibility */
+
+#pragma once
+
+#pragma message "`bluetooth.h` is deprecated"
+
+#include
+#include "report.h"
+
+/**
+ * \brief Initialize the Bluetooth system.
+ */
+void bluetooth_init(void);
+
+/**
+ * \brief Perform housekeeping tasks.
+ */
+void bluetooth_task(void);
+
+/**
+ * \brief Send a keyboard report.
+ *
+ * \param report The keyboard report to send.
+ */
+void bluetooth_send_keyboard(report_keyboard_t *report);
+
+/**
+ * \brief Send a mouse report.
+ *
+ * \param report The mouse report to send.
+ */
+void bluetooth_send_mouse(report_mouse_t *report);
+
+/**
+ * \brief Send a consumer usage.
+ *
+ * \param usage The consumer usage to send.
+ */
+void bluetooth_send_consumer(uint16_t usage);
diff --git a/drivers/bluetooth/outputselect.c b/drivers/bluetooth/outputselect.c
deleted file mode 100644
index b986ba274e9d..000000000000
--- a/drivers/bluetooth/outputselect.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
-Copyright 2017 Priyadi Iman Nurcahyo
-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 .
-*/
-
-#include "outputselect.h"
-#include "usb_util.h"
-
-#ifdef BLUETOOTH_BLUEFRUIT_LE
-# include "bluefruit_le.h"
-#endif
-
-uint8_t desired_output = OUTPUT_DEFAULT;
-
-/** \brief Set Output
- *
- * FIXME: Needs doc
- */
-void set_output(uint8_t output) {
- set_output_user(output);
- desired_output = output;
-}
-
-/** \brief Set Output User
- *
- * FIXME: Needs doc
- */
-__attribute__((weak)) void set_output_user(uint8_t output) {}
-
-/** \brief Auto Detect Output
- *
- * FIXME: Needs doc
- */
-uint8_t auto_detect_output(void) {
- if (usb_connected_state()) {
- return OUTPUT_USB;
- }
-
-#ifdef BLUETOOTH_BLUEFRUIT_LE
- if (bluefruit_le_is_connected()) {
- return OUTPUT_BLUETOOTH;
- }
-#endif
-
-#ifdef BLUETOOTH_ENABLE
- return OUTPUT_BLUETOOTH; // should check if BT is connected here
-#endif
-
- return OUTPUT_NONE;
-}
-
-/** \brief Where To Send
- *
- * FIXME: Needs doc
- */
-uint8_t where_to_send(void) {
- if (desired_output == OUTPUT_AUTO) {
- return auto_detect_output();
- }
- return desired_output;
-}
diff --git a/drivers/bluetooth/outputselect.h b/drivers/bluetooth/outputselect.h
deleted file mode 100644
index c4548e1122ad..000000000000
--- a/drivers/bluetooth/outputselect.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
-Copyright 2017 Priyadi Iman Nurcahyo
-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 .
-*/
-
-#pragma once
-
-#include
-
-enum outputs {
- OUTPUT_AUTO,
-
- OUTPUT_NONE,
- OUTPUT_USB,
- OUTPUT_BLUETOOTH
-};
-
-#ifndef OUTPUT_DEFAULT
-# define OUTPUT_DEFAULT OUTPUT_AUTO
-#endif
-
-void set_output(uint8_t output);
-void set_output_user(uint8_t output);
-uint8_t auto_detect_output(void);
-uint8_t where_to_send(void);
diff --git a/keyboards/bioi/bluetooth_custom.c b/keyboards/bioi/bluetooth_custom.c
index 4ea277f731a6..ece777d9acfa 100644
--- a/keyboards/bioi/bluetooth_custom.c
+++ b/keyboards/bioi/bluetooth_custom.c
@@ -77,6 +77,8 @@ void bluetooth_init(void) {
void bluetooth_task(void) {}
+bool bluetooth_is_connected(void) { return true; } // lie
+
void bluetooth_send_keyboard(report_keyboard_t *report)
{
#ifdef BLUEFRUIT_TRACE_SERIAL
@@ -161,3 +163,12 @@ void bluetooth_send_consumer(uint16_t usage)
bluefruit_trace_footer();
#endif
}
+
+const bluetooth_driver_t bluetooth_driver = {
+ .init = bluetooth_init,
+ .task = bluetooth_task,
+ .is_connected = bluetooth_is_connected,
+ .send_keyboard = bluetooth_send_keyboard,
+ .send_mouse = bluetooth_send_mouse,
+ .send_consumer = bluetooth_send_consumer,
+};
diff --git a/keyboards/handwired/promethium/keymaps/default/keymap.c b/keyboards/handwired/promethium/keymaps/default/keymap.c
index ff73e51d5eb2..1b6dcbbd145e 100644
--- a/keyboards/handwired/promethium/keymaps/default/keymap.c
+++ b/keyboards/handwired/promethium/keymaps/default/keymap.c
@@ -47,7 +47,7 @@ along with this program. If not, see .
} while (0)
#endif
#endif
-#include "outputselect.h"
+#include "bluetooth.h"
#include "led.h"
#define COUNT(x) ARRAY_SIZE((x))
@@ -1251,13 +1251,13 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
return true;
}
-void set_output_user(uint8_t output) {
+void set_send_output_user(send_output_t output) {
#ifdef BLUETOOTH_BLUEFRUIT_LE
- switch(output) {
- case OUTPUT_USB:
+ switch (output) {
+ case SEND_OUTPUT_USB:
led_set_output_usb();
break;
- case OUTPUT_BLUETOOTH:
+ case SEND_OUTPUT_BLUETOOTH:
led_set_output_ble();
break;
default:
@@ -1277,11 +1277,11 @@ void matrix_init_user(void) {
// auto detect output on init
#ifdef BLUETOOTH_BLUEFRUIT_LE
- uint8_t output = auto_detect_output();
- if (output == OUTPUT_USB) {
- set_output(OUTPUT_USB);
+ send_output_t output = get_send_output();
+ if (output == SEND_OUTPUT_USB) {
+ set_send_output(SEND_OUTPUT_USB);
} else {
- set_output(OUTPUT_BLUETOOTH);
+ set_send_output(SEND_OUTPUT_BLUETOOTH);
}
#endif
}
diff --git a/keyboards/nek_type_a/matrix.c b/keyboards/nek_type_a/matrix.c
index 76613947f615..edc5e5c66dee 100644
--- a/keyboards/nek_type_a/matrix.c
+++ b/keyboards/nek_type_a/matrix.c
@@ -34,7 +34,7 @@ along with this program. If not, see .
#include "matrix.h"
#include "timer.h"
#include "mcp23017.h"
-#include "outputselect.h"
+#include "bluetooth.h"
/* Set 0 if debouncing isn't needed */
@@ -136,7 +136,7 @@ void matrix_init(void) {
}
matrix_init_kb();
- set_output(OUTPUT_AUTO);
+ set_send_output(SEND_OUTPUT_AUTO);
}
uint8_t matrix_scan(void)
diff --git a/quantum/keyboard.c b/quantum/keyboard.c
index b5fa1a6e2e9c..387685d10c2a 100644
--- a/quantum/keyboard.c
+++ b/quantum/keyboard.c
@@ -454,7 +454,7 @@ void keyboard_init(void) {
pointing_device_init();
#endif
#ifdef BLUETOOTH_ENABLE
- bluetooth_init();
+ bluetooth_driver.init();
#endif
#ifdef HAPTIC_ENABLE
haptic_init();
@@ -710,7 +710,7 @@ void keyboard_task(void) {
#endif
#ifdef BLUETOOTH_ENABLE
- bluetooth_task();
+ bluetooth_driver.task();
#endif
#ifdef HAPTIC_ENABLE
diff --git a/quantum/quantum.c b/quantum/quantum.c
index 6639dc229109..2749643f1d1c 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -21,7 +21,7 @@
#endif
#ifdef BLUETOOTH_ENABLE
-# include "outputselect.h"
+# include "bluetooth.h"
#endif
#ifdef GRAVE_ESC_ENABLE
@@ -426,13 +426,13 @@ bool process_record_quantum(keyrecord_t *record) {
#endif
#ifdef BLUETOOTH_ENABLE
case QK_OUTPUT_AUTO:
- set_output(OUTPUT_AUTO);
+ set_send_output(SEND_OUTPUT_AUTO);
return false;
case QK_OUTPUT_USB:
- set_output(OUTPUT_USB);
+ set_send_output(SEND_OUTPUT_USB);
return false;
case QK_OUTPUT_BLUETOOTH:
- set_output(OUTPUT_BLUETOOTH);
+ set_send_output(SEND_OUTPUT_BLUETOOTH);
return false;
#endif
#ifndef NO_ACTION_ONESHOT
diff --git a/tmk_core/protocol/host.c b/tmk_core/protocol/host.c
index 732fbdc37d4d..f910efcd8844 100644
--- a/tmk_core/protocol/host.c
+++ b/tmk_core/protocol/host.c
@@ -32,7 +32,6 @@ along with this program. If not, see .
#ifdef BLUETOOTH_ENABLE
# include "bluetooth.h"
-# include "outputselect.h"
#endif
#ifdef NKRO_ENABLE
@@ -73,11 +72,13 @@ led_t host_keyboard_led_state(void) {
/* send report */
void host_keyboard_send(report_keyboard_t *report) {
+
#ifdef BLUETOOTH_ENABLE
- if (where_to_send() == OUTPUT_BLUETOOTH) {
- bluetooth_send_keyboard(report);
- return;
- }
+ send_output_t where_to_send = get_send_output();
+ if ((where_to_send == SEND_OUTPUT_BLUETOOTH) || (where_to_send == SEND_OUTPUT_BOTH)) {
+ bluetooth_driver.send_keyboard(report);
+ if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
+ } else if ((where_to_send == SEND_OUTPUT_NONE)) return;
#endif
if (!driver) return;
@@ -98,6 +99,15 @@ void host_keyboard_send(report_keyboard_t *report) {
void host_nkro_send(report_nkro_t *report) {
if (!driver) return;
report->report_id = REPORT_ID_NKRO;
+
+#if defined(BLUETOOTH_ENABLE) && defined(NKRO_ENABLE)
+ send_output_t where_to_send = get_send_output();
+ if ((where_to_send == SEND_OUTPUT_BLUETOOTH) || (where_to_send == SEND_OUTPUT_BOTH)) {
+ bluetooth_driver.send_nkro(report);
+ if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
+ } else if (where_to_send == SEND_OUTPUT_NONE) return;
+#endif
+
(*driver->send_nkro)(report);
if (debug_keyboard) {
@@ -110,11 +120,13 @@ void host_nkro_send(report_nkro_t *report) {
}
void host_mouse_send(report_mouse_t *report) {
+
#ifdef BLUETOOTH_ENABLE
- if (where_to_send() == OUTPUT_BLUETOOTH) {
- bluetooth_send_mouse(report);
- return;
- }
+ send_output_t where_to_send = get_send_output();
+ if ((where_to_send == SEND_OUTPUT_BLUETOOTH) || (where_to_send == SEND_OUTPUT_BOTH)) {
+ bluetooth_driver.send_mouse(report);
+ if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
+ } else if (where_to_send == SEND_OUTPUT_NONE) return;
#endif
if (!driver) return;
@@ -133,6 +145,14 @@ void host_system_send(uint16_t usage) {
if (usage == last_system_usage) return;
last_system_usage = usage;
+#ifdef BLUETOOTH_ENABLE
+ send_output_t where_to_send = get_send_output();
+ if ((where_to_send == SEND_OUTPUT_BLUETOOTH) || (where_to_send == SEND_OUTPUT_BOTH)) {
+ bluetooth_driver.send_system(usage);
+ if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
+ } else if (where_to_send == SEND_OUTPUT_NONE) return;
+#endif
+
if (!driver) return;
report_extra_t report = {
@@ -147,10 +167,11 @@ void host_consumer_send(uint16_t usage) {
last_consumer_usage = usage;
#ifdef BLUETOOTH_ENABLE
- if (where_to_send() == OUTPUT_BLUETOOTH) {
- bluetooth_send_consumer(usage);
- return;
- }
+ send_output_t where_to_send = get_send_output();
+ if ((where_to_send == SEND_OUTPUT_BLUETOOTH) || (where_to_send == SEND_OUTPUT_BOTH)) {
+ bluetooth_driver.send_consumer(usage);
+ if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
+ } else if (where_to_send == SEND_OUTPUT_NONE) return;
#endif
if (!driver) return;
From bf1bb606d7e5cd89c140042c941c418006d823cd Mon Sep 17 00:00:00 2001
From: Vino Rodrigues <366673+vinorodrigues@users.noreply.github.com>
Date: Sun, 24 Dec 2023 17:05:21 +1100
Subject: [PATCH 02/31] clang-format
---
drivers/bluetooth/bluetooth.c | 3 +--
drivers/bluetooth/bluetooth.h | 4 ++--
tmk_core/protocol/host.c | 27 +++++++++++++++------------
3 files changed, 18 insertions(+), 16 deletions(-)
diff --git a/drivers/bluetooth/bluetooth.c b/drivers/bluetooth/bluetooth.c
index 649acdbdc30b..078e17ad5657 100644
--- a/drivers/bluetooth/bluetooth.c
+++ b/drivers/bluetooth/bluetooth.c
@@ -15,7 +15,6 @@
* along with this program. If not, see .
*/
-
#include
#include
#include "bluetooth.h"
@@ -69,7 +68,7 @@ __attribute__((weak)) void set_send_output_kb(send_output_t send_output) {
set_send_output_user(send_output);
}
-__attribute__((weak)) void set_send_output_user(send_output_t send_output) {} // do nothing
+__attribute__((weak)) void set_send_output_user(send_output_t send_output) {} // do nothing
send_output_t get_send_output(void) {
if (desired_send_output == SEND_OUTPUT_AUTO) {
diff --git a/drivers/bluetooth/bluetooth.h b/drivers/bluetooth/bluetooth.h
index 851ad35bec36..d34c59e93a7a 100644
--- a/drivers/bluetooth/bluetooth.h
+++ b/drivers/bluetooth/bluetooth.h
@@ -22,9 +22,9 @@
#include "report.h"
#if defined(BLUETOOTH_BLUEFRUIT_LE)
-# include "bluefruit_le.h"
+# include "bluefruit_le.h"
#elif defined(BLUETOOTH_RN42)
-# include "rn42.h"
+# include "rn42.h"
#endif
typedef enum send_output_t {
diff --git a/tmk_core/protocol/host.c b/tmk_core/protocol/host.c
index f910efcd8844..919830ddcfe7 100644
--- a/tmk_core/protocol/host.c
+++ b/tmk_core/protocol/host.c
@@ -72,13 +72,13 @@ led_t host_keyboard_led_state(void) {
/* send report */
void host_keyboard_send(report_keyboard_t *report) {
-
#ifdef BLUETOOTH_ENABLE
send_output_t where_to_send = get_send_output();
if ((where_to_send == SEND_OUTPUT_BLUETOOTH) || (where_to_send == SEND_OUTPUT_BOTH)) {
bluetooth_driver.send_keyboard(report);
- if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
- } else if ((where_to_send == SEND_OUTPUT_NONE)) return;
+ if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
+ } else if ((where_to_send == SEND_OUTPUT_NONE))
+ return;
#endif
if (!driver) return;
@@ -104,8 +104,9 @@ void host_nkro_send(report_nkro_t *report) {
send_output_t where_to_send = get_send_output();
if ((where_to_send == SEND_OUTPUT_BLUETOOTH) || (where_to_send == SEND_OUTPUT_BOTH)) {
bluetooth_driver.send_nkro(report);
- if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
- } else if (where_to_send == SEND_OUTPUT_NONE) return;
+ if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
+ } else if (where_to_send == SEND_OUTPUT_NONE)
+ return;
#endif
(*driver->send_nkro)(report);
@@ -120,13 +121,13 @@ void host_nkro_send(report_nkro_t *report) {
}
void host_mouse_send(report_mouse_t *report) {
-
#ifdef BLUETOOTH_ENABLE
send_output_t where_to_send = get_send_output();
if ((where_to_send == SEND_OUTPUT_BLUETOOTH) || (where_to_send == SEND_OUTPUT_BOTH)) {
bluetooth_driver.send_mouse(report);
- if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
- } else if (where_to_send == SEND_OUTPUT_NONE) return;
+ if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
+ } else if (where_to_send == SEND_OUTPUT_NONE)
+ return;
#endif
if (!driver) return;
@@ -149,8 +150,9 @@ void host_system_send(uint16_t usage) {
send_output_t where_to_send = get_send_output();
if ((where_to_send == SEND_OUTPUT_BLUETOOTH) || (where_to_send == SEND_OUTPUT_BOTH)) {
bluetooth_driver.send_system(usage);
- if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
- } else if (where_to_send == SEND_OUTPUT_NONE) return;
+ if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
+ } else if (where_to_send == SEND_OUTPUT_NONE)
+ return;
#endif
if (!driver) return;
@@ -170,8 +172,9 @@ void host_consumer_send(uint16_t usage) {
send_output_t where_to_send = get_send_output();
if ((where_to_send == SEND_OUTPUT_BLUETOOTH) || (where_to_send == SEND_OUTPUT_BOTH)) {
bluetooth_driver.send_consumer(usage);
- if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
- } else if (where_to_send == SEND_OUTPUT_NONE) return;
+ if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
+ } else if (where_to_send == SEND_OUTPUT_NONE)
+ return;
#endif
if (!driver) return;
From 15ed59cacc8356b4e9d27113f423c503b613e4c5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=E1=BA=AFn?= <59417802+MaiTheSan@users.noreply.github.com>
Date: Sun, 24 Dec 2023 13:30:54 +0700
Subject: [PATCH 03/31] [Keyboard] Add Nuxros RE65 (#22078)
Co-authored-by: jack <0x6a73@protonmail.com>
Co-authored-by: Duncan Sutherland
Co-authored-by: Drashna Jaelre
---
keyboards/sawnsprojects/re65/info.json | 370 ++++++++++++++++++
.../re65/keymaps/default/keymap.c | 57 +++
.../re65/keymaps/default/rules.mk | 1 +
.../sawnsprojects/re65/keymaps/via/keymap.c | 57 +++
.../sawnsprojects/re65/keymaps/via/rules.mk | 2 +
keyboards/sawnsprojects/re65/readme.md | 26 ++
keyboards/sawnsprojects/re65/rules.mk | 1 +
7 files changed, 514 insertions(+)
create mode 100644 keyboards/sawnsprojects/re65/info.json
create mode 100644 keyboards/sawnsprojects/re65/keymaps/default/keymap.c
create mode 100644 keyboards/sawnsprojects/re65/keymaps/default/rules.mk
create mode 100644 keyboards/sawnsprojects/re65/keymaps/via/keymap.c
create mode 100644 keyboards/sawnsprojects/re65/keymaps/via/rules.mk
create mode 100644 keyboards/sawnsprojects/re65/readme.md
create mode 100644 keyboards/sawnsprojects/re65/rules.mk
diff --git a/keyboards/sawnsprojects/re65/info.json b/keyboards/sawnsprojects/re65/info.json
new file mode 100644
index 000000000000..45e874db6d54
--- /dev/null
+++ b/keyboards/sawnsprojects/re65/info.json
@@ -0,0 +1,370 @@
+{
+ "keyboard_name": "RE65",
+ "maintainer": "Salane",
+ "manufacturer": "Mai The San",
+ "url": "",
+ "processor": "RP2040",
+ "bootloader": "rp2040",
+ "usb": {
+ "vid": "0x534C",
+ "pid": "0x0C65",
+ "device_version": "0.0.1"
+ },
+ "features": {
+ "bootmagic": true,
+ "mousekey": true,
+ "extrakey": true,
+ "console": false,
+ "command": false,
+ "nkro": true,
+ "rgblight": true,
+ "encoder": true
+ },
+ "diode_direction": "COL2ROW",
+ "matrix_pins": {
+ "rows": ["GP27", "GP26", "GP25", "GP29", "GP4"],
+ "cols": ["GP20", "GP19", "GP18", "GP24", "GP23", "GP22", "GP17", "GP28", "GP2", "GP3", "GP12", "GP11", "GP10", "GP9", "GP8"]
+ },
+ "encoder": {
+ "rotary": [
+ {"pin_a": "GP5", "pin_b": "GP6"}
+ ]
+ },
+ "rgblight": {
+ "led_count": 32,
+ "saturation_steps": 8,
+ "brightness_steps": 8,
+ "sleep": true,
+ "animations": {
+ "alternating": true,
+ "breathing": true,
+ "christmas": true,
+ "knight": true,
+ "rainbow_mood": true,
+ "rainbow_swirl": true,
+ "rgb_test": true,
+ "snake": true,
+ "static_gradient": true,
+ "twinkle": true
+ }
+ },
+ "ws2812": {
+ "pin": "GP21",
+ "driver": "vendor"
+ },
+ "community_layouts": ["65_ansi_blocker","65_ansi_blocker_split_bs","65_ansi_blocker_tsangan","65_ansi_blocker_tsangan_split_bs"],
+ "layouts": {
+ "LAYOUT_65_ansi_blocker_split_bs": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [2, 13], "x": 14, "y": 0},
+ {"matrix": [0, 14], "x": 15, "y": 0},
+
+ {"matrix": [1, 0], "w": 1.5, "x": 0, "y": 1},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [1, 13], "w": 1.5, "x": 13.5, "y": 1},
+ {"matrix": [1, 14], "x": 15, "y": 1},
+
+ {"matrix": [2, 0], "w": 1.75, "x": 0, "y": 2},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "w": 2.25, "x": 12.75, "y": 2},
+ {"matrix": [2, 14], "x": 15, "y": 2},
+
+ {"matrix": [3, 0], "w": 2.25, "x": 0, "y": 3},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "w": 1.75, "x": 12.25, "y": 3},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+ {"matrix": [3, 14], "x": 15, "y": 3},
+
+ {"matrix": [4, 0], "w": 1.25, "x": 0, "y": 4},
+ {"matrix": [4, 1], "w": 1.25, "x": 1.25, "y": 4},
+ {"matrix": [4, 2], "w": 1.25, "x": 2.5, "y": 4},
+
+ {"matrix": [4, 6], "w": 6.25, "x": 3.75, "y": 4},
+
+ {"matrix": [4, 10], "w": 1.25, "x": 10, "y": 4},
+ {"matrix": [4, 11], "w": 1.25, "x": 11.25, "y": 4},
+
+ {"matrix": [4, 12], "x": 13, "y": 4},
+ {"matrix": [4, 13], "x": 14, "y": 4},
+ {"matrix": [4, 14], "x": 15, "y": 4}
+ ]
+ },
+ "LAYOUT_65_ansi_blocker": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "w": 2, "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 15, "y": 0},
+
+ {"matrix": [1, 0], "w": 1.5, "x": 0, "y": 1},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [1, 13], "w": 1.5, "x": 13.5, "y": 1},
+ {"matrix": [1, 14], "x": 15, "y": 1},
+
+ {"matrix": [2, 0], "w": 1.75, "x": 0, "y": 2},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "w": 2.25, "x": 12.75, "y": 2},
+ {"matrix": [2, 14], "x": 15, "y": 2},
+
+ {"matrix": [3, 0], "w": 2.25, "x": 0, "y": 3},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "w": 1.75, "x": 12.25, "y": 3},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+ {"matrix": [3, 14], "x": 15, "y": 3},
+
+ {"matrix": [4, 0], "w": 1.25, "x": 0, "y": 4},
+ {"matrix": [4, 1], "w": 1.25, "x": 1.25, "y": 4},
+ {"matrix": [4, 2], "w": 1.25, "x": 2.5, "y": 4},
+
+ {"matrix": [4, 6], "w": 6.25, "x": 3.75, "y": 4},
+
+ {"matrix": [4, 10], "w": 1.25, "x": 10, "y": 4},
+ {"matrix": [4, 11], "w": 1.25, "x": 11.25, "y": 4},
+
+ {"matrix": [4, 12], "x": 13, "y": 4},
+ {"matrix": [4, 13], "x": 14, "y": 4},
+ {"matrix": [4, 14], "x": 15, "y": 4}
+ ]
+ },
+ "LAYOUT_65_ansi_blocker_tsangan": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "w": 2, "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 15, "y": 0},
+
+ {"matrix": [1, 0], "w": 1.5, "x": 0, "y": 1},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [1, 13], "w": 1.5, "x": 13.5, "y": 1},
+ {"matrix": [1, 14], "x": 15, "y": 1},
+
+ {"matrix": [2, 0], "w": 1.75, "x": 0, "y": 2},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "w": 2.25, "x": 12.75, "y": 2},
+ {"matrix": [2, 14], "x": 15, "y": 2},
+
+ {"matrix": [3, 0], "w": 2.25, "x": 0, "y": 3},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "w": 1.75, "x": 12.25, "y": 3},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+ {"matrix": [3, 14], "x": 15, "y": 3},
+
+ {"matrix": [4, 0], "w": 1.5, "x": 0, "y": 4},
+ {"matrix": [4, 1], "x": 1.5, "y": 4},
+ {"matrix": [4, 2], "w": 1.5, "x": 2.5, "y": 4},
+
+ {"matrix": [4, 6], "w": 7, "x": 4, "y": 4},
+
+ {"matrix": [4, 11], "w": 1.5, "x": 11, "y": 4},
+
+ {"matrix": [4, 12], "x": 13, "y": 4},
+ {"matrix": [4, 13], "x": 14, "y": 4},
+ {"matrix": [4, 14], "x": 15, "y": 4}
+ ]
+ },
+ "LAYOUT_65_ansi_blocker_tsangan_split_bs": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [2, 13], "x": 14, "y": 0},
+ {"matrix": [0, 14], "x": 15, "y": 0},
+
+ {"matrix": [1, 0], "w": 1.5, "x": 0, "y": 1},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [1, 13], "w": 1.5, "x": 13.5, "y": 1},
+ {"matrix": [1, 14], "x": 15, "y": 1},
+
+ {"matrix": [2, 0], "w": 1.75, "x": 0, "y": 2},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "w": 2.25, "x": 12.75, "y": 2},
+ {"matrix": [2, 14], "x": 15, "y": 2},
+
+ {"matrix": [3, 0], "w": 2.25, "x": 0, "y": 3},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "w": 1.75, "x": 12.25, "y": 3},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+ {"matrix": [3, 14], "x": 15, "y": 3},
+
+ {"matrix": [4, 0], "w": 1.5, "x": 0, "y": 4},
+ {"matrix": [4, 1], "x": 1.5, "y": 4},
+ {"matrix": [4, 2], "w": 1.5, "x": 2.5, "y": 4},
+
+ {"matrix": [4, 6], "w": 7, "x": 4, "y": 4},
+
+ {"matrix": [4, 11], "w": 1.5, "x": 11, "y": 4},
+
+ {"matrix": [4, 12], "x": 13, "y": 4},
+ {"matrix": [4, 13], "x": 14, "y": 4},
+ {"matrix": [4, 14], "x": 15, "y": 4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/sawnsprojects/re65/keymaps/default/keymap.c b/keyboards/sawnsprojects/re65/keymaps/default/keymap.c
new file mode 100644
index 000000000000..6dc79fead35b
--- /dev/null
+++ b/keyboards/sawnsprojects/re65/keymaps/default/keymap.c
@@ -0,0 +1,57 @@
+// Copyright 2023 MaiTheSan (@maithesan)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+enum {
+ _BASE,
+ _FN1
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Base Layer
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┬───┐
+ * │Esc│! 1│@ 2│# 3│$ 4│% 5│^ 6│& 7│* 8│( 9│) 0│_ -│+ =│ Bckspc│Hom│
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┼───┤
+ * │Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │{ [│} ]│| \│PgU│
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤
+ * │HyCaps│ A │ S │ D │ F │ G │ H │ J │ K │ L │: ;│" '│ Enter│PgD│
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤
+ * │Shift │ Z │ X │ C │ V │ B │ N │ M │< ,│> .│? /│ Shift│ Up│End│
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤
+ * │Ctrl│ Opt│ Cmd│ Space │Cmd │FnPy│ │Lef│Dow│Rig│
+ * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘
+ */
+[_BASE] = LAYOUT_65_ansi_blocker(
+ KC_ESC, 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_HOME,
+ 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, KC_PGUP,
+ 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, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
+ KC_LCTL, KC_LOPT, KC_LCMD, KC_SPC, KC_RCMD, MO(_FN1), KC_LEFT, KC_DOWN, KC_RGHT
+),
+/* Function Layer
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┬───┐
+ * │` ~│ F1│ F2│ F3│ F4│ F5│ F6│ F7│ F8│ F9│F10│F11│F12│ Delete│SlD│
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┼───┤
+ * │RMod │RH+│RS+│RV+│AS+│ │ │ │ │ │F13│F14│F15│ LHP │VlU│
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤
+ * │RTgl │RH-│RS-│RV-│AS-│ │ │ │ │ │ │ │ │VlD│
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤
+ * │ │LYR│Thm│ │ │RST│ │Mke│Prv│Nxt│Ply│ │PgU│Mut│
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤
+ * │ │ │ │ │ │ │ │Hom│PgD│End│
+ * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘
+ */
+[_FN1] = LAYOUT_65_ansi_blocker(
+ KC_GRV, 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_DEL, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_F13, KC_F14, KC_F15, _______, KC_VOLU,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLD,
+ _______, _______, _______, _______, _______, QK_BOOT, _______, _______, KC_MPRV, KC_MNXT, KC_MPLY, _______, KC_PGUP, KC_MUTE,
+ _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END
+),
+};
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
+ [_BASE] = { ENCODER_CCW_CW(KC_PGDN, KC_PGUP) },
+ [_FN1] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }
+};
+#endif // ENCODER_MAP_ENABLE
diff --git a/keyboards/sawnsprojects/re65/keymaps/default/rules.mk b/keyboards/sawnsprojects/re65/keymaps/default/rules.mk
new file mode 100644
index 000000000000..a40474b4d5c7
--- /dev/null
+++ b/keyboards/sawnsprojects/re65/keymaps/default/rules.mk
@@ -0,0 +1 @@
+ENCODER_MAP_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/sawnsprojects/re65/keymaps/via/keymap.c b/keyboards/sawnsprojects/re65/keymaps/via/keymap.c
new file mode 100644
index 000000000000..55581a841921
--- /dev/null
+++ b/keyboards/sawnsprojects/re65/keymaps/via/keymap.c
@@ -0,0 +1,57 @@
+// Copyright 2023 MaiTheSan (@maithesan)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+enum {
+ _BASE,
+ _FN1,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Base Layer
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
+ * │Esc│! 1│@ 2│# 3│$ 4│% 5│^ 6│& 7│* 8│( 9│) 0│_ -│+ =│Bsp│Bsp│Hom│
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤
+ * │Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │{ [│} ]│| \│PgU│
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤
+ * │HyCaps│ A │ S │ D │ F │ G │ H │ J │ K │ L │: ;│" '│ Enter│PgD│
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤
+ * │Shift │ Z │ X │ C │ V │ B │ N │ M │< ,│> .│? /│ Shift│ Up│End│
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤
+ * │Ctrl│ Opt│ Cmd│ Space │Cmd │FnPy│ │Lef│Dow│Rig│
+ * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘
+ */
+[_BASE] = LAYOUT_65_ansi_blocker_split_bs(
+ KC_ESC, 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_BSPC, KC_HOME,
+ 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, KC_PGUP,
+ 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, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
+ KC_LCTL, KC_LOPT, KC_LCMD, KC_SPC, KC_RCMD, MO(_FN1), KC_LEFT, KC_DOWN, KC_RGHT
+),
+/* Function Layer
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
+ * │` ~│ F1│ F2│ F3│ F4│ F5│ F6│ F7│ F8│ F9│F10│F11│F12│Del│ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤
+ * │RMod │RH+│RS+│RV+│AS+│ │ │ │ │ │F13│F14│F15│ LHP │VlU│
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤
+ * │RTgl │RH-│RS-│RV-│AS-│ │ │ │ │ │ │ │ │VlD│
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤
+ * │ │LYR│Thm│ │ │RST│ │Mke│Prv│Nxt│Ply│ │PgU│Mut│
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤
+ * │ │ │ │ │ │ │ │Hom│PgD│End│
+ * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘
+ */
+[_FN1] = LAYOUT_65_ansi_blocker_split_bs(
+ KC_GRV, 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_DEL, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_F13, KC_F14, KC_F15, _______, KC_VOLU,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLD,
+ _______, _______, _______, _______, _______, QK_BOOT, _______, _______, KC_MPRV, KC_MNXT, KC_MPLY, _______, KC_PGUP, KC_MUTE,
+ _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END
+),
+};
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
+ [_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [_FN1] = { ENCODER_CCW_CW(KC_BRID, KC_BRIU) },
+};
+#endif
\ No newline at end of file
diff --git a/keyboards/sawnsprojects/re65/keymaps/via/rules.mk b/keyboards/sawnsprojects/re65/keymaps/via/rules.mk
new file mode 100644
index 000000000000..4253f570f0bb
--- /dev/null
+++ b/keyboards/sawnsprojects/re65/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+ENCODER_MAP_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/sawnsprojects/re65/readme.md b/keyboards/sawnsprojects/re65/readme.md
new file mode 100644
index 000000000000..b02dfe592aac
--- /dev/null
+++ b/keyboards/sawnsprojects/re65/readme.md
@@ -0,0 +1,26 @@
+# RE65
+
+![RE65](https://i.imgur.com/bzeWSwwh.png)
+
+A Keyboard from Nuxros
+
+* Keyboard Maintainer: [Mai The San](https://github.com/maithesan)
+* Hardware Supported: RE65, KBD67 MKII
+* Hardware Availability: [Nuxros Store](https://nuxroskb.store/en/products/re65?variant=45628371370283)
+Make example for this keyboard (after setting up your build environment):
+
+ make sawnsprojects/re65:default
+
+Flashing example for this keyboard:
+
+ make sawnsprojects/re65: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 short the `RST` and `GND` pads on the SWD header twice, or short the `BOOT` header and plug in keyboard
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
diff --git a/keyboards/sawnsprojects/re65/rules.mk b/keyboards/sawnsprojects/re65/rules.mk
new file mode 100644
index 000000000000..7ff128fa692e
--- /dev/null
+++ b/keyboards/sawnsprojects/re65/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
\ No newline at end of file
From 2b8799a43aca2b8dfa2729c1a8c48cddc4abac5f Mon Sep 17 00:00:00 2001
From: Vino Rodrigues <366673+vinorodrigues@users.noreply.github.com>
Date: Mon, 25 Dec 2023 04:06:25 +1100
Subject: [PATCH 04/31] clang-format
---
drivers/bluetooth/bluetooth.h | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/bluetooth/bluetooth.h b/drivers/bluetooth/bluetooth.h
index d34c59e93a7a..74b0936f55c2 100644
--- a/drivers/bluetooth/bluetooth.h
+++ b/drivers/bluetooth/bluetooth.h
@@ -27,6 +27,8 @@
# include "rn42.h"
#endif
+// clang-format off
+
typedef enum send_output_t {
SEND_OUTPUT_AUTO,
SEND_OUTPUT_NONE,
@@ -35,6 +37,8 @@ typedef enum send_output_t {
SEND_OUTPUT_BOTH
} send_output_t;
+// clang-format on
+
#ifndef SEND_OUTPUT_DEFAULT
# define SEND_OUTPUT_DEFAULT SEND_OUTPUT_AUTO
#endif
From 83b84187ea19c92d31909443c85a89fe8a605f91 Mon Sep 17 00:00:00 2001
From: Jesse Leventhal <45154268+jessel92@users.noreply.github.com>
Date: Sun, 24 Dec 2023 13:16:34 -0500
Subject: [PATCH 05/31] [Keyboard] Add Noodlepad_Micro (#22703)
Co-authored-by: Joel Challis
Co-authored-by: jack <0x6a73@protonmail.com>
Co-authored-by: Sergey Vlasov
---
.../themadnoodle/noodlepad_micro/config.h | 6 ++
.../themadnoodle/noodlepad_micro/info.json | 72 +++++++++++++++
.../noodlepad_micro/keymaps/default/keymap.c | 68 +++++++++++++++
.../noodlepad_micro/keymaps/default/rules.mk | 1 +
.../noodlepad_micro/keymaps/via/keymap.c | 87 +++++++++++++++++++
.../noodlepad_micro/keymaps/via/rules.mk | 2 +
.../themadnoodle/noodlepad_micro/readme.md | 28 ++++++
.../themadnoodle/noodlepad_micro/rules.mk | 2 +
8 files changed, 266 insertions(+)
create mode 100644 keyboards/themadnoodle/noodlepad_micro/config.h
create mode 100644 keyboards/themadnoodle/noodlepad_micro/info.json
create mode 100644 keyboards/themadnoodle/noodlepad_micro/keymaps/default/keymap.c
create mode 100644 keyboards/themadnoodle/noodlepad_micro/keymaps/default/rules.mk
create mode 100644 keyboards/themadnoodle/noodlepad_micro/keymaps/via/keymap.c
create mode 100644 keyboards/themadnoodle/noodlepad_micro/keymaps/via/rules.mk
create mode 100644 keyboards/themadnoodle/noodlepad_micro/readme.md
create mode 100644 keyboards/themadnoodle/noodlepad_micro/rules.mk
diff --git a/keyboards/themadnoodle/noodlepad_micro/config.h b/keyboards/themadnoodle/noodlepad_micro/config.h
new file mode 100644
index 000000000000..1dd3a20816b2
--- /dev/null
+++ b/keyboards/themadnoodle/noodlepad_micro/config.h
@@ -0,0 +1,6 @@
+// Copyright 2023 The Mad Noodle(@the_mad_noodle)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define RGBLIGHT_DEFAULT_MODE RGBLIGHT_MODE_RAINBOW_SWIRL + 5
diff --git a/keyboards/themadnoodle/noodlepad_micro/info.json b/keyboards/themadnoodle/noodlepad_micro/info.json
new file mode 100644
index 000000000000..fe7ab9ea7511
--- /dev/null
+++ b/keyboards/themadnoodle/noodlepad_micro/info.json
@@ -0,0 +1,72 @@
+{
+ "manufacturer": "The Mad Noodle",
+ "keyboard_name": "NoodlePad Micro",
+ "maintainer": "the-mad-noodle",
+ "url": "https://www.madnoodleprototypes.com/",
+ "bootloader": "rp2040",
+ "diode_direction": "ROW2COL",
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgblight": true,
+ "encoder": true
+ },
+ "rgblight": {
+ "hue_steps": 10,
+ "led_count": 4,
+ "sleep": true,
+ "animations": {
+ "breathing": true,
+ "rainbow_mood": true,
+ "rainbow_swirl": true,
+ "snake": true,
+ "knight": true,
+ "christmas": true,
+ "static_gradient": true,
+ "rgb_test": true,
+ "alternating": true,
+ "twinkle": true
+ }
+ },
+ "matrix_pins": {
+ "cols": ["GP6", "GP7", "GP0"],
+ "rows": ["GP26", "GP27", "GP28"]
+ },
+ "processor": "RP2040",
+ "usb": {
+ "device_version": "3.0.0",
+ "pid": "0x0004",
+ "vid": "0x6A6C"
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [1, 2], "x": 2, "y": 1},
+ {"matrix": [1, 1], "x": 1, "y": 1},
+ {"matrix": [1, 0], "x": 0, "y": 1},
+ {"matrix": [2, 2], "x": 2, "y": 2},
+ {"matrix": [2, 1], "x": 1, "y": 2},
+ {"matrix": [2, 0], "x": 0, "y": 2}
+ ]
+ }
+ },
+ "ws2812": {
+ "pin": "GP29",
+ "driver": "vendor"
+ },
+ "encoder": {
+ "rotary": [
+ { "pin_a": "GP2", "pin_b": "GP1" }
+ { "pin_a": "GP3", "pin_b": "GP4" }
+ ]
+
+ }
+
+
+}
diff --git a/keyboards/themadnoodle/noodlepad_micro/keymaps/default/keymap.c b/keyboards/themadnoodle/noodlepad_micro/keymaps/default/keymap.c
new file mode 100644
index 000000000000..663a668ae849
--- /dev/null
+++ b/keyboards/themadnoodle/noodlepad_micro/keymaps/default/keymap.c
@@ -0,0 +1,68 @@
+// Copyright 2023 The Mad Noodle(@the_mad_noodle)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ /* LAYER 0
+ * ,--ENC2-- --ENC1--.
+ * | << | | >> |
+ * |-------+-------+-------|
+ * | STOP | PLAY | MEDIA |
+ * |-------+-------+-------|
+ * | CALC | MAIL | PC/FN |
+ * `-----------------------'
+ */
+
+ [0] = LAYOUT(
+ KC_MPRV, KC_MNXT,
+ KC_MSTP, KC_MPLY, KC_MSEL,
+ LT(2,KC_CALC), KC_MAIL, LT(1, KC_MYCM)
+ ),
+
+
+ /* LAYER 1
+ * ,--ENC2-- --ENC1--.
+ * | MODE+ | | MODE- |
+ * |-------+-------+-------|
+ * |Bright-| Tog |Bright+|
+ * |-------+-------+-------|
+ * | PLAIN |BREATH | |
+ * `-----------------------'
+ */
+
+ [1] = LAYOUT(
+ RGB_MOD, RGB_RMOD,
+ RGB_VAD, RGB_TOG, RGB_VAI,
+ RGB_M_P, RGB_M_B, KC_TRNS
+ ),
+
+
+ /* LAYER 2 (ENCODER)
+ * ,--ENC2-- --ENC1--.
+ * | | | |
+ * |-------+-------+-------|
+ * | | | |
+ * |-------+-------+-------|
+ * | | | |
+ * `-----------------------'
+ */
+
+ [2] = LAYOUT(
+ KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+ )
+};
+
+
+/*Encoder Mapping*/
+//-----------------------(ENC1)---------------------------------(ENC2)-----------------
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
+ [0] = { ENCODER_CCW_CW(KC_LEFT, KC_RGHT), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [1] = { ENCODER_CCW_CW(RGB_HUD, RGB_HUI), ENCODER_CCW_CW(RGB_SAD, RGB_SAI) },
+ [2] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI), ENCODER_CCW_CW(RGB_SPD, RGB_SPI) }
+};
+#endif
diff --git a/keyboards/themadnoodle/noodlepad_micro/keymaps/default/rules.mk b/keyboards/themadnoodle/noodlepad_micro/keymaps/default/rules.mk
new file mode 100644
index 000000000000..a40474b4d5c7
--- /dev/null
+++ b/keyboards/themadnoodle/noodlepad_micro/keymaps/default/rules.mk
@@ -0,0 +1 @@
+ENCODER_MAP_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/themadnoodle/noodlepad_micro/keymaps/via/keymap.c b/keyboards/themadnoodle/noodlepad_micro/keymaps/via/keymap.c
new file mode 100644
index 000000000000..d6df824a5089
--- /dev/null
+++ b/keyboards/themadnoodle/noodlepad_micro/keymaps/via/keymap.c
@@ -0,0 +1,87 @@
+// Copyright 2023 The Mad Noodle(@the_mad_noodle)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ /* LAYER 0
+ * ,--ENC2-- --ENC1--.
+ * | << | | >> |
+ * |-------+-------+-------|
+ * | STOP | PLAY | MEDIA |
+ * |-------+-------+-------|
+ * | CALC | MY PC | TO(3) |
+ * `-----------------------'
+ */
+
+ [0] = LAYOUT(
+ KC_MPRV, KC_MNXT,
+ KC_MSTP, KC_MPLY, KC_MSEL,
+ KC_CALC, KC_MYCM, TO(3)
+ ),
+
+
+ /* LAYER 1
+ * ,--ENC2-- --ENC1--.
+ * | MODE+ | | MODE- |
+ * |-------+-------+-------|
+ * |Bright-| Tog |Bright+|
+ * |-------+-------+-------|
+ * | PLAIN |BREATH | TO(0) |
+ * `-----------------------'
+ */
+
+ [1] = LAYOUT(
+ RGB_MOD, RGB_RMOD,
+ RGB_VAD, RGB_TOG, RGB_VAI,
+ RGB_M_P, RGB_M_B, TO(0)
+ ),
+
+
+ /* LAYER 2
+ * ,--ENC2-- --ENC1--.
+ * | | | |
+ * |-------+-------+-------|
+ * | | | |
+ * |-------+-------+-------|
+ * | | | TO(0) |
+ * `-----------------------'
+ */
+
+ [2] = LAYOUT(
+ KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, TO(0)
+ ),
+
+ /* LAYER 3
+ * ,--ENC2-- --ENC1--.
+ * | | | |
+ * |-------+-------+-------|
+ * | TO(1) | | TO(2) |
+ * |-------+-------+-------|
+ * | | | TO(0) |
+ * `-----------------------'
+ */
+
+ [3] = LAYOUT(
+ KC_TRNS, KC_TRNS,
+ TO(1), KC_TRNS, TO(2),
+ KC_TRNS, KC_TRNS, TO(0)
+ )
+
+};
+
+
+/*Encoder Mapping*/
+//-----------------------(ENC1)---------------------------------(ENC2)-----------------
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
+ [0] = { ENCODER_CCW_CW(KC_LEFT, KC_RGHT), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [1] = { ENCODER_CCW_CW(RGB_HUD, RGB_HUI), ENCODER_CCW_CW(RGB_SAD, RGB_SAI) },
+ [2] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI), ENCODER_CCW_CW(RGB_SPD, RGB_SPI) },
+ [3] = { ENCODER_CCW_CW(KC_LEFT, KC_RGHT), ENCODER_CCW_CW(KC_DOWN, KC_UP) },
+
+};
+#endif
diff --git a/keyboards/themadnoodle/noodlepad_micro/keymaps/via/rules.mk b/keyboards/themadnoodle/noodlepad_micro/keymaps/via/rules.mk
new file mode 100644
index 000000000000..6ccd6d91943d
--- /dev/null
+++ b/keyboards/themadnoodle/noodlepad_micro/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+ENCODER_MAP_ENABLE = yes
+VIA_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/themadnoodle/noodlepad_micro/readme.md b/keyboards/themadnoodle/noodlepad_micro/readme.md
new file mode 100644
index 000000000000..a77c1ad7ba39
--- /dev/null
+++ b/keyboards/themadnoodle/noodlepad_micro/readme.md
@@ -0,0 +1,28 @@
+# NoodlePad [Micro]
+
+![NoodlePad [Micro]](https://i.imgur.com/uRmVt3ah.jpg)
+
+The NoodlePad [Micro] is a 6 key 2 encoder macro keypad designed using RP2040 chipset.
+
+* Keyboard Maintainer: [The Mad Noodle](https://github.com/The-Mad-Noodle)
+* Hardware Supported: NoodlePad [Micro]
+* Hardware Availability: https://www.madnoodleprototypes.com/shop
+
+Compile example for this keyboard (after setting up your build environment):
+
+ qmk compile -kb themadnoodle/noodlepad_micro -km default
+
+Flashing example for this keyboard:
+
+ qmk flash -kb themadnoodle/noodlepad_micro -km default
+
+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 & Flashing
+
+
+**Physical reset button**:
+
+* Double press the button on the back, center, left of the PCB labeled "R" to enter the bootloader drive mode.
+
+* If you have a pre-compiled .uf2 file, copy it into bootloader drive (RPI-RP2), board will reset automatically once file is copied sucessfully
\ No newline at end of file
diff --git a/keyboards/themadnoodle/noodlepad_micro/rules.mk b/keyboards/themadnoodle/noodlepad_micro/rules.mk
new file mode 100644
index 000000000000..6968c523355c
--- /dev/null
+++ b/keyboards/themadnoodle/noodlepad_micro/rules.mk
@@ -0,0 +1,2 @@
+# This file intentionally left blank
+
From 6c3315fccb6ebf6b5977631336068249d39bba40 Mon Sep 17 00:00:00 2001
From: Vino Rodrigues <366673+vinorodrigues@users.noreply.github.com>
Date: Mon, 25 Dec 2023 11:02:42 +1100
Subject: [PATCH 06/31] post sigprof review fixes
---
drivers/bluetooth/bluetooth.c | 2 +-
quantum/keyboard.c | 2 +-
tmk_core/protocol/host.c | 17 ++++++++++-------
3 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/drivers/bluetooth/bluetooth.c b/drivers/bluetooth/bluetooth.c
index 078e17ad5657..bb8acee0911b 100644
--- a/drivers/bluetooth/bluetooth.c
+++ b/drivers/bluetooth/bluetooth.c
@@ -22,7 +22,7 @@
/* Each driver needs to define the struct
* const rgb_matrix_driver_t rgb_matrix_driver;
- * All members (except `task`, `.detect_output` and `system`) must be provided.
+ * All members (except `task`, `is_connected` and `send_system`) must be provided.
* Keyboard custom drivers can define this in their own files, it should only
* be here if shared between boards.
*/
diff --git a/quantum/keyboard.c b/quantum/keyboard.c
index 387685d10c2a..1af62aafe8e2 100644
--- a/quantum/keyboard.c
+++ b/quantum/keyboard.c
@@ -710,7 +710,7 @@ void keyboard_task(void) {
#endif
#ifdef BLUETOOTH_ENABLE
- bluetooth_driver.task();
+ if (NULL != (*bluetooth_driver.task)) bluetooth_driver.task();
#endif
#ifdef HAPTIC_ENABLE
diff --git a/tmk_core/protocol/host.c b/tmk_core/protocol/host.c
index 919830ddcfe7..1162499d1b22 100644
--- a/tmk_core/protocol/host.c
+++ b/tmk_core/protocol/host.c
@@ -78,7 +78,7 @@ void host_keyboard_send(report_keyboard_t *report) {
bluetooth_driver.send_keyboard(report);
if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
} else if ((where_to_send == SEND_OUTPUT_NONE))
- return;
+ return; // dont send to USB either, jump out
#endif
if (!driver) return;
@@ -106,7 +106,7 @@ void host_nkro_send(report_nkro_t *report) {
bluetooth_driver.send_nkro(report);
if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
} else if (where_to_send == SEND_OUTPUT_NONE)
- return;
+ return; // dont send to USB either, jump out
#endif
(*driver->send_nkro)(report);
@@ -127,7 +127,7 @@ void host_mouse_send(report_mouse_t *report) {
bluetooth_driver.send_mouse(report);
if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
} else if (where_to_send == SEND_OUTPUT_NONE)
- return;
+ return; // dont send to USB either, jump out
#endif
if (!driver) return;
@@ -149,10 +149,13 @@ void host_system_send(uint16_t usage) {
#ifdef BLUETOOTH_ENABLE
send_output_t where_to_send = get_send_output();
if ((where_to_send == SEND_OUTPUT_BLUETOOTH) || (where_to_send == SEND_OUTPUT_BOTH)) {
- bluetooth_driver.send_system(usage);
- if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
+ if (NULL != (*bluetooth_driver.send_system)) {
+ bluetooth_driver.send_system(usage);
+ if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
+ } else if (where_to_send == SEND_OUTPUT_BLUETOOTH)
+ return; // only BT, but no `send_system`, jump out
} else if (where_to_send == SEND_OUTPUT_NONE)
- return;
+ return; // dont send to USB either, jump out
#endif
if (!driver) return;
@@ -174,7 +177,7 @@ void host_consumer_send(uint16_t usage) {
bluetooth_driver.send_consumer(usage);
if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
} else if (where_to_send == SEND_OUTPUT_NONE)
- return;
+ return; // dont send to USB either, jump out
#endif
if (!driver) return;
From e526da18ab0757bde909bfdc69c9eaac38451eb1 Mon Sep 17 00:00:00 2001
From: Vino Rodrigues <366673+vinorodrigues@users.noreply.github.com>
Date: Mon, 25 Dec 2023 18:23:05 +1100
Subject: [PATCH 07/31] post sigprof review fixes, r2
---
drivers/bluetooth/bluetooth.c | 2 +-
drivers/bluetooth/bluetooth_legacy.c | 6 +++---
quantum/keyboard.c | 2 +-
tmk_core/protocol/host.c | 3 ++-
4 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/drivers/bluetooth/bluetooth.c b/drivers/bluetooth/bluetooth.c
index bb8acee0911b..a970188c47fd 100644
--- a/drivers/bluetooth/bluetooth.c
+++ b/drivers/bluetooth/bluetooth.c
@@ -76,7 +76,7 @@ send_output_t get_send_output(void) {
if (usb_connected_state()) {
return SEND_OUTPUT_USB;
}
- if ((NULL != (*bluetooth_driver.is_connected)) && (bluetooth_driver.is_connected())) {
+ if ((NULL != bluetooth_driver.is_connected) && (bluetooth_driver.is_connected())) {
return SEND_OUTPUT_BLUETOOTH;
} else {
return SEND_OUTPUT_NONE;
diff --git a/drivers/bluetooth/bluetooth_legacy.c b/drivers/bluetooth/bluetooth_legacy.c
index 0b46fe0fc6b6..891ccceecfa9 100644
--- a/drivers/bluetooth/bluetooth_legacy.c
+++ b/drivers/bluetooth/bluetooth_legacy.c
@@ -26,7 +26,7 @@ __attribute__((weak)) void bluetooth_init(void) {
}
__attribute__((weak)) void bluetooth_task(void) {
- if (NULL != (*bluetooth_driver.task)) {
+ if (NULL != bluetooth_driver.task) {
bluetooth_driver.task();
}
}
@@ -37,7 +37,7 @@ __attribute__((weak)) void bluetooth_send_keyboard(report_keyboard_t *report) {
#ifdef NKRO_ENABLE
__attribute__((weak)) void bluetooth_send_nkro(report_keyboard_t *report) {
- if (NULL != (*bluetooth_driver.send_nkro)) {
+ if (NULL != bluetooth_driver.send_nkro) {
bluetooth_driver.send_nkro(report);
}
}
@@ -52,7 +52,7 @@ __attribute__((weak)) void bluetooth_send_consumer(uint16_t usage) {
}
__attribute__((weak)) void bluetooth_send_system(uint16_t usage) {
- if (NULL != (*bluetooth_driver.send_system)) {
+ if (NULL != bluetooth_driver.send_system) {
bluetooth_driver.send_system(usage);
}
}
diff --git a/quantum/keyboard.c b/quantum/keyboard.c
index 1af62aafe8e2..61aaa2e3878f 100644
--- a/quantum/keyboard.c
+++ b/quantum/keyboard.c
@@ -710,7 +710,7 @@ void keyboard_task(void) {
#endif
#ifdef BLUETOOTH_ENABLE
- if (NULL != (*bluetooth_driver.task)) bluetooth_driver.task();
+ if (NULL != bluetooth_driver.task) bluetooth_driver.task();
#endif
#ifdef HAPTIC_ENABLE
diff --git a/tmk_core/protocol/host.c b/tmk_core/protocol/host.c
index 1162499d1b22..f90842f1cfc6 100644
--- a/tmk_core/protocol/host.c
+++ b/tmk_core/protocol/host.c
@@ -16,6 +16,7 @@ along with this program. If not, see .
*/
#include
+#include
#include "keyboard.h"
#include "keycode.h"
#include "host.h"
@@ -149,7 +150,7 @@ void host_system_send(uint16_t usage) {
#ifdef BLUETOOTH_ENABLE
send_output_t where_to_send = get_send_output();
if ((where_to_send == SEND_OUTPUT_BLUETOOTH) || (where_to_send == SEND_OUTPUT_BOTH)) {
- if (NULL != (*bluetooth_driver.send_system)) {
+ if (NULL != bluetooth_driver.send_system) {
bluetooth_driver.send_system(usage);
if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
} else if (where_to_send == SEND_OUTPUT_BLUETOOTH)
From cc08f230ffac3a48e82d26b32ca6bdf0c6ab041e Mon Sep 17 00:00:00 2001
From: Ryan
Date: Wed, 27 Dec 2023 12:12:42 +1100
Subject: [PATCH 08/31] bm40hsrgb/rev2: disable some RGB Matrix effects to
reduce filesize (#22761)
---
keyboards/kprepublic/bm40hsrgb/rev2/info.json | 5 -----
1 file changed, 5 deletions(-)
diff --git a/keyboards/kprepublic/bm40hsrgb/rev2/info.json b/keyboards/kprepublic/bm40hsrgb/rev2/info.json
index dac848ed52a1..c530b456cfb0 100644
--- a/keyboards/kprepublic/bm40hsrgb/rev2/info.json
+++ b/keyboards/kprepublic/bm40hsrgb/rev2/info.json
@@ -62,11 +62,6 @@
"hue_breathing": true,
"hue_pendulum": true,
"hue_wave": true,
- "pixel_rain": true,
- "pixel_flow": true,
- "pixel_fractal": true,
- "typing_heatmap": true,
- "digital_rain": true,
"solid_reactive_simple": true,
"solid_reactive": true,
"solid_reactive_wide": true,
From 2505d7edd0b10f4540ac5cb8c07717778a65de1b Mon Sep 17 00:00:00 2001
From: Tom Barnes
Date: Wed, 27 Dec 2023 22:11:06 +0000
Subject: [PATCH 09/31] vendor keymaps-mechboards via updates (#22767)
* update mb_via keymaps to new naming for vendor keymaps
* missed a reference to old name, tidy crkbd readme, add lily58 readme
* fix typo
* fix typo
* delete shopify image
---
keyboards/crkbd/keymaps/mb_via/readme.md | 12 ------------
.../keymaps/{mb_via => via_mechboards}/config.h | 0
.../keymaps/{mb_via => via_mechboards}/keymap.c | 0
keyboards/crkbd/keymaps/via_mechboards/readme.md | 10 ++++++++++
.../keymaps/{mb_via => via_mechboards}/rules.mk | 0
.../keymaps/{mb_via => via_mechboards}/config.h | 0
.../keymaps/{mb_via => via_mechboards}/keymap.c | 0
keyboards/lily58/keymaps/via_mechboards/readme.md | 10 ++++++++++
.../keymaps/{mb_via => via_mechboards}/rules.mk | 0
9 files changed, 20 insertions(+), 12 deletions(-)
delete mode 100644 keyboards/crkbd/keymaps/mb_via/readme.md
rename keyboards/crkbd/keymaps/{mb_via => via_mechboards}/config.h (100%)
rename keyboards/crkbd/keymaps/{mb_via => via_mechboards}/keymap.c (100%)
create mode 100644 keyboards/crkbd/keymaps/via_mechboards/readme.md
rename keyboards/crkbd/keymaps/{mb_via => via_mechboards}/rules.mk (100%)
rename keyboards/lily58/keymaps/{mb_via => via_mechboards}/config.h (100%)
rename keyboards/lily58/keymaps/{mb_via => via_mechboards}/keymap.c (100%)
create mode 100644 keyboards/lily58/keymaps/via_mechboards/readme.md
rename keyboards/lily58/keymaps/{mb_via => via_mechboards}/rules.mk (100%)
diff --git a/keyboards/crkbd/keymaps/mb_via/readme.md b/keyboards/crkbd/keymaps/mb_via/readme.md
deleted file mode 100644
index 048927073ba8..000000000000
--- a/keyboards/crkbd/keymaps/mb_via/readme.md
+++ /dev/null
@@ -1,12 +0,0 @@
-# Default Via keyboard for the Corne R2G by Mechboards UK
-
-![r2g](https://cdn.shopify.com/s/files/1/0582/0242/3501/products/HelidoxCorneR2GPCB_1800x1800.png)
-
-Corne R2G is an eddition of the classic CRKBD by footsan remade to feature a full smd assembly
-
-In this fold can be found the default via enabled keymap that can be in conjunction
-
-Flash example for this Keymap:
-```sh
-qmk flash -kb crkbd/r2g -km mb_via
-```
diff --git a/keyboards/crkbd/keymaps/mb_via/config.h b/keyboards/crkbd/keymaps/via_mechboards/config.h
similarity index 100%
rename from keyboards/crkbd/keymaps/mb_via/config.h
rename to keyboards/crkbd/keymaps/via_mechboards/config.h
diff --git a/keyboards/crkbd/keymaps/mb_via/keymap.c b/keyboards/crkbd/keymaps/via_mechboards/keymap.c
similarity index 100%
rename from keyboards/crkbd/keymaps/mb_via/keymap.c
rename to keyboards/crkbd/keymaps/via_mechboards/keymap.c
diff --git a/keyboards/crkbd/keymaps/via_mechboards/readme.md b/keyboards/crkbd/keymaps/via_mechboards/readme.md
new file mode 100644
index 000000000000..a173bc43ecb3
--- /dev/null
+++ b/keyboards/crkbd/keymaps/via_mechboards/readme.md
@@ -0,0 +1,10 @@
+# Default Via keymap for the Corne R2G by Mechboards UK
+
+Corne R2G is an edition of the classic CRKBD by foostan remade to feature full smd assembly
+
+In this folder can be found the default via enabled keymap that can be in conjunction with the mechboards R2G PCB.
+
+Flash example for this Keymap:
+```sh
+qmk flash -kb crkbd/r2g -km via_mechboards
+```
diff --git a/keyboards/crkbd/keymaps/mb_via/rules.mk b/keyboards/crkbd/keymaps/via_mechboards/rules.mk
similarity index 100%
rename from keyboards/crkbd/keymaps/mb_via/rules.mk
rename to keyboards/crkbd/keymaps/via_mechboards/rules.mk
diff --git a/keyboards/lily58/keymaps/mb_via/config.h b/keyboards/lily58/keymaps/via_mechboards/config.h
similarity index 100%
rename from keyboards/lily58/keymaps/mb_via/config.h
rename to keyboards/lily58/keymaps/via_mechboards/config.h
diff --git a/keyboards/lily58/keymaps/mb_via/keymap.c b/keyboards/lily58/keymaps/via_mechboards/keymap.c
similarity index 100%
rename from keyboards/lily58/keymaps/mb_via/keymap.c
rename to keyboards/lily58/keymaps/via_mechboards/keymap.c
diff --git a/keyboards/lily58/keymaps/via_mechboards/readme.md b/keyboards/lily58/keymaps/via_mechboards/readme.md
new file mode 100644
index 000000000000..36aaab31b589
--- /dev/null
+++ b/keyboards/lily58/keymaps/via_mechboards/readme.md
@@ -0,0 +1,10 @@
+# Default Via keymap for the Lily58 R2G by Mechboards UK
+
+Lily58 R2G is the classic Lily58 remade to feature full SMD assembly
+
+In this folder can be found the default via enabled keymap that can be in conjunction with the mechboards R2G PCB.
+
+Flash example for this Keymap:
+```sh
+qmk flash -kb lily58/r2g -km via_mechboards
+```
diff --git a/keyboards/lily58/keymaps/mb_via/rules.mk b/keyboards/lily58/keymaps/via_mechboards/rules.mk
similarity index 100%
rename from keyboards/lily58/keymaps/mb_via/rules.mk
rename to keyboards/lily58/keymaps/via_mechboards/rules.mk
From 420b13468b1c1d6d3a34c58e3c065b39e3895d5d Mon Sep 17 00:00:00 2001
From: yuezp <49514776+LXF-YZP@users.noreply.github.com>
Date: Thu, 28 Dec 2023 12:37:01 +0800
Subject: [PATCH 10/31] [Keyboard] Add meetlab kafkasplit (#22756)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: “yuezp” <“yuezpchn@126.com”>
---
keyboards/meetlab/kafkasplit/config.h | 35 +++
keyboards/meetlab/kafkasplit/halconf.h | 21 ++
keyboards/meetlab/kafkasplit/info.json | 203 +++++++++++++++++
keyboards/meetlab/kafkasplit/kafkasplit.c | 207 ++++++++++++++++++
.../kafkasplit/keymaps/default/keymap.c | 73 ++++++
.../meetlab/kafkasplit/keymaps/via/keymap.c | 73 ++++++
.../meetlab/kafkasplit/keymaps/via/rules.mk | 1 +
.../meetlab/kafkasplit/matrix_diagram.md | 14 ++
keyboards/meetlab/kafkasplit/mcuconf.h | 22 ++
keyboards/meetlab/kafkasplit/readme.md | 26 +++
keyboards/meetlab/kafkasplit/rules.mk | 1 +
11 files changed, 676 insertions(+)
create mode 100644 keyboards/meetlab/kafkasplit/config.h
create mode 100644 keyboards/meetlab/kafkasplit/halconf.h
create mode 100644 keyboards/meetlab/kafkasplit/info.json
create mode 100644 keyboards/meetlab/kafkasplit/kafkasplit.c
create mode 100644 keyboards/meetlab/kafkasplit/keymaps/default/keymap.c
create mode 100644 keyboards/meetlab/kafkasplit/keymaps/via/keymap.c
create mode 100644 keyboards/meetlab/kafkasplit/keymaps/via/rules.mk
create mode 100644 keyboards/meetlab/kafkasplit/matrix_diagram.md
create mode 100644 keyboards/meetlab/kafkasplit/mcuconf.h
create mode 100644 keyboards/meetlab/kafkasplit/readme.md
create mode 100644 keyboards/meetlab/kafkasplit/rules.mk
diff --git a/keyboards/meetlab/kafkasplit/config.h b/keyboards/meetlab/kafkasplit/config.h
new file mode 100644
index 000000000000..714b709fe17d
--- /dev/null
+++ b/keyboards/meetlab/kafkasplit/config.h
@@ -0,0 +1,35 @@
+/* Copyright 2022 LXF-YZP(yuezp)
+ *
+ * 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 .
+ */
+
+#pragma once
+
+/* Double tap reset button to enter bootloader */
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED GP25
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U
+
+
+#define SERIAL_USART_FULL_DUPLEX
+#define SERIAL_USART_TX_PIN GP0
+#define SERIAL_USART_RX_PIN GP1
+
+#define I2C1_SCL_PIN GP27
+#define I2C1_SDA_PIN GP26
+#define I2C_DRIVER I2CD1
+#define I2C1_CLOCK_SPEED 400000
+#define OLED_BRIGHTNESS 128
+#define OLED_TIMEOUT 600000
+#define OLED_SCROLL_TIMEOUT 300000
diff --git a/keyboards/meetlab/kafkasplit/halconf.h b/keyboards/meetlab/kafkasplit/halconf.h
new file mode 100644
index 000000000000..4e2f667f1eca
--- /dev/null
+++ b/keyboards/meetlab/kafkasplit/halconf.h
@@ -0,0 +1,21 @@
+/* Copyright 2022 LXF-YZP(yuezp)
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#define HAL_USE_I2C TRUE
+
+#include_next
diff --git a/keyboards/meetlab/kafkasplit/info.json b/keyboards/meetlab/kafkasplit/info.json
new file mode 100644
index 000000000000..d71d405f336b
--- /dev/null
+++ b/keyboards/meetlab/kafkasplit/info.json
@@ -0,0 +1,203 @@
+{
+ "manufacturer": "lucky_studio",
+ "keyboard_name": "kafkaSplit",
+ "maintainer": "yuezp",
+ "bootloader": "rp2040",
+ "diode_direction": "ROW2COL",
+ "features": {
+ "bootmagic": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "oled": true,
+ "rgb_matrix": true,
+ "wpm": true
+ },
+ "indicators": {
+ "caps_lock": "GP25",
+ "on_state": 1
+ },
+ "matrix_pins": {
+ "cols": ["GP2", "GP3", "GP6", "GP7", "GP10", "GP11"],
+ "rows": ["GP5", "GP8", "GP12", "GP13"]
+ },
+ "processor": "RP2040",
+ "rgb_matrix": {
+ "animations": {
+ "alphas_mods": true,
+ "band_pinwheel_sat": true,
+ "band_pinwheel_val": true,
+ "band_sat": true,
+ "band_spiral_sat": true,
+ "band_spiral_val": true,
+ "band_val": true,
+ "breathing": true,
+ "cycle_all": true,
+ "cycle_left_right": true,
+ "cycle_out_in": true,
+ "cycle_out_in_dual": true,
+ "cycle_pinwheel": true,
+ "cycle_spiral": true,
+ "cycle_up_down": true,
+ "digital_rain": true,
+ "dual_beacon": true,
+ "gradient_left_right": true,
+ "gradient_up_down": true,
+ "hue_breathing": true,
+ "hue_pendulum": true,
+ "hue_wave": true,
+ "jellybean_raindrops": true,
+ "multisplash": true,
+ "pixel_flow": true,
+ "pixel_fractal": true,
+ "pixel_rain": true,
+ "rainbow_beacon": true,
+ "rainbow_moving_chevron": true,
+ "rainbow_pinwheels": true,
+ "raindrops": true,
+ "solid_multisplash": true,
+ "solid_reactive": true,
+ "solid_reactive_cross": true,
+ "solid_reactive_multicross": true,
+ "solid_reactive_multinexus": true,
+ "solid_reactive_multiwide": true,
+ "solid_reactive_nexus": true,
+ "solid_reactive_simple": true,
+ "solid_reactive_wide": true,
+ "solid_splash": true,
+ "splash": true,
+ "typing_heatmap": true
+ },
+ "default": {
+ "animation": "breathing",
+ "hue": 200
+ },
+ "driver": "ws2812",
+ "layout": [
+ {"matrix": [3, 5], "x": 0, "y": 0, "flags": 4},
+ {"matrix": [3, 4], "x": 18, "y": 5, "flags": 4},
+ {"matrix": [3, 3], "x": 36, "y": 10, "flags": 4},
+ {"matrix": [3, 2], "x": 54, "y": 15, "flags": 4},
+ {"matrix": [2, 5], "x": 2, "y": 21, "flags": 4},
+ {"matrix": [2, 4], "x": 20, "y": 23, "flags": 4},
+ {"matrix": [2, 3], "x": 38, "y": 25, "flags": 4},
+ {"matrix": [2, 2], "x": 56, "y": 23, "flags": 4},
+ {"matrix": [2, 1], "x": 72, "y": 21, "flags": 4},
+ {"matrix": [2, 0], "x": 90, "y": 21, "flags": 4},
+ {"matrix": [1, 5], "x": 2, "y": 39, "flags": 4},
+ {"matrix": [1, 4], "x": 20, "y": 41, "flags": 4},
+ {"matrix": [1, 3], "x": 38, "y": 43, "flags": 4},
+ {"matrix": [1, 2], "x": 56, "y": 41, "flags": 4},
+ {"matrix": [1, 1], "x": 72, "y": 39, "flags": 4},
+ {"matrix": [1, 0], "x": 90, "y": 39, "flags": 4},
+ {"matrix": [0, 5], "x": 2, "y": 57, "flags": 4},
+ {"matrix": [0, 4], "x": 20, "y": 59, "flags": 4},
+ {"matrix": [0, 3], "x": 38, "y": 61, "flags": 4},
+ {"matrix": [0, 2], "x": 56, "y": 59, "flags": 4},
+ {"matrix": [0, 1], "x": 72, "y": 57, "flags": 4},
+ {"matrix": [0, 0], "x": 90, "y": 57, "flags": 4},
+ {"matrix": [7, 3], "x": 0, "y": 0, "flags": 4},
+ {"matrix": [7, 2], "x": 18, "y": 5, "flags": 4},
+ {"matrix": [7, 1], "x": 36, "y": 10, "flags": 4},
+ {"matrix": [7, 0], "x": 54, "y": 15, "flags": 4},
+ {"matrix": [6, 5], "x": 2, "y": 21, "flags": 4},
+ {"matrix": [6, 4], "x": 20, "y": 23, "flags": 4},
+ {"matrix": [6, 3], "x": 38, "y": 25, "flags": 4},
+ {"matrix": [6, 2], "x": 56, "y": 23, "flags": 4},
+ {"matrix": [6, 1], "x": 72, "y": 21, "flags": 4},
+ {"matrix": [6, 0], "x": 90, "y": 21, "flags": 4},
+ {"matrix": [5, 5], "x": 2, "y": 39, "flags": 4},
+ {"matrix": [5, 4], "x": 20, "y": 41, "flags": 4},
+ {"matrix": [5, 3], "x": 38, "y": 43, "flags": 4},
+ {"matrix": [5, 2], "x": 56, "y": 41, "flags": 4},
+ {"matrix": [5, 1], "x": 72, "y": 39, "flags": 4},
+ {"matrix": [5, 0], "x": 90, "y": 39, "flags": 4},
+ {"matrix": [4, 5], "x": 159, "y": 57, "flags": 4},
+ {"matrix": [4, 4], "x": 159, "y": 59, "flags": 4},
+ {"matrix": [4, 3], "x": 224, "y": 61, "flags": 4},
+ {"matrix": [4, 2], "x": 224, "y": 59, "flags": 4},
+ {"matrix": [4, 1], "x": 224, "y": 57, "flags": 4},
+ {"matrix": [4, 0], "x": 224, "y": 57, "flags": 4}
+ ],
+ "sleep": true,
+ "split_count": [22, 22]
+ },
+ "split": {
+ "enabled": true,
+ "matrix_pins": {
+ "right": {
+ "cols": ["GP9", "GP10", "GP8", "GP7", "GP6", "GP5"],
+ "rows": ["GP11", "GP13", "GP12", "GP14"]
+ }
+ },
+ "transport": {
+ "sync": {
+ "indicators": true,
+ "layer_state": true,
+ "matrix_state": true,
+ "modifiers": true,
+ "wpm": true
+ }
+ }
+ },
+ "url": "",
+ "usb": {
+ "device_version": "0.0.1",
+ "pid": "0xBFC2",
+ "vid": "0xAFC2"
+ },
+ "ws2812": {
+ "driver": "vendor",
+ "pin": "GP15"
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0.25},
+ {"matrix": [0, 1], "x": 1, "y": 0.25},
+ {"matrix": [0, 2], "x": 2, "y": 0.13},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0.13},
+ {"matrix": [0, 5], "x": 5, "y": 0.25},
+ {"matrix": [4, 0], "x": 8.75, "y": 0.25},
+ {"matrix": [4, 1], "x": 9.75, "y": 0.25},
+ {"matrix": [4, 2], "x": 10.75, "y": 0.13},
+ {"matrix": [4, 3], "x": 11.75, "y": 0},
+ {"matrix": [4, 4], "x": 12.75, "y": 0.13},
+ {"matrix": [4, 5], "x": 13.75, "y": 0.25},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.13},
+ {"matrix": [1, 3], "x": 3, "y": 1},
+ {"matrix": [1, 4], "x": 4, "y": 1.13},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [5, 0], "x": 8.75, "y": 1.25},
+ {"matrix": [5, 1], "x": 9.75, "y": 1.25},
+ {"matrix": [5, 2], "x": 10.75, "y": 1.13},
+ {"matrix": [5, 3], "x": 11.75, "y": 1},
+ {"matrix": [5, 4], "x": 12.75, "y": 1.13},
+ {"matrix": [5, 5], "x": 13.75, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25},
+ {"matrix": [2, 1], "x": 1, "y": 2.25},
+ {"matrix": [2, 2], "x": 2, "y": 2.13},
+ {"matrix": [2, 3], "x": 3, "y": 2},
+ {"matrix": [2, 4], "x": 4, "y": 2.13},
+ {"matrix": [2, 5], "x": 5, "y": 2.25},
+ {"matrix": [6, 0], "x": 8.75, "y": 2.25},
+ {"matrix": [6, 1], "x": 9.75, "y": 2.25},
+ {"matrix": [6, 2], "x": 10.75, "y": 2.13},
+ {"matrix": [6, 3], "x": 11.75, "y": 2},
+ {"matrix": [6, 4], "x": 12.75, "y": 2.13},
+ {"matrix": [6, 5], "x": 13.75, "y": 2.25},
+ {"matrix": [3, 2], "x": 2, "y": 3.13},
+ {"matrix": [3, 3], "x": 4, "y": 2.05, "h": 1.25},
+ {"matrix": [3, 4], "x": 5.25, "y": 1.7, "h": 1.25},
+ {"matrix": [3, 5], "x": 5.35, "y": 3.65, "h": 1.5},
+ {"matrix": [7, 0], "x": 8.25, "y": 4.25, "h": 1.5},
+ {"matrix": [7, 1], "x": 7.75, "y": 6.25, "h": 1.25},
+ {"matrix": [7, 2], "x": 9.23, "y": 5.85, "h": 1.25},
+ {"matrix": [7, 3], "x": 11.75, "y": 3.13}
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/meetlab/kafkasplit/kafkasplit.c b/keyboards/meetlab/kafkasplit/kafkasplit.c
new file mode 100644
index 000000000000..ee352bc8dc06
--- /dev/null
+++ b/keyboards/meetlab/kafkasplit/kafkasplit.c
@@ -0,0 +1,207 @@
+/* Copyright 2022 LXF-YZP(yuezp)
+ *
+ * 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 .
+ */
+
+#include "quantum.h"
+
+#ifdef RGB_MATRIX_ENABLE
+bool rgb_matrix_indicators_kb(void) {
+ if (!rgb_matrix_indicators_user()) {
+ return false;
+ }
+ // if (is_keyboard_master()) {
+ if (host_keyboard_led_state().caps_lock) { // 处于 CPAS LOCK 状态
+ rgb_matrix_set_color(5, 100, 0, 0); // 灯变为红色(R:255, G:0, B:0)
+ }
+ return true;
+}
+#endif
+
+#ifdef OLED_ENABLE
+// WPM-responsive animation stuff here
+# define IDLE_FRAMES 5
+# define IDLE_SPEED 20 // below this wpm value your animation will idle
+
+// #define PREP_FRAMES 1 // uncomment if >1
+
+# define TAP_FRAMES 2
+# define TAP_SPEED 40 // above this wpm value typing animation to trigger
+
+# define ANIM_FRAME_DURATION 200 // how long each frame lasts in ms
+// #define SLEEP_TIMER 60000 // should sleep after this period of 0 wpm, needs fixing
+# define ANIM_SIZE 636 // number of bytes in array, minimize for adequate firmware size, max is 1024
+
+uint32_t anim_timer = 0;
+uint32_t anim_sleep = 0;
+uint8_t current_idle_frame = 0;
+// uint8_t current_prep_frame = 0; // uncomment if PREP_FRAMES >1
+uint8_t current_tap_frame = 0;
+
+static void render_anim(void) {
+ static const char PROGMEM idle[IDLE_FRAMES][ANIM_SIZE] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x18, 0x04, 0x02, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x30, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x86, 0x86, 0x40, 0x40, 0x40, 0x40, 0x21, 0x22, 0x22, 0x20, 0x11, 0x11, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x82, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x60, 0x60, 0x00, 0x01, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x30, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x86, 0x86, 0x40, 0x40, 0x40, 0x40, 0x21, 0x22, 0x22, 0x20, 0x11, 0x11, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x34, 0xc4, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x18, 0x04, 0x02, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0d, 0x31, 0xc1, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x04, 0x04, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
+ static const char PROGMEM prep[][ANIM_SIZE] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x84, 0x44, 0x44, 0x42, 0x82, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x64, 0x18, 0x04, 0x12, 0xc2, 0xca, 0x24, 0x88, 0xf0, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x02, 0x18, 0x19, 0x00, 0x05, 0xfe, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
+ static const char PROGMEM tap[TAP_FRAMES][ANIM_SIZE] = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x64, 0x18, 0x04, 0x12, 0xc2, 0xca, 0x24, 0x88, 0xf0, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x98, 0xc0, 0x88, 0x88, 0x8c, 0x9c, 0x1c, 0x1e, 0x0e, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x84, 0x44, 0x44, 0x42, 0x82, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x02, 0x18, 0x19, 0x00, 0x05, 0xfe, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0f, 0x0f, 0x07, 0x03, 0x03, 0x61, 0xf0, 0xf8, 0xfc, 0x60, 0x01, 0x01, 0x01, 0x3c, 0x78, 0xf8, 0xf0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ };
+
+ // assumes 1 frame prep stage
+ void animation_phase(void) {
+ if (get_current_wpm() <= IDLE_SPEED) {
+ current_idle_frame = (current_idle_frame + 1) % IDLE_FRAMES;
+ oled_write_raw_P(idle[abs((IDLE_FRAMES - 1) - current_idle_frame)], ANIM_SIZE);
+ }
+ if (get_current_wpm() > IDLE_SPEED && get_current_wpm() < TAP_SPEED) {
+ // oled_write_raw_P(prep[abs((PREP_FRAMES-1)-current_prep_frame)], ANIM_SIZE); // uncomment if IDLE_FRAMES >1
+ oled_write_raw_P(prep[0], ANIM_SIZE); // remove if IDLE_FRAMES >1
+ }
+ if (get_current_wpm() >= TAP_SPEED) {
+ current_tap_frame = (current_tap_frame + 1) % TAP_FRAMES;
+ oled_write_raw_P(tap[abs((TAP_FRAMES - 1) - current_tap_frame)], ANIM_SIZE);
+ }
+ }
+ if (get_current_wpm() != 000) {
+ oled_on(); // not essential but turns on animation OLED with any alpha keypress
+ if (timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) {
+ anim_timer = timer_read32();
+ animation_phase();
+ }
+ anim_sleep = timer_read32();
+ } else {
+
+ if (timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) {
+ anim_timer = timer_read32();
+ animation_phase();
+ }
+
+ }
+}
+
+oled_rotation_t oled_init_kb(oled_rotation_t rotation) {
+ if (!is_keyboard_master()) {
+ return OLED_ROTATION_180;
+ } else {
+ return rotation;
+ }
+}
+
+static void render_keylock_status(led_t led_state) {
+ oled_write_P(PSTR("Lock: "), false);
+ oled_write_P(PSTR("CAPS"), led_state.caps_lock);
+ oled_write_P(PSTR(" "), false);
+ oled_write_P(PSTR("NUML"), led_state.num_lock);
+ oled_write_P(PSTR(" "), false);
+ oled_write_ln_P(PSTR("SCLK"), led_state.scroll_lock);
+}
+
+static void render_mod_status(uint8_t modifiers) {
+ oled_write_P(PSTR("Mods: "), false);
+ oled_write_P(PSTR("Sft"), (modifiers & MOD_MASK_SHIFT));
+ oled_write_P(PSTR(" "), false);
+ oled_write_P(PSTR("Ctl"), (modifiers & MOD_MASK_CTRL));
+ oled_write_P(PSTR(" "), false);
+ oled_write_P(PSTR("Alt"), (modifiers & MOD_MASK_ALT));
+ oled_write_P(PSTR(" "), false);
+ oled_write_P(PSTR("GUI"), (modifiers & MOD_MASK_GUI));
+}
+
+
+static void render_status(void) {
+ // Host Keyboard Layer Status
+ switch (get_highest_layer(default_layer_state)) {
+ case 0:
+ oled_write_P(PSTR("QWERTY | "), false);
+ break;
+ }
+
+ switch (get_highest_layer(layer_state)) {
+ case 0:
+ oled_write_P(PSTR("Base \n"), false);
+ break;
+
+ case 1:
+ oled_write_P(PSTR("Lower \n"), false);
+ break;
+
+ case 2:
+ oled_write_P(PSTR("Raise \n"), false);
+ break;
+
+ case 3:
+ oled_write_P(PSTR("Adjust \n"), false);
+ break;
+
+ default:
+ oled_write_P(PSTR("Unknown \n"), false);
+ }
+
+ oled_write_P(PSTR("\n"), false);
+ render_keylock_status(host_keyboard_led_state());
+ render_mod_status(get_mods() | get_oneshot_mods());
+}
+
+bool oled_task_kb(void) {
+ if (!oled_task_user()) {
+ return false;
+ }
+
+ if (is_keyboard_master()) {
+ // Renders the current keyboard state (layer, lock, caps, scroll, etc)
+ render_status();
+ } else {
+ render_anim(); // renders pixelart
+
+ oled_set_cursor(0, 0); // sets cursor to (row, column) using charactar spacing (5 rows on 128x32 screen, anything more will overflow back to the top)
+ oled_write_P(PSTR("WPM: "), false);
+ oled_write(get_u8_str(get_current_wpm(), '0'), false);
+
+ led_t led_state = host_keyboard_led_state(); // caps lock stuff, prints CAPS on new line if caps led is on
+ oled_set_cursor(0, 1);
+ oled_write_P(led_state.caps_lock ? PSTR("CAPS") : PSTR(" "), false);
+
+ return false;
+ }
+
+ return false;
+}
+#endif
diff --git a/keyboards/meetlab/kafkasplit/keymaps/default/keymap.c b/keyboards/meetlab/kafkasplit/keymaps/default/keymap.c
new file mode 100644
index 000000000000..db6ccd891257
--- /dev/null
+++ b/keyboards/meetlab/kafkasplit/keymaps/default/keymap.c
@@ -0,0 +1,73 @@
+/* Copyright 2022 LXF-YZP(yuezp)
+ *
+ * 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 FITNKCS 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 .
+ */
+
+#include QMK_KEYBOARD_H
+
+enum layer_namKC {
+ _BASE,
+ _LOWER,
+ _RAISE,
+ _ADJUST
+};
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [_BASE] = LAYOUT(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ KC_LCTL, KC_LGUI, MO(1), KC_SPC, KC_ENT, MO(2), KC_BSPC, KC_LALT
+ //`----------------------------------' `------------------------------------'
+ ),
+
+ [_LOWER] = LAYOUT(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_MINS, KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_BSPC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LCTL, KC_F5, KC_F6, KC_F7, KC_F8, KC_EQL, KC_DEL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, XXXXXXX,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LSFT, KC_F9, KC_F10, KC_F11, KC_F12, KC_PAUS, XXXXXXX, XXXXXXX, KC_LBRC, KC_RBRC, KC_BSLS, KC_RSFT,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ _______, KC_LGUI, _______, KC_SPC, KC_ENT, _______, _______, KC_LALT
+ //`-----------------------------------' `----------------------------------'
+ ),
+ [_RAISE] = LAYOUT(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ KC_CAPS, KC_EXLM, KC_DQUO, KC_HASH, KC_CIRC, XXXXXXX, KC_ASTR, KC_7, KC_8, KC_9, KC_MINS, KC_BSPC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LCTL, KC_LCBR, KC_RCBR, KC_LPRN, KC_RPRN, XXXXXXX, KC_SLSH, KC_4, KC_5, KC_6, KC_PLUS, KC_QUOT,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LSFT, KC_LBRC, KC_RBRC, KC_LABK, KC_RABK, KC_EQL, KC_0, KC_1, KC_2, KC_3, KC_DOT, KC_RSFT,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ _______, KC_LGUI, _______, KC_SPC, KC_ENT, _______, _______, _______
+ //`----------------------------------' `------------------------------------'
+ ),
+ [_ADJUST] = LAYOUT(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ XXXXXXX, XXXXXXX, KC_AT, XXXXXXX, KC_DLR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BSPC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LCTL, XXXXXXX, KC_AMPR, KC_PIPE, KC_BSLS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_TILD, KC_GRV,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, KC_PERC, XXXXXXX, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, KC_RSFT,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ _______, KC_LGUI, _______, KC_SPC, KC_ENT, _______, _______, KC_LALT
+ //`---------------------------------' `-----------------------------------'
+ )
+
+};
diff --git a/keyboards/meetlab/kafkasplit/keymaps/via/keymap.c b/keyboards/meetlab/kafkasplit/keymaps/via/keymap.c
new file mode 100644
index 000000000000..db6ccd891257
--- /dev/null
+++ b/keyboards/meetlab/kafkasplit/keymaps/via/keymap.c
@@ -0,0 +1,73 @@
+/* Copyright 2022 LXF-YZP(yuezp)
+ *
+ * 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 FITNKCS 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 .
+ */
+
+#include QMK_KEYBOARD_H
+
+enum layer_namKC {
+ _BASE,
+ _LOWER,
+ _RAISE,
+ _ADJUST
+};
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [_BASE] = LAYOUT(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ KC_LCTL, KC_LGUI, MO(1), KC_SPC, KC_ENT, MO(2), KC_BSPC, KC_LALT
+ //`----------------------------------' `------------------------------------'
+ ),
+
+ [_LOWER] = LAYOUT(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_MINS, KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_BSPC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LCTL, KC_F5, KC_F6, KC_F7, KC_F8, KC_EQL, KC_DEL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, XXXXXXX,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LSFT, KC_F9, KC_F10, KC_F11, KC_F12, KC_PAUS, XXXXXXX, XXXXXXX, KC_LBRC, KC_RBRC, KC_BSLS, KC_RSFT,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ _______, KC_LGUI, _______, KC_SPC, KC_ENT, _______, _______, KC_LALT
+ //`-----------------------------------' `----------------------------------'
+ ),
+ [_RAISE] = LAYOUT(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ KC_CAPS, KC_EXLM, KC_DQUO, KC_HASH, KC_CIRC, XXXXXXX, KC_ASTR, KC_7, KC_8, KC_9, KC_MINS, KC_BSPC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LCTL, KC_LCBR, KC_RCBR, KC_LPRN, KC_RPRN, XXXXXXX, KC_SLSH, KC_4, KC_5, KC_6, KC_PLUS, KC_QUOT,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LSFT, KC_LBRC, KC_RBRC, KC_LABK, KC_RABK, KC_EQL, KC_0, KC_1, KC_2, KC_3, KC_DOT, KC_RSFT,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ _______, KC_LGUI, _______, KC_SPC, KC_ENT, _______, _______, _______
+ //`----------------------------------' `------------------------------------'
+ ),
+ [_ADJUST] = LAYOUT(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ XXXXXXX, XXXXXXX, KC_AT, XXXXXXX, KC_DLR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BSPC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LCTL, XXXXXXX, KC_AMPR, KC_PIPE, KC_BSLS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_TILD, KC_GRV,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, KC_PERC, XXXXXXX, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, KC_RSFT,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ _______, KC_LGUI, _______, KC_SPC, KC_ENT, _______, _______, KC_LALT
+ //`---------------------------------' `-----------------------------------'
+ )
+
+};
diff --git a/keyboards/meetlab/kafkasplit/keymaps/via/rules.mk b/keyboards/meetlab/kafkasplit/keymaps/via/rules.mk
new file mode 100644
index 000000000000..1e5b99807cb7
--- /dev/null
+++ b/keyboards/meetlab/kafkasplit/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/meetlab/kafkasplit/matrix_diagram.md b/keyboards/meetlab/kafkasplit/matrix_diagram.md
new file mode 100644
index 000000000000..4fa57f74a2a8
--- /dev/null
+++ b/keyboards/meetlab/kafkasplit/matrix_diagram.md
@@ -0,0 +1,14 @@
+# Matrix Diagram for kafkaSplit
+
+```
+┌───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┬───┬───┬───┐
+│00 │01 │02 │03 │04 │05 │ │40 │41 │42 │43 │44 │45 │
+├───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┤
+│10 │11 │12 │13 │14 │15 │ │50 │51 │52 │53 │54 │55 │
+├───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┤
+│20 │21 │22 │23 │24 │25 │ │60 │61 │62 │63 │64 │65 │
+└───┴───┴───┼───┼───┼───┼───┐ ┌───┼───┼───┼───┼───┴───┴───┘
+ │32 │33 │34 │35 │ │70 │71 │72 │73 │
+ └───┴───┴───┴───┘ └───┴───┴───┴───┘
+
+```
diff --git a/keyboards/meetlab/kafkasplit/mcuconf.h b/keyboards/meetlab/kafkasplit/mcuconf.h
new file mode 100644
index 000000000000..56bd747d62cb
--- /dev/null
+++ b/keyboards/meetlab/kafkasplit/mcuconf.h
@@ -0,0 +1,22 @@
+/* Copyright 2022 JasonRen(biu)
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include_next
+
+#undef RP_I2C_USE_I2C1
+#define RP_I2C_USE_I2C1 TRUE
diff --git a/keyboards/meetlab/kafkasplit/readme.md b/keyboards/meetlab/kafkasplit/readme.md
new file mode 100644
index 000000000000..7b332d784a55
--- /dev/null
+++ b/keyboards/meetlab/kafkasplit/readme.md
@@ -0,0 +1,26 @@
+# kafkasplit - PCB
+
+![kafkasplit](https://i.imgur.com/fqxZGeHh.jpg)
+
+A 44-key split keyboard with rgb
+
+* Keyboard Maintainer: https://github.com/LXF-YZP
+* Hardware Supported: https://github.com/LXF-YZP/KafkaSplit
+
+Make example for this keyboard (after setting up your build environment):
+
+ make meetlab/kafkasplit:default
+
+Flashing example for this keyboard:
+
+ make meetlab/kafkasplit: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
\ No newline at end of file
diff --git a/keyboards/meetlab/kafkasplit/rules.mk b/keyboards/meetlab/kafkasplit/rules.mk
new file mode 100644
index 000000000000..161ec22b16e2
--- /dev/null
+++ b/keyboards/meetlab/kafkasplit/rules.mk
@@ -0,0 +1 @@
+SERIAL_DRIVER = vendor
From fc20e0b01434ed152481e3c778c24879ac116360 Mon Sep 17 00:00:00 2001
From: 4pplet
Date: Fri, 29 Dec 2023 17:17:20 +0100
Subject: [PATCH 11/31] Waffling60 iso rev e (#22733)
Co-authored-by: jack <0x6a73@protonmail.com>
Co-authored-by: Drashna Jaelre
---
.../4pplet/waffling60/rev_e_iso/config.h | 20 +
.../4pplet/waffling60/rev_e_iso/info.json | 408 ++++++++++++++++++
.../rev_e_iso/keymaps/default/keymap.c | 40 ++
.../rev_e_iso/keymaps/default/rules.mk | 1 +
.../waffling60/rev_e_iso/keymaps/via/keymap.c | 41 ++
.../waffling60/rev_e_iso/keymaps/via/rules.mk | 2 +
.../waffling60/rev_e_iso/matrix_diagram.md | 24 ++
.../4pplet/waffling60/rev_e_iso/readme.md | 26 ++
.../4pplet/waffling60/rev_e_iso/rules.mk | 2 +
9 files changed, 564 insertions(+)
create mode 100644 keyboards/4pplet/waffling60/rev_e_iso/config.h
create mode 100644 keyboards/4pplet/waffling60/rev_e_iso/info.json
create mode 100644 keyboards/4pplet/waffling60/rev_e_iso/keymaps/default/keymap.c
create mode 100644 keyboards/4pplet/waffling60/rev_e_iso/keymaps/default/rules.mk
create mode 100644 keyboards/4pplet/waffling60/rev_e_iso/keymaps/via/keymap.c
create mode 100644 keyboards/4pplet/waffling60/rev_e_iso/keymaps/via/rules.mk
create mode 100644 keyboards/4pplet/waffling60/rev_e_iso/matrix_diagram.md
create mode 100644 keyboards/4pplet/waffling60/rev_e_iso/readme.md
create mode 100644 keyboards/4pplet/waffling60/rev_e_iso/rules.mk
diff --git a/keyboards/4pplet/waffling60/rev_e_iso/config.h b/keyboards/4pplet/waffling60/rev_e_iso/config.h
new file mode 100644
index 000000000000..521ddf96a183
--- /dev/null
+++ b/keyboards/4pplet/waffling60/rev_e_iso/config.h
@@ -0,0 +1,20 @@
+/*
+Copyright 2023 Stefan Sundin "4pplet"
+
+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 .
+*/
+#pragma once
+
+#define WS2812_EXTERNAL_PULLUP
+
diff --git a/keyboards/4pplet/waffling60/rev_e_iso/info.json b/keyboards/4pplet/waffling60/rev_e_iso/info.json
new file mode 100644
index 000000000000..e53dcab891cd
--- /dev/null
+++ b/keyboards/4pplet/waffling60/rev_e_iso/info.json
@@ -0,0 +1,408 @@
+{
+ "manufacturer": "4pplet",
+ "keyboard_name": "waffling60 Rev E ISO HS",
+ "maintainer": "4pplet",
+ "bootloader": "stm32-dfu",
+ "diode_direction": "COL2ROW",
+ "encoder": {
+ "rotary": [
+ {"pin_a": "A2", "pin_b": "A1", "resolution": 2}
+ ]
+ },
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "key_lock": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgblight": true
+ },
+ "matrix_pins": {
+ "cols": ["B2", "A4", "A3", "A0", "F1", "F0", "C15", "C14", "C13", "B9", "B8", "B7", "A15", "B3"],
+ "rows": ["B14", "A9", "B6", "B5", "B4"]
+ },
+ "processor": "STM32F072",
+ "rgblight": {
+ "animations": {
+ "alternating": true,
+ "breathing": true,
+ "christmas": true,
+ "knight": true,
+ "rainbow_mood": true,
+ "rainbow_swirl": true,
+ "rgb_test": true,
+ "snake": true,
+ "static_gradient": true,
+ "twinkle": true
+ },
+ "led_count": 17
+ },
+ "url": "https://github.com/4pplet/waffling60",
+ "usb": {
+ "device_version": "0.0.5",
+ "pid": "0x0016",
+ "vid": "0x4444"
+ },
+ "ws2812": {
+ "pin": "A8"
+ },
+ "community_layouts": [
+ "60_iso_tsangan_split_bs_rshift",
+ "60_iso_wkl_split_bs_rshift"
+ ],
+ "layouts": {
+ "LAYOUT_all": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [1, 13], "x": 14, "y": 0},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "x": 12.75, "y": 2},
+ {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
+ {"matrix": [3, 1], "x": 1.25, "y": 3},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 1], "x": 1.5, "y": 4},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 4], "x": 4, "y": 4, "w": 3},
+ {"matrix": [4, 6], "x": 7, "y": 4},
+ {"matrix": [4, 8], "x": 8, "y": 4, "w": 3},
+ {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
+ {"matrix": [4, 12], "x": 12.5, "y": 4},
+ {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
+ ]
+ },
+ "LAYOUT_60_iso_tsangan_split_rshift": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [1, 13], "x": 13, "y": 0, "w": 2},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "x": 12.75, "y": 2},
+ {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
+ {"matrix": [3, 1], "x": 1.25, "y": 3},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 1], "x": 1.5, "y": 4},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+ {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
+ {"matrix": [4, 12], "x": 12.5, "y": 4},
+ {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
+ ]
+ },
+ "LAYOUT_60_iso_tsangan_split_bs_rshift": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [1, 13], "x": 14, "y": 0},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "x": 12.75, "y": 2},
+ {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
+ {"matrix": [3, 1], "x": 1.25, "y": 3},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 1], "x": 1.5, "y": 4},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+ {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
+ {"matrix": [4, 12], "x": 12.5, "y": 4},
+ {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
+ ]
+ },
+ "LAYOUT_60_iso_wkl_split_rshift": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [1, 13], "x": 13, "y": 0, "w": 2},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "x": 12.75, "y": 2},
+ {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
+ {"matrix": [3, 1], "x": 1.25, "y": 3},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+ {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
+ {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
+ ]
+ },
+ "LAYOUT_60_iso_wkl_split_bs_rshift": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [1, 13], "x": 14, "y": 0},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "x": 12.75, "y": 2},
+ {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
+ {"matrix": [3, 1], "x": 1.25, "y": 3},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+ {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
+ {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/4pplet/waffling60/rev_e_iso/keymaps/default/keymap.c b/keyboards/4pplet/waffling60/rev_e_iso/keymaps/default/keymap.c
new file mode 100644
index 000000000000..545e1e974fb1
--- /dev/null
+++ b/keyboards/4pplet/waffling60/rev_e_iso/keymaps/default/keymap.c
@@ -0,0 +1,40 @@
+/*
+Copyright 2023 Stefan Sundin "4pplet" <4pplet@protonmail.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 .
+*/
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+// main layer
+[0] = LAYOUT_all(
+ KC_ESC, 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_NO, KC_BSPC,
+ 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_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL),
+// basic function layer
+[1] = LAYOUT_all(
+ QK_BOOT, 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_TRNS, KC_DEL,
+ KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NUHS, 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, 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][NUM_DIRECTIONS] = {
+ [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [1] = { ENCODER_CCW_CW(KC_BRID, KC_BRIU) }
+};
+#endif
diff --git a/keyboards/4pplet/waffling60/rev_e_iso/keymaps/default/rules.mk b/keyboards/4pplet/waffling60/rev_e_iso/keymaps/default/rules.mk
new file mode 100644
index 000000000000..ee325681483f
--- /dev/null
+++ b/keyboards/4pplet/waffling60/rev_e_iso/keymaps/default/rules.mk
@@ -0,0 +1 @@
+ENCODER_MAP_ENABLE = yes
diff --git a/keyboards/4pplet/waffling60/rev_e_iso/keymaps/via/keymap.c b/keyboards/4pplet/waffling60/rev_e_iso/keymaps/via/keymap.c
new file mode 100644
index 000000000000..3254764a0c51
--- /dev/null
+++ b/keyboards/4pplet/waffling60/rev_e_iso/keymaps/via/keymap.c
@@ -0,0 +1,41 @@
+/*
+Copyright 2023 Stefan Sundin "4pplet" <4pplet@protonmail.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 .
+*/
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+// main layer
+[0] = LAYOUT_all(
+ KC_ESC, 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_BSLS, KC_BSPC,
+ 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_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL),
+// basic function layer
+[1] = LAYOUT_all(
+ QK_BOOT, 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_TRNS, KC_DEL,
+ KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, 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, 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, KC_TRNS),
+};
+
+#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_BRID, KC_BRIU) }
+};
+#endif
diff --git a/keyboards/4pplet/waffling60/rev_e_iso/keymaps/via/rules.mk b/keyboards/4pplet/waffling60/rev_e_iso/keymaps/via/rules.mk
new file mode 100644
index 000000000000..f1adcab005e8
--- /dev/null
+++ b/keyboards/4pplet/waffling60/rev_e_iso/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+ENCODER_MAP_ENABLE = yes
diff --git a/keyboards/4pplet/waffling60/rev_e_iso/matrix_diagram.md b/keyboards/4pplet/waffling60/rev_e_iso/matrix_diagram.md
new file mode 100644
index 000000000000..9ccedf98e30e
--- /dev/null
+++ b/keyboards/4pplet/waffling60/rev_e_iso/matrix_diagram.md
@@ -0,0 +1,24 @@
+# Matrix Diagram for 4pplet Waffling60 Rev E ISO
+
+```
+ ┌───────┐
+ 2u Backspace │1D │
+ └───────┘
+┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
+│00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0A │0B │0C │0D │1D │
+├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤
+│10 │11 │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │ │
+├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐2D │
+│20 │21 │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │2C │ │
+├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬───┤
+│30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3A │3B │3C │3D │
+├────┴┬──┴┬──┴──┬┴───┴───┴──┬┴──┬┴───┴───┴──┬┴───┴┬───┬─┴───┤
+│40 │41 │42 │44 │46 │48 │4B │4C │4D │
+└─────┴───┴─────┴───────────┴───┴───────────┴─────┴───┴─────┘
+┌─────┬───┬─────┬───────────────────────────┬─────┬───┬─────┐
+│40 │41 │42 │46 │4B │4C │4D │ Tsangan/WKL/HHKB
+└─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘
+┌─────┬───┬───────────────────────────────────────┬───┬─────┐
+│40 │41 │46 │4C │4D │ 10u Spacebar
+└─────┴───┴───────────────────────────────────────┴───┴─────┘
+```
\ No newline at end of file
diff --git a/keyboards/4pplet/waffling60/rev_e_iso/readme.md b/keyboards/4pplet/waffling60/rev_e_iso/readme.md
new file mode 100644
index 000000000000..03fa4889c62b
--- /dev/null
+++ b/keyboards/4pplet/waffling60/rev_e_iso/readme.md
@@ -0,0 +1,26 @@
+# waffling60 Rev. E ISO
+
+A 60% PCB for MX switches, one hot swap and one solder-pcb version with decent layout support. Revision E adds underglow and rotary encoder support.
+
+More info: https://github.com/4pplet/waffling60
+
+* Keyboard Maintainer: [4pplet](https://github.com/4pplet)
+* Hardware Supported: [waffling60](https://github.com/4pplet/waffling60)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make 4pplet/waffling60/rev_e_iso:default
+
+Flashing example for this keyboard:
+
+ make 4pplet/waffling60/rev_e_iso: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
+
+How to enter bootloader (DFU):
+* Short the reset-header (labled BL/RESET) on the back of the PCB for about 2 seconds for the keyboard to enter DFU. When in DFU, it's ready to flash the firmware. If using a APM MCU it will not automatically reset after flash. Simply short the reset-header for a very short time to just reset the PCB, alternatively unplug and repluck the USB-cable to the keyboard.
+
+Alternative option if the firmware is already pre-flashed:
+* Unplug your keyboard, hold down the Spacebar and B at the same time, plug in your keyboard and wait a second before releasing the keys. The keyboard will enter DFU and is ready to flash the firmware.
diff --git a/keyboards/4pplet/waffling60/rev_e_iso/rules.mk b/keyboards/4pplet/waffling60/rev_e_iso/rules.mk
new file mode 100644
index 000000000000..04fe1eba2acd
--- /dev/null
+++ b/keyboards/4pplet/waffling60/rev_e_iso/rules.mk
@@ -0,0 +1,2 @@
+# Wildcard to allow APM32 MCU
+DFU_SUFFIX_ARGS = -p FFFF -v FFFF
From 3a1f5cff49b369f8ab802c31563c72de3b60a531 Mon Sep 17 00:00:00 2001
From: Vino Rodrigues <366673+vinorodrigues@users.noreply.github.com>
Date: Sat, 30 Dec 2023 23:06:29 +1100
Subject: [PATCH 12/31] Edit of docs and refinement of `set_send_output`
function to allow override
---
docs/config_options.md | 2 +-
docs/faq_keymap.md | 4 +-
docs/feature_bluetooth.md | 167 ++++++++++++++++++++++++++++------
docs/hardware_drivers.md | 4 +
drivers/bluetooth/bluetooth.c | 18 ++--
drivers/bluetooth/bluetooth.h | 25 +++--
6 files changed, 173 insertions(+), 47 deletions(-)
diff --git a/docs/config_options.md b/docs/config_options.md
index bc28f603faca..bf57c7b0bdf1 100644
--- a/docs/config_options.md
+++ b/docs/config_options.md
@@ -439,7 +439,7 @@ Use these to enable or disable building certain features. The more you have enab
* `UNICODE_ENABLE`
* Unicode
* `BLUETOOTH_ENABLE`
- * Current options are bluefruit_le, rn42
+ * Enable Bluetooth driver. Also requires `BLUETOOTH_DRIVER`. Set to onr of `bluefruit_le`, `rn42` or `custom`.
* `SPLIT_KEYBOARD`
* Enables split keyboard support (dual MCU like the let's split and bakingpy's boards) and includes all necessary files located at quantum/split_common
* `CUSTOM_MATRIX`
diff --git a/docs/faq_keymap.md b/docs/faq_keymap.md
index 864128183508..027b23dc1dd7 100644
--- a/docs/faq_keymap.md
+++ b/docs/faq_keymap.md
@@ -119,9 +119,9 @@ Japanese JIS keyboard specific keys like `無変換(Muhenkan)`, `変換(Henkan)`
https://pqrs.org/osx/karabiner/seil.html
-## RN-42 Bluetooth Doesn't Work with Karabiner
+## RN-42 Bluetooth Doesn't Work with Karabiner on OSX
-Karabiner - Keymapping tool on Mac OSX - ignores inputs from RN-42 module by default. You have to enable this option to make Karabiner working with your keyboard.
+Karabiner - Keymapping tool on Mac OSX - ignores inputs from RN-42 module by default. You have to enable this option to make Karabiner work with your keyboard.
https://github.com/tekezo/Karabiner/issues/403#issuecomment-102559237
See these for the detail of this problem.
diff --git a/docs/feature_bluetooth.md b/docs/feature_bluetooth.md
index 5fac06fba756..a6a8b8bdec73 100644
--- a/docs/feature_bluetooth.md
+++ b/docs/feature_bluetooth.md
@@ -1,46 +1,157 @@
# Bluetooth
-## Bluetooth Known Supported Hardware
+This feature allows you to integrate into a Bluetooth module to create a Bluetooth keyboard for wireless operation.
-Currently Bluetooth support is limited to AVR based chips. For Bluetooth 2.1, QMK has support for RN-42 modules. For more recent BLE protocols, currently only the Adafruit Bluefruit SPI Friend is directly supported. BLE is needed to connect to iOS devices. Note iOS does not support mouse input.
+## Supported Modules
-|Board |Bluetooth Protocol |Connection Type|rules.mk |Bluetooth Chip|
-|----------------------------------------------------------------|--------------------|---------------|---------------------------------|--------------|
-|Roving Networks RN-42 (Sparkfun Bluesmirf) |Bluetooth Classic |UART |`BLUETOOTH_DRIVER = rn42` |RN-42 |
-|[Bluefruit LE SPI Friend](https://www.adafruit.com/product/2633)|Bluetooth Low Energy|SPI |`BLUETOOTH_DRIVER = bluefruit_le`|nRF51822 |
+Currently on the following modules are supported:
-Not Supported Yet but possible:
-* [Bluefruit LE UART Friend](https://www.adafruit.com/product/2479). [Possible tmk implementation found in](https://github.com/tmk/tmk_keyboard/issues/514)
-* HC-05 boards flashed with RN-42 firmware. They apparently both use the CSR BC417 Chip. Flashing it with RN-42 firmware gives it HID capability.
-* Sparkfun Bluetooth Mate
-* HM-13 based boards
+| Board | Module based on | Bluetooth Protocol | Connection Type | rules.mk |Bluetooth Chip |
+|--------------------------------------------------------------------|---------------------|-----------------------------|-----------------|---------------------------------|----------------|
+|[Sparkfun BlueSMiRF Silver](https://www.sparkfun.com/products/12577)|Roving Networks RN-42|Bluetooth 2.1 *"Classic"* |UART |`BLUETOOTH_DRIVER = rn42` |RN421|
+|[Bluefruit LE SPI Friend](https://www.adafruit.com/product/2633) |Raytac MDBT40-256RV3 |Bluettoth 4.1 BLE2|SPI |`BLUETOOTH_DRIVER = bluefruit_le`|nRF51822 |
+
+> 1 RN42 based are modules mostly retired or EOL as the BT2.1 spec is deprecated and withdrawn as of July 2020.
+>
+> 2 BLE is needed to connect to iOS devices.
+
+Not supported yet, but possible:
+
+* [Bluefruit LE UART Friend](https://www.adafruit.com/product/2479).
+* HC-05, HC-06 and HC-08 modules.
+* Modules based on Nordic nRF51*, nRF52* and nRF53* SoC's - however in most cases one will also need to develop firmware for those modules.
+
+> **NOTE:** QMK does not currently support MCU sleep modes, and this may impact the longevity of battery based builds.
+
+## Driver configuration
### Adafruit BLE SPI Friend
-Currently The only bluetooth chipset supported by QMK is the Adafruit Bluefruit SPI Friend. It's a Nordic nRF51822 based chip running Adafruit's custom firmware. Data is transmitted via Adafruit's SDEP over Hardware SPI. The [Feather 32u4 Bluefruit LE](https://www.adafruit.com/product/2829) is supported as it's an AVR mcu connected via SPI to the Nordic BLE chip with Adafruit firmware. If Building a custom board with the SPI friend it would be easiest to just use the pin selection that the 32u4 feather uses but you can change the pins in the config.h options with the following defines:
-* `#define BLUEFRUIT_LE_RST_PIN D4`
-* `#define BLUEFRUIT_LE_CS_PIN B4`
-* `#define BLUEFRUIT_LE_IRQ_PIN E6`
-A Bluefruit UART friend can be converted to an SPI friend, however this [requires](https://github.com/qmk/qmk_firmware/issues/2274) some reflashing and soldering directly to the MDBT40 chip.
+To enable support for the Adafruit Bluefruit LE SPI Friend, add this to your `rules.mk` file:
+
+```make
+NKRO_ENABLE = no # ** Required
+BLUETOOTH_ENABLE = yes
+BLUETOOTH_DRIVER = bluefruit_le
+```
+
+> ** This module does no support [N-Key Rollover (NKRO)](reference_glossary.md#n-key-rollover-nkro);
+
+The Adafruit Bluefruit SPI Friend is a module based on the MDBT30 module, using a Nordic nRF51822 chip, and is flashed with Adafruit's custom firmware that using AT Command sets.
+Data is transmitted via Adafruit's [SDEP](https://learn.adafruit.com/introducing-the-adafruit-bluefruit-spi-breakout/sdep-spi-data-transport) data packets.
+
+#### SPI Configuration
+
+QMK’s `spi_master` must already be correctly configured for the platform you’re building for.
+In addition, you will also need to define the following items in `config.h``:
+
+| Variable | Description | Default |
+|------------------------|-------------------------------------------|---------|
+| `BLUEFRUIT_LE_RST_PIN` | Used to perform a reset on initialization | D4 |
+| `BLUEFRUIT_LE_CS_PIN` | SPI SS/CI "Chip Select" pin | B4 |
+| `BLUEFRUIT_LE_IRQ_PIN` | Module Interrupt Request pin | E6 |
+
+> Defaults are based on the [Adafruit Feather 32u4 Bluefruit](https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le/overview).
+
+## Keycodes
+
+The following keycodes will allow you change the output selector for the keyboard.
+This allows for switching between USB and Bluetooth on keyboards that support both.
+
+| Key | Aliases | Description |
+|---------------------|---------|----------------------------------------------------------|
+|`QK_OUTPUT_AUTO` |`OU_AUTO`|Automatically switch between USB and Bluetooth *(Default)*|
+|`QK_OUTPUT_USB` |`OU_USB` |USB only |
+|`QK_OUTPUT_BLUETOOTH`|`OU_BT` |Bluetooth only |
+
+## Output Interface Selection
+
+The above keycodes will in turn call the output selector API to direct all key, mouse, consumer, and system output events to the selected interface:
+
+```c
+send_output_t set_send_output(send_output_t send_output);
+send_output_t get_send_output(void);
+```
+
+The *`send_output`* variable should be one of:
+
+```c
+enum send_output_t {
+ SEND_OUTPUT_AUTO, // Selection is USB if USB cable connected, else is Bluetooth is Bluetooth is connected. (Default)
+ SEND_OUTPUT_NONE, // No output is sent.
+ SEND_OUTPUT_USB, // Output is always USB.
+ SEND_OUTPUT_BLUETOOTH, // Output is always Bluetooth.
+ SEND_OUTPUT_BOTH // Output is sent to both USb and Bluetooth (used for testing).
+};
+```
+
+You can change the initial state with the following define in the `config.h` file:
-
-## Bluetooth Rules.mk Options
+```c
+#define SEND_OUTPUT_DEFAULT SEND_OUTPUT_AUTO
+```
-The currently supported Bluetooth chipsets do not support [N-Key Rollover (NKRO)](reference_glossary.md#n-key-rollover-nkro), so `rules.mk` must contain `NKRO_ENABLE = no`.
+Vendor and keymap code can also use the keyboard-level and user-level (to either perform ancillary functions on the setting, or overrode the setting) by creating the following functions in the `kb_name.c` or the `keymap.c` files:
-Add the following to your `rules.mk`:
+```c
+send_output_t set_send_output_kb(send_output_t send_output); // kb-level function usually in the `kb_name.c file`. Should also call `set_send_output_user`.
+send_output_t set_send_output_user(send_output_t send_output); // user-level function usually in `keymap.c` file.
+```
+
+## Bluetooth Driver API
+
+### Custom Bluetooth Driver
+
+You can create your own Bluetooth driver (or for that matter any alternate output interface) with the `bluetooth_driver` variable, and the `bluetooth_driver_t` struct.
+
+Then, to enable a custom Bluetooth driver add this to your `rules.mk` file:
```make
BLUETOOTH_ENABLE = yes
-BLUETOOTH_DRIVER = bluefruit_le # or rn42
+BLUETOOTH_DRIVER = custom
+```
+
+#### Example
+
+You create your own Bluetooth driver by creating compliant functions and referencing these with within the `bluetooth_driver` variable.
+
+In your `kb_name.c` file, create that variable as such:
+
+```c
+const bluetooth_driver_t bluetooth_driver = {
+ .init = xyz_bt_init,
+ .task = xyz_bt_task, // Optional
+ .is_connected = xyz_bt_is_connected, // Optional
+ .send_keyboard = xyz_bt_send_keyboard,
+ .send_mouse = xyz_bt_send_mouse,
+ .send_consumer = xyz_bt_send_consumer,
+ .send_system = xyz_bt_send_system, // Optional
+};
```
-## Bluetooth Keycodes
+> *Optional* items can be set to `NULL`.
+
+Then code for the following functions:
+
+```c
+/* Initialize the Bluetooth system. */
+void xyz_bt_init(void) {}
-This is used when multiple keyboard outputs can be selected. Currently this only allows for switching between USB and Bluetooth on keyboards that support both.
+/* Perform housekeeping tasks. Called every loop. (Optional) */
+void xyz_bt_task(void) {}
-|Key |Aliases |Description |
-|---------------------|---------|----------------------------------------------|
-|`QK_OUTPUT_AUTO` |`OU_AUTO`|Automatically switch between USB and Bluetooth|
-|`QK_OUTPUT_USB` |`OU_USB` |USB only |
-|`QK_OUTPUT_BLUETOOTH`|`OU_BT` |Bluetooth only |
+/* Detects if BT is connected, also used by `SEND_OUTPUT_AUTO`. (Optional) */
+bool xyz_bt_is_connected(void) {}
+
+/* Send a keyboard report. */
+void xyz_bt_send_keyboard(report_keyboard_t *report) {}
+
+/* Send a mouse report. */
+void xyz_bt_send_mouse(report_mouse_t *report) {}
+
+/* Send a consumer usage. */
+void xyz_bt_send_consumer(uint16_t usage) {}
+
+/* Send a system usage. (Optional) */
+void xyz_bt_send_system(uint16_t usage) {}
+```
diff --git a/docs/hardware_drivers.md b/docs/hardware_drivers.md
index a157501326db..f0fb1069948f 100644
--- a/docs/hardware_drivers.md
+++ b/docs/hardware_drivers.md
@@ -33,3 +33,7 @@ Support for up to a single driver with room for expansion. Each driver can contr
## 24xx series external I2C EEPROM
Support for an external I2C-based EEPROM instead of using the on-chip EEPROM. For more information on how to setup the driver see the [EEPROM Driver](eeprom_driver.md) page.
+
+## BlueFruit LE SPI
+
+Support for Bluetooth is provided by the inclusion of the BlueFruit LE SPI module driver. For more information on how to setup the driver see the [Bluetooth](feature_bluetooth.md) page.
diff --git a/drivers/bluetooth/bluetooth.c b/drivers/bluetooth/bluetooth.c
index a970188c47fd..d492baec4c36 100644
--- a/drivers/bluetooth/bluetooth.c
+++ b/drivers/bluetooth/bluetooth.c
@@ -57,18 +57,24 @@ const bluetooth_driver_t bluetooth_driver = {
#endif
+#ifndef SEND_OUTPUT_DEFAULT
+# define SEND_OUTPUT_DEFAULT SEND_OUTPUT_AUTO
+#endif
+
send_output_t desired_send_output = SEND_OUTPUT_DEFAULT;
-void set_send_output(send_output_t send_output) {
- set_send_output_kb(send_output);
- desired_send_output = send_output;
+send_output_t set_send_output(send_output_t send_output) {
+ desired_send_output = set_send_output_kb(send_output);
+ return desired_send_output;
}
-__attribute__((weak)) void set_send_output_kb(send_output_t send_output) {
- set_send_output_user(send_output);
+__attribute__((weak)) send_output_t set_send_output_kb(send_output_t send_output) {
+ return set_send_output_user(send_output);
}
-__attribute__((weak)) void set_send_output_user(send_output_t send_output) {} // do nothing
+__attribute__((weak)) send_output_t set_send_output_user(send_output_t send_output) {
+ return send_output;
+}
send_output_t get_send_output(void) {
if (desired_send_output == SEND_OUTPUT_AUTO) {
diff --git a/drivers/bluetooth/bluetooth.h b/drivers/bluetooth/bluetooth.h
index 74b0936f55c2..32d523e9c59a 100644
--- a/drivers/bluetooth/bluetooth.h
+++ b/drivers/bluetooth/bluetooth.h
@@ -39,32 +39,37 @@ typedef enum send_output_t {
// clang-format on
-#ifndef SEND_OUTPUT_DEFAULT
-# define SEND_OUTPUT_DEFAULT SEND_OUTPUT_AUTO
-#endif
-
typedef struct {
/* Initialize the Bluetooth system. */
void (*init)(void);
- /* Perform housekeeping tasks. */
+
+ /* Perform housekeeping tasks. (Optional) */
void (*task)(void);
- /* Detects if BT is connected, also used by `SEND_OUTPUT_AUTO` */
+
+ /* Detects if BT is connected, also used by `SEND_OUTPUT_AUTO`. (Optional) */
bool (*is_connected)(void);
+
/* Send a keyboard report. */
void (*send_keyboard)(report_keyboard_t *report);
+
+#ifdef NKRO_ENABLE
/* Send a NKRO report. (Optional & dependant on `NKRO_ENABLE` ) */
void (*send_nkro)(report_keyboard_t *report);
+#endif
+
/* Send a mouse report. */
void (*send_mouse)(report_mouse_t *report);
+
/* Send a consumer usage. */
void (*send_consumer)(uint16_t usage);
- /* Send a system usage (Optional) */
+
+ /* Send a system usage. (Optional) */
void (*send_system)(uint16_t usage);
} bluetooth_driver_t;
-void set_send_output(send_output_t send_output);
-void set_send_output_kb(send_output_t send_output);
-void set_send_output_user(send_output_t send_output);
+send_output_t set_send_output(send_output_t send_output);
+send_output_t set_send_output_kb(send_output_t send_output);
+send_output_t set_send_output_user(send_output_t send_output);
send_output_t get_send_output(void);
extern const bluetooth_driver_t bluetooth_driver;
From 5328f2d36ad51baee5858761a904c6ba84b7f6c5 Mon Sep 17 00:00:00 2001
From: Vino Rodrigues <366673+vinorodrigues@users.noreply.github.com>
Date: Sun, 24 Dec 2023 16:21:06 +1100
Subject: [PATCH 13/31] initial attempt at a bluetooth driver framework
---
builddefs/common_features.mk | 6 +-
...{bluefruit_le.cpp => bluefruit_le_spi.cpp} | 0
drivers/bluetooth/bluetooth.c | 92 ++++++++++++-------
drivers/bluetooth/bluetooth.h | 68 ++++++++------
drivers/bluetooth/bluetooth_legacy.c | 58 ++++++++++++
drivers/bluetooth/bluetooth_legacy.h | 56 +++++++++++
drivers/bluetooth/outputselect.c | 70 --------------
drivers/bluetooth/outputselect.h | 34 -------
keyboards/bioi/bluetooth_custom.c | 11 +++
.../promethium/keymaps/default/keymap.c | 18 ++--
keyboards/nek_type_a/matrix.c | 4 +-
quantum/keyboard.c | 4 +-
quantum/quantum.c | 8 +-
tmk_core/protocol/host.c | 47 +++++++---
14 files changed, 278 insertions(+), 198 deletions(-)
rename drivers/bluetooth/{bluefruit_le.cpp => bluefruit_le_spi.cpp} (100%)
create mode 100644 drivers/bluetooth/bluetooth_legacy.c
create mode 100644 drivers/bluetooth/bluetooth_legacy.h
delete mode 100644 drivers/bluetooth/outputselect.c
delete mode 100644 drivers/bluetooth/outputselect.h
diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk
index 5e93480e4d05..18daef1e1ab3 100644
--- a/builddefs/common_features.mk
+++ b/builddefs/common_features.mk
@@ -884,18 +884,16 @@ ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
OPT_DEFS += -DBLUETOOTH_$(strip $(shell echo $(BLUETOOTH_DRIVER) | tr '[:lower:]' '[:upper:]'))
NO_USB_STARTUP_CHECK := yes
COMMON_VPATH += $(DRIVER_PATH)/bluetooth
- SRC += outputselect.c
+ SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c
ifeq ($(strip $(BLUETOOTH_DRIVER)), bluefruit_le)
SPI_DRIVER_REQUIRED = yes
ANALOG_DRIVER_REQUIRED = yes
- SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c
- SRC += $(DRIVER_PATH)/bluetooth/bluefruit_le.cpp
+ SRC += $(DRIVER_PATH)/bluetooth/bluefruit_le_spi.cpp
endif
ifeq ($(strip $(BLUETOOTH_DRIVER)), rn42)
UART_DRIVER_REQUIRED = yes
- SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c
SRC += $(DRIVER_PATH)/bluetooth/rn42.c
endif
endif
diff --git a/drivers/bluetooth/bluefruit_le.cpp b/drivers/bluetooth/bluefruit_le_spi.cpp
similarity index 100%
rename from drivers/bluetooth/bluefruit_le.cpp
rename to drivers/bluetooth/bluefruit_le_spi.cpp
diff --git a/drivers/bluetooth/bluetooth.c b/drivers/bluetooth/bluetooth.c
index d5382401e7e5..649acdbdc30b 100644
--- a/drivers/bluetooth/bluetooth.c
+++ b/drivers/bluetooth/bluetooth.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2022
+ * Copyright 2024
*
* 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
@@ -15,48 +15,74 @@
* along with this program. If not, see .
*/
+
+#include
+#include
#include "bluetooth.h"
+#include "usb_util.h"
-#if defined(BLUETOOTH_BLUEFRUIT_LE)
-# include "bluefruit_le.h"
-#elif defined(BLUETOOTH_RN42)
-# include "rn42.h"
-#endif
+/* Each driver needs to define the struct
+ * const rgb_matrix_driver_t rgb_matrix_driver;
+ * All members (except `task`, `.detect_output` and `system`) must be provided.
+ * Keyboard custom drivers can define this in their own files, it should only
+ * be here if shared between boards.
+ */
-void bluetooth_init(void) {
#if defined(BLUETOOTH_BLUEFRUIT_LE)
- bluefruit_le_init();
+const bluetooth_driver_t bluetooth_driver = {
+ .init = bluefruit_le_init,
+ .task = bluefruit_le_task,
+ .is_connected = bluefruit_le_is_connected,
+ .send_keyboard = bluefruit_le_send_keyboard,
+ .send_mouse = bluefruit_le_send_mouse,
+ .send_consumer = bluefruit_le_send_consumer,
+ .send_system = NULL,
+};
+# ifdef ENABLE_NKRO
+# error BlueFruit LE does not support NKRO, do not declare `ENABLE_NKRO`
+# endif
+
#elif defined(BLUETOOTH_RN42)
- rn42_init();
-#endif
-}
+const bluetooth_driver_t bluetooth_driver = {
+ .init = rn42_init,
+ .task = NULL,
+ .is_connected = NULL,
+ .send_keyboard = rn42_send_keyboard,
+ .send_mouse = rn42_send_mouse,
+ .send_consumer = rn42_send_consumer,
+ .send_system = NULL,
+};
+# ifdef ENABLE_NKRO
+# error RN42 does not support NKRO, do not declare `ENABLE_NKRO`
+# endif
-void bluetooth_task(void) {
-#if defined(BLUETOOTH_BLUEFRUIT_LE)
- bluefruit_le_task();
#endif
-}
-void bluetooth_send_keyboard(report_keyboard_t *report) {
-#if defined(BLUETOOTH_BLUEFRUIT_LE)
- bluefruit_le_send_keyboard(report);
-#elif defined(BLUETOOTH_RN42)
- rn42_send_keyboard(report);
-#endif
+send_output_t desired_send_output = SEND_OUTPUT_DEFAULT;
+
+void set_send_output(send_output_t send_output) {
+ set_send_output_kb(send_output);
+ desired_send_output = send_output;
}
-void bluetooth_send_mouse(report_mouse_t *report) {
-#if defined(BLUETOOTH_BLUEFRUIT_LE)
- bluefruit_le_send_mouse(report);
-#elif defined(BLUETOOTH_RN42)
- rn42_send_mouse(report);
-#endif
+__attribute__((weak)) void set_send_output_kb(send_output_t send_output) {
+ set_send_output_user(send_output);
}
-void bluetooth_send_consumer(uint16_t usage) {
-#if defined(BLUETOOTH_BLUEFRUIT_LE)
- bluefruit_le_send_consumer(usage);
-#elif defined(BLUETOOTH_RN42)
- rn42_send_consumer(usage);
-#endif
+__attribute__((weak)) void set_send_output_user(send_output_t send_output) {} // do nothing
+
+send_output_t get_send_output(void) {
+ if (desired_send_output == SEND_OUTPUT_AUTO) {
+ // only if USB is **disconnected**
+ if (usb_connected_state()) {
+ return SEND_OUTPUT_USB;
+ }
+ if ((NULL != (*bluetooth_driver.is_connected)) && (bluetooth_driver.is_connected())) {
+ return SEND_OUTPUT_BLUETOOTH;
+ } else {
+ return SEND_OUTPUT_NONE;
+ }
+ } else {
+ return desired_send_output;
+ }
}
diff --git a/drivers/bluetooth/bluetooth.h b/drivers/bluetooth/bluetooth.h
index 2e4d0df5381a..851ad35bec36 100644
--- a/drivers/bluetooth/bluetooth.h
+++ b/drivers/bluetooth/bluetooth.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2022
+ * Copyright 2024
*
* 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
@@ -18,35 +18,49 @@
#pragma once
#include
+#include
#include "report.h"
-/**
- * \brief Initialize the Bluetooth system.
- */
-void bluetooth_init(void);
+#if defined(BLUETOOTH_BLUEFRUIT_LE)
+# include "bluefruit_le.h"
+#elif defined(BLUETOOTH_RN42)
+# include "rn42.h"
+#endif
-/**
- * \brief Perform housekeeping tasks.
- */
-void bluetooth_task(void);
+typedef enum send_output_t {
+ SEND_OUTPUT_AUTO,
+ SEND_OUTPUT_NONE,
+ SEND_OUTPUT_USB,
+ SEND_OUTPUT_BLUETOOTH,
+ SEND_OUTPUT_BOTH
+} send_output_t;
-/**
- * \brief Send a keyboard report.
- *
- * \param report The keyboard report to send.
- */
-void bluetooth_send_keyboard(report_keyboard_t *report);
+#ifndef SEND_OUTPUT_DEFAULT
+# define SEND_OUTPUT_DEFAULT SEND_OUTPUT_AUTO
+#endif
-/**
- * \brief Send a mouse report.
- *
- * \param report The mouse report to send.
- */
-void bluetooth_send_mouse(report_mouse_t *report);
+typedef struct {
+ /* Initialize the Bluetooth system. */
+ void (*init)(void);
+ /* Perform housekeeping tasks. */
+ void (*task)(void);
+ /* Detects if BT is connected, also used by `SEND_OUTPUT_AUTO` */
+ bool (*is_connected)(void);
+ /* Send a keyboard report. */
+ void (*send_keyboard)(report_keyboard_t *report);
+ /* Send a NKRO report. (Optional & dependant on `NKRO_ENABLE` ) */
+ void (*send_nkro)(report_keyboard_t *report);
+ /* Send a mouse report. */
+ void (*send_mouse)(report_mouse_t *report);
+ /* Send a consumer usage. */
+ void (*send_consumer)(uint16_t usage);
+ /* Send a system usage (Optional) */
+ void (*send_system)(uint16_t usage);
+} bluetooth_driver_t;
-/**
- * \brief Send a consumer usage.
- *
- * \param usage The consumer usage to send.
- */
-void bluetooth_send_consumer(uint16_t usage);
+void set_send_output(send_output_t send_output);
+void set_send_output_kb(send_output_t send_output);
+void set_send_output_user(send_output_t send_output);
+send_output_t get_send_output(void);
+
+extern const bluetooth_driver_t bluetooth_driver;
diff --git a/drivers/bluetooth/bluetooth_legacy.c b/drivers/bluetooth/bluetooth_legacy.c
new file mode 100644
index 000000000000..0b46fe0fc6b6
--- /dev/null
+++ b/drivers/bluetooth/bluetooth_legacy.c
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2022
+ *
+ * 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 .
+ */
+
+/** DEPRECATED: Provided for backward compatibility */
+
+#include
+#include "bluetooth.h"
+#include "bluetooth_legacy.h"
+
+__attribute__((weak)) void bluetooth_init(void) {
+ bluetooth_driver.init();
+}
+
+__attribute__((weak)) void bluetooth_task(void) {
+ if (NULL != (*bluetooth_driver.task)) {
+ bluetooth_driver.task();
+ }
+}
+
+__attribute__((weak)) void bluetooth_send_keyboard(report_keyboard_t *report) {
+ bluetooth_driver.send_keyboard(report);
+}
+
+#ifdef NKRO_ENABLE
+__attribute__((weak)) void bluetooth_send_nkro(report_keyboard_t *report) {
+ if (NULL != (*bluetooth_driver.send_nkro)) {
+ bluetooth_driver.send_nkro(report);
+ }
+}
+#endif
+
+__attribute__((weak)) void bluetooth_send_mouse(report_mouse_t *report) {
+ bluetooth_driver.send_mouse(report);
+}
+
+__attribute__((weak)) void bluetooth_send_consumer(uint16_t usage) {
+ bluetooth_driver.send_consumer(usage);
+}
+
+__attribute__((weak)) void bluetooth_send_system(uint16_t usage) {
+ if (NULL != (*bluetooth_driver.send_system)) {
+ bluetooth_driver.send_system(usage);
+ }
+}
diff --git a/drivers/bluetooth/bluetooth_legacy.h b/drivers/bluetooth/bluetooth_legacy.h
new file mode 100644
index 000000000000..ba5837255278
--- /dev/null
+++ b/drivers/bluetooth/bluetooth_legacy.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2022
+ *
+ * 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 .
+ */
+
+/** DEPRECATED: Provided for backward compatibility */
+
+#pragma once
+
+#pragma message "`bluetooth.h` is deprecated"
+
+#include
+#include "report.h"
+
+/**
+ * \brief Initialize the Bluetooth system.
+ */
+void bluetooth_init(void);
+
+/**
+ * \brief Perform housekeeping tasks.
+ */
+void bluetooth_task(void);
+
+/**
+ * \brief Send a keyboard report.
+ *
+ * \param report The keyboard report to send.
+ */
+void bluetooth_send_keyboard(report_keyboard_t *report);
+
+/**
+ * \brief Send a mouse report.
+ *
+ * \param report The mouse report to send.
+ */
+void bluetooth_send_mouse(report_mouse_t *report);
+
+/**
+ * \brief Send a consumer usage.
+ *
+ * \param usage The consumer usage to send.
+ */
+void bluetooth_send_consumer(uint16_t usage);
diff --git a/drivers/bluetooth/outputselect.c b/drivers/bluetooth/outputselect.c
deleted file mode 100644
index b986ba274e9d..000000000000
--- a/drivers/bluetooth/outputselect.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
-Copyright 2017 Priyadi Iman Nurcahyo
-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 .
-*/
-
-#include "outputselect.h"
-#include "usb_util.h"
-
-#ifdef BLUETOOTH_BLUEFRUIT_LE
-# include "bluefruit_le.h"
-#endif
-
-uint8_t desired_output = OUTPUT_DEFAULT;
-
-/** \brief Set Output
- *
- * FIXME: Needs doc
- */
-void set_output(uint8_t output) {
- set_output_user(output);
- desired_output = output;
-}
-
-/** \brief Set Output User
- *
- * FIXME: Needs doc
- */
-__attribute__((weak)) void set_output_user(uint8_t output) {}
-
-/** \brief Auto Detect Output
- *
- * FIXME: Needs doc
- */
-uint8_t auto_detect_output(void) {
- if (usb_connected_state()) {
- return OUTPUT_USB;
- }
-
-#ifdef BLUETOOTH_BLUEFRUIT_LE
- if (bluefruit_le_is_connected()) {
- return OUTPUT_BLUETOOTH;
- }
-#endif
-
-#ifdef BLUETOOTH_ENABLE
- return OUTPUT_BLUETOOTH; // should check if BT is connected here
-#endif
-
- return OUTPUT_NONE;
-}
-
-/** \brief Where To Send
- *
- * FIXME: Needs doc
- */
-uint8_t where_to_send(void) {
- if (desired_output == OUTPUT_AUTO) {
- return auto_detect_output();
- }
- return desired_output;
-}
diff --git a/drivers/bluetooth/outputselect.h b/drivers/bluetooth/outputselect.h
deleted file mode 100644
index c4548e1122ad..000000000000
--- a/drivers/bluetooth/outputselect.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
-Copyright 2017 Priyadi Iman Nurcahyo
-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 .
-*/
-
-#pragma once
-
-#include
-
-enum outputs {
- OUTPUT_AUTO,
-
- OUTPUT_NONE,
- OUTPUT_USB,
- OUTPUT_BLUETOOTH
-};
-
-#ifndef OUTPUT_DEFAULT
-# define OUTPUT_DEFAULT OUTPUT_AUTO
-#endif
-
-void set_output(uint8_t output);
-void set_output_user(uint8_t output);
-uint8_t auto_detect_output(void);
-uint8_t where_to_send(void);
diff --git a/keyboards/bioi/bluetooth_custom.c b/keyboards/bioi/bluetooth_custom.c
index 4ea277f731a6..ece777d9acfa 100644
--- a/keyboards/bioi/bluetooth_custom.c
+++ b/keyboards/bioi/bluetooth_custom.c
@@ -77,6 +77,8 @@ void bluetooth_init(void) {
void bluetooth_task(void) {}
+bool bluetooth_is_connected(void) { return true; } // lie
+
void bluetooth_send_keyboard(report_keyboard_t *report)
{
#ifdef BLUEFRUIT_TRACE_SERIAL
@@ -161,3 +163,12 @@ void bluetooth_send_consumer(uint16_t usage)
bluefruit_trace_footer();
#endif
}
+
+const bluetooth_driver_t bluetooth_driver = {
+ .init = bluetooth_init,
+ .task = bluetooth_task,
+ .is_connected = bluetooth_is_connected,
+ .send_keyboard = bluetooth_send_keyboard,
+ .send_mouse = bluetooth_send_mouse,
+ .send_consumer = bluetooth_send_consumer,
+};
diff --git a/keyboards/handwired/promethium/keymaps/default/keymap.c b/keyboards/handwired/promethium/keymaps/default/keymap.c
index ff73e51d5eb2..1b6dcbbd145e 100644
--- a/keyboards/handwired/promethium/keymaps/default/keymap.c
+++ b/keyboards/handwired/promethium/keymaps/default/keymap.c
@@ -47,7 +47,7 @@ along with this program. If not, see .
} while (0)
#endif
#endif
-#include "outputselect.h"
+#include "bluetooth.h"
#include "led.h"
#define COUNT(x) ARRAY_SIZE((x))
@@ -1251,13 +1251,13 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
return true;
}
-void set_output_user(uint8_t output) {
+void set_send_output_user(send_output_t output) {
#ifdef BLUETOOTH_BLUEFRUIT_LE
- switch(output) {
- case OUTPUT_USB:
+ switch (output) {
+ case SEND_OUTPUT_USB:
led_set_output_usb();
break;
- case OUTPUT_BLUETOOTH:
+ case SEND_OUTPUT_BLUETOOTH:
led_set_output_ble();
break;
default:
@@ -1277,11 +1277,11 @@ void matrix_init_user(void) {
// auto detect output on init
#ifdef BLUETOOTH_BLUEFRUIT_LE
- uint8_t output = auto_detect_output();
- if (output == OUTPUT_USB) {
- set_output(OUTPUT_USB);
+ send_output_t output = get_send_output();
+ if (output == SEND_OUTPUT_USB) {
+ set_send_output(SEND_OUTPUT_USB);
} else {
- set_output(OUTPUT_BLUETOOTH);
+ set_send_output(SEND_OUTPUT_BLUETOOTH);
}
#endif
}
diff --git a/keyboards/nek_type_a/matrix.c b/keyboards/nek_type_a/matrix.c
index 76613947f615..edc5e5c66dee 100644
--- a/keyboards/nek_type_a/matrix.c
+++ b/keyboards/nek_type_a/matrix.c
@@ -34,7 +34,7 @@ along with this program. If not, see .
#include "matrix.h"
#include "timer.h"
#include "mcp23017.h"
-#include "outputselect.h"
+#include "bluetooth.h"
/* Set 0 if debouncing isn't needed */
@@ -136,7 +136,7 @@ void matrix_init(void) {
}
matrix_init_kb();
- set_output(OUTPUT_AUTO);
+ set_send_output(SEND_OUTPUT_AUTO);
}
uint8_t matrix_scan(void)
diff --git a/quantum/keyboard.c b/quantum/keyboard.c
index b5fa1a6e2e9c..387685d10c2a 100644
--- a/quantum/keyboard.c
+++ b/quantum/keyboard.c
@@ -454,7 +454,7 @@ void keyboard_init(void) {
pointing_device_init();
#endif
#ifdef BLUETOOTH_ENABLE
- bluetooth_init();
+ bluetooth_driver.init();
#endif
#ifdef HAPTIC_ENABLE
haptic_init();
@@ -710,7 +710,7 @@ void keyboard_task(void) {
#endif
#ifdef BLUETOOTH_ENABLE
- bluetooth_task();
+ bluetooth_driver.task();
#endif
#ifdef HAPTIC_ENABLE
diff --git a/quantum/quantum.c b/quantum/quantum.c
index 6639dc229109..2749643f1d1c 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -21,7 +21,7 @@
#endif
#ifdef BLUETOOTH_ENABLE
-# include "outputselect.h"
+# include "bluetooth.h"
#endif
#ifdef GRAVE_ESC_ENABLE
@@ -426,13 +426,13 @@ bool process_record_quantum(keyrecord_t *record) {
#endif
#ifdef BLUETOOTH_ENABLE
case QK_OUTPUT_AUTO:
- set_output(OUTPUT_AUTO);
+ set_send_output(SEND_OUTPUT_AUTO);
return false;
case QK_OUTPUT_USB:
- set_output(OUTPUT_USB);
+ set_send_output(SEND_OUTPUT_USB);
return false;
case QK_OUTPUT_BLUETOOTH:
- set_output(OUTPUT_BLUETOOTH);
+ set_send_output(SEND_OUTPUT_BLUETOOTH);
return false;
#endif
#ifndef NO_ACTION_ONESHOT
diff --git a/tmk_core/protocol/host.c b/tmk_core/protocol/host.c
index 732fbdc37d4d..f910efcd8844 100644
--- a/tmk_core/protocol/host.c
+++ b/tmk_core/protocol/host.c
@@ -32,7 +32,6 @@ along with this program. If not, see .
#ifdef BLUETOOTH_ENABLE
# include "bluetooth.h"
-# include "outputselect.h"
#endif
#ifdef NKRO_ENABLE
@@ -73,11 +72,13 @@ led_t host_keyboard_led_state(void) {
/* send report */
void host_keyboard_send(report_keyboard_t *report) {
+
#ifdef BLUETOOTH_ENABLE
- if (where_to_send() == OUTPUT_BLUETOOTH) {
- bluetooth_send_keyboard(report);
- return;
- }
+ send_output_t where_to_send = get_send_output();
+ if ((where_to_send == SEND_OUTPUT_BLUETOOTH) || (where_to_send == SEND_OUTPUT_BOTH)) {
+ bluetooth_driver.send_keyboard(report);
+ if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
+ } else if ((where_to_send == SEND_OUTPUT_NONE)) return;
#endif
if (!driver) return;
@@ -98,6 +99,15 @@ void host_keyboard_send(report_keyboard_t *report) {
void host_nkro_send(report_nkro_t *report) {
if (!driver) return;
report->report_id = REPORT_ID_NKRO;
+
+#if defined(BLUETOOTH_ENABLE) && defined(NKRO_ENABLE)
+ send_output_t where_to_send = get_send_output();
+ if ((where_to_send == SEND_OUTPUT_BLUETOOTH) || (where_to_send == SEND_OUTPUT_BOTH)) {
+ bluetooth_driver.send_nkro(report);
+ if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
+ } else if (where_to_send == SEND_OUTPUT_NONE) return;
+#endif
+
(*driver->send_nkro)(report);
if (debug_keyboard) {
@@ -110,11 +120,13 @@ void host_nkro_send(report_nkro_t *report) {
}
void host_mouse_send(report_mouse_t *report) {
+
#ifdef BLUETOOTH_ENABLE
- if (where_to_send() == OUTPUT_BLUETOOTH) {
- bluetooth_send_mouse(report);
- return;
- }
+ send_output_t where_to_send = get_send_output();
+ if ((where_to_send == SEND_OUTPUT_BLUETOOTH) || (where_to_send == SEND_OUTPUT_BOTH)) {
+ bluetooth_driver.send_mouse(report);
+ if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
+ } else if (where_to_send == SEND_OUTPUT_NONE) return;
#endif
if (!driver) return;
@@ -133,6 +145,14 @@ void host_system_send(uint16_t usage) {
if (usage == last_system_usage) return;
last_system_usage = usage;
+#ifdef BLUETOOTH_ENABLE
+ send_output_t where_to_send = get_send_output();
+ if ((where_to_send == SEND_OUTPUT_BLUETOOTH) || (where_to_send == SEND_OUTPUT_BOTH)) {
+ bluetooth_driver.send_system(usage);
+ if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
+ } else if (where_to_send == SEND_OUTPUT_NONE) return;
+#endif
+
if (!driver) return;
report_extra_t report = {
@@ -147,10 +167,11 @@ void host_consumer_send(uint16_t usage) {
last_consumer_usage = usage;
#ifdef BLUETOOTH_ENABLE
- if (where_to_send() == OUTPUT_BLUETOOTH) {
- bluetooth_send_consumer(usage);
- return;
- }
+ send_output_t where_to_send = get_send_output();
+ if ((where_to_send == SEND_OUTPUT_BLUETOOTH) || (where_to_send == SEND_OUTPUT_BOTH)) {
+ bluetooth_driver.send_consumer(usage);
+ if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
+ } else if (where_to_send == SEND_OUTPUT_NONE) return;
#endif
if (!driver) return;
From 99d207ca05c2699b3b017285428ded0fcff04588 Mon Sep 17 00:00:00 2001
From: Vino Rodrigues <366673+vinorodrigues@users.noreply.github.com>
Date: Sun, 24 Dec 2023 17:05:21 +1100
Subject: [PATCH 14/31] clang-format
---
drivers/bluetooth/bluetooth.c | 3 +--
drivers/bluetooth/bluetooth.h | 4 ++--
tmk_core/protocol/host.c | 27 +++++++++++++++------------
3 files changed, 18 insertions(+), 16 deletions(-)
diff --git a/drivers/bluetooth/bluetooth.c b/drivers/bluetooth/bluetooth.c
index 649acdbdc30b..078e17ad5657 100644
--- a/drivers/bluetooth/bluetooth.c
+++ b/drivers/bluetooth/bluetooth.c
@@ -15,7 +15,6 @@
* along with this program. If not, see .
*/
-
#include
#include
#include "bluetooth.h"
@@ -69,7 +68,7 @@ __attribute__((weak)) void set_send_output_kb(send_output_t send_output) {
set_send_output_user(send_output);
}
-__attribute__((weak)) void set_send_output_user(send_output_t send_output) {} // do nothing
+__attribute__((weak)) void set_send_output_user(send_output_t send_output) {} // do nothing
send_output_t get_send_output(void) {
if (desired_send_output == SEND_OUTPUT_AUTO) {
diff --git a/drivers/bluetooth/bluetooth.h b/drivers/bluetooth/bluetooth.h
index 851ad35bec36..d34c59e93a7a 100644
--- a/drivers/bluetooth/bluetooth.h
+++ b/drivers/bluetooth/bluetooth.h
@@ -22,9 +22,9 @@
#include "report.h"
#if defined(BLUETOOTH_BLUEFRUIT_LE)
-# include "bluefruit_le.h"
+# include "bluefruit_le.h"
#elif defined(BLUETOOTH_RN42)
-# include "rn42.h"
+# include "rn42.h"
#endif
typedef enum send_output_t {
diff --git a/tmk_core/protocol/host.c b/tmk_core/protocol/host.c
index f910efcd8844..919830ddcfe7 100644
--- a/tmk_core/protocol/host.c
+++ b/tmk_core/protocol/host.c
@@ -72,13 +72,13 @@ led_t host_keyboard_led_state(void) {
/* send report */
void host_keyboard_send(report_keyboard_t *report) {
-
#ifdef BLUETOOTH_ENABLE
send_output_t where_to_send = get_send_output();
if ((where_to_send == SEND_OUTPUT_BLUETOOTH) || (where_to_send == SEND_OUTPUT_BOTH)) {
bluetooth_driver.send_keyboard(report);
- if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
- } else if ((where_to_send == SEND_OUTPUT_NONE)) return;
+ if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
+ } else if ((where_to_send == SEND_OUTPUT_NONE))
+ return;
#endif
if (!driver) return;
@@ -104,8 +104,9 @@ void host_nkro_send(report_nkro_t *report) {
send_output_t where_to_send = get_send_output();
if ((where_to_send == SEND_OUTPUT_BLUETOOTH) || (where_to_send == SEND_OUTPUT_BOTH)) {
bluetooth_driver.send_nkro(report);
- if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
- } else if (where_to_send == SEND_OUTPUT_NONE) return;
+ if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
+ } else if (where_to_send == SEND_OUTPUT_NONE)
+ return;
#endif
(*driver->send_nkro)(report);
@@ -120,13 +121,13 @@ void host_nkro_send(report_nkro_t *report) {
}
void host_mouse_send(report_mouse_t *report) {
-
#ifdef BLUETOOTH_ENABLE
send_output_t where_to_send = get_send_output();
if ((where_to_send == SEND_OUTPUT_BLUETOOTH) || (where_to_send == SEND_OUTPUT_BOTH)) {
bluetooth_driver.send_mouse(report);
- if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
- } else if (where_to_send == SEND_OUTPUT_NONE) return;
+ if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
+ } else if (where_to_send == SEND_OUTPUT_NONE)
+ return;
#endif
if (!driver) return;
@@ -149,8 +150,9 @@ void host_system_send(uint16_t usage) {
send_output_t where_to_send = get_send_output();
if ((where_to_send == SEND_OUTPUT_BLUETOOTH) || (where_to_send == SEND_OUTPUT_BOTH)) {
bluetooth_driver.send_system(usage);
- if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
- } else if (where_to_send == SEND_OUTPUT_NONE) return;
+ if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
+ } else if (where_to_send == SEND_OUTPUT_NONE)
+ return;
#endif
if (!driver) return;
@@ -170,8 +172,9 @@ void host_consumer_send(uint16_t usage) {
send_output_t where_to_send = get_send_output();
if ((where_to_send == SEND_OUTPUT_BLUETOOTH) || (where_to_send == SEND_OUTPUT_BOTH)) {
bluetooth_driver.send_consumer(usage);
- if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
- } else if (where_to_send == SEND_OUTPUT_NONE) return;
+ if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
+ } else if (where_to_send == SEND_OUTPUT_NONE)
+ return;
#endif
if (!driver) return;
From 62eef50a687fa4893fb0e7251587f66ac3a40730 Mon Sep 17 00:00:00 2001
From: Vino Rodrigues <366673+vinorodrigues@users.noreply.github.com>
Date: Mon, 25 Dec 2023 04:06:25 +1100
Subject: [PATCH 15/31] clang-format
---
drivers/bluetooth/bluetooth.h | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/bluetooth/bluetooth.h b/drivers/bluetooth/bluetooth.h
index d34c59e93a7a..74b0936f55c2 100644
--- a/drivers/bluetooth/bluetooth.h
+++ b/drivers/bluetooth/bluetooth.h
@@ -27,6 +27,8 @@
# include "rn42.h"
#endif
+// clang-format off
+
typedef enum send_output_t {
SEND_OUTPUT_AUTO,
SEND_OUTPUT_NONE,
@@ -35,6 +37,8 @@ typedef enum send_output_t {
SEND_OUTPUT_BOTH
} send_output_t;
+// clang-format on
+
#ifndef SEND_OUTPUT_DEFAULT
# define SEND_OUTPUT_DEFAULT SEND_OUTPUT_AUTO
#endif
From 8a6dcc3a7932655a2d587fbba7004527e568d3c2 Mon Sep 17 00:00:00 2001
From: Vino Rodrigues <366673+vinorodrigues@users.noreply.github.com>
Date: Mon, 25 Dec 2023 11:02:42 +1100
Subject: [PATCH 16/31] post sigprof review fixes
---
drivers/bluetooth/bluetooth.c | 2 +-
quantum/keyboard.c | 2 +-
tmk_core/protocol/host.c | 17 ++++++++++-------
3 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/drivers/bluetooth/bluetooth.c b/drivers/bluetooth/bluetooth.c
index 078e17ad5657..bb8acee0911b 100644
--- a/drivers/bluetooth/bluetooth.c
+++ b/drivers/bluetooth/bluetooth.c
@@ -22,7 +22,7 @@
/* Each driver needs to define the struct
* const rgb_matrix_driver_t rgb_matrix_driver;
- * All members (except `task`, `.detect_output` and `system`) must be provided.
+ * All members (except `task`, `is_connected` and `send_system`) must be provided.
* Keyboard custom drivers can define this in their own files, it should only
* be here if shared between boards.
*/
diff --git a/quantum/keyboard.c b/quantum/keyboard.c
index 387685d10c2a..1af62aafe8e2 100644
--- a/quantum/keyboard.c
+++ b/quantum/keyboard.c
@@ -710,7 +710,7 @@ void keyboard_task(void) {
#endif
#ifdef BLUETOOTH_ENABLE
- bluetooth_driver.task();
+ if (NULL != (*bluetooth_driver.task)) bluetooth_driver.task();
#endif
#ifdef HAPTIC_ENABLE
diff --git a/tmk_core/protocol/host.c b/tmk_core/protocol/host.c
index 919830ddcfe7..1162499d1b22 100644
--- a/tmk_core/protocol/host.c
+++ b/tmk_core/protocol/host.c
@@ -78,7 +78,7 @@ void host_keyboard_send(report_keyboard_t *report) {
bluetooth_driver.send_keyboard(report);
if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
} else if ((where_to_send == SEND_OUTPUT_NONE))
- return;
+ return; // dont send to USB either, jump out
#endif
if (!driver) return;
@@ -106,7 +106,7 @@ void host_nkro_send(report_nkro_t *report) {
bluetooth_driver.send_nkro(report);
if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
} else if (where_to_send == SEND_OUTPUT_NONE)
- return;
+ return; // dont send to USB either, jump out
#endif
(*driver->send_nkro)(report);
@@ -127,7 +127,7 @@ void host_mouse_send(report_mouse_t *report) {
bluetooth_driver.send_mouse(report);
if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
} else if (where_to_send == SEND_OUTPUT_NONE)
- return;
+ return; // dont send to USB either, jump out
#endif
if (!driver) return;
@@ -149,10 +149,13 @@ void host_system_send(uint16_t usage) {
#ifdef BLUETOOTH_ENABLE
send_output_t where_to_send = get_send_output();
if ((where_to_send == SEND_OUTPUT_BLUETOOTH) || (where_to_send == SEND_OUTPUT_BOTH)) {
- bluetooth_driver.send_system(usage);
- if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
+ if (NULL != (*bluetooth_driver.send_system)) {
+ bluetooth_driver.send_system(usage);
+ if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
+ } else if (where_to_send == SEND_OUTPUT_BLUETOOTH)
+ return; // only BT, but no `send_system`, jump out
} else if (where_to_send == SEND_OUTPUT_NONE)
- return;
+ return; // dont send to USB either, jump out
#endif
if (!driver) return;
@@ -174,7 +177,7 @@ void host_consumer_send(uint16_t usage) {
bluetooth_driver.send_consumer(usage);
if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
} else if (where_to_send == SEND_OUTPUT_NONE)
- return;
+ return; // dont send to USB either, jump out
#endif
if (!driver) return;
From d2403468eac7a9b3db0020286c7fb77b4dc94943 Mon Sep 17 00:00:00 2001
From: Vino Rodrigues <366673+vinorodrigues@users.noreply.github.com>
Date: Mon, 25 Dec 2023 18:23:05 +1100
Subject: [PATCH 17/31] post sigprof review fixes, r2
---
drivers/bluetooth/bluetooth.c | 2 +-
drivers/bluetooth/bluetooth_legacy.c | 6 +++---
quantum/keyboard.c | 2 +-
tmk_core/protocol/host.c | 3 ++-
4 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/drivers/bluetooth/bluetooth.c b/drivers/bluetooth/bluetooth.c
index bb8acee0911b..a970188c47fd 100644
--- a/drivers/bluetooth/bluetooth.c
+++ b/drivers/bluetooth/bluetooth.c
@@ -76,7 +76,7 @@ send_output_t get_send_output(void) {
if (usb_connected_state()) {
return SEND_OUTPUT_USB;
}
- if ((NULL != (*bluetooth_driver.is_connected)) && (bluetooth_driver.is_connected())) {
+ if ((NULL != bluetooth_driver.is_connected) && (bluetooth_driver.is_connected())) {
return SEND_OUTPUT_BLUETOOTH;
} else {
return SEND_OUTPUT_NONE;
diff --git a/drivers/bluetooth/bluetooth_legacy.c b/drivers/bluetooth/bluetooth_legacy.c
index 0b46fe0fc6b6..891ccceecfa9 100644
--- a/drivers/bluetooth/bluetooth_legacy.c
+++ b/drivers/bluetooth/bluetooth_legacy.c
@@ -26,7 +26,7 @@ __attribute__((weak)) void bluetooth_init(void) {
}
__attribute__((weak)) void bluetooth_task(void) {
- if (NULL != (*bluetooth_driver.task)) {
+ if (NULL != bluetooth_driver.task) {
bluetooth_driver.task();
}
}
@@ -37,7 +37,7 @@ __attribute__((weak)) void bluetooth_send_keyboard(report_keyboard_t *report) {
#ifdef NKRO_ENABLE
__attribute__((weak)) void bluetooth_send_nkro(report_keyboard_t *report) {
- if (NULL != (*bluetooth_driver.send_nkro)) {
+ if (NULL != bluetooth_driver.send_nkro) {
bluetooth_driver.send_nkro(report);
}
}
@@ -52,7 +52,7 @@ __attribute__((weak)) void bluetooth_send_consumer(uint16_t usage) {
}
__attribute__((weak)) void bluetooth_send_system(uint16_t usage) {
- if (NULL != (*bluetooth_driver.send_system)) {
+ if (NULL != bluetooth_driver.send_system) {
bluetooth_driver.send_system(usage);
}
}
diff --git a/quantum/keyboard.c b/quantum/keyboard.c
index 1af62aafe8e2..61aaa2e3878f 100644
--- a/quantum/keyboard.c
+++ b/quantum/keyboard.c
@@ -710,7 +710,7 @@ void keyboard_task(void) {
#endif
#ifdef BLUETOOTH_ENABLE
- if (NULL != (*bluetooth_driver.task)) bluetooth_driver.task();
+ if (NULL != bluetooth_driver.task) bluetooth_driver.task();
#endif
#ifdef HAPTIC_ENABLE
diff --git a/tmk_core/protocol/host.c b/tmk_core/protocol/host.c
index 1162499d1b22..f90842f1cfc6 100644
--- a/tmk_core/protocol/host.c
+++ b/tmk_core/protocol/host.c
@@ -16,6 +16,7 @@ along with this program. If not, see .
*/
#include
+#include
#include "keyboard.h"
#include "keycode.h"
#include "host.h"
@@ -149,7 +150,7 @@ void host_system_send(uint16_t usage) {
#ifdef BLUETOOTH_ENABLE
send_output_t where_to_send = get_send_output();
if ((where_to_send == SEND_OUTPUT_BLUETOOTH) || (where_to_send == SEND_OUTPUT_BOTH)) {
- if (NULL != (*bluetooth_driver.send_system)) {
+ if (NULL != bluetooth_driver.send_system) {
bluetooth_driver.send_system(usage);
if (where_to_send == SEND_OUTPUT_BLUETOOTH) return; // only BT, jump out
} else if (where_to_send == SEND_OUTPUT_BLUETOOTH)
From ed53c7f1353aef8fd8105b3d9863e0174ec1779b Mon Sep 17 00:00:00 2001
From: Vino Rodrigues <366673+vinorodrigues@users.noreply.github.com>
Date: Sat, 30 Dec 2023 23:06:29 +1100
Subject: [PATCH 18/31] Edit of docs and refinement of `set_send_output`
function to allow override
---
docs/config_options.md | 2 +-
docs/faq_keymap.md | 4 +-
docs/feature_bluetooth.md | 167 ++++++++++++++++++++++++++++------
docs/hardware_drivers.md | 4 +
drivers/bluetooth/bluetooth.c | 18 ++--
drivers/bluetooth/bluetooth.h | 25 +++--
6 files changed, 173 insertions(+), 47 deletions(-)
diff --git a/docs/config_options.md b/docs/config_options.md
index bc28f603faca..bf57c7b0bdf1 100644
--- a/docs/config_options.md
+++ b/docs/config_options.md
@@ -439,7 +439,7 @@ Use these to enable or disable building certain features. The more you have enab
* `UNICODE_ENABLE`
* Unicode
* `BLUETOOTH_ENABLE`
- * Current options are bluefruit_le, rn42
+ * Enable Bluetooth driver. Also requires `BLUETOOTH_DRIVER`. Set to onr of `bluefruit_le`, `rn42` or `custom`.
* `SPLIT_KEYBOARD`
* Enables split keyboard support (dual MCU like the let's split and bakingpy's boards) and includes all necessary files located at quantum/split_common
* `CUSTOM_MATRIX`
diff --git a/docs/faq_keymap.md b/docs/faq_keymap.md
index 864128183508..027b23dc1dd7 100644
--- a/docs/faq_keymap.md
+++ b/docs/faq_keymap.md
@@ -119,9 +119,9 @@ Japanese JIS keyboard specific keys like `無変換(Muhenkan)`, `変換(Henkan)`
https://pqrs.org/osx/karabiner/seil.html
-## RN-42 Bluetooth Doesn't Work with Karabiner
+## RN-42 Bluetooth Doesn't Work with Karabiner on OSX
-Karabiner - Keymapping tool on Mac OSX - ignores inputs from RN-42 module by default. You have to enable this option to make Karabiner working with your keyboard.
+Karabiner - Keymapping tool on Mac OSX - ignores inputs from RN-42 module by default. You have to enable this option to make Karabiner work with your keyboard.
https://github.com/tekezo/Karabiner/issues/403#issuecomment-102559237
See these for the detail of this problem.
diff --git a/docs/feature_bluetooth.md b/docs/feature_bluetooth.md
index 5fac06fba756..a6a8b8bdec73 100644
--- a/docs/feature_bluetooth.md
+++ b/docs/feature_bluetooth.md
@@ -1,46 +1,157 @@
# Bluetooth
-## Bluetooth Known Supported Hardware
+This feature allows you to integrate into a Bluetooth module to create a Bluetooth keyboard for wireless operation.
-Currently Bluetooth support is limited to AVR based chips. For Bluetooth 2.1, QMK has support for RN-42 modules. For more recent BLE protocols, currently only the Adafruit Bluefruit SPI Friend is directly supported. BLE is needed to connect to iOS devices. Note iOS does not support mouse input.
+## Supported Modules
-|Board |Bluetooth Protocol |Connection Type|rules.mk |Bluetooth Chip|
-|----------------------------------------------------------------|--------------------|---------------|---------------------------------|--------------|
-|Roving Networks RN-42 (Sparkfun Bluesmirf) |Bluetooth Classic |UART |`BLUETOOTH_DRIVER = rn42` |RN-42 |
-|[Bluefruit LE SPI Friend](https://www.adafruit.com/product/2633)|Bluetooth Low Energy|SPI |`BLUETOOTH_DRIVER = bluefruit_le`|nRF51822 |
+Currently on the following modules are supported:
-Not Supported Yet but possible:
-* [Bluefruit LE UART Friend](https://www.adafruit.com/product/2479). [Possible tmk implementation found in](https://github.com/tmk/tmk_keyboard/issues/514)
-* HC-05 boards flashed with RN-42 firmware. They apparently both use the CSR BC417 Chip. Flashing it with RN-42 firmware gives it HID capability.
-* Sparkfun Bluetooth Mate
-* HM-13 based boards
+| Board | Module based on | Bluetooth Protocol | Connection Type | rules.mk |Bluetooth Chip |
+|--------------------------------------------------------------------|---------------------|-----------------------------|-----------------|---------------------------------|----------------|
+|[Sparkfun BlueSMiRF Silver](https://www.sparkfun.com/products/12577)|Roving Networks RN-42|Bluetooth 2.1 *"Classic"* |UART |`BLUETOOTH_DRIVER = rn42` |RN421|
+|[Bluefruit LE SPI Friend](https://www.adafruit.com/product/2633) |Raytac MDBT40-256RV3 |Bluettoth 4.1 BLE2|SPI |`BLUETOOTH_DRIVER = bluefruit_le`|nRF51822 |
+
+> 1 RN42 based are modules mostly retired or EOL as the BT2.1 spec is deprecated and withdrawn as of July 2020.
+>
+> 2 BLE is needed to connect to iOS devices.
+
+Not supported yet, but possible:
+
+* [Bluefruit LE UART Friend](https://www.adafruit.com/product/2479).
+* HC-05, HC-06 and HC-08 modules.
+* Modules based on Nordic nRF51*, nRF52* and nRF53* SoC's - however in most cases one will also need to develop firmware for those modules.
+
+> **NOTE:** QMK does not currently support MCU sleep modes, and this may impact the longevity of battery based builds.
+
+## Driver configuration
### Adafruit BLE SPI Friend
-Currently The only bluetooth chipset supported by QMK is the Adafruit Bluefruit SPI Friend. It's a Nordic nRF51822 based chip running Adafruit's custom firmware. Data is transmitted via Adafruit's SDEP over Hardware SPI. The [Feather 32u4 Bluefruit LE](https://www.adafruit.com/product/2829) is supported as it's an AVR mcu connected via SPI to the Nordic BLE chip with Adafruit firmware. If Building a custom board with the SPI friend it would be easiest to just use the pin selection that the 32u4 feather uses but you can change the pins in the config.h options with the following defines:
-* `#define BLUEFRUIT_LE_RST_PIN D4`
-* `#define BLUEFRUIT_LE_CS_PIN B4`
-* `#define BLUEFRUIT_LE_IRQ_PIN E6`
-A Bluefruit UART friend can be converted to an SPI friend, however this [requires](https://github.com/qmk/qmk_firmware/issues/2274) some reflashing and soldering directly to the MDBT40 chip.
+To enable support for the Adafruit Bluefruit LE SPI Friend, add this to your `rules.mk` file:
+
+```make
+NKRO_ENABLE = no # ** Required
+BLUETOOTH_ENABLE = yes
+BLUETOOTH_DRIVER = bluefruit_le
+```
+
+> ** This module does no support [N-Key Rollover (NKRO)](reference_glossary.md#n-key-rollover-nkro);
+
+The Adafruit Bluefruit SPI Friend is a module based on the MDBT30 module, using a Nordic nRF51822 chip, and is flashed with Adafruit's custom firmware that using AT Command sets.
+Data is transmitted via Adafruit's [SDEP](https://learn.adafruit.com/introducing-the-adafruit-bluefruit-spi-breakout/sdep-spi-data-transport) data packets.
+
+#### SPI Configuration
+
+QMK’s `spi_master` must already be correctly configured for the platform you’re building for.
+In addition, you will also need to define the following items in `config.h``:
+
+| Variable | Description | Default |
+|------------------------|-------------------------------------------|---------|
+| `BLUEFRUIT_LE_RST_PIN` | Used to perform a reset on initialization | D4 |
+| `BLUEFRUIT_LE_CS_PIN` | SPI SS/CI "Chip Select" pin | B4 |
+| `BLUEFRUIT_LE_IRQ_PIN` | Module Interrupt Request pin | E6 |
+
+> Defaults are based on the [Adafruit Feather 32u4 Bluefruit](https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le/overview).
+
+## Keycodes
+
+The following keycodes will allow you change the output selector for the keyboard.
+This allows for switching between USB and Bluetooth on keyboards that support both.
+
+| Key | Aliases | Description |
+|---------------------|---------|----------------------------------------------------------|
+|`QK_OUTPUT_AUTO` |`OU_AUTO`|Automatically switch between USB and Bluetooth *(Default)*|
+|`QK_OUTPUT_USB` |`OU_USB` |USB only |
+|`QK_OUTPUT_BLUETOOTH`|`OU_BT` |Bluetooth only |
+
+## Output Interface Selection
+
+The above keycodes will in turn call the output selector API to direct all key, mouse, consumer, and system output events to the selected interface:
+
+```c
+send_output_t set_send_output(send_output_t send_output);
+send_output_t get_send_output(void);
+```
+
+The *`send_output`* variable should be one of:
+
+```c
+enum send_output_t {
+ SEND_OUTPUT_AUTO, // Selection is USB if USB cable connected, else is Bluetooth is Bluetooth is connected. (Default)
+ SEND_OUTPUT_NONE, // No output is sent.
+ SEND_OUTPUT_USB, // Output is always USB.
+ SEND_OUTPUT_BLUETOOTH, // Output is always Bluetooth.
+ SEND_OUTPUT_BOTH // Output is sent to both USb and Bluetooth (used for testing).
+};
+```
+
+You can change the initial state with the following define in the `config.h` file:
-
-## Bluetooth Rules.mk Options
+```c
+#define SEND_OUTPUT_DEFAULT SEND_OUTPUT_AUTO
+```
-The currently supported Bluetooth chipsets do not support [N-Key Rollover (NKRO)](reference_glossary.md#n-key-rollover-nkro), so `rules.mk` must contain `NKRO_ENABLE = no`.
+Vendor and keymap code can also use the keyboard-level and user-level (to either perform ancillary functions on the setting, or overrode the setting) by creating the following functions in the `kb_name.c` or the `keymap.c` files:
-Add the following to your `rules.mk`:
+```c
+send_output_t set_send_output_kb(send_output_t send_output); // kb-level function usually in the `kb_name.c file`. Should also call `set_send_output_user`.
+send_output_t set_send_output_user(send_output_t send_output); // user-level function usually in `keymap.c` file.
+```
+
+## Bluetooth Driver API
+
+### Custom Bluetooth Driver
+
+You can create your own Bluetooth driver (or for that matter any alternate output interface) with the `bluetooth_driver` variable, and the `bluetooth_driver_t` struct.
+
+Then, to enable a custom Bluetooth driver add this to your `rules.mk` file:
```make
BLUETOOTH_ENABLE = yes
-BLUETOOTH_DRIVER = bluefruit_le # or rn42
+BLUETOOTH_DRIVER = custom
+```
+
+#### Example
+
+You create your own Bluetooth driver by creating compliant functions and referencing these with within the `bluetooth_driver` variable.
+
+In your `kb_name.c` file, create that variable as such:
+
+```c
+const bluetooth_driver_t bluetooth_driver = {
+ .init = xyz_bt_init,
+ .task = xyz_bt_task, // Optional
+ .is_connected = xyz_bt_is_connected, // Optional
+ .send_keyboard = xyz_bt_send_keyboard,
+ .send_mouse = xyz_bt_send_mouse,
+ .send_consumer = xyz_bt_send_consumer,
+ .send_system = xyz_bt_send_system, // Optional
+};
```
-## Bluetooth Keycodes
+> *Optional* items can be set to `NULL`.
+
+Then code for the following functions:
+
+```c
+/* Initialize the Bluetooth system. */
+void xyz_bt_init(void) {}
-This is used when multiple keyboard outputs can be selected. Currently this only allows for switching between USB and Bluetooth on keyboards that support both.
+/* Perform housekeeping tasks. Called every loop. (Optional) */
+void xyz_bt_task(void) {}
-|Key |Aliases |Description |
-|---------------------|---------|----------------------------------------------|
-|`QK_OUTPUT_AUTO` |`OU_AUTO`|Automatically switch between USB and Bluetooth|
-|`QK_OUTPUT_USB` |`OU_USB` |USB only |
-|`QK_OUTPUT_BLUETOOTH`|`OU_BT` |Bluetooth only |
+/* Detects if BT is connected, also used by `SEND_OUTPUT_AUTO`. (Optional) */
+bool xyz_bt_is_connected(void) {}
+
+/* Send a keyboard report. */
+void xyz_bt_send_keyboard(report_keyboard_t *report) {}
+
+/* Send a mouse report. */
+void xyz_bt_send_mouse(report_mouse_t *report) {}
+
+/* Send a consumer usage. */
+void xyz_bt_send_consumer(uint16_t usage) {}
+
+/* Send a system usage. (Optional) */
+void xyz_bt_send_system(uint16_t usage) {}
+```
diff --git a/docs/hardware_drivers.md b/docs/hardware_drivers.md
index a157501326db..f0fb1069948f 100644
--- a/docs/hardware_drivers.md
+++ b/docs/hardware_drivers.md
@@ -33,3 +33,7 @@ Support for up to a single driver with room for expansion. Each driver can contr
## 24xx series external I2C EEPROM
Support for an external I2C-based EEPROM instead of using the on-chip EEPROM. For more information on how to setup the driver see the [EEPROM Driver](eeprom_driver.md) page.
+
+## BlueFruit LE SPI
+
+Support for Bluetooth is provided by the inclusion of the BlueFruit LE SPI module driver. For more information on how to setup the driver see the [Bluetooth](feature_bluetooth.md) page.
diff --git a/drivers/bluetooth/bluetooth.c b/drivers/bluetooth/bluetooth.c
index a970188c47fd..d492baec4c36 100644
--- a/drivers/bluetooth/bluetooth.c
+++ b/drivers/bluetooth/bluetooth.c
@@ -57,18 +57,24 @@ const bluetooth_driver_t bluetooth_driver = {
#endif
+#ifndef SEND_OUTPUT_DEFAULT
+# define SEND_OUTPUT_DEFAULT SEND_OUTPUT_AUTO
+#endif
+
send_output_t desired_send_output = SEND_OUTPUT_DEFAULT;
-void set_send_output(send_output_t send_output) {
- set_send_output_kb(send_output);
- desired_send_output = send_output;
+send_output_t set_send_output(send_output_t send_output) {
+ desired_send_output = set_send_output_kb(send_output);
+ return desired_send_output;
}
-__attribute__((weak)) void set_send_output_kb(send_output_t send_output) {
- set_send_output_user(send_output);
+__attribute__((weak)) send_output_t set_send_output_kb(send_output_t send_output) {
+ return set_send_output_user(send_output);
}
-__attribute__((weak)) void set_send_output_user(send_output_t send_output) {} // do nothing
+__attribute__((weak)) send_output_t set_send_output_user(send_output_t send_output) {
+ return send_output;
+}
send_output_t get_send_output(void) {
if (desired_send_output == SEND_OUTPUT_AUTO) {
diff --git a/drivers/bluetooth/bluetooth.h b/drivers/bluetooth/bluetooth.h
index 74b0936f55c2..32d523e9c59a 100644
--- a/drivers/bluetooth/bluetooth.h
+++ b/drivers/bluetooth/bluetooth.h
@@ -39,32 +39,37 @@ typedef enum send_output_t {
// clang-format on
-#ifndef SEND_OUTPUT_DEFAULT
-# define SEND_OUTPUT_DEFAULT SEND_OUTPUT_AUTO
-#endif
-
typedef struct {
/* Initialize the Bluetooth system. */
void (*init)(void);
- /* Perform housekeeping tasks. */
+
+ /* Perform housekeeping tasks. (Optional) */
void (*task)(void);
- /* Detects if BT is connected, also used by `SEND_OUTPUT_AUTO` */
+
+ /* Detects if BT is connected, also used by `SEND_OUTPUT_AUTO`. (Optional) */
bool (*is_connected)(void);
+
/* Send a keyboard report. */
void (*send_keyboard)(report_keyboard_t *report);
+
+#ifdef NKRO_ENABLE
/* Send a NKRO report. (Optional & dependant on `NKRO_ENABLE` ) */
void (*send_nkro)(report_keyboard_t *report);
+#endif
+
/* Send a mouse report. */
void (*send_mouse)(report_mouse_t *report);
+
/* Send a consumer usage. */
void (*send_consumer)(uint16_t usage);
- /* Send a system usage (Optional) */
+
+ /* Send a system usage. (Optional) */
void (*send_system)(uint16_t usage);
} bluetooth_driver_t;
-void set_send_output(send_output_t send_output);
-void set_send_output_kb(send_output_t send_output);
-void set_send_output_user(send_output_t send_output);
+send_output_t set_send_output(send_output_t send_output);
+send_output_t set_send_output_kb(send_output_t send_output);
+send_output_t set_send_output_user(send_output_t send_output);
send_output_t get_send_output(void);
extern const bluetooth_driver_t bluetooth_driver;
From dcc80b12b5af8e8aaf3858947e875c55ea613da5 Mon Sep 17 00:00:00 2001
From: Abhijithabhi
Date: Sun, 24 Dec 2023 02:41:39 +0530
Subject: [PATCH 19/31] [Keyboard] Add redragon k617 port (#22410)
Co-authored-by: Less/Rikki <86894501+lesshonor@users.noreply.github.com>
Co-authored-by: jack <0x6a73@protonmail.com>
Co-authored-by: Drashna Jaelre
---
keyboards/handwired/rd_61_qmk/config.h | 6 +
keyboards/handwired/rd_61_qmk/info.json | 126 ++++++++++++++++++
.../rd_61_qmk/keymaps/default/keymap.c | 37 +++++
keyboards/handwired/rd_61_qmk/readme.md | 53 ++++++++
keyboards/handwired/rd_61_qmk/rules.mk | 1 +
5 files changed, 223 insertions(+)
create mode 100644 keyboards/handwired/rd_61_qmk/config.h
create mode 100644 keyboards/handwired/rd_61_qmk/info.json
create mode 100644 keyboards/handwired/rd_61_qmk/keymaps/default/keymap.c
create mode 100644 keyboards/handwired/rd_61_qmk/readme.md
create mode 100644 keyboards/handwired/rd_61_qmk/rules.mk
diff --git a/keyboards/handwired/rd_61_qmk/config.h b/keyboards/handwired/rd_61_qmk/config.h
new file mode 100644
index 000000000000..7281c45662d3
--- /dev/null
+++ b/keyboards/handwired/rd_61_qmk/config.h
@@ -0,0 +1,6 @@
+// Copyright 2023 abhiakl (@abhijithabhiakl)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+/* QK_MAKE support*/
+#define ENABLE_COMPILE_KEYCODE
diff --git a/keyboards/handwired/rd_61_qmk/info.json b/keyboards/handwired/rd_61_qmk/info.json
new file mode 100644
index 000000000000..be07d95924fc
--- /dev/null
+++ b/keyboards/handwired/rd_61_qmk/info.json
@@ -0,0 +1,126 @@
+{
+ "manufacturer": "abhiakl",
+ "keyboard_name": "rd_61_qmk",
+ "maintainer": "abhijithabhiakl",
+ "backlight": {
+ "driver": "pwm",
+ "levels": 5,
+ "pin": "B7"
+ },
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x7421",
+ "vid": "0xFEED"
+ },
+ "development_board": "promicro",
+ "diode_direction": "ROW2COL",
+ "features": {
+ "backlight": true,
+ "bootmagic": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgblight": true
+ },
+ "qmk": {
+ "locking": {
+ "enabled": true,
+ "resync": true
+ }
+ },
+ "indicators": {
+ "caps_lock": "F0"
+ },
+ "matrix_pins": {
+ "cols": ["B6", "B2", "B3", "B1", "F7", "F6", "F5", "F4", "D4", "D0", "D1", "D2", "D3", "D5"],
+ "rows": ["B5", "B4", "E6", "D7", "C6"]
+ },
+ "rgblight": {
+ "animations": {
+ "alternating": true,
+ "breathing": true,
+ "christmas": true,
+ "knight": true,
+ "rainbow_mood": true,
+ "rainbow_swirl": true,
+ "rgb_test": true,
+ "snake": true,
+ "static_gradient": true,
+ "twinkle": true
+ },
+ "brightness_steps": 8,
+ "led_count": 1,
+ "saturation_steps": 8
+ },
+ "url": "",
+ "ws2812": {
+ "pin": "C7"
+ },
+ "layouts": {
+ "LAYOUT_60_ansi": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0, "w": 2},
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+ {"matrix": [3, 1], "x": 2.25, "y": 3},
+ {"matrix": [3, 2], "x": 3.25, "y": 3},
+ {"matrix": [3, 3], "x": 4.25, "y": 3},
+ {"matrix": [3, 4], "x": 5.25, "y": 3},
+ {"matrix": [3, 5], "x": 6.25, "y": 3},
+ {"matrix": [3, 6], "x": 7.25, "y": 3},
+ {"matrix": [3, 7], "x": 8.25, "y": 3},
+ {"matrix": [3, 8], "x": 9.25, "y": 3},
+ {"matrix": [3, 9], "x": 10.25, "y": 3},
+ {"matrix": [3, 10], "x": 11.25, "y": 3},
+ {"matrix": [3, 13], "x": 12.25, "y": 3, "w": 2.75},
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25},
+ {"matrix": [4, 5], "x": 3.75, "y": 4, "w": 6.25},
+ {"matrix": [4, 8], "x": 10, "y": 4, "w": 1.25},
+ {"matrix": [4, 9], "x": 11.25, "y": 4, "w": 1.25},
+ {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25},
+ {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/rd_61_qmk/keymaps/default/keymap.c b/keyboards/handwired/rd_61_qmk/keymaps/default/keymap.c
new file mode 100644
index 000000000000..b32fa614a7d0
--- /dev/null
+++ b/keyboards/handwired/rd_61_qmk/keymaps/default/keymap.c
@@ -0,0 +1,37 @@
+// Copyright 2023 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_60_ansi(
+ KC_ESC, 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_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,
+ 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,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LCTL, MO(1), KC_LALT, KC_SPC, KC_RALT, MO(3), KC_RCTL, KC_PENT
+ ),
+
+ [1] = LAYOUT_60_ansi(
+ KC_GRV, 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_TRNS,
+ KC_PSCR, DF(0), KC_UP, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_DEL, KC_LEFT, KC_DOWN, KC_RGHT, KC_BRID, KC_BRIU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_LSFT, C(S(KC_TAB)), C(KC_TAB), KC_MPLY, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_RSFT,
+ KC_RGUI, KC_TRNS, MO(2), KC_TRNS, KC_TRNS, MO(3), KC_TRNS, KC_TRNS
+ ),
+
+ [2] = LAYOUT_60_ansi(
+ QK_RBT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL, KC_BSPC,
+ KC_PSCR, KC_P7, KC_P8, KC_P9, KC_PSLS, KC_PAST, KC_LEFT, KC_TRNS, KC_TRNS, KC_7, KC_8, KC_9, KC_TRNS, KC_PSCR,
+ KC_DEL, KC_P4, KC_P5, KC_P6, KC_PMNS, KC_PPLS, KC_RGHT, KC_TRNS, KC_TRNS, KC_4, KC_5, KC_6, KC_TRNS,
+ KC_LSFT, KC_P1, KC_P2, KC_P3, KC_PDOT, KC_P0, KC_ENT, KC_TRNS, KC_1, KC_2, KC_3, KC_RSFT,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(3), KC_TRNS, KC_TRNS
+ ),
+
+ [3] = LAYOUT_60_ansi(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, DB_TOGG, QK_RBT, QK_BOOT, QK_MAKE,
+ 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, 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, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAI, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_MOD, KC_TRNS, RGB_HUI, RGB_SAI
+ )
+};
diff --git a/keyboards/handwired/rd_61_qmk/readme.md b/keyboards/handwired/rd_61_qmk/readme.md
new file mode 100644
index 000000000000..f9e40ac81bfd
--- /dev/null
+++ b/keyboards/handwired/rd_61_qmk/readme.md
@@ -0,0 +1,53 @@
+# Redragon K617 (QMK ported)
+
+![Keyboard image](https://imagizer.imageshack.com/img922/3464/qUpU8k.png)
+
+*Firmware,layout and schematics for porting Redragon K617 keyboard to qmk*
+
+* Keyboard Maintainer: *[abhijithabhiakl](https://github.com/abhijithabhiakl)*
+* Hardware Supported: *Redragon K617, Pro micro(caterina)*
+* Hardware Availability: *[Redragon K617](https://redragon.in/products/fizz-k617-60-wired-mechanical-keyboard-white-and-grey-red-switches)*
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/rd_61_qmk:default
+
+Flashing example for this keyboard:
+
+ make handwired/rd_61_qmk:default:flash
+
+Also can be flashed with QMK *[QMK toolbox](https://github.com/qmk/qmk_toolbox)* or *[avrdudess](https://blog.zakkemble.net/avrdudess-a-gui-for-avrdude/)*
+
+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).
+
+See [QMK repo cloning](https://docs.qmk.fm/#/getting_started_github) for information about cloning the repo
+
+## Hardware details:
+
+Note : Before doing any modifications in the PCB make sure that the stock microcontroller is removed.
+
+#### Matrix layout:
+![Keyboard image](https://imagizer.imageshack.com/img924/8415/hX5gAb.jpg)
+
+#### Schematic:
+![Keyboard image](https://imagizer.imageshack.com/img922/5585/vXorPx.png)
+
+* *The header `J0` in not present in the normal pro mirco, for my purpose i directly soldered the `D5`, `C7` and `F0` pins to the pad of the microcontroller with micro soldering tools.
+
+* **To connect the promicro to PCB - Micro USB to the USB C, i made use of an old micro usb cable lying around, cut the cable to approprite length and exposed the wires, connected the male connector to female port of pro micro, Connected the Vcc and Gnd wires to Vcc and Gnd in the PCB, In PCB there's a differential pair (D+, D-) running from USB C port in the PCB to microcontroller in the PCB, in between the connection there's a resistor and filter capacitors, after removing both (bypassing the connection) i connected the D+ and D- wires to the bypassed point respectively (make sure the cable wires are also impedance matched)
+
+#### RGB Lighting:
+
+The stock RGB Lighting used on the keyboard is [this](https://www.luckylight.cn/en/products/smd-led/multi-color-smd-led/?series_code=sr187-rgb-series) `SR187RGBC` `Multi-color PLCC SMD LEDs`, to use this kind of LED with qmk I either have to write a custom led matrix code ( I don't know for sure if qmk already have any support this neither currently have the knowledge or time to do so ) or need to make a led matrix with qmk supported led matrix drivers, due to above mentioned reasons I haven't did any RGB lightings in the keyboard except a single ws2812 led
+
+I'm trying to make a custom PCB for this keyboard (will work for all redragon 60% keyboard (ig) ), I'll update here
+
+## Bootloader
+
+Entering the bootloader:
+
+* **Physical reset button**: Briefly press the button soldered to promicro (In my case i soldered the reset button to the promicro with wires and glued in outside in front of the case)
+* **Bootmagic key at [0,0]**: Hold this key down when plugging the keyboard in. Just the single key
+* **Keycode in layout**: Press the key mapped to `QK_BOOT`. Also in `layer #3` keys `DB_TOGG` `QK_RBT` `QK_BOOT` `QK_MAKE` are present at the top right corner for debug mode, keyboard reboot, bootloader mode and qmk make (`qmk flash` if shift is held ) in the respective order to make the flasing easier.
+`QK_MAKE` will type `qmk compile -kb handwired/rd_61_qmk -km default` in the terminal and `qmk flash` will type `qmk flash -kb handwired/rd_61_qmk -km default`
+
diff --git a/keyboards/handwired/rd_61_qmk/rules.mk b/keyboards/handwired/rd_61_qmk/rules.mk
new file mode 100644
index 000000000000..6e7633bfe015
--- /dev/null
+++ b/keyboards/handwired/rd_61_qmk/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
From 5ec0482feb067d5bc1845449e6d714cd358c15af Mon Sep 17 00:00:00 2001
From: Joe Scotto <8194147+joe-scotto@users.noreply.github.com>
Date: Sat, 23 Dec 2023 16:51:38 -0500
Subject: [PATCH 20/31] [Keyboard] Add Scotto108 handwired keyboard (#22720)
Co-authored-by: jack <0x6a73@protonmail.com>
---
.../handwired/scottokeebs/scotto108/info.json | 138 ++++++++++++++++++
.../scotto108/keymaps/default/keymap.c | 29 ++++
.../handwired/scottokeebs/scotto108/readme.md | 29 ++++
.../handwired/scottokeebs/scotto108/rules.mk | 1 +
4 files changed, 197 insertions(+)
create mode 100644 keyboards/handwired/scottokeebs/scotto108/info.json
create mode 100644 keyboards/handwired/scottokeebs/scotto108/keymaps/default/keymap.c
create mode 100644 keyboards/handwired/scottokeebs/scotto108/readme.md
create mode 100644 keyboards/handwired/scottokeebs/scotto108/rules.mk
diff --git a/keyboards/handwired/scottokeebs/scotto108/info.json b/keyboards/handwired/scottokeebs/scotto108/info.json
new file mode 100644
index 000000000000..0781bb4cae34
--- /dev/null
+++ b/keyboards/handwired/scottokeebs/scotto108/info.json
@@ -0,0 +1,138 @@
+{
+ "manufacturer": "ScottoKeebs",
+ "keyboard_name": "Scotto108",
+ "maintainer": "joe-scotto",
+ "bootloader": "rp2040",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ },
+ "matrix_pins": {
+ "cols": ["GP6", "GP7", "GP8", "GP9", "GP10", "GP11", "GP12", "GP13", "GP14", "GP15", "GP29", "GP28", "GP27", "GP26", "GP22", "GP21", "GP20", "GP19", "GP18", "GP17", "GP16"],
+ "rows": ["GP0", "GP1", "GP2", "GP3", "GP4", "GP5"]
+ },
+ "processor": "RP2040",
+ "url": "https://scottokeebs.com",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x1022",
+ "vid": "0x534B"
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14.5, "y": 0},
+ {"matrix": [0, 15], "x": 15.5, "y": 0},
+ {"matrix": [0, 16], "x": 16.5, "y": 0},
+ {"matrix": [0, 17], "x": 18, "y": 0},
+ {"matrix": [0, 18], "x": 19, "y": 0},
+ {"matrix": [0, 19], "x": 20, "y": 0},
+ {"matrix": [0, 20], "x": 21, "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": [1, 4], "x": 4, "y": 1.5},
+ {"matrix": [1, 5], "x": 5, "y": 1.5},
+ {"matrix": [1, 6], "x": 6, "y": 1.5},
+ {"matrix": [1, 7], "x": 7, "y": 1.5},
+ {"matrix": [1, 8], "x": 8, "y": 1.5},
+ {"matrix": [1, 9], "x": 9, "y": 1.5},
+ {"matrix": [1, 10], "x": 10, "y": 1.5},
+ {"matrix": [1, 11], "x": 11, "y": 1.5},
+ {"matrix": [1, 12], "x": 12, "y": 1.5},
+ {"matrix": [1, 13], "x": 13, "y": 1.5},
+ {"matrix": [1, 14], "x": 14.5, "y": 1.5},
+ {"matrix": [1, 15], "x": 15.5, "y": 1.5},
+ {"matrix": [1, 16], "x": 16.5, "y": 1.5},
+ {"matrix": [1, 17], "x": 18, "y": 1.5},
+ {"matrix": [1, 18], "x": 19, "y": 1.5},
+ {"matrix": [1, 19], "x": 20, "y": 1.5},
+ {"matrix": [1, 20], "x": 21, "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},
+ {"matrix": [2, 4], "x": 4, "y": 2.5},
+ {"matrix": [2, 5], "x": 5, "y": 2.5},
+ {"matrix": [2, 6], "x": 6, "y": 2.5},
+ {"matrix": [2, 7], "x": 7, "y": 2.5},
+ {"matrix": [2, 8], "x": 8, "y": 2.5},
+ {"matrix": [2, 9], "x": 9, "y": 2.5},
+ {"matrix": [2, 10], "x": 10, "y": 2.5},
+ {"matrix": [2, 11], "x": 11, "y": 2.5},
+ {"matrix": [2, 12], "x": 12, "y": 2.5},
+ {"matrix": [2, 13], "x": 13, "y": 2.5},
+ {"matrix": [2, 14], "x": 14.5, "y": 2.5},
+ {"matrix": [2, 15], "x": 15.5, "y": 2.5},
+ {"matrix": [2, 16], "x": 16.5, "y": 2.5},
+ {"matrix": [2, 17], "x": 18, "y": 2.5},
+ {"matrix": [2, 18], "x": 19, "y": 2.5},
+ {"matrix": [2, 19], "x": 20, "y": 2.5},
+ {"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": [3, 3], "x": 3, "y": 3.5},
+ {"matrix": [3, 4], "x": 4, "y": 3.5},
+ {"matrix": [3, 5], "x": 5, "y": 3.5},
+ {"matrix": [3, 6], "x": 6, "y": 3.5},
+ {"matrix": [3, 7], "x": 7, "y": 3.5},
+ {"matrix": [3, 8], "x": 8, "y": 3.5},
+ {"matrix": [3, 9], "x": 9, "y": 3.5},
+ {"matrix": [3, 10], "x": 10, "y": 3.5},
+ {"matrix": [3, 11], "x": 11, "y": 3.5},
+ {"matrix": [3, 13], "x": 12, "y": 3.5, "w": 2},
+ {"matrix": [3, 17], "x": 18, "y": 3.5},
+ {"matrix": [3, 18], "x": 19, "y": 3.5},
+ {"matrix": [3, 19], "x": 20, "y": 3.5},
+ {"matrix": [3, 20], "x": 21, "y": 2.5, "h": 2},
+ {"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},
+ {"matrix": [4, 4], "x": 4, "y": 4.5},
+ {"matrix": [4, 5], "x": 5, "y": 4.5},
+ {"matrix": [4, 6], "x": 6, "y": 4.5},
+ {"matrix": [4, 7], "x": 7, "y": 4.5},
+ {"matrix": [4, 8], "x": 8, "y": 4.5},
+ {"matrix": [4, 9], "x": 9, "y": 4.5},
+ {"matrix": [4, 10], "x": 10, "y": 4.5},
+ {"matrix": [4, 12], "x": 11, "y": 4.5, "w": 3},
+ {"matrix": [4, 15], "x": 15.5, "y": 4.5},
+ {"matrix": [4, 17], "x": 18, "y": 4.5},
+ {"matrix": [4, 18], "x": 19, "y": 4.5},
+ {"matrix": [4, 19], "x": 20, "y": 4.5},
+ {"matrix": [5, 0], "x": 0, "y": 5.5},
+ {"matrix": [5, 1], "x": 1, "y": 5.5},
+ {"matrix": [5, 2], "x": 2, "y": 5.5},
+ {"matrix": [5, 6], "x": 3, "y": 5.5, "w": 7},
+ {"matrix": [5, 10], "x": 10, "y": 5.5},
+ {"matrix": [5, 11], "x": 11, "y": 5.5},
+ {"matrix": [5, 12], "x": 12, "y": 5.5},
+ {"matrix": [5, 13], "x": 13, "y": 5.5},
+ {"matrix": [5, 14], "x": 14.5, "y": 5.5},
+ {"matrix": [5, 15], "x": 15.5, "y": 5.5},
+ {"matrix": [5, 16], "x": 16.5, "y": 5.5},
+ {"matrix": [5, 17], "x": 18, "y": 5.5, "w": 2},
+ {"matrix": [5, 19], "x": 20, "y": 5.5},
+ {"matrix": [5, 20], "x": 21, "y": 4.5, "h": 2}
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/handwired/scottokeebs/scotto108/keymaps/default/keymap.c b/keyboards/handwired/scottokeebs/scotto108/keymaps/default/keymap.c
new file mode 100644
index 000000000000..472318e1f5bb
--- /dev/null
+++ b/keyboards/handwired/scottokeebs/scotto108/keymaps/default/keymap.c
@@ -0,0 +1,29 @@
+/*
+Copyright 2023 Joe Scotto
+
+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 .
+*/
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ KC_ESC, 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_PSCR, KC_SCRL, KC_PAUS, KC_1, KC_2, KC_3, KC_4,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQUAL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS,
+ 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, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9,
+ 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, KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT, KC_P0, KC_PDOT, KC_PENT
+ )
+};
\ No newline at end of file
diff --git a/keyboards/handwired/scottokeebs/scotto108/readme.md b/keyboards/handwired/scottokeebs/scotto108/readme.md
new file mode 100644
index 000000000000..1875adbc309d
--- /dev/null
+++ b/keyboards/handwired/scottokeebs/scotto108/readme.md
@@ -0,0 +1,29 @@
+# Scotto108
+
+![Scotto108](https://i.imgur.com/ss4BEujh.jpg)
+
+A 108-key full-sized ortholinear keyboard with a 7u spacebar and 4 macro keys above the numpad.
+
+* Keyboard Maintainer: [Joe Scotto](https://github.com/joe-scotto)
+* Hardware Supported: Raspberry Pi Pico
+* Hardware Availability: [ScottoKeebs](https://scottokeebs.com), [Amazon](https://amazon.com), [AliExpress](https://aliexpress.com)
+
+# Compiling
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/scottokeebs/scotto108:default
+
+Flashing example for this keyboard:
+
+ make handwired/scottokeebs/scotto108: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
diff --git a/keyboards/handwired/scottokeebs/scotto108/rules.mk b/keyboards/handwired/scottokeebs/scotto108/rules.mk
new file mode 100644
index 000000000000..6e7633bfe015
--- /dev/null
+++ b/keyboards/handwired/scottokeebs/scotto108/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
From 8dea03fb8a8af9926f6407cb5fc6eaab9f244993 Mon Sep 17 00:00:00 2001
From: Joe Scotto <8194147+joe-scotto@users.noreply.github.com>
Date: Sat, 23 Dec 2023 17:05:36 -0500
Subject: [PATCH 21/31] [Keyboard] Fix Scotto61 Configurator Layout (#22718)
---
keyboards/handwired/scottokeebs/scotto61/info.json | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/keyboards/handwired/scottokeebs/scotto61/info.json b/keyboards/handwired/scottokeebs/scotto61/info.json
index fe08843b978b..8614ec81ebec 100644
--- a/keyboards/handwired/scottokeebs/scotto61/info.json
+++ b/keyboards/handwired/scottokeebs/scotto61/info.json
@@ -41,7 +41,7 @@
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 13], "x": 13, "y": 0},
- {"matrix": [1, 0], "x": 0, "y": 4},
+ {"matrix": [1, 0], "x": 0, "y": 1},
{"matrix": [1, 1], "x": 1, "y": 1},
{"matrix": [1, 2], "x": 2, "y": 1},
{"matrix": [1, 3], "x": 3, "y": 1},
@@ -67,7 +67,7 @@
{"matrix": [2, 9], "x": 9, "y": 2},
{"matrix": [2, 10], "x": 10, "y": 2},
{"matrix": [2, 11], "x": 11, "y": 2},
- {"matrix": [2, 13], "x": 13, "y": 2},
+ {"matrix": [2, 13], "x": 12, "y": 2, "w": 2},
{"matrix": [3, 0], "x": 0, "y": 3},
{"matrix": [3, 1], "x": 1, "y": 3},
{"matrix": [3, 2], "x": 2, "y": 3},
@@ -79,11 +79,11 @@
{"matrix": [3, 8], "x": 8, "y": 3},
{"matrix": [3, 9], "x": 9, "y": 3},
{"matrix": [3, 10], "x": 10, "y": 3},
- {"matrix": [3, 12], "x": 12, "y": 3},
+ {"matrix": [3, 12], "x": 11, "y": 3, "w": 3},
{"matrix": [4, 0], "x": 0, "y": 4},
{"matrix": [4, 1], "x": 1, "y": 4},
{"matrix": [4, 2], "x": 2, "y": 4},
- {"matrix": [4, 6], "x": 6, "y": 4},
+ {"matrix": [4, 6], "x": 3, "y": 4, "w": 7},
{"matrix": [4, 10], "x": 10, "y": 4},
{"matrix": [4, 11], "x": 11, "y": 4},
{"matrix": [4, 12], "x": 12, "y": 4},
From be773c4463725dade30adf286446f0fd3dc48c9b Mon Sep 17 00:00:00 2001
From: yuezp <49514776+LXF-YZP@users.noreply.github.com>
Date: Sun, 24 Dec 2023 07:45:12 +0800
Subject: [PATCH 22/31] [Keyboard] Add kafka68 (#22684)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: “yuezp” <“yuezpchn@126.com”>
---
keyboards/meetlab/kafka68/info.json | 102 ++++++++++++++++++
.../meetlab/kafka68/keymaps/default/keymap.c | 35 ++++++
.../meetlab/kafka68/keymaps/via/keymap.c | 35 ++++++
.../meetlab/kafka68/keymaps/via/rules.mk | 1 +
keyboards/meetlab/kafka68/matrix_diagram.md | 16 +++
keyboards/meetlab/kafka68/readme.md | 26 +++++
keyboards/meetlab/kafka68/rules.mk | 1 +
7 files changed, 216 insertions(+)
create mode 100644 keyboards/meetlab/kafka68/info.json
create mode 100644 keyboards/meetlab/kafka68/keymaps/default/keymap.c
create mode 100644 keyboards/meetlab/kafka68/keymaps/via/keymap.c
create mode 100644 keyboards/meetlab/kafka68/keymaps/via/rules.mk
create mode 100644 keyboards/meetlab/kafka68/matrix_diagram.md
create mode 100644 keyboards/meetlab/kafka68/readme.md
create mode 100644 keyboards/meetlab/kafka68/rules.mk
diff --git a/keyboards/meetlab/kafka68/info.json b/keyboards/meetlab/kafka68/info.json
new file mode 100644
index 000000000000..3836edc3c9a7
--- /dev/null
+++ b/keyboards/meetlab/kafka68/info.json
@@ -0,0 +1,102 @@
+{
+ "manufacturer": "lucky_studio",
+ "keyboard_name": "kafka68",
+ "maintainer": "yuezp",
+ "development_board": "bluepill",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true
+ },
+ "matrix_pins": {
+ "cols": ["A10", "B7", "B6", "B5", "B4", "B3", "A15", "B0", "A7", "A6", "A5", "A4", "A3", "B1", "B10", "B11"],
+ "rows": ["B13", "B14", "B15", "A8", "A9"]
+ },
+ "url": "",
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0xAA07",
+ "vid": "0xBB07"
+ },
+ "community_layouts": ["68_ansi"],
+ "layouts": {
+ "LAYOUT_68_ansi": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0, "w": 2},
+ {"matrix": [0, 14], "x": 15.25, "y": 0},
+ {"matrix": [0, 15], "x": 16.25, "y": 0},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [1, 13], "x": 12.5, "y": 1, "w": 1.5},
+ {"matrix": [1, 14], "x": 15.25, "y": 1},
+ {"matrix": [1, 15], "x": 16.25, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+ {"matrix": [3, 1], "x": 2.25, "y": 3},
+ {"matrix": [3, 2], "x": 3.25, "y": 3},
+ {"matrix": [3, 3], "x": 4.25, "y": 3},
+ {"matrix": [3, 4], "x": 5.25, "y": 3},
+ {"matrix": [3, 5], "x": 6.25, "y": 3},
+ {"matrix": [3, 6], "x": 7.25, "y": 3},
+ {"matrix": [3, 7], "x": 8.25, "y": 3},
+ {"matrix": [3, 8], "x": 9.25, "y": 3},
+ {"matrix": [3, 9], "x": 10.25, "y": 3},
+ {"matrix": [3, 10], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75},
+ {"matrix": [3, 14], "x": 15.25, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25},
+ {"matrix": [4, 5], "x": 3.75, "y": 4, "w": 6.25},
+ {"matrix": [4, 9], "x": 10, "y": 4, "w": 1.25},
+ {"matrix": [4, 10], "x": 11.25, "y": 4, "w": 1.25},
+ {"matrix": [4, 11], "x": 12.5, "y": 4, "w": 1.25},
+ {"matrix": [4, 13], "x": 14.25, "y": 4},
+ {"matrix": [4, 14], "x": 15.25, "y": 4},
+ {"matrix": [4, 15], "x": 16.25, "y": 4}
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/meetlab/kafka68/keymaps/default/keymap.c b/keyboards/meetlab/kafka68/keymaps/default/keymap.c
new file mode 100644
index 000000000000..f4968692728e
--- /dev/null
+++ b/keyboards/meetlab/kafka68/keymaps/default/keymap.c
@@ -0,0 +1,35 @@
+/* Copyright 2022 LXF-YZP(yuezp)
+ *
+ * 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 .
+ */
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+[0]=LAYOUT_68_ansi(
+ KC_GRV, 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_INS, KC_HOME,
+ 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, KC_DEL, KC_END,
+ 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,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_LEFT, KC_DOWN, KC_RGHT),
+
+[1]=LAYOUT_68_ansi(
+ KC_TRNS, 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_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, 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,
+ 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, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS)
+
+};
diff --git a/keyboards/meetlab/kafka68/keymaps/via/keymap.c b/keyboards/meetlab/kafka68/keymaps/via/keymap.c
new file mode 100644
index 000000000000..f4968692728e
--- /dev/null
+++ b/keyboards/meetlab/kafka68/keymaps/via/keymap.c
@@ -0,0 +1,35 @@
+/* Copyright 2022 LXF-YZP(yuezp)
+ *
+ * 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 .
+ */
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+[0]=LAYOUT_68_ansi(
+ KC_GRV, 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_INS, KC_HOME,
+ 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, KC_DEL, KC_END,
+ 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,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_LEFT, KC_DOWN, KC_RGHT),
+
+[1]=LAYOUT_68_ansi(
+ KC_TRNS, 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_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, 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,
+ 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, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS)
+
+};
diff --git a/keyboards/meetlab/kafka68/keymaps/via/rules.mk b/keyboards/meetlab/kafka68/keymaps/via/rules.mk
new file mode 100644
index 000000000000..036bd6d1c3ec
--- /dev/null
+++ b/keyboards/meetlab/kafka68/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/meetlab/kafka68/matrix_diagram.md b/keyboards/meetlab/kafka68/matrix_diagram.md
new file mode 100644
index 000000000000..df7d6369186b
--- /dev/null
+++ b/keyboards/meetlab/kafka68/matrix_diagram.md
@@ -0,0 +1,16 @@
+# Matrix Diagram for kafka68
+
+```
+┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐┌───┬───┐
+│00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0A │0B │0C │0D ││0E │0F │
+├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤├───┼───┤
+│10 │11 │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │1D ││1E │1F │
+├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤└───┴───┘
+│20 │21 │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │2C │
+├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤┌───┐
+│30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3A │3C ││3E │
+├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬───┬──┬──┴┼───┼───┐
+│40 │41 │42 │45 │49 │4A │4B │ │4D │4E │4F │
+└────┴────┴────┴────────────────────────┴────┴────┴───┘ └───┴───┴───┘
+
+```
diff --git a/keyboards/meetlab/kafka68/readme.md b/keyboards/meetlab/kafka68/readme.md
new file mode 100644
index 000000000000..ac8742a10165
--- /dev/null
+++ b/keyboards/meetlab/kafka68/readme.md
@@ -0,0 +1,26 @@
+# kafka68 - PCB
+
+![kafka68](https://i.imgur.com/5w8fESLh.jpg)
+
+A 68 key keyboard made by Lucky, based on hhkb layout.
+
+* Keyboard Maintainer: https://github.com/LXF-YZP
+* Hardware Supported: Lucky PCB
+
+Make example for this keyboard (after setting up your build environment):
+
+ make meetlab/kafka68:default
+
+Flashing example for this keyboard:
+
+ make meetlab/kafka68: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
\ No newline at end of file
diff --git a/keyboards/meetlab/kafka68/rules.mk b/keyboards/meetlab/kafka68/rules.mk
new file mode 100644
index 000000000000..7ff128fa692e
--- /dev/null
+++ b/keyboards/meetlab/kafka68/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
\ No newline at end of file
From 3746cf83c923065c923a8a55d374ff11bb40ba5e Mon Sep 17 00:00:00 2001
From: peepeetee <43021794+peepeetee@users.noreply.github.com>
Date: Sat, 23 Dec 2023 17:49:37 -0600
Subject: [PATCH 23/31] Add Momokai Aurora Image (#22728)
Co-authored-by: Duncan Sutherland
---
keyboards/momokai/aurora/readme.md | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/keyboards/momokai/aurora/readme.md b/keyboards/momokai/aurora/readme.md
index e8ab8f141b62..0368b21f8677 100644
--- a/keyboards/momokai/aurora/readme.md
+++ b/keyboards/momokai/aurora/readme.md
@@ -1,12 +1,14 @@
# Momokai Aurora
+![Momokai Aurora](https://i.imgur.com/A7iHqzAh.jpg)
+
https://www.momokai.com/pages/aurora
A 6 key keypad with a rotary encoder
* Keyboard Maintainer: [peepeetee](https://github.com/peepeetee)
* Hardware Supported: Aurora
-* Hardware Availability: [Momokai](https://www.momokai.com/)
+* Hardware Availability: [Momokai](https://www.momokai.com/pages/aurora)
Make example for this keyboard (after setting up your build environment):
From 7a8d099e9edb1017446cb7369ff48a560c99ebc1 Mon Sep 17 00:00:00 2001
From: Joy Lee <986984630@qq.com>
Date: Sun, 24 Dec 2023 11:01:42 +0800
Subject: [PATCH 24/31] [Keyboard] Add darmoshark k3 (#21980)
Co-authored-by: Joel Challis
Co-authored-by: Duncan Sutherland
Co-authored-by: Proceee
---
keyboards/darmoshark/k3/config.h | 12 ++
keyboards/darmoshark/k3/halconf.h | 10 +
keyboards/darmoshark/k3/info.json | 183 ++++++++++++++++++
.../darmoshark/k3/keymaps/default/keymap.c | 25 +++
keyboards/darmoshark/k3/keymaps/via/config.h | 6 +
keyboards/darmoshark/k3/keymaps/via/keymap.c | 25 +++
keyboards/darmoshark/k3/keymaps/via/rules.mk | 1 +
keyboards/darmoshark/k3/mcuconf.h | 9 +
keyboards/darmoshark/k3/readme.md | 23 +++
keyboards/darmoshark/k3/rules.mk | 1 +
10 files changed, 295 insertions(+)
create mode 100644 keyboards/darmoshark/k3/config.h
create mode 100644 keyboards/darmoshark/k3/halconf.h
create mode 100644 keyboards/darmoshark/k3/info.json
create mode 100644 keyboards/darmoshark/k3/keymaps/default/keymap.c
create mode 100644 keyboards/darmoshark/k3/keymaps/via/config.h
create mode 100644 keyboards/darmoshark/k3/keymaps/via/keymap.c
create mode 100644 keyboards/darmoshark/k3/keymaps/via/rules.mk
create mode 100644 keyboards/darmoshark/k3/mcuconf.h
create mode 100644 keyboards/darmoshark/k3/readme.md
create mode 100644 keyboards/darmoshark/k3/rules.mk
diff --git a/keyboards/darmoshark/k3/config.h b/keyboards/darmoshark/k3/config.h
new file mode 100644
index 000000000000..c3cf83a9849c
--- /dev/null
+++ b/keyboards/darmoshark/k3/config.h
@@ -0,0 +1,12 @@
+// Copyright 2023 Proceee
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+/* SPI Config for spi flash*/
+#define SPI_DRIVER SPIDQ
+#define SPI_SCK_PIN B3
+#define SPI_MOSI_PIN B5
+#define SPI_MISO_PIN B4
+#define SPI_MOSI_PAL_MODE 5
+
+#define EXTERNAL_FLASH_SPI_SLAVE_SELECT_PIN C12
diff --git a/keyboards/darmoshark/k3/halconf.h b/keyboards/darmoshark/k3/halconf.h
new file mode 100644
index 000000000000..b6a606056a1a
--- /dev/null
+++ b/keyboards/darmoshark/k3/halconf.h
@@ -0,0 +1,10 @@
+// Copyright 2023 Proceee
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define HAL_USE_SPI TRUE
+#define SPI_USE_WAIT TRUE
+#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
+
+#include_next
diff --git a/keyboards/darmoshark/k3/info.json b/keyboards/darmoshark/k3/info.json
new file mode 100644
index 000000000000..bca494f35cdc
--- /dev/null
+++ b/keyboards/darmoshark/k3/info.json
@@ -0,0 +1,183 @@
+{
+ "manufacturer": "Darmoshark",
+ "keyboard_name": "K3 QMK",
+ "maintainer": "Proceee",
+ "url": "",
+ "processor": "WB32FQ95",
+ "bootloader": "wb32-dfu",
+ "usb": {
+ "device_version": "1.0.0",
+ "vid": "0xC001",
+ "pid": "0x3667",
+ "suspend_wakeup_delay": 1000
+ },
+ "diode_direction": "ROW2COL",
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgb_matrix": true
+ },
+ "eeprom": {
+ "driver": "wear_leveling",
+ "wear_leveling": {
+ "driver": "spi_flash",
+ "backing_size": 4096
+ }
+ },
+ "matrix_pins": {
+ "rows": ["B13", "A1", "A2", "A3", "A4", "B7"],
+ "cols": ["B1", "C7", "C13", "B9"]
+ },
+ "indicators": {
+ "num_lock": "C5",
+ "on_state": 1
+ },
+ "ws2812": {
+ "pin": "A8"
+ },
+ "rgb_matrix": {
+ "driver": "ws2812",
+ "default":{
+ "val": 80
+ },
+ "sleep": true,
+ "center_point": [24, 32],
+ "max_brightness": 140,
+ "animations": {
+ "solid_color": true,
+ "alphas_mods": true,
+ "gradient_up_down": true,
+ "gradient_left_right": true,
+ "breathing": true,
+ "band_sat": true,
+ "band_val": true,
+ "band_pinwheel_sat": true,
+ "band_pinwheel_val": true,
+ "band_spiral_sat": true,
+ "band_spiral_val": true,
+ "cycle_all": true,
+ "cycle_left_right": true,
+ "cycle_up_down": true,
+ "cycle_out_in": true,
+ "cycle_out_in_dual": true,
+ "rainbow_moving_chevron": true,
+ "cycle_pinwheel": true,
+ "cycle_spiral": true,
+ "dual_beacon": true,
+ "rainbow_beacon": true,
+ "rainbow_pinwheels": true,
+ "raindrops": true,
+ "jellybean_raindrops": true,
+ "hue_breathing": true,
+ "hue_pendulum": true,
+ "hue_wave": true,
+ "pixel_fractal": true,
+ "pixel_flow": true,
+ "pixel_rain": true,
+ "typing_heatmap": true,
+ "digital_rain": true,
+ "solid_reactive_simple": true,
+ "solid_reactive": true,
+ "solid_reactive_wide": true,
+ "solid_reactive_multiwide": true,
+ "solid_reactive_cross": true,
+ "solid_reactive_multicross": true,
+ "solid_reactive_nexus": true,
+ "solid_reactive_multinexus": true,
+ "splash": true,
+ "multisplash": true,
+ "solid_splash": true,
+ "solid_multisplash": true
+ },
+ "layout": [
+ { "flags": 4, "matrix":[0,2], "x": 32, "y": 0},
+ { "flags": 4, "matrix":[0,3], "x": 48, "y": 0},
+
+ { "flags": 4, "matrix":[1,3], "x": 48, "y": 13},
+ { "flags": 4, "matrix":[2,3], "x": 48, "y": 26},
+ { "flags": 4, "matrix":[4,3], "x": 48, "y": 51},
+
+ { "flags": 4, "matrix":[5,2], "x": 48, "y": 64},
+ { "flags": 4, "matrix":[4,2], "x": 32, "y": 51},
+ { "flags": 4, "matrix":[3,2], "x": 32, "y": 38},
+ { "flags": 4, "matrix":[2,2], "x": 32, "y": 26},
+ { "flags": 4, "matrix":[1,2], "x": 32, "y": 13},
+
+ { "flags": 4, "matrix":[1,1], "x": 16, "y": 13},
+ { "flags": 4, "matrix":[2,1], "x": 16, "y": 26},
+ { "flags": 4, "matrix":[3,1], "x": 16, "y": 38},
+ { "flags": 4, "matrix":[4,1], "x": 16, "y": 51},
+
+ { "flags": 4, "matrix":[5,1], "x": 0, "y": 64},
+ { "flags": 4, "matrix":[4,0], "x": 0, "y": 51},
+ { "flags": 4, "matrix":[3,0], "x": 0, "y": 38},
+ { "flags": 4, "matrix":[2,0], "x": 0, "y": 26},
+ { "flags": 4, "matrix":[1,0], "x": 0, "y": 13},
+ { "flags": 4, "matrix":[0,0], "x": 0, "y": 0},
+
+ { "flags": 4, "matrix":[0,1], "x": 16, "y": 0},
+
+ { "flags": 4, "x": 224, "y": 64},
+ { "flags": 4, "x": 224, "y": 64},
+ { "flags": 4, "x": 224, "y": 64},
+ { "flags": 4, "x": 224, "y": 64},
+ { "flags": 4, "x": 224, "y": 64},
+ { "flags": 4, "x": 224, "y": 64},
+ { "flags": 4, "x": 224, "y": 64},
+ { "flags": 4, "x": 224, "y": 64},
+ { "flags": 4, "x": 224, "y": 64},
+ { "flags": 4, "x": 224, "y": 64},
+ { "flags": 4, "x": 224, "y": 64},
+ { "flags": 4, "x": 224, "y": 64},
+
+ { "flags": 4, "x": 224, "y": 64},
+ { "flags": 4, "x": 224, "y": 64},
+ { "flags": 4, "x": 224, "y": 64},
+ { "flags": 4, "x": 224, "y": 64},
+ { "flags": 4, "x": 224, "y": 64},
+ { "flags": 4, "x": 224, "y": 64},
+ { "flags": 4, "x": 224, "y": 64},
+ { "flags": 4, "x": 224, "y": 64},
+ { "flags": 4, "x": 224, "y": 64},
+ { "flags": 4, "x": 224, "y": 64},
+ { "flags": 4, "x": 224, "y": 64}
+ ]
+ },
+ "community_layouts": ["numpad_6x4"],
+ "layouts": {
+ "LAYOUT_numpad_6x4": {
+ "layout": [
+ { "matrix":[0,0], "x": 0, "y": 0 },
+ { "matrix":[0,1], "x": 1, "y": 0 },
+ { "matrix":[0,2], "x": 2, "y": 0 },
+ { "matrix":[0,3], "x": 3, "y": 0 },
+
+ { "matrix":[1,0], "x": 0, "y": 1 },
+ { "matrix":[1,1], "x": 1, "y": 1 },
+ { "matrix":[1,2], "x": 2, "y": 1 },
+ { "matrix":[1,3], "x": 3, "y": 1 },
+
+ { "matrix":[2,0], "x": 0, "y": 2 },
+ { "matrix":[2,1], "x": 1, "y": 2 },
+ { "matrix":[2,2], "x": 2, "y": 2 },
+
+ { "matrix":[3,0], "x": 0, "y": 3 },
+ { "matrix":[3,1], "x": 1, "y": 3 },
+ { "matrix":[3,2], "x": 2, "y": 3 },
+ { "matrix":[2,3], "x": 3, "y": 2, "h": 2 },
+
+ { "matrix":[4,0], "x": 0, "y": 4 },
+ { "matrix":[4,1], "x": 1, "y": 4 },
+ { "matrix":[4,2], "x": 2, "y": 4 },
+
+ { "matrix":[5,1], "x": 0, "y": 5, "w": 2 },
+ { "matrix":[5,2], "x": 2, "y": 5 },
+ { "matrix":[4,3], "x": 3, "y": 4, "h": 2 }
+ ]
+ }
+ }
+}
diff --git a/keyboards/darmoshark/k3/keymaps/default/keymap.c b/keyboards/darmoshark/k3/keymaps/default/keymap.c
new file mode 100644
index 000000000000..5c49cab1a3e3
--- /dev/null
+++ b/keyboards/darmoshark/k3/keymaps/default/keymap.c
@@ -0,0 +1,25 @@
+// Copyright 2023 Proceee
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT_numpad_6x4(
+ KC_ESC, KC_TAB, KC_BSPC, MO(1),
+ KC_NUM, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_P7, KC_P8, KC_P9,
+ KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_P1, KC_P2, KC_P3,
+ KC_P0, KC_PDOT, KC_PENT
+ ),
+
+ [1] = LAYOUT_numpad_6x4(
+ EE_CLR, _______, RGB_MOD, _______,
+ KC_CALC, _______, _______, RGB_VAD,
+ _______, RGB_SPI, _______,
+ _______, _______, _______, RGB_VAI,
+ _______, RGB_SPD, _______,
+ _______, RGB_TOG, _______
+ )
+};
diff --git a/keyboards/darmoshark/k3/keymaps/via/config.h b/keyboards/darmoshark/k3/keymaps/via/config.h
new file mode 100644
index 000000000000..5e18cd011646
--- /dev/null
+++ b/keyboards/darmoshark/k3/keymaps/via/config.h
@@ -0,0 +1,6 @@
+// Copyright 2023 JoyLee (@itarze)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define DYNAMIC_KEYMAP_LAYER_COUNT 6
diff --git a/keyboards/darmoshark/k3/keymaps/via/keymap.c b/keyboards/darmoshark/k3/keymaps/via/keymap.c
new file mode 100644
index 000000000000..5c49cab1a3e3
--- /dev/null
+++ b/keyboards/darmoshark/k3/keymaps/via/keymap.c
@@ -0,0 +1,25 @@
+// Copyright 2023 Proceee
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT_numpad_6x4(
+ KC_ESC, KC_TAB, KC_BSPC, MO(1),
+ KC_NUM, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_P7, KC_P8, KC_P9,
+ KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_P1, KC_P2, KC_P3,
+ KC_P0, KC_PDOT, KC_PENT
+ ),
+
+ [1] = LAYOUT_numpad_6x4(
+ EE_CLR, _______, RGB_MOD, _______,
+ KC_CALC, _______, _______, RGB_VAD,
+ _______, RGB_SPI, _______,
+ _______, _______, _______, RGB_VAI,
+ _______, RGB_SPD, _______,
+ _______, RGB_TOG, _______
+ )
+};
diff --git a/keyboards/darmoshark/k3/keymaps/via/rules.mk b/keyboards/darmoshark/k3/keymaps/via/rules.mk
new file mode 100644
index 000000000000..1e5b99807cb7
--- /dev/null
+++ b/keyboards/darmoshark/k3/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/darmoshark/k3/mcuconf.h b/keyboards/darmoshark/k3/mcuconf.h
new file mode 100644
index 000000000000..182db617aa83
--- /dev/null
+++ b/keyboards/darmoshark/k3/mcuconf.h
@@ -0,0 +1,9 @@
+// Copyright 2023 Proceee
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include_next
+
+#undef WB32_SPI_USE_QSPI
+#define WB32_SPI_USE_QSPI TRUE
diff --git a/keyboards/darmoshark/k3/readme.md b/keyboards/darmoshark/k3/readme.md
new file mode 100644
index 000000000000..aecfe659357f
--- /dev/null
+++ b/keyboards/darmoshark/k3/readme.md
@@ -0,0 +1,23 @@
+# K3 QMK
+
+* Keyboard Maintainer: [Proceee](https://github.com/Proceee)
+* Hardware Supported: [Darmoshark](http://www.Darmoshark.cn)
+* Hardware Availability: [Darmoshark](http://www.Darmoshark.cn)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make darmoshark/k3:default
+
+Flashing example for this keyboard:
+
+ make darmoshark/k3: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
diff --git a/keyboards/darmoshark/k3/rules.mk b/keyboards/darmoshark/k3/rules.mk
new file mode 100644
index 000000000000..6e7633bfe015
--- /dev/null
+++ b/keyboards/darmoshark/k3/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
From a7d639160c0d0d646df35dbb276d45a0a900b5a2 Mon Sep 17 00:00:00 2001
From: khchen2004 <148961563+khchen2004@users.noreply.github.com>
Date: Sun, 24 Dec 2023 11:34:17 +0800
Subject: [PATCH 25/31] [Keyboard] add scorpio pcb (#22732)
---
keyboards/kwstudio/scorpio/config.h | 20 ++
keyboards/kwstudio/scorpio/info.json | 199 ++++++++++++++++++
.../kwstudio/scorpio/keymaps/default/keymap.c | 34 +++
.../kwstudio/scorpio/keymaps/via/keymap.c | 34 +++
.../kwstudio/scorpio/keymaps/via/rules.mk | 1 +
keyboards/kwstudio/scorpio/readme.md | 25 +++
keyboards/kwstudio/scorpio/rules.mk | 1 +
7 files changed, 314 insertions(+)
create mode 100644 keyboards/kwstudio/scorpio/config.h
create mode 100644 keyboards/kwstudio/scorpio/info.json
create mode 100644 keyboards/kwstudio/scorpio/keymaps/default/keymap.c
create mode 100644 keyboards/kwstudio/scorpio/keymaps/via/keymap.c
create mode 100644 keyboards/kwstudio/scorpio/keymaps/via/rules.mk
create mode 100644 keyboards/kwstudio/scorpio/readme.md
create mode 100644 keyboards/kwstudio/scorpio/rules.mk
diff --git a/keyboards/kwstudio/scorpio/config.h b/keyboards/kwstudio/scorpio/config.h
new file mode 100644
index 000000000000..2f136dd0011f
--- /dev/null
+++ b/keyboards/kwstudio/scorpio/config.h
@@ -0,0 +1,20 @@
+/* Copyright 2023 kwstudio
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#define WS2812_PIO_USE_PIO1
+
diff --git a/keyboards/kwstudio/scorpio/info.json b/keyboards/kwstudio/scorpio/info.json
new file mode 100644
index 000000000000..82262afb1be9
--- /dev/null
+++ b/keyboards/kwstudio/scorpio/info.json
@@ -0,0 +1,199 @@
+{
+ "manufacturer": "kwstudio",
+ "keyboard_name": "Scorpio",
+ "maintainer": "kwstudio",
+ "bootloader": "rp2040",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgblight": true
+ },
+ "indicators": {
+ "caps_lock": "GP24"
+ },
+ "matrix_pins": {
+ "cols": ["GP23", "GP22", "GP21", "GP20", "GP19", "GP18", "GP17", "GP7", "GP6", "GP5", "GP13", "GP12", "GP11", "GP10", "GP9", "GP8"],
+ "rows": ["GP1", "GP0", "GP16", "GP15", "GP14"]
+ },
+ "processor": "RP2040",
+ "rgblight": {
+ "animations": {
+ "alternating": true,
+ "breathing": true,
+ "christmas": true,
+ "knight": true,
+ "rainbow_mood": true,
+ "rainbow_swirl": true,
+ "rgb_test": true,
+ "snake": true,
+ "static_gradient": true,
+ "twinkle": true
+ },
+ "led_count": 9,
+ "sleep": true
+ },
+ "url": "",
+ "usb": {
+ "device_version": "0.0.1",
+ "pid": "0x0002",
+ "vid": "0x4B53"
+ },
+ "ws2812": {
+ "driver": "vendor",
+ "pin": "GP4"
+ },
+ "layout_aliases": {
+ "LAYOUT_all": "LAYOUT_65_ansi_blocker_tsangan_wkl_split_bs"
+ },
+ "layouts": {
+ "LAYOUT_65_ansi_blocker_tsangan_wkl": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0, "w": 2},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+ {"matrix": [1, 15], "x": 15, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
+ {"matrix": [2, 15], "x": 15, "y": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+ {"matrix": [3, 1], "x": 2.25, "y": 3},
+ {"matrix": [3, 2], "x": 3.25, "y": 3},
+ {"matrix": [3, 3], "x": 4.25, "y": 3},
+ {"matrix": [3, 4], "x": 5.25, "y": 3},
+ {"matrix": [3, 5], "x": 6.25, "y": 3},
+ {"matrix": [3, 6], "x": 7.25, "y": 3},
+ {"matrix": [3, 7], "x": 8.25, "y": 3},
+ {"matrix": [3, 8], "x": 9.25, "y": 3},
+ {"matrix": [3, 9], "x": 10.25, "y": 3},
+ {"matrix": [3, 10], "x": 11.25, "y": 3},
+ {"matrix": [3, 11], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 14], "x": 14, "y": 3},
+ {"matrix": [3, 15], "x": 15, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 2], "x": 2.25, "y": 4, "w": 1.5},
+ {"matrix": [4, 5], "x": 3.75, "y": 4, "w": 7},
+ {"matrix": [4, 10], "x": 10.75, "y": 4, "w": 1.5},
+ {"matrix": [4, 13], "x": 13, "y": 4},
+ {"matrix": [4, 14], "x": 14, "y": 4},
+ {"matrix": [4, 15], "x": 15, "y": 4}
+ ]
+ },
+ "LAYOUT_65_ansi_blocker_tsangan_wkl_split_bs": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+ {"matrix": [1, 15], "x": 15, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
+ {"matrix": [2, 15], "x": 15, "y": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+ {"matrix": [3, 1], "x": 2.25, "y": 3},
+ {"matrix": [3, 2], "x": 3.25, "y": 3},
+ {"matrix": [3, 3], "x": 4.25, "y": 3},
+ {"matrix": [3, 4], "x": 5.25, "y": 3},
+ {"matrix": [3, 5], "x": 6.25, "y": 3},
+ {"matrix": [3, 6], "x": 7.25, "y": 3},
+ {"matrix": [3, 7], "x": 8.25, "y": 3},
+ {"matrix": [3, 8], "x": 9.25, "y": 3},
+ {"matrix": [3, 9], "x": 10.25, "y": 3},
+ {"matrix": [3, 10], "x": 11.25, "y": 3},
+ {"matrix": [3, 11], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 14], "x": 14, "y": 3},
+ {"matrix": [3, 15], "x": 15, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 2], "x": 2.25, "y": 4, "w": 1.5},
+ {"matrix": [4, 5], "x": 3.75, "y": 4, "w": 7},
+ {"matrix": [4, 10], "x": 10.75, "y": 4, "w": 1.5},
+ {"matrix": [4, 13], "x": 13, "y": 4},
+ {"matrix": [4, 14], "x": 14, "y": 4},
+ {"matrix": [4, 15], "x": 15, "y": 4}
+ ]
+ }
+ }
+}
+
diff --git a/keyboards/kwstudio/scorpio/keymaps/default/keymap.c b/keyboards/kwstudio/scorpio/keymaps/default/keymap.c
new file mode 100644
index 000000000000..8061c4935021
--- /dev/null
+++ b/keyboards/kwstudio/scorpio/keymaps/default/keymap.c
@@ -0,0 +1,34 @@
+/* Copyright 2023 kwstudio
+ *
+ * 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 .
+ */
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+[0] = LAYOUT_all(
+ KC_ESC, 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_SPC,
+ 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, KC_PGUP,
+ 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, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, MO(1),
+ KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT),
+
+[1] = LAYOUT_all(
+ KC_TRNS, 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_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, 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, 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, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS)
+};
diff --git a/keyboards/kwstudio/scorpio/keymaps/via/keymap.c b/keyboards/kwstudio/scorpio/keymaps/via/keymap.c
new file mode 100644
index 000000000000..8061c4935021
--- /dev/null
+++ b/keyboards/kwstudio/scorpio/keymaps/via/keymap.c
@@ -0,0 +1,34 @@
+/* Copyright 2023 kwstudio
+ *
+ * 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 .
+ */
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+[0] = LAYOUT_all(
+ KC_ESC, 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_SPC,
+ 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, KC_PGUP,
+ 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, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, MO(1),
+ KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT),
+
+[1] = LAYOUT_all(
+ KC_TRNS, 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_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, 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, 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, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS)
+};
diff --git a/keyboards/kwstudio/scorpio/keymaps/via/rules.mk b/keyboards/kwstudio/scorpio/keymaps/via/rules.mk
new file mode 100644
index 000000000000..1e5b99807cb7
--- /dev/null
+++ b/keyboards/kwstudio/scorpio/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/kwstudio/scorpio/readme.md b/keyboards/kwstudio/scorpio/readme.md
new file mode 100644
index 000000000000..fcaea8cf9195
--- /dev/null
+++ b/keyboards/kwstudio/scorpio/readme.md
@@ -0,0 +1,25 @@
+# Scorpio
+
+![Scorpio](https://i.imgur.com/ikAlEQMh.jpeg)
+
+* Keyboard Maintainer: [khchen](https://github.com/khchen2004)
+* Hardware Supported: Scorpio PCB
+* Hardware Availability: Private GB
+
+Make example for this keyboard (after setting up your build environment):
+
+ make kwstudio/scorpio:default
+
+Flashing example for this keyboard:
+
+ make kwstudio/scorpio: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
diff --git a/keyboards/kwstudio/scorpio/rules.mk b/keyboards/kwstudio/scorpio/rules.mk
new file mode 100644
index 000000000000..6e7633bfe015
--- /dev/null
+++ b/keyboards/kwstudio/scorpio/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
From ab5972df13bbf5fbc9eb642d250ff9f2d82bf1e0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=E1=BA=AFn?= <59417802+MaiTheSan@users.noreply.github.com>
Date: Sun, 24 Dec 2023 13:30:54 +0700
Subject: [PATCH 26/31] [Keyboard] Add Nuxros RE65 (#22078)
Co-authored-by: jack <0x6a73@protonmail.com>
Co-authored-by: Duncan Sutherland
Co-authored-by: Drashna Jaelre
---
keyboards/sawnsprojects/re65/info.json | 370 ++++++++++++++++++
.../re65/keymaps/default/keymap.c | 57 +++
.../re65/keymaps/default/rules.mk | 1 +
.../sawnsprojects/re65/keymaps/via/keymap.c | 57 +++
.../sawnsprojects/re65/keymaps/via/rules.mk | 2 +
keyboards/sawnsprojects/re65/readme.md | 26 ++
keyboards/sawnsprojects/re65/rules.mk | 1 +
7 files changed, 514 insertions(+)
create mode 100644 keyboards/sawnsprojects/re65/info.json
create mode 100644 keyboards/sawnsprojects/re65/keymaps/default/keymap.c
create mode 100644 keyboards/sawnsprojects/re65/keymaps/default/rules.mk
create mode 100644 keyboards/sawnsprojects/re65/keymaps/via/keymap.c
create mode 100644 keyboards/sawnsprojects/re65/keymaps/via/rules.mk
create mode 100644 keyboards/sawnsprojects/re65/readme.md
create mode 100644 keyboards/sawnsprojects/re65/rules.mk
diff --git a/keyboards/sawnsprojects/re65/info.json b/keyboards/sawnsprojects/re65/info.json
new file mode 100644
index 000000000000..45e874db6d54
--- /dev/null
+++ b/keyboards/sawnsprojects/re65/info.json
@@ -0,0 +1,370 @@
+{
+ "keyboard_name": "RE65",
+ "maintainer": "Salane",
+ "manufacturer": "Mai The San",
+ "url": "",
+ "processor": "RP2040",
+ "bootloader": "rp2040",
+ "usb": {
+ "vid": "0x534C",
+ "pid": "0x0C65",
+ "device_version": "0.0.1"
+ },
+ "features": {
+ "bootmagic": true,
+ "mousekey": true,
+ "extrakey": true,
+ "console": false,
+ "command": false,
+ "nkro": true,
+ "rgblight": true,
+ "encoder": true
+ },
+ "diode_direction": "COL2ROW",
+ "matrix_pins": {
+ "rows": ["GP27", "GP26", "GP25", "GP29", "GP4"],
+ "cols": ["GP20", "GP19", "GP18", "GP24", "GP23", "GP22", "GP17", "GP28", "GP2", "GP3", "GP12", "GP11", "GP10", "GP9", "GP8"]
+ },
+ "encoder": {
+ "rotary": [
+ {"pin_a": "GP5", "pin_b": "GP6"}
+ ]
+ },
+ "rgblight": {
+ "led_count": 32,
+ "saturation_steps": 8,
+ "brightness_steps": 8,
+ "sleep": true,
+ "animations": {
+ "alternating": true,
+ "breathing": true,
+ "christmas": true,
+ "knight": true,
+ "rainbow_mood": true,
+ "rainbow_swirl": true,
+ "rgb_test": true,
+ "snake": true,
+ "static_gradient": true,
+ "twinkle": true
+ }
+ },
+ "ws2812": {
+ "pin": "GP21",
+ "driver": "vendor"
+ },
+ "community_layouts": ["65_ansi_blocker","65_ansi_blocker_split_bs","65_ansi_blocker_tsangan","65_ansi_blocker_tsangan_split_bs"],
+ "layouts": {
+ "LAYOUT_65_ansi_blocker_split_bs": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [2, 13], "x": 14, "y": 0},
+ {"matrix": [0, 14], "x": 15, "y": 0},
+
+ {"matrix": [1, 0], "w": 1.5, "x": 0, "y": 1},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [1, 13], "w": 1.5, "x": 13.5, "y": 1},
+ {"matrix": [1, 14], "x": 15, "y": 1},
+
+ {"matrix": [2, 0], "w": 1.75, "x": 0, "y": 2},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "w": 2.25, "x": 12.75, "y": 2},
+ {"matrix": [2, 14], "x": 15, "y": 2},
+
+ {"matrix": [3, 0], "w": 2.25, "x": 0, "y": 3},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "w": 1.75, "x": 12.25, "y": 3},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+ {"matrix": [3, 14], "x": 15, "y": 3},
+
+ {"matrix": [4, 0], "w": 1.25, "x": 0, "y": 4},
+ {"matrix": [4, 1], "w": 1.25, "x": 1.25, "y": 4},
+ {"matrix": [4, 2], "w": 1.25, "x": 2.5, "y": 4},
+
+ {"matrix": [4, 6], "w": 6.25, "x": 3.75, "y": 4},
+
+ {"matrix": [4, 10], "w": 1.25, "x": 10, "y": 4},
+ {"matrix": [4, 11], "w": 1.25, "x": 11.25, "y": 4},
+
+ {"matrix": [4, 12], "x": 13, "y": 4},
+ {"matrix": [4, 13], "x": 14, "y": 4},
+ {"matrix": [4, 14], "x": 15, "y": 4}
+ ]
+ },
+ "LAYOUT_65_ansi_blocker": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "w": 2, "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 15, "y": 0},
+
+ {"matrix": [1, 0], "w": 1.5, "x": 0, "y": 1},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [1, 13], "w": 1.5, "x": 13.5, "y": 1},
+ {"matrix": [1, 14], "x": 15, "y": 1},
+
+ {"matrix": [2, 0], "w": 1.75, "x": 0, "y": 2},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "w": 2.25, "x": 12.75, "y": 2},
+ {"matrix": [2, 14], "x": 15, "y": 2},
+
+ {"matrix": [3, 0], "w": 2.25, "x": 0, "y": 3},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "w": 1.75, "x": 12.25, "y": 3},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+ {"matrix": [3, 14], "x": 15, "y": 3},
+
+ {"matrix": [4, 0], "w": 1.25, "x": 0, "y": 4},
+ {"matrix": [4, 1], "w": 1.25, "x": 1.25, "y": 4},
+ {"matrix": [4, 2], "w": 1.25, "x": 2.5, "y": 4},
+
+ {"matrix": [4, 6], "w": 6.25, "x": 3.75, "y": 4},
+
+ {"matrix": [4, 10], "w": 1.25, "x": 10, "y": 4},
+ {"matrix": [4, 11], "w": 1.25, "x": 11.25, "y": 4},
+
+ {"matrix": [4, 12], "x": 13, "y": 4},
+ {"matrix": [4, 13], "x": 14, "y": 4},
+ {"matrix": [4, 14], "x": 15, "y": 4}
+ ]
+ },
+ "LAYOUT_65_ansi_blocker_tsangan": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "w": 2, "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 15, "y": 0},
+
+ {"matrix": [1, 0], "w": 1.5, "x": 0, "y": 1},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [1, 13], "w": 1.5, "x": 13.5, "y": 1},
+ {"matrix": [1, 14], "x": 15, "y": 1},
+
+ {"matrix": [2, 0], "w": 1.75, "x": 0, "y": 2},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "w": 2.25, "x": 12.75, "y": 2},
+ {"matrix": [2, 14], "x": 15, "y": 2},
+
+ {"matrix": [3, 0], "w": 2.25, "x": 0, "y": 3},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "w": 1.75, "x": 12.25, "y": 3},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+ {"matrix": [3, 14], "x": 15, "y": 3},
+
+ {"matrix": [4, 0], "w": 1.5, "x": 0, "y": 4},
+ {"matrix": [4, 1], "x": 1.5, "y": 4},
+ {"matrix": [4, 2], "w": 1.5, "x": 2.5, "y": 4},
+
+ {"matrix": [4, 6], "w": 7, "x": 4, "y": 4},
+
+ {"matrix": [4, 11], "w": 1.5, "x": 11, "y": 4},
+
+ {"matrix": [4, 12], "x": 13, "y": 4},
+ {"matrix": [4, 13], "x": 14, "y": 4},
+ {"matrix": [4, 14], "x": 15, "y": 4}
+ ]
+ },
+ "LAYOUT_65_ansi_blocker_tsangan_split_bs": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [2, 13], "x": 14, "y": 0},
+ {"matrix": [0, 14], "x": 15, "y": 0},
+
+ {"matrix": [1, 0], "w": 1.5, "x": 0, "y": 1},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [1, 13], "w": 1.5, "x": 13.5, "y": 1},
+ {"matrix": [1, 14], "x": 15, "y": 1},
+
+ {"matrix": [2, 0], "w": 1.75, "x": 0, "y": 2},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "w": 2.25, "x": 12.75, "y": 2},
+ {"matrix": [2, 14], "x": 15, "y": 2},
+
+ {"matrix": [3, 0], "w": 2.25, "x": 0, "y": 3},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "w": 1.75, "x": 12.25, "y": 3},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+ {"matrix": [3, 14], "x": 15, "y": 3},
+
+ {"matrix": [4, 0], "w": 1.5, "x": 0, "y": 4},
+ {"matrix": [4, 1], "x": 1.5, "y": 4},
+ {"matrix": [4, 2], "w": 1.5, "x": 2.5, "y": 4},
+
+ {"matrix": [4, 6], "w": 7, "x": 4, "y": 4},
+
+ {"matrix": [4, 11], "w": 1.5, "x": 11, "y": 4},
+
+ {"matrix": [4, 12], "x": 13, "y": 4},
+ {"matrix": [4, 13], "x": 14, "y": 4},
+ {"matrix": [4, 14], "x": 15, "y": 4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/sawnsprojects/re65/keymaps/default/keymap.c b/keyboards/sawnsprojects/re65/keymaps/default/keymap.c
new file mode 100644
index 000000000000..6dc79fead35b
--- /dev/null
+++ b/keyboards/sawnsprojects/re65/keymaps/default/keymap.c
@@ -0,0 +1,57 @@
+// Copyright 2023 MaiTheSan (@maithesan)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+enum {
+ _BASE,
+ _FN1
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Base Layer
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┬───┐
+ * │Esc│! 1│@ 2│# 3│$ 4│% 5│^ 6│& 7│* 8│( 9│) 0│_ -│+ =│ Bckspc│Hom│
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┼───┤
+ * │Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │{ [│} ]│| \│PgU│
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤
+ * │HyCaps│ A │ S │ D │ F │ G │ H │ J │ K │ L │: ;│" '│ Enter│PgD│
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤
+ * │Shift │ Z │ X │ C │ V │ B │ N │ M │< ,│> .│? /│ Shift│ Up│End│
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤
+ * │Ctrl│ Opt│ Cmd│ Space │Cmd │FnPy│ │Lef│Dow│Rig│
+ * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘
+ */
+[_BASE] = LAYOUT_65_ansi_blocker(
+ KC_ESC, 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_HOME,
+ 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, KC_PGUP,
+ 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, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
+ KC_LCTL, KC_LOPT, KC_LCMD, KC_SPC, KC_RCMD, MO(_FN1), KC_LEFT, KC_DOWN, KC_RGHT
+),
+/* Function Layer
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┬───┐
+ * │` ~│ F1│ F2│ F3│ F4│ F5│ F6│ F7│ F8│ F9│F10│F11│F12│ Delete│SlD│
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┼───┤
+ * │RMod │RH+│RS+│RV+│AS+│ │ │ │ │ │F13│F14│F15│ LHP │VlU│
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤
+ * │RTgl │RH-│RS-│RV-│AS-│ │ │ │ │ │ │ │ │VlD│
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤
+ * │ │LYR│Thm│ │ │RST│ │Mke│Prv│Nxt│Ply│ │PgU│Mut│
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤
+ * │ │ │ │ │ │ │ │Hom│PgD│End│
+ * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘
+ */
+[_FN1] = LAYOUT_65_ansi_blocker(
+ KC_GRV, 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_DEL, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_F13, KC_F14, KC_F15, _______, KC_VOLU,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLD,
+ _______, _______, _______, _______, _______, QK_BOOT, _______, _______, KC_MPRV, KC_MNXT, KC_MPLY, _______, KC_PGUP, KC_MUTE,
+ _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END
+),
+};
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
+ [_BASE] = { ENCODER_CCW_CW(KC_PGDN, KC_PGUP) },
+ [_FN1] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }
+};
+#endif // ENCODER_MAP_ENABLE
diff --git a/keyboards/sawnsprojects/re65/keymaps/default/rules.mk b/keyboards/sawnsprojects/re65/keymaps/default/rules.mk
new file mode 100644
index 000000000000..a40474b4d5c7
--- /dev/null
+++ b/keyboards/sawnsprojects/re65/keymaps/default/rules.mk
@@ -0,0 +1 @@
+ENCODER_MAP_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/sawnsprojects/re65/keymaps/via/keymap.c b/keyboards/sawnsprojects/re65/keymaps/via/keymap.c
new file mode 100644
index 000000000000..55581a841921
--- /dev/null
+++ b/keyboards/sawnsprojects/re65/keymaps/via/keymap.c
@@ -0,0 +1,57 @@
+// Copyright 2023 MaiTheSan (@maithesan)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+enum {
+ _BASE,
+ _FN1,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Base Layer
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
+ * │Esc│! 1│@ 2│# 3│$ 4│% 5│^ 6│& 7│* 8│( 9│) 0│_ -│+ =│Bsp│Bsp│Hom│
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤
+ * │Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │{ [│} ]│| \│PgU│
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤
+ * │HyCaps│ A │ S │ D │ F │ G │ H │ J │ K │ L │: ;│" '│ Enter│PgD│
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤
+ * │Shift │ Z │ X │ C │ V │ B │ N │ M │< ,│> .│? /│ Shift│ Up│End│
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤
+ * │Ctrl│ Opt│ Cmd│ Space │Cmd │FnPy│ │Lef│Dow│Rig│
+ * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘
+ */
+[_BASE] = LAYOUT_65_ansi_blocker_split_bs(
+ KC_ESC, 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_BSPC, KC_HOME,
+ 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, KC_PGUP,
+ 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, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
+ KC_LCTL, KC_LOPT, KC_LCMD, KC_SPC, KC_RCMD, MO(_FN1), KC_LEFT, KC_DOWN, KC_RGHT
+),
+/* Function Layer
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
+ * │` ~│ F1│ F2│ F3│ F4│ F5│ F6│ F7│ F8│ F9│F10│F11│F12│Del│ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤
+ * │RMod │RH+│RS+│RV+│AS+│ │ │ │ │ │F13│F14│F15│ LHP │VlU│
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤
+ * │RTgl │RH-│RS-│RV-│AS-│ │ │ │ │ │ │ │ │VlD│
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤
+ * │ │LYR│Thm│ │ │RST│ │Mke│Prv│Nxt│Ply│ │PgU│Mut│
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤
+ * │ │ │ │ │ │ │ │Hom│PgD│End│
+ * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘
+ */
+[_FN1] = LAYOUT_65_ansi_blocker_split_bs(
+ KC_GRV, 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_DEL, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_F13, KC_F14, KC_F15, _______, KC_VOLU,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLD,
+ _______, _______, _______, _______, _______, QK_BOOT, _______, _______, KC_MPRV, KC_MNXT, KC_MPLY, _______, KC_PGUP, KC_MUTE,
+ _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END
+),
+};
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
+ [_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [_FN1] = { ENCODER_CCW_CW(KC_BRID, KC_BRIU) },
+};
+#endif
\ No newline at end of file
diff --git a/keyboards/sawnsprojects/re65/keymaps/via/rules.mk b/keyboards/sawnsprojects/re65/keymaps/via/rules.mk
new file mode 100644
index 000000000000..4253f570f0bb
--- /dev/null
+++ b/keyboards/sawnsprojects/re65/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+ENCODER_MAP_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/sawnsprojects/re65/readme.md b/keyboards/sawnsprojects/re65/readme.md
new file mode 100644
index 000000000000..b02dfe592aac
--- /dev/null
+++ b/keyboards/sawnsprojects/re65/readme.md
@@ -0,0 +1,26 @@
+# RE65
+
+![RE65](https://i.imgur.com/bzeWSwwh.png)
+
+A Keyboard from Nuxros
+
+* Keyboard Maintainer: [Mai The San](https://github.com/maithesan)
+* Hardware Supported: RE65, KBD67 MKII
+* Hardware Availability: [Nuxros Store](https://nuxroskb.store/en/products/re65?variant=45628371370283)
+Make example for this keyboard (after setting up your build environment):
+
+ make sawnsprojects/re65:default
+
+Flashing example for this keyboard:
+
+ make sawnsprojects/re65: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 short the `RST` and `GND` pads on the SWD header twice, or short the `BOOT` header and plug in keyboard
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
diff --git a/keyboards/sawnsprojects/re65/rules.mk b/keyboards/sawnsprojects/re65/rules.mk
new file mode 100644
index 000000000000..7ff128fa692e
--- /dev/null
+++ b/keyboards/sawnsprojects/re65/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
\ No newline at end of file
From c76c9f5033822e8e0c2e07dbdc8c458cbad79672 Mon Sep 17 00:00:00 2001
From: Jesse Leventhal <45154268+jessel92@users.noreply.github.com>
Date: Sun, 24 Dec 2023 13:16:34 -0500
Subject: [PATCH 27/31] [Keyboard] Add Noodlepad_Micro (#22703)
Co-authored-by: Joel Challis
Co-authored-by: jack <0x6a73@protonmail.com>
Co-authored-by: Sergey Vlasov
---
.../themadnoodle/noodlepad_micro/config.h | 6 ++
.../themadnoodle/noodlepad_micro/info.json | 72 +++++++++++++++
.../noodlepad_micro/keymaps/default/keymap.c | 68 +++++++++++++++
.../noodlepad_micro/keymaps/default/rules.mk | 1 +
.../noodlepad_micro/keymaps/via/keymap.c | 87 +++++++++++++++++++
.../noodlepad_micro/keymaps/via/rules.mk | 2 +
.../themadnoodle/noodlepad_micro/readme.md | 28 ++++++
.../themadnoodle/noodlepad_micro/rules.mk | 2 +
8 files changed, 266 insertions(+)
create mode 100644 keyboards/themadnoodle/noodlepad_micro/config.h
create mode 100644 keyboards/themadnoodle/noodlepad_micro/info.json
create mode 100644 keyboards/themadnoodle/noodlepad_micro/keymaps/default/keymap.c
create mode 100644 keyboards/themadnoodle/noodlepad_micro/keymaps/default/rules.mk
create mode 100644 keyboards/themadnoodle/noodlepad_micro/keymaps/via/keymap.c
create mode 100644 keyboards/themadnoodle/noodlepad_micro/keymaps/via/rules.mk
create mode 100644 keyboards/themadnoodle/noodlepad_micro/readme.md
create mode 100644 keyboards/themadnoodle/noodlepad_micro/rules.mk
diff --git a/keyboards/themadnoodle/noodlepad_micro/config.h b/keyboards/themadnoodle/noodlepad_micro/config.h
new file mode 100644
index 000000000000..1dd3a20816b2
--- /dev/null
+++ b/keyboards/themadnoodle/noodlepad_micro/config.h
@@ -0,0 +1,6 @@
+// Copyright 2023 The Mad Noodle(@the_mad_noodle)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define RGBLIGHT_DEFAULT_MODE RGBLIGHT_MODE_RAINBOW_SWIRL + 5
diff --git a/keyboards/themadnoodle/noodlepad_micro/info.json b/keyboards/themadnoodle/noodlepad_micro/info.json
new file mode 100644
index 000000000000..fe7ab9ea7511
--- /dev/null
+++ b/keyboards/themadnoodle/noodlepad_micro/info.json
@@ -0,0 +1,72 @@
+{
+ "manufacturer": "The Mad Noodle",
+ "keyboard_name": "NoodlePad Micro",
+ "maintainer": "the-mad-noodle",
+ "url": "https://www.madnoodleprototypes.com/",
+ "bootloader": "rp2040",
+ "diode_direction": "ROW2COL",
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgblight": true,
+ "encoder": true
+ },
+ "rgblight": {
+ "hue_steps": 10,
+ "led_count": 4,
+ "sleep": true,
+ "animations": {
+ "breathing": true,
+ "rainbow_mood": true,
+ "rainbow_swirl": true,
+ "snake": true,
+ "knight": true,
+ "christmas": true,
+ "static_gradient": true,
+ "rgb_test": true,
+ "alternating": true,
+ "twinkle": true
+ }
+ },
+ "matrix_pins": {
+ "cols": ["GP6", "GP7", "GP0"],
+ "rows": ["GP26", "GP27", "GP28"]
+ },
+ "processor": "RP2040",
+ "usb": {
+ "device_version": "3.0.0",
+ "pid": "0x0004",
+ "vid": "0x6A6C"
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [1, 2], "x": 2, "y": 1},
+ {"matrix": [1, 1], "x": 1, "y": 1},
+ {"matrix": [1, 0], "x": 0, "y": 1},
+ {"matrix": [2, 2], "x": 2, "y": 2},
+ {"matrix": [2, 1], "x": 1, "y": 2},
+ {"matrix": [2, 0], "x": 0, "y": 2}
+ ]
+ }
+ },
+ "ws2812": {
+ "pin": "GP29",
+ "driver": "vendor"
+ },
+ "encoder": {
+ "rotary": [
+ { "pin_a": "GP2", "pin_b": "GP1" }
+ { "pin_a": "GP3", "pin_b": "GP4" }
+ ]
+
+ }
+
+
+}
diff --git a/keyboards/themadnoodle/noodlepad_micro/keymaps/default/keymap.c b/keyboards/themadnoodle/noodlepad_micro/keymaps/default/keymap.c
new file mode 100644
index 000000000000..663a668ae849
--- /dev/null
+++ b/keyboards/themadnoodle/noodlepad_micro/keymaps/default/keymap.c
@@ -0,0 +1,68 @@
+// Copyright 2023 The Mad Noodle(@the_mad_noodle)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ /* LAYER 0
+ * ,--ENC2-- --ENC1--.
+ * | << | | >> |
+ * |-------+-------+-------|
+ * | STOP | PLAY | MEDIA |
+ * |-------+-------+-------|
+ * | CALC | MAIL | PC/FN |
+ * `-----------------------'
+ */
+
+ [0] = LAYOUT(
+ KC_MPRV, KC_MNXT,
+ KC_MSTP, KC_MPLY, KC_MSEL,
+ LT(2,KC_CALC), KC_MAIL, LT(1, KC_MYCM)
+ ),
+
+
+ /* LAYER 1
+ * ,--ENC2-- --ENC1--.
+ * | MODE+ | | MODE- |
+ * |-------+-------+-------|
+ * |Bright-| Tog |Bright+|
+ * |-------+-------+-------|
+ * | PLAIN |BREATH | |
+ * `-----------------------'
+ */
+
+ [1] = LAYOUT(
+ RGB_MOD, RGB_RMOD,
+ RGB_VAD, RGB_TOG, RGB_VAI,
+ RGB_M_P, RGB_M_B, KC_TRNS
+ ),
+
+
+ /* LAYER 2 (ENCODER)
+ * ,--ENC2-- --ENC1--.
+ * | | | |
+ * |-------+-------+-------|
+ * | | | |
+ * |-------+-------+-------|
+ * | | | |
+ * `-----------------------'
+ */
+
+ [2] = LAYOUT(
+ KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+ )
+};
+
+
+/*Encoder Mapping*/
+//-----------------------(ENC1)---------------------------------(ENC2)-----------------
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
+ [0] = { ENCODER_CCW_CW(KC_LEFT, KC_RGHT), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [1] = { ENCODER_CCW_CW(RGB_HUD, RGB_HUI), ENCODER_CCW_CW(RGB_SAD, RGB_SAI) },
+ [2] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI), ENCODER_CCW_CW(RGB_SPD, RGB_SPI) }
+};
+#endif
diff --git a/keyboards/themadnoodle/noodlepad_micro/keymaps/default/rules.mk b/keyboards/themadnoodle/noodlepad_micro/keymaps/default/rules.mk
new file mode 100644
index 000000000000..a40474b4d5c7
--- /dev/null
+++ b/keyboards/themadnoodle/noodlepad_micro/keymaps/default/rules.mk
@@ -0,0 +1 @@
+ENCODER_MAP_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/themadnoodle/noodlepad_micro/keymaps/via/keymap.c b/keyboards/themadnoodle/noodlepad_micro/keymaps/via/keymap.c
new file mode 100644
index 000000000000..d6df824a5089
--- /dev/null
+++ b/keyboards/themadnoodle/noodlepad_micro/keymaps/via/keymap.c
@@ -0,0 +1,87 @@
+// Copyright 2023 The Mad Noodle(@the_mad_noodle)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ /* LAYER 0
+ * ,--ENC2-- --ENC1--.
+ * | << | | >> |
+ * |-------+-------+-------|
+ * | STOP | PLAY | MEDIA |
+ * |-------+-------+-------|
+ * | CALC | MY PC | TO(3) |
+ * `-----------------------'
+ */
+
+ [0] = LAYOUT(
+ KC_MPRV, KC_MNXT,
+ KC_MSTP, KC_MPLY, KC_MSEL,
+ KC_CALC, KC_MYCM, TO(3)
+ ),
+
+
+ /* LAYER 1
+ * ,--ENC2-- --ENC1--.
+ * | MODE+ | | MODE- |
+ * |-------+-------+-------|
+ * |Bright-| Tog |Bright+|
+ * |-------+-------+-------|
+ * | PLAIN |BREATH | TO(0) |
+ * `-----------------------'
+ */
+
+ [1] = LAYOUT(
+ RGB_MOD, RGB_RMOD,
+ RGB_VAD, RGB_TOG, RGB_VAI,
+ RGB_M_P, RGB_M_B, TO(0)
+ ),
+
+
+ /* LAYER 2
+ * ,--ENC2-- --ENC1--.
+ * | | | |
+ * |-------+-------+-------|
+ * | | | |
+ * |-------+-------+-------|
+ * | | | TO(0) |
+ * `-----------------------'
+ */
+
+ [2] = LAYOUT(
+ KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, TO(0)
+ ),
+
+ /* LAYER 3
+ * ,--ENC2-- --ENC1--.
+ * | | | |
+ * |-------+-------+-------|
+ * | TO(1) | | TO(2) |
+ * |-------+-------+-------|
+ * | | | TO(0) |
+ * `-----------------------'
+ */
+
+ [3] = LAYOUT(
+ KC_TRNS, KC_TRNS,
+ TO(1), KC_TRNS, TO(2),
+ KC_TRNS, KC_TRNS, TO(0)
+ )
+
+};
+
+
+/*Encoder Mapping*/
+//-----------------------(ENC1)---------------------------------(ENC2)-----------------
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
+ [0] = { ENCODER_CCW_CW(KC_LEFT, KC_RGHT), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [1] = { ENCODER_CCW_CW(RGB_HUD, RGB_HUI), ENCODER_CCW_CW(RGB_SAD, RGB_SAI) },
+ [2] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI), ENCODER_CCW_CW(RGB_SPD, RGB_SPI) },
+ [3] = { ENCODER_CCW_CW(KC_LEFT, KC_RGHT), ENCODER_CCW_CW(KC_DOWN, KC_UP) },
+
+};
+#endif
diff --git a/keyboards/themadnoodle/noodlepad_micro/keymaps/via/rules.mk b/keyboards/themadnoodle/noodlepad_micro/keymaps/via/rules.mk
new file mode 100644
index 000000000000..6ccd6d91943d
--- /dev/null
+++ b/keyboards/themadnoodle/noodlepad_micro/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+ENCODER_MAP_ENABLE = yes
+VIA_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/themadnoodle/noodlepad_micro/readme.md b/keyboards/themadnoodle/noodlepad_micro/readme.md
new file mode 100644
index 000000000000..a77c1ad7ba39
--- /dev/null
+++ b/keyboards/themadnoodle/noodlepad_micro/readme.md
@@ -0,0 +1,28 @@
+# NoodlePad [Micro]
+
+![NoodlePad [Micro]](https://i.imgur.com/uRmVt3ah.jpg)
+
+The NoodlePad [Micro] is a 6 key 2 encoder macro keypad designed using RP2040 chipset.
+
+* Keyboard Maintainer: [The Mad Noodle](https://github.com/The-Mad-Noodle)
+* Hardware Supported: NoodlePad [Micro]
+* Hardware Availability: https://www.madnoodleprototypes.com/shop
+
+Compile example for this keyboard (after setting up your build environment):
+
+ qmk compile -kb themadnoodle/noodlepad_micro -km default
+
+Flashing example for this keyboard:
+
+ qmk flash -kb themadnoodle/noodlepad_micro -km default
+
+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 & Flashing
+
+
+**Physical reset button**:
+
+* Double press the button on the back, center, left of the PCB labeled "R" to enter the bootloader drive mode.
+
+* If you have a pre-compiled .uf2 file, copy it into bootloader drive (RPI-RP2), board will reset automatically once file is copied sucessfully
\ No newline at end of file
diff --git a/keyboards/themadnoodle/noodlepad_micro/rules.mk b/keyboards/themadnoodle/noodlepad_micro/rules.mk
new file mode 100644
index 000000000000..6968c523355c
--- /dev/null
+++ b/keyboards/themadnoodle/noodlepad_micro/rules.mk
@@ -0,0 +1,2 @@
+# This file intentionally left blank
+
From e46dae26c1c9198a9eaf145e02b1878ad0791cbd Mon Sep 17 00:00:00 2001
From: Ryan
Date: Wed, 27 Dec 2023 12:12:42 +1100
Subject: [PATCH 28/31] bm40hsrgb/rev2: disable some RGB Matrix effects to
reduce filesize (#22761)
---
keyboards/kprepublic/bm40hsrgb/rev2/info.json | 5 -----
1 file changed, 5 deletions(-)
diff --git a/keyboards/kprepublic/bm40hsrgb/rev2/info.json b/keyboards/kprepublic/bm40hsrgb/rev2/info.json
index dac848ed52a1..c530b456cfb0 100644
--- a/keyboards/kprepublic/bm40hsrgb/rev2/info.json
+++ b/keyboards/kprepublic/bm40hsrgb/rev2/info.json
@@ -62,11 +62,6 @@
"hue_breathing": true,
"hue_pendulum": true,
"hue_wave": true,
- "pixel_rain": true,
- "pixel_flow": true,
- "pixel_fractal": true,
- "typing_heatmap": true,
- "digital_rain": true,
"solid_reactive_simple": true,
"solid_reactive": true,
"solid_reactive_wide": true,
From 5622f55d0360e365e7dd200d9e86aa0685cacf98 Mon Sep 17 00:00:00 2001
From: Tom Barnes
Date: Wed, 27 Dec 2023 22:11:06 +0000
Subject: [PATCH 29/31] vendor keymaps-mechboards via updates (#22767)
* update mb_via keymaps to new naming for vendor keymaps
* missed a reference to old name, tidy crkbd readme, add lily58 readme
* fix typo
* fix typo
* delete shopify image
---
keyboards/crkbd/keymaps/mb_via/readme.md | 12 ------------
.../keymaps/{mb_via => via_mechboards}/config.h | 0
.../keymaps/{mb_via => via_mechboards}/keymap.c | 0
keyboards/crkbd/keymaps/via_mechboards/readme.md | 10 ++++++++++
.../keymaps/{mb_via => via_mechboards}/rules.mk | 0
.../keymaps/{mb_via => via_mechboards}/config.h | 0
.../keymaps/{mb_via => via_mechboards}/keymap.c | 0
keyboards/lily58/keymaps/via_mechboards/readme.md | 10 ++++++++++
.../keymaps/{mb_via => via_mechboards}/rules.mk | 0
9 files changed, 20 insertions(+), 12 deletions(-)
delete mode 100644 keyboards/crkbd/keymaps/mb_via/readme.md
rename keyboards/crkbd/keymaps/{mb_via => via_mechboards}/config.h (100%)
rename keyboards/crkbd/keymaps/{mb_via => via_mechboards}/keymap.c (100%)
create mode 100644 keyboards/crkbd/keymaps/via_mechboards/readme.md
rename keyboards/crkbd/keymaps/{mb_via => via_mechboards}/rules.mk (100%)
rename keyboards/lily58/keymaps/{mb_via => via_mechboards}/config.h (100%)
rename keyboards/lily58/keymaps/{mb_via => via_mechboards}/keymap.c (100%)
create mode 100644 keyboards/lily58/keymaps/via_mechboards/readme.md
rename keyboards/lily58/keymaps/{mb_via => via_mechboards}/rules.mk (100%)
diff --git a/keyboards/crkbd/keymaps/mb_via/readme.md b/keyboards/crkbd/keymaps/mb_via/readme.md
deleted file mode 100644
index 048927073ba8..000000000000
--- a/keyboards/crkbd/keymaps/mb_via/readme.md
+++ /dev/null
@@ -1,12 +0,0 @@
-# Default Via keyboard for the Corne R2G by Mechboards UK
-
-![r2g](https://cdn.shopify.com/s/files/1/0582/0242/3501/products/HelidoxCorneR2GPCB_1800x1800.png)
-
-Corne R2G is an eddition of the classic CRKBD by footsan remade to feature a full smd assembly
-
-In this fold can be found the default via enabled keymap that can be in conjunction
-
-Flash example for this Keymap:
-```sh
-qmk flash -kb crkbd/r2g -km mb_via
-```
diff --git a/keyboards/crkbd/keymaps/mb_via/config.h b/keyboards/crkbd/keymaps/via_mechboards/config.h
similarity index 100%
rename from keyboards/crkbd/keymaps/mb_via/config.h
rename to keyboards/crkbd/keymaps/via_mechboards/config.h
diff --git a/keyboards/crkbd/keymaps/mb_via/keymap.c b/keyboards/crkbd/keymaps/via_mechboards/keymap.c
similarity index 100%
rename from keyboards/crkbd/keymaps/mb_via/keymap.c
rename to keyboards/crkbd/keymaps/via_mechboards/keymap.c
diff --git a/keyboards/crkbd/keymaps/via_mechboards/readme.md b/keyboards/crkbd/keymaps/via_mechboards/readme.md
new file mode 100644
index 000000000000..a173bc43ecb3
--- /dev/null
+++ b/keyboards/crkbd/keymaps/via_mechboards/readme.md
@@ -0,0 +1,10 @@
+# Default Via keymap for the Corne R2G by Mechboards UK
+
+Corne R2G is an edition of the classic CRKBD by foostan remade to feature full smd assembly
+
+In this folder can be found the default via enabled keymap that can be in conjunction with the mechboards R2G PCB.
+
+Flash example for this Keymap:
+```sh
+qmk flash -kb crkbd/r2g -km via_mechboards
+```
diff --git a/keyboards/crkbd/keymaps/mb_via/rules.mk b/keyboards/crkbd/keymaps/via_mechboards/rules.mk
similarity index 100%
rename from keyboards/crkbd/keymaps/mb_via/rules.mk
rename to keyboards/crkbd/keymaps/via_mechboards/rules.mk
diff --git a/keyboards/lily58/keymaps/mb_via/config.h b/keyboards/lily58/keymaps/via_mechboards/config.h
similarity index 100%
rename from keyboards/lily58/keymaps/mb_via/config.h
rename to keyboards/lily58/keymaps/via_mechboards/config.h
diff --git a/keyboards/lily58/keymaps/mb_via/keymap.c b/keyboards/lily58/keymaps/via_mechboards/keymap.c
similarity index 100%
rename from keyboards/lily58/keymaps/mb_via/keymap.c
rename to keyboards/lily58/keymaps/via_mechboards/keymap.c
diff --git a/keyboards/lily58/keymaps/via_mechboards/readme.md b/keyboards/lily58/keymaps/via_mechboards/readme.md
new file mode 100644
index 000000000000..36aaab31b589
--- /dev/null
+++ b/keyboards/lily58/keymaps/via_mechboards/readme.md
@@ -0,0 +1,10 @@
+# Default Via keymap for the Lily58 R2G by Mechboards UK
+
+Lily58 R2G is the classic Lily58 remade to feature full SMD assembly
+
+In this folder can be found the default via enabled keymap that can be in conjunction with the mechboards R2G PCB.
+
+Flash example for this Keymap:
+```sh
+qmk flash -kb lily58/r2g -km via_mechboards
+```
diff --git a/keyboards/lily58/keymaps/mb_via/rules.mk b/keyboards/lily58/keymaps/via_mechboards/rules.mk
similarity index 100%
rename from keyboards/lily58/keymaps/mb_via/rules.mk
rename to keyboards/lily58/keymaps/via_mechboards/rules.mk
From dd480eff68921156771e6a88972ae74ca7aaa4b2 Mon Sep 17 00:00:00 2001
From: yuezp <49514776+LXF-YZP@users.noreply.github.com>
Date: Thu, 28 Dec 2023 12:37:01 +0800
Subject: [PATCH 30/31] [Keyboard] Add meetlab kafkasplit (#22756)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: “yuezp” <“yuezpchn@126.com”>
---
keyboards/meetlab/kafkasplit/config.h | 35 +++
keyboards/meetlab/kafkasplit/halconf.h | 21 ++
keyboards/meetlab/kafkasplit/info.json | 203 +++++++++++++++++
keyboards/meetlab/kafkasplit/kafkasplit.c | 207 ++++++++++++++++++
.../kafkasplit/keymaps/default/keymap.c | 73 ++++++
.../meetlab/kafkasplit/keymaps/via/keymap.c | 73 ++++++
.../meetlab/kafkasplit/keymaps/via/rules.mk | 1 +
.../meetlab/kafkasplit/matrix_diagram.md | 14 ++
keyboards/meetlab/kafkasplit/mcuconf.h | 22 ++
keyboards/meetlab/kafkasplit/readme.md | 26 +++
keyboards/meetlab/kafkasplit/rules.mk | 1 +
11 files changed, 676 insertions(+)
create mode 100644 keyboards/meetlab/kafkasplit/config.h
create mode 100644 keyboards/meetlab/kafkasplit/halconf.h
create mode 100644 keyboards/meetlab/kafkasplit/info.json
create mode 100644 keyboards/meetlab/kafkasplit/kafkasplit.c
create mode 100644 keyboards/meetlab/kafkasplit/keymaps/default/keymap.c
create mode 100644 keyboards/meetlab/kafkasplit/keymaps/via/keymap.c
create mode 100644 keyboards/meetlab/kafkasplit/keymaps/via/rules.mk
create mode 100644 keyboards/meetlab/kafkasplit/matrix_diagram.md
create mode 100644 keyboards/meetlab/kafkasplit/mcuconf.h
create mode 100644 keyboards/meetlab/kafkasplit/readme.md
create mode 100644 keyboards/meetlab/kafkasplit/rules.mk
diff --git a/keyboards/meetlab/kafkasplit/config.h b/keyboards/meetlab/kafkasplit/config.h
new file mode 100644
index 000000000000..714b709fe17d
--- /dev/null
+++ b/keyboards/meetlab/kafkasplit/config.h
@@ -0,0 +1,35 @@
+/* Copyright 2022 LXF-YZP(yuezp)
+ *
+ * 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 .
+ */
+
+#pragma once
+
+/* Double tap reset button to enter bootloader */
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED GP25
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U
+
+
+#define SERIAL_USART_FULL_DUPLEX
+#define SERIAL_USART_TX_PIN GP0
+#define SERIAL_USART_RX_PIN GP1
+
+#define I2C1_SCL_PIN GP27
+#define I2C1_SDA_PIN GP26
+#define I2C_DRIVER I2CD1
+#define I2C1_CLOCK_SPEED 400000
+#define OLED_BRIGHTNESS 128
+#define OLED_TIMEOUT 600000
+#define OLED_SCROLL_TIMEOUT 300000
diff --git a/keyboards/meetlab/kafkasplit/halconf.h b/keyboards/meetlab/kafkasplit/halconf.h
new file mode 100644
index 000000000000..4e2f667f1eca
--- /dev/null
+++ b/keyboards/meetlab/kafkasplit/halconf.h
@@ -0,0 +1,21 @@
+/* Copyright 2022 LXF-YZP(yuezp)
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#define HAL_USE_I2C TRUE
+
+#include_next
diff --git a/keyboards/meetlab/kafkasplit/info.json b/keyboards/meetlab/kafkasplit/info.json
new file mode 100644
index 000000000000..d71d405f336b
--- /dev/null
+++ b/keyboards/meetlab/kafkasplit/info.json
@@ -0,0 +1,203 @@
+{
+ "manufacturer": "lucky_studio",
+ "keyboard_name": "kafkaSplit",
+ "maintainer": "yuezp",
+ "bootloader": "rp2040",
+ "diode_direction": "ROW2COL",
+ "features": {
+ "bootmagic": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "oled": true,
+ "rgb_matrix": true,
+ "wpm": true
+ },
+ "indicators": {
+ "caps_lock": "GP25",
+ "on_state": 1
+ },
+ "matrix_pins": {
+ "cols": ["GP2", "GP3", "GP6", "GP7", "GP10", "GP11"],
+ "rows": ["GP5", "GP8", "GP12", "GP13"]
+ },
+ "processor": "RP2040",
+ "rgb_matrix": {
+ "animations": {
+ "alphas_mods": true,
+ "band_pinwheel_sat": true,
+ "band_pinwheel_val": true,
+ "band_sat": true,
+ "band_spiral_sat": true,
+ "band_spiral_val": true,
+ "band_val": true,
+ "breathing": true,
+ "cycle_all": true,
+ "cycle_left_right": true,
+ "cycle_out_in": true,
+ "cycle_out_in_dual": true,
+ "cycle_pinwheel": true,
+ "cycle_spiral": true,
+ "cycle_up_down": true,
+ "digital_rain": true,
+ "dual_beacon": true,
+ "gradient_left_right": true,
+ "gradient_up_down": true,
+ "hue_breathing": true,
+ "hue_pendulum": true,
+ "hue_wave": true,
+ "jellybean_raindrops": true,
+ "multisplash": true,
+ "pixel_flow": true,
+ "pixel_fractal": true,
+ "pixel_rain": true,
+ "rainbow_beacon": true,
+ "rainbow_moving_chevron": true,
+ "rainbow_pinwheels": true,
+ "raindrops": true,
+ "solid_multisplash": true,
+ "solid_reactive": true,
+ "solid_reactive_cross": true,
+ "solid_reactive_multicross": true,
+ "solid_reactive_multinexus": true,
+ "solid_reactive_multiwide": true,
+ "solid_reactive_nexus": true,
+ "solid_reactive_simple": true,
+ "solid_reactive_wide": true,
+ "solid_splash": true,
+ "splash": true,
+ "typing_heatmap": true
+ },
+ "default": {
+ "animation": "breathing",
+ "hue": 200
+ },
+ "driver": "ws2812",
+ "layout": [
+ {"matrix": [3, 5], "x": 0, "y": 0, "flags": 4},
+ {"matrix": [3, 4], "x": 18, "y": 5, "flags": 4},
+ {"matrix": [3, 3], "x": 36, "y": 10, "flags": 4},
+ {"matrix": [3, 2], "x": 54, "y": 15, "flags": 4},
+ {"matrix": [2, 5], "x": 2, "y": 21, "flags": 4},
+ {"matrix": [2, 4], "x": 20, "y": 23, "flags": 4},
+ {"matrix": [2, 3], "x": 38, "y": 25, "flags": 4},
+ {"matrix": [2, 2], "x": 56, "y": 23, "flags": 4},
+ {"matrix": [2, 1], "x": 72, "y": 21, "flags": 4},
+ {"matrix": [2, 0], "x": 90, "y": 21, "flags": 4},
+ {"matrix": [1, 5], "x": 2, "y": 39, "flags": 4},
+ {"matrix": [1, 4], "x": 20, "y": 41, "flags": 4},
+ {"matrix": [1, 3], "x": 38, "y": 43, "flags": 4},
+ {"matrix": [1, 2], "x": 56, "y": 41, "flags": 4},
+ {"matrix": [1, 1], "x": 72, "y": 39, "flags": 4},
+ {"matrix": [1, 0], "x": 90, "y": 39, "flags": 4},
+ {"matrix": [0, 5], "x": 2, "y": 57, "flags": 4},
+ {"matrix": [0, 4], "x": 20, "y": 59, "flags": 4},
+ {"matrix": [0, 3], "x": 38, "y": 61, "flags": 4},
+ {"matrix": [0, 2], "x": 56, "y": 59, "flags": 4},
+ {"matrix": [0, 1], "x": 72, "y": 57, "flags": 4},
+ {"matrix": [0, 0], "x": 90, "y": 57, "flags": 4},
+ {"matrix": [7, 3], "x": 0, "y": 0, "flags": 4},
+ {"matrix": [7, 2], "x": 18, "y": 5, "flags": 4},
+ {"matrix": [7, 1], "x": 36, "y": 10, "flags": 4},
+ {"matrix": [7, 0], "x": 54, "y": 15, "flags": 4},
+ {"matrix": [6, 5], "x": 2, "y": 21, "flags": 4},
+ {"matrix": [6, 4], "x": 20, "y": 23, "flags": 4},
+ {"matrix": [6, 3], "x": 38, "y": 25, "flags": 4},
+ {"matrix": [6, 2], "x": 56, "y": 23, "flags": 4},
+ {"matrix": [6, 1], "x": 72, "y": 21, "flags": 4},
+ {"matrix": [6, 0], "x": 90, "y": 21, "flags": 4},
+ {"matrix": [5, 5], "x": 2, "y": 39, "flags": 4},
+ {"matrix": [5, 4], "x": 20, "y": 41, "flags": 4},
+ {"matrix": [5, 3], "x": 38, "y": 43, "flags": 4},
+ {"matrix": [5, 2], "x": 56, "y": 41, "flags": 4},
+ {"matrix": [5, 1], "x": 72, "y": 39, "flags": 4},
+ {"matrix": [5, 0], "x": 90, "y": 39, "flags": 4},
+ {"matrix": [4, 5], "x": 159, "y": 57, "flags": 4},
+ {"matrix": [4, 4], "x": 159, "y": 59, "flags": 4},
+ {"matrix": [4, 3], "x": 224, "y": 61, "flags": 4},
+ {"matrix": [4, 2], "x": 224, "y": 59, "flags": 4},
+ {"matrix": [4, 1], "x": 224, "y": 57, "flags": 4},
+ {"matrix": [4, 0], "x": 224, "y": 57, "flags": 4}
+ ],
+ "sleep": true,
+ "split_count": [22, 22]
+ },
+ "split": {
+ "enabled": true,
+ "matrix_pins": {
+ "right": {
+ "cols": ["GP9", "GP10", "GP8", "GP7", "GP6", "GP5"],
+ "rows": ["GP11", "GP13", "GP12", "GP14"]
+ }
+ },
+ "transport": {
+ "sync": {
+ "indicators": true,
+ "layer_state": true,
+ "matrix_state": true,
+ "modifiers": true,
+ "wpm": true
+ }
+ }
+ },
+ "url": "",
+ "usb": {
+ "device_version": "0.0.1",
+ "pid": "0xBFC2",
+ "vid": "0xAFC2"
+ },
+ "ws2812": {
+ "driver": "vendor",
+ "pin": "GP15"
+ },
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0.25},
+ {"matrix": [0, 1], "x": 1, "y": 0.25},
+ {"matrix": [0, 2], "x": 2, "y": 0.13},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0.13},
+ {"matrix": [0, 5], "x": 5, "y": 0.25},
+ {"matrix": [4, 0], "x": 8.75, "y": 0.25},
+ {"matrix": [4, 1], "x": 9.75, "y": 0.25},
+ {"matrix": [4, 2], "x": 10.75, "y": 0.13},
+ {"matrix": [4, 3], "x": 11.75, "y": 0},
+ {"matrix": [4, 4], "x": 12.75, "y": 0.13},
+ {"matrix": [4, 5], "x": 13.75, "y": 0.25},
+ {"matrix": [1, 0], "x": 0, "y": 1.25},
+ {"matrix": [1, 1], "x": 1, "y": 1.25},
+ {"matrix": [1, 2], "x": 2, "y": 1.13},
+ {"matrix": [1, 3], "x": 3, "y": 1},
+ {"matrix": [1, 4], "x": 4, "y": 1.13},
+ {"matrix": [1, 5], "x": 5, "y": 1.25},
+ {"matrix": [5, 0], "x": 8.75, "y": 1.25},
+ {"matrix": [5, 1], "x": 9.75, "y": 1.25},
+ {"matrix": [5, 2], "x": 10.75, "y": 1.13},
+ {"matrix": [5, 3], "x": 11.75, "y": 1},
+ {"matrix": [5, 4], "x": 12.75, "y": 1.13},
+ {"matrix": [5, 5], "x": 13.75, "y": 1.25},
+ {"matrix": [2, 0], "x": 0, "y": 2.25},
+ {"matrix": [2, 1], "x": 1, "y": 2.25},
+ {"matrix": [2, 2], "x": 2, "y": 2.13},
+ {"matrix": [2, 3], "x": 3, "y": 2},
+ {"matrix": [2, 4], "x": 4, "y": 2.13},
+ {"matrix": [2, 5], "x": 5, "y": 2.25},
+ {"matrix": [6, 0], "x": 8.75, "y": 2.25},
+ {"matrix": [6, 1], "x": 9.75, "y": 2.25},
+ {"matrix": [6, 2], "x": 10.75, "y": 2.13},
+ {"matrix": [6, 3], "x": 11.75, "y": 2},
+ {"matrix": [6, 4], "x": 12.75, "y": 2.13},
+ {"matrix": [6, 5], "x": 13.75, "y": 2.25},
+ {"matrix": [3, 2], "x": 2, "y": 3.13},
+ {"matrix": [3, 3], "x": 4, "y": 2.05, "h": 1.25},
+ {"matrix": [3, 4], "x": 5.25, "y": 1.7, "h": 1.25},
+ {"matrix": [3, 5], "x": 5.35, "y": 3.65, "h": 1.5},
+ {"matrix": [7, 0], "x": 8.25, "y": 4.25, "h": 1.5},
+ {"matrix": [7, 1], "x": 7.75, "y": 6.25, "h": 1.25},
+ {"matrix": [7, 2], "x": 9.23, "y": 5.85, "h": 1.25},
+ {"matrix": [7, 3], "x": 11.75, "y": 3.13}
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/meetlab/kafkasplit/kafkasplit.c b/keyboards/meetlab/kafkasplit/kafkasplit.c
new file mode 100644
index 000000000000..ee352bc8dc06
--- /dev/null
+++ b/keyboards/meetlab/kafkasplit/kafkasplit.c
@@ -0,0 +1,207 @@
+/* Copyright 2022 LXF-YZP(yuezp)
+ *
+ * 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 .
+ */
+
+#include "quantum.h"
+
+#ifdef RGB_MATRIX_ENABLE
+bool rgb_matrix_indicators_kb(void) {
+ if (!rgb_matrix_indicators_user()) {
+ return false;
+ }
+ // if (is_keyboard_master()) {
+ if (host_keyboard_led_state().caps_lock) { // 处于 CPAS LOCK 状态
+ rgb_matrix_set_color(5, 100, 0, 0); // 灯变为红色(R:255, G:0, B:0)
+ }
+ return true;
+}
+#endif
+
+#ifdef OLED_ENABLE
+// WPM-responsive animation stuff here
+# define IDLE_FRAMES 5
+# define IDLE_SPEED 20 // below this wpm value your animation will idle
+
+// #define PREP_FRAMES 1 // uncomment if >1
+
+# define TAP_FRAMES 2
+# define TAP_SPEED 40 // above this wpm value typing animation to trigger
+
+# define ANIM_FRAME_DURATION 200 // how long each frame lasts in ms
+// #define SLEEP_TIMER 60000 // should sleep after this period of 0 wpm, needs fixing
+# define ANIM_SIZE 636 // number of bytes in array, minimize for adequate firmware size, max is 1024
+
+uint32_t anim_timer = 0;
+uint32_t anim_sleep = 0;
+uint8_t current_idle_frame = 0;
+// uint8_t current_prep_frame = 0; // uncomment if PREP_FRAMES >1
+uint8_t current_tap_frame = 0;
+
+static void render_anim(void) {
+ static const char PROGMEM idle[IDLE_FRAMES][ANIM_SIZE] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x18, 0x04, 0x02, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x30, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x86, 0x86, 0x40, 0x40, 0x40, 0x40, 0x21, 0x22, 0x22, 0x20, 0x11, 0x11, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x82, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x60, 0x60, 0x00, 0x01, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x30, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x86, 0x86, 0x40, 0x40, 0x40, 0x40, 0x21, 0x22, 0x22, 0x20, 0x11, 0x11, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x34, 0xc4, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x18, 0x04, 0x02, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0d, 0x31, 0xc1, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x04, 0x04, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
+ static const char PROGMEM prep[][ANIM_SIZE] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x84, 0x44, 0x44, 0x42, 0x82, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x64, 0x18, 0x04, 0x12, 0xc2, 0xca, 0x24, 0x88, 0xf0, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x02, 0x18, 0x19, 0x00, 0x05, 0xfe, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
+ static const char PROGMEM tap[TAP_FRAMES][ANIM_SIZE] = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x64, 0x18, 0x04, 0x12, 0xc2, 0xca, 0x24, 0x88, 0xf0, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x98, 0xc0, 0x88, 0x88, 0x8c, 0x9c, 0x1c, 0x1e, 0x0e, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x84, 0x44, 0x44, 0x42, 0x82, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x02, 0x18, 0x19, 0x00, 0x05, 0xfe, 0x80, 0x83, 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0f, 0x0f, 0x07, 0x03, 0x03, 0x61, 0xf0, 0xf8, 0xfc, 0x60, 0x01, 0x01, 0x01, 0x3c, 0x78, 0xf8, 0xf0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ };
+
+ // assumes 1 frame prep stage
+ void animation_phase(void) {
+ if (get_current_wpm() <= IDLE_SPEED) {
+ current_idle_frame = (current_idle_frame + 1) % IDLE_FRAMES;
+ oled_write_raw_P(idle[abs((IDLE_FRAMES - 1) - current_idle_frame)], ANIM_SIZE);
+ }
+ if (get_current_wpm() > IDLE_SPEED && get_current_wpm() < TAP_SPEED) {
+ // oled_write_raw_P(prep[abs((PREP_FRAMES-1)-current_prep_frame)], ANIM_SIZE); // uncomment if IDLE_FRAMES >1
+ oled_write_raw_P(prep[0], ANIM_SIZE); // remove if IDLE_FRAMES >1
+ }
+ if (get_current_wpm() >= TAP_SPEED) {
+ current_tap_frame = (current_tap_frame + 1) % TAP_FRAMES;
+ oled_write_raw_P(tap[abs((TAP_FRAMES - 1) - current_tap_frame)], ANIM_SIZE);
+ }
+ }
+ if (get_current_wpm() != 000) {
+ oled_on(); // not essential but turns on animation OLED with any alpha keypress
+ if (timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) {
+ anim_timer = timer_read32();
+ animation_phase();
+ }
+ anim_sleep = timer_read32();
+ } else {
+
+ if (timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) {
+ anim_timer = timer_read32();
+ animation_phase();
+ }
+
+ }
+}
+
+oled_rotation_t oled_init_kb(oled_rotation_t rotation) {
+ if (!is_keyboard_master()) {
+ return OLED_ROTATION_180;
+ } else {
+ return rotation;
+ }
+}
+
+static void render_keylock_status(led_t led_state) {
+ oled_write_P(PSTR("Lock: "), false);
+ oled_write_P(PSTR("CAPS"), led_state.caps_lock);
+ oled_write_P(PSTR(" "), false);
+ oled_write_P(PSTR("NUML"), led_state.num_lock);
+ oled_write_P(PSTR(" "), false);
+ oled_write_ln_P(PSTR("SCLK"), led_state.scroll_lock);
+}
+
+static void render_mod_status(uint8_t modifiers) {
+ oled_write_P(PSTR("Mods: "), false);
+ oled_write_P(PSTR("Sft"), (modifiers & MOD_MASK_SHIFT));
+ oled_write_P(PSTR(" "), false);
+ oled_write_P(PSTR("Ctl"), (modifiers & MOD_MASK_CTRL));
+ oled_write_P(PSTR(" "), false);
+ oled_write_P(PSTR("Alt"), (modifiers & MOD_MASK_ALT));
+ oled_write_P(PSTR(" "), false);
+ oled_write_P(PSTR("GUI"), (modifiers & MOD_MASK_GUI));
+}
+
+
+static void render_status(void) {
+ // Host Keyboard Layer Status
+ switch (get_highest_layer(default_layer_state)) {
+ case 0:
+ oled_write_P(PSTR("QWERTY | "), false);
+ break;
+ }
+
+ switch (get_highest_layer(layer_state)) {
+ case 0:
+ oled_write_P(PSTR("Base \n"), false);
+ break;
+
+ case 1:
+ oled_write_P(PSTR("Lower \n"), false);
+ break;
+
+ case 2:
+ oled_write_P(PSTR("Raise \n"), false);
+ break;
+
+ case 3:
+ oled_write_P(PSTR("Adjust \n"), false);
+ break;
+
+ default:
+ oled_write_P(PSTR("Unknown \n"), false);
+ }
+
+ oled_write_P(PSTR("\n"), false);
+ render_keylock_status(host_keyboard_led_state());
+ render_mod_status(get_mods() | get_oneshot_mods());
+}
+
+bool oled_task_kb(void) {
+ if (!oled_task_user()) {
+ return false;
+ }
+
+ if (is_keyboard_master()) {
+ // Renders the current keyboard state (layer, lock, caps, scroll, etc)
+ render_status();
+ } else {
+ render_anim(); // renders pixelart
+
+ oled_set_cursor(0, 0); // sets cursor to (row, column) using charactar spacing (5 rows on 128x32 screen, anything more will overflow back to the top)
+ oled_write_P(PSTR("WPM: "), false);
+ oled_write(get_u8_str(get_current_wpm(), '0'), false);
+
+ led_t led_state = host_keyboard_led_state(); // caps lock stuff, prints CAPS on new line if caps led is on
+ oled_set_cursor(0, 1);
+ oled_write_P(led_state.caps_lock ? PSTR("CAPS") : PSTR(" "), false);
+
+ return false;
+ }
+
+ return false;
+}
+#endif
diff --git a/keyboards/meetlab/kafkasplit/keymaps/default/keymap.c b/keyboards/meetlab/kafkasplit/keymaps/default/keymap.c
new file mode 100644
index 000000000000..db6ccd891257
--- /dev/null
+++ b/keyboards/meetlab/kafkasplit/keymaps/default/keymap.c
@@ -0,0 +1,73 @@
+/* Copyright 2022 LXF-YZP(yuezp)
+ *
+ * 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 FITNKCS 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 .
+ */
+
+#include QMK_KEYBOARD_H
+
+enum layer_namKC {
+ _BASE,
+ _LOWER,
+ _RAISE,
+ _ADJUST
+};
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [_BASE] = LAYOUT(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ KC_LCTL, KC_LGUI, MO(1), KC_SPC, KC_ENT, MO(2), KC_BSPC, KC_LALT
+ //`----------------------------------' `------------------------------------'
+ ),
+
+ [_LOWER] = LAYOUT(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_MINS, KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_BSPC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LCTL, KC_F5, KC_F6, KC_F7, KC_F8, KC_EQL, KC_DEL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, XXXXXXX,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LSFT, KC_F9, KC_F10, KC_F11, KC_F12, KC_PAUS, XXXXXXX, XXXXXXX, KC_LBRC, KC_RBRC, KC_BSLS, KC_RSFT,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ _______, KC_LGUI, _______, KC_SPC, KC_ENT, _______, _______, KC_LALT
+ //`-----------------------------------' `----------------------------------'
+ ),
+ [_RAISE] = LAYOUT(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ KC_CAPS, KC_EXLM, KC_DQUO, KC_HASH, KC_CIRC, XXXXXXX, KC_ASTR, KC_7, KC_8, KC_9, KC_MINS, KC_BSPC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LCTL, KC_LCBR, KC_RCBR, KC_LPRN, KC_RPRN, XXXXXXX, KC_SLSH, KC_4, KC_5, KC_6, KC_PLUS, KC_QUOT,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LSFT, KC_LBRC, KC_RBRC, KC_LABK, KC_RABK, KC_EQL, KC_0, KC_1, KC_2, KC_3, KC_DOT, KC_RSFT,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ _______, KC_LGUI, _______, KC_SPC, KC_ENT, _______, _______, _______
+ //`----------------------------------' `------------------------------------'
+ ),
+ [_ADJUST] = LAYOUT(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ XXXXXXX, XXXXXXX, KC_AT, XXXXXXX, KC_DLR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BSPC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LCTL, XXXXXXX, KC_AMPR, KC_PIPE, KC_BSLS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_TILD, KC_GRV,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, KC_PERC, XXXXXXX, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, KC_RSFT,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ _______, KC_LGUI, _______, KC_SPC, KC_ENT, _______, _______, KC_LALT
+ //`---------------------------------' `-----------------------------------'
+ )
+
+};
diff --git a/keyboards/meetlab/kafkasplit/keymaps/via/keymap.c b/keyboards/meetlab/kafkasplit/keymaps/via/keymap.c
new file mode 100644
index 000000000000..db6ccd891257
--- /dev/null
+++ b/keyboards/meetlab/kafkasplit/keymaps/via/keymap.c
@@ -0,0 +1,73 @@
+/* Copyright 2022 LXF-YZP(yuezp)
+ *
+ * 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 FITNKCS 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 .
+ */
+
+#include QMK_KEYBOARD_H
+
+enum layer_namKC {
+ _BASE,
+ _LOWER,
+ _RAISE,
+ _ADJUST
+};
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [_BASE] = LAYOUT(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ KC_LCTL, KC_LGUI, MO(1), KC_SPC, KC_ENT, MO(2), KC_BSPC, KC_LALT
+ //`----------------------------------' `------------------------------------'
+ ),
+
+ [_LOWER] = LAYOUT(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_MINS, KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_BSPC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LCTL, KC_F5, KC_F6, KC_F7, KC_F8, KC_EQL, KC_DEL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, XXXXXXX,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LSFT, KC_F9, KC_F10, KC_F11, KC_F12, KC_PAUS, XXXXXXX, XXXXXXX, KC_LBRC, KC_RBRC, KC_BSLS, KC_RSFT,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ _______, KC_LGUI, _______, KC_SPC, KC_ENT, _______, _______, KC_LALT
+ //`-----------------------------------' `----------------------------------'
+ ),
+ [_RAISE] = LAYOUT(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ KC_CAPS, KC_EXLM, KC_DQUO, KC_HASH, KC_CIRC, XXXXXXX, KC_ASTR, KC_7, KC_8, KC_9, KC_MINS, KC_BSPC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LCTL, KC_LCBR, KC_RCBR, KC_LPRN, KC_RPRN, XXXXXXX, KC_SLSH, KC_4, KC_5, KC_6, KC_PLUS, KC_QUOT,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LSFT, KC_LBRC, KC_RBRC, KC_LABK, KC_RABK, KC_EQL, KC_0, KC_1, KC_2, KC_3, KC_DOT, KC_RSFT,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ _______, KC_LGUI, _______, KC_SPC, KC_ENT, _______, _______, _______
+ //`----------------------------------' `------------------------------------'
+ ),
+ [_ADJUST] = LAYOUT(
+ //,-----------------------------------------------------. ,-----------------------------------------------------.
+ XXXXXXX, XXXXXXX, KC_AT, XXXXXXX, KC_DLR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BSPC,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LCTL, XXXXXXX, KC_AMPR, KC_PIPE, KC_BSLS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_TILD, KC_GRV,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, KC_PERC, XXXXXXX, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, KC_RSFT,
+ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
+ _______, KC_LGUI, _______, KC_SPC, KC_ENT, _______, _______, KC_LALT
+ //`---------------------------------' `-----------------------------------'
+ )
+
+};
diff --git a/keyboards/meetlab/kafkasplit/keymaps/via/rules.mk b/keyboards/meetlab/kafkasplit/keymaps/via/rules.mk
new file mode 100644
index 000000000000..1e5b99807cb7
--- /dev/null
+++ b/keyboards/meetlab/kafkasplit/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/meetlab/kafkasplit/matrix_diagram.md b/keyboards/meetlab/kafkasplit/matrix_diagram.md
new file mode 100644
index 000000000000..4fa57f74a2a8
--- /dev/null
+++ b/keyboards/meetlab/kafkasplit/matrix_diagram.md
@@ -0,0 +1,14 @@
+# Matrix Diagram for kafkaSplit
+
+```
+┌───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┬───┬───┬───┐
+│00 │01 │02 │03 │04 │05 │ │40 │41 │42 │43 │44 │45 │
+├───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┤
+│10 │11 │12 │13 │14 │15 │ │50 │51 │52 │53 │54 │55 │
+├───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┤
+│20 │21 │22 │23 │24 │25 │ │60 │61 │62 │63 │64 │65 │
+└───┴───┴───┼───┼───┼───┼───┐ ┌───┼───┼───┼───┼───┴───┴───┘
+ │32 │33 │34 │35 │ │70 │71 │72 │73 │
+ └───┴───┴───┴───┘ └───┴───┴───┴───┘
+
+```
diff --git a/keyboards/meetlab/kafkasplit/mcuconf.h b/keyboards/meetlab/kafkasplit/mcuconf.h
new file mode 100644
index 000000000000..56bd747d62cb
--- /dev/null
+++ b/keyboards/meetlab/kafkasplit/mcuconf.h
@@ -0,0 +1,22 @@
+/* Copyright 2022 JasonRen(biu)
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include_next
+
+#undef RP_I2C_USE_I2C1
+#define RP_I2C_USE_I2C1 TRUE
diff --git a/keyboards/meetlab/kafkasplit/readme.md b/keyboards/meetlab/kafkasplit/readme.md
new file mode 100644
index 000000000000..7b332d784a55
--- /dev/null
+++ b/keyboards/meetlab/kafkasplit/readme.md
@@ -0,0 +1,26 @@
+# kafkasplit - PCB
+
+![kafkasplit](https://i.imgur.com/fqxZGeHh.jpg)
+
+A 44-key split keyboard with rgb
+
+* Keyboard Maintainer: https://github.com/LXF-YZP
+* Hardware Supported: https://github.com/LXF-YZP/KafkaSplit
+
+Make example for this keyboard (after setting up your build environment):
+
+ make meetlab/kafkasplit:default
+
+Flashing example for this keyboard:
+
+ make meetlab/kafkasplit: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
\ No newline at end of file
diff --git a/keyboards/meetlab/kafkasplit/rules.mk b/keyboards/meetlab/kafkasplit/rules.mk
new file mode 100644
index 000000000000..161ec22b16e2
--- /dev/null
+++ b/keyboards/meetlab/kafkasplit/rules.mk
@@ -0,0 +1 @@
+SERIAL_DRIVER = vendor
From 79f97207347c16e25a6c57e6a84110f02b633288 Mon Sep 17 00:00:00 2001
From: 4pplet
Date: Fri, 29 Dec 2023 17:17:20 +0100
Subject: [PATCH 31/31] Waffling60 iso rev e (#22733)
Co-authored-by: jack <0x6a73@protonmail.com>
Co-authored-by: Drashna Jaelre
---
.../4pplet/waffling60/rev_e_iso/config.h | 20 +
.../4pplet/waffling60/rev_e_iso/info.json | 408 ++++++++++++++++++
.../rev_e_iso/keymaps/default/keymap.c | 40 ++
.../rev_e_iso/keymaps/default/rules.mk | 1 +
.../waffling60/rev_e_iso/keymaps/via/keymap.c | 41 ++
.../waffling60/rev_e_iso/keymaps/via/rules.mk | 2 +
.../waffling60/rev_e_iso/matrix_diagram.md | 24 ++
.../4pplet/waffling60/rev_e_iso/readme.md | 26 ++
.../4pplet/waffling60/rev_e_iso/rules.mk | 2 +
9 files changed, 564 insertions(+)
create mode 100644 keyboards/4pplet/waffling60/rev_e_iso/config.h
create mode 100644 keyboards/4pplet/waffling60/rev_e_iso/info.json
create mode 100644 keyboards/4pplet/waffling60/rev_e_iso/keymaps/default/keymap.c
create mode 100644 keyboards/4pplet/waffling60/rev_e_iso/keymaps/default/rules.mk
create mode 100644 keyboards/4pplet/waffling60/rev_e_iso/keymaps/via/keymap.c
create mode 100644 keyboards/4pplet/waffling60/rev_e_iso/keymaps/via/rules.mk
create mode 100644 keyboards/4pplet/waffling60/rev_e_iso/matrix_diagram.md
create mode 100644 keyboards/4pplet/waffling60/rev_e_iso/readme.md
create mode 100644 keyboards/4pplet/waffling60/rev_e_iso/rules.mk
diff --git a/keyboards/4pplet/waffling60/rev_e_iso/config.h b/keyboards/4pplet/waffling60/rev_e_iso/config.h
new file mode 100644
index 000000000000..521ddf96a183
--- /dev/null
+++ b/keyboards/4pplet/waffling60/rev_e_iso/config.h
@@ -0,0 +1,20 @@
+/*
+Copyright 2023 Stefan Sundin "4pplet"
+
+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 .
+*/
+#pragma once
+
+#define WS2812_EXTERNAL_PULLUP
+
diff --git a/keyboards/4pplet/waffling60/rev_e_iso/info.json b/keyboards/4pplet/waffling60/rev_e_iso/info.json
new file mode 100644
index 000000000000..e53dcab891cd
--- /dev/null
+++ b/keyboards/4pplet/waffling60/rev_e_iso/info.json
@@ -0,0 +1,408 @@
+{
+ "manufacturer": "4pplet",
+ "keyboard_name": "waffling60 Rev E ISO HS",
+ "maintainer": "4pplet",
+ "bootloader": "stm32-dfu",
+ "diode_direction": "COL2ROW",
+ "encoder": {
+ "rotary": [
+ {"pin_a": "A2", "pin_b": "A1", "resolution": 2}
+ ]
+ },
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "key_lock": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgblight": true
+ },
+ "matrix_pins": {
+ "cols": ["B2", "A4", "A3", "A0", "F1", "F0", "C15", "C14", "C13", "B9", "B8", "B7", "A15", "B3"],
+ "rows": ["B14", "A9", "B6", "B5", "B4"]
+ },
+ "processor": "STM32F072",
+ "rgblight": {
+ "animations": {
+ "alternating": true,
+ "breathing": true,
+ "christmas": true,
+ "knight": true,
+ "rainbow_mood": true,
+ "rainbow_swirl": true,
+ "rgb_test": true,
+ "snake": true,
+ "static_gradient": true,
+ "twinkle": true
+ },
+ "led_count": 17
+ },
+ "url": "https://github.com/4pplet/waffling60",
+ "usb": {
+ "device_version": "0.0.5",
+ "pid": "0x0016",
+ "vid": "0x4444"
+ },
+ "ws2812": {
+ "pin": "A8"
+ },
+ "community_layouts": [
+ "60_iso_tsangan_split_bs_rshift",
+ "60_iso_wkl_split_bs_rshift"
+ ],
+ "layouts": {
+ "LAYOUT_all": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [1, 13], "x": 14, "y": 0},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "x": 12.75, "y": 2},
+ {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
+ {"matrix": [3, 1], "x": 1.25, "y": 3},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 1], "x": 1.5, "y": 4},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 4], "x": 4, "y": 4, "w": 3},
+ {"matrix": [4, 6], "x": 7, "y": 4},
+ {"matrix": [4, 8], "x": 8, "y": 4, "w": 3},
+ {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
+ {"matrix": [4, 12], "x": 12.5, "y": 4},
+ {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
+ ]
+ },
+ "LAYOUT_60_iso_tsangan_split_rshift": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [1, 13], "x": 13, "y": 0, "w": 2},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "x": 12.75, "y": 2},
+ {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
+ {"matrix": [3, 1], "x": 1.25, "y": 3},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 1], "x": 1.5, "y": 4},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+ {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
+ {"matrix": [4, 12], "x": 12.5, "y": 4},
+ {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
+ ]
+ },
+ "LAYOUT_60_iso_tsangan_split_bs_rshift": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [1, 13], "x": 14, "y": 0},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "x": 12.75, "y": 2},
+ {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
+ {"matrix": [3, 1], "x": 1.25, "y": 3},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 1], "x": 1.5, "y": 4},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+ {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
+ {"matrix": [4, 12], "x": 12.5, "y": 4},
+ {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
+ ]
+ },
+ "LAYOUT_60_iso_wkl_split_rshift": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [1, 13], "x": 13, "y": 0, "w": 2},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "x": 12.75, "y": 2},
+ {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
+ {"matrix": [3, 1], "x": 1.25, "y": 3},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+ {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
+ {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
+ ]
+ },
+ "LAYOUT_60_iso_wkl_split_bs_rshift": {
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0},
+ {"matrix": [0, 1], "x": 1, "y": 0},
+ {"matrix": [0, 2], "x": 2, "y": 0},
+ {"matrix": [0, 3], "x": 3, "y": 0},
+ {"matrix": [0, 4], "x": 4, "y": 0},
+ {"matrix": [0, 5], "x": 5, "y": 0},
+ {"matrix": [0, 6], "x": 6, "y": 0},
+ {"matrix": [0, 7], "x": 7, "y": 0},
+ {"matrix": [0, 8], "x": 8, "y": 0},
+ {"matrix": [0, 9], "x": 9, "y": 0},
+ {"matrix": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [1, 13], "x": 14, "y": 0},
+
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "x": 12.75, "y": 2},
+ {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
+ {"matrix": [3, 1], "x": 1.25, "y": 3},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+ {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
+ {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/4pplet/waffling60/rev_e_iso/keymaps/default/keymap.c b/keyboards/4pplet/waffling60/rev_e_iso/keymaps/default/keymap.c
new file mode 100644
index 000000000000..545e1e974fb1
--- /dev/null
+++ b/keyboards/4pplet/waffling60/rev_e_iso/keymaps/default/keymap.c
@@ -0,0 +1,40 @@
+/*
+Copyright 2023 Stefan Sundin "4pplet" <4pplet@protonmail.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 .
+*/
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+// main layer
+[0] = LAYOUT_all(
+ KC_ESC, 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_NO, KC_BSPC,
+ 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_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL),
+// basic function layer
+[1] = LAYOUT_all(
+ QK_BOOT, 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_TRNS, KC_DEL,
+ KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NUHS, 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, 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][NUM_DIRECTIONS] = {
+ [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [1] = { ENCODER_CCW_CW(KC_BRID, KC_BRIU) }
+};
+#endif
diff --git a/keyboards/4pplet/waffling60/rev_e_iso/keymaps/default/rules.mk b/keyboards/4pplet/waffling60/rev_e_iso/keymaps/default/rules.mk
new file mode 100644
index 000000000000..ee325681483f
--- /dev/null
+++ b/keyboards/4pplet/waffling60/rev_e_iso/keymaps/default/rules.mk
@@ -0,0 +1 @@
+ENCODER_MAP_ENABLE = yes
diff --git a/keyboards/4pplet/waffling60/rev_e_iso/keymaps/via/keymap.c b/keyboards/4pplet/waffling60/rev_e_iso/keymaps/via/keymap.c
new file mode 100644
index 000000000000..3254764a0c51
--- /dev/null
+++ b/keyboards/4pplet/waffling60/rev_e_iso/keymaps/via/keymap.c
@@ -0,0 +1,41 @@
+/*
+Copyright 2023 Stefan Sundin "4pplet" <4pplet@protonmail.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 .
+*/
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+// main layer
+[0] = LAYOUT_all(
+ KC_ESC, 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_BSLS, KC_BSPC,
+ 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_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL),
+// basic function layer
+[1] = LAYOUT_all(
+ QK_BOOT, 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_TRNS, KC_DEL,
+ KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, 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, 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, KC_TRNS),
+};
+
+#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_BRID, KC_BRIU) }
+};
+#endif
diff --git a/keyboards/4pplet/waffling60/rev_e_iso/keymaps/via/rules.mk b/keyboards/4pplet/waffling60/rev_e_iso/keymaps/via/rules.mk
new file mode 100644
index 000000000000..f1adcab005e8
--- /dev/null
+++ b/keyboards/4pplet/waffling60/rev_e_iso/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+ENCODER_MAP_ENABLE = yes
diff --git a/keyboards/4pplet/waffling60/rev_e_iso/matrix_diagram.md b/keyboards/4pplet/waffling60/rev_e_iso/matrix_diagram.md
new file mode 100644
index 000000000000..9ccedf98e30e
--- /dev/null
+++ b/keyboards/4pplet/waffling60/rev_e_iso/matrix_diagram.md
@@ -0,0 +1,24 @@
+# Matrix Diagram for 4pplet Waffling60 Rev E ISO
+
+```
+ ┌───────┐
+ 2u Backspace │1D │
+ └───────┘
+┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
+│00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0A │0B │0C │0D │1D │
+├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤
+│10 │11 │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │ │
+├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐2D │
+│20 │21 │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │2C │ │
+├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬───┤
+│30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3A │3B │3C │3D │
+├────┴┬──┴┬──┴──┬┴───┴───┴──┬┴──┬┴───┴───┴──┬┴───┴┬───┬─┴───┤
+│40 │41 │42 │44 │46 │48 │4B │4C │4D │
+└─────┴───┴─────┴───────────┴───┴───────────┴─────┴───┴─────┘
+┌─────┬───┬─────┬───────────────────────────┬─────┬───┬─────┐
+│40 │41 │42 │46 │4B │4C │4D │ Tsangan/WKL/HHKB
+└─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘
+┌─────┬───┬───────────────────────────────────────┬───┬─────┐
+│40 │41 │46 │4C │4D │ 10u Spacebar
+└─────┴───┴───────────────────────────────────────┴───┴─────┘
+```
\ No newline at end of file
diff --git a/keyboards/4pplet/waffling60/rev_e_iso/readme.md b/keyboards/4pplet/waffling60/rev_e_iso/readme.md
new file mode 100644
index 000000000000..03fa4889c62b
--- /dev/null
+++ b/keyboards/4pplet/waffling60/rev_e_iso/readme.md
@@ -0,0 +1,26 @@
+# waffling60 Rev. E ISO
+
+A 60% PCB for MX switches, one hot swap and one solder-pcb version with decent layout support. Revision E adds underglow and rotary encoder support.
+
+More info: https://github.com/4pplet/waffling60
+
+* Keyboard Maintainer: [4pplet](https://github.com/4pplet)
+* Hardware Supported: [waffling60](https://github.com/4pplet/waffling60)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make 4pplet/waffling60/rev_e_iso:default
+
+Flashing example for this keyboard:
+
+ make 4pplet/waffling60/rev_e_iso: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
+
+How to enter bootloader (DFU):
+* Short the reset-header (labled BL/RESET) on the back of the PCB for about 2 seconds for the keyboard to enter DFU. When in DFU, it's ready to flash the firmware. If using a APM MCU it will not automatically reset after flash. Simply short the reset-header for a very short time to just reset the PCB, alternatively unplug and repluck the USB-cable to the keyboard.
+
+Alternative option if the firmware is already pre-flashed:
+* Unplug your keyboard, hold down the Spacebar and B at the same time, plug in your keyboard and wait a second before releasing the keys. The keyboard will enter DFU and is ready to flash the firmware.
diff --git a/keyboards/4pplet/waffling60/rev_e_iso/rules.mk b/keyboards/4pplet/waffling60/rev_e_iso/rules.mk
new file mode 100644
index 000000000000..04fe1eba2acd
--- /dev/null
+++ b/keyboards/4pplet/waffling60/rev_e_iso/rules.mk
@@ -0,0 +1,2 @@
+# Wildcard to allow APM32 MCU
+DFU_SUFFIX_ARGS = -p FFFF -v FFFF