qmk_me

QMK Firmware userspace, keyboards, & keymaps
git clone git://git.pngu.org.org/qmk_me
Log | Files | Refs | Submodules | README | LICENSE

commit 8999cef3e7c97bf6cc9881472f5bdff12d7314eb
parent 3d69064553d5e66b42226bf0e59d5360a3d4c38d
Author: Jack Sangdahl <jack@pngu.org>
Date:   Sat, 20 Sep 2025 13:18:11 -0600

Initial quantum painter code

Diffstat:
Mkeyboards/crkbd/keymaps/jack/keymap.c | 10+++++-----
Mkeyboards/splitkb/kyria/keymaps/jack/keymap.c | 4++--
Mkeyboards/sweep/config.h | 10----------
Mkeyboards/sweep/keyboard.json | 3+++
Akeyboards/sweep/keymaps/jack/config.h | 13+++++++++++++
Mkeyboards/sweep/keymaps/jack/keymap.c | 27+++++++++++++++++++++++----
Akeyboards/sweep/keymaps/jack/rules.mk | 1+
Mkeyboards/sweep/rules.mk | 3+--
Dkeyboards/sweep/sweep.c | 27---------------------------
Musers/jack/jack.c | 3+++
Musers/jack/jack.h | 17+++++++++++------
Musers/jack/oled.c | 12++++++------
Ausers/jack/painter.c | 10++++++++++
Ausers/jack/painter.h | 6++++++
Musers/jack/rules.mk | 4++++
15 files changed, 88 insertions(+), 62 deletions(-)

diff --git a/keyboards/crkbd/keymaps/jack/keymap.c b/keyboards/crkbd/keymaps/jack/keymap.c @@ -46,14 +46,14 @@ oled_rotation_t oled_init_user(oled_rotation_t rotation) { bool oled_task_keymap(void) { if (is_keyboard_master()) - render_layer_anim(); + oled_layer_anim(); else { - render_layer_status(); + oled_layer_status(); oled_set_cursor(0, 3); - render_felix_dog(); + oled_felix_dog(); oled_set_cursor(0, 7); - render_wpm(); - render_mod_status(); + oled_wpm(); + oled_mod_status(); } return false; } diff --git a/keyboards/splitkb/kyria/keymaps/jack/keymap.c b/keyboards/splitkb/kyria/keymaps/jack/keymap.c @@ -30,8 +30,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #ifdef OLED_ENABLE bool oled_task_keymap(void) { if (is_keyboard_left()) { - render_wpm_graph(); - render_wpm(); + oled_wpm_graph(); + oled_wpm(); } return false; } diff --git a/keyboards/sweep/config.h b/keyboards/sweep/config.h @@ -6,8 +6,6 @@ #define SERIAL_USART_TX_PIN GP0 #define SERIAL_USART_RX_PIN GP1 -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET - #define SPI_DRIVER SPID0 #define SPI_SCK_PIN GP6 #define SPI_MOSI_PIN GP3 @@ -16,14 +14,6 @@ #define LCD_CS_PIN GP5 #define LCD_DC_PIN GP6 #define LCD_RST_PIN GP28 -#define LCD_DISPLAY_WIDTH 135 -#define LCD_DISPLAY_HEIGHT 240 -#define LCD_SPI_DIVISOR 4 #define BACKLIGHT_PWM_DRIVER PWMD3 #define BACKLIGHT_PWM_CHANNEL 2 - -#define ADC_RESOLUTION 12 -#define ADC_SATURATION ((1 << 12) - 1) -#define ADC_CURRENT_PIN GP26 -#define ADC_VOLTAGE_PIN GP27 diff --git a/keyboards/sweep/keyboard.json b/keyboards/sweep/keyboard.json @@ -70,6 +70,9 @@ "sleep": true, "split_count": [21, 21] }, + "rp2040_bootloader": { + "double_tap_reset": true + }, "split": { "enabled": true, "handedness": { diff --git a/keyboards/sweep/keymaps/jack/config.h b/keyboards/sweep/keymaps/jack/config.h @@ -0,0 +1,13 @@ +// Copyright 2025 jack@pngu.org +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define LCD_DISPLAY_WIDTH 135 +#define LCD_DISPLAY_HEIGHT 240 +#define LCD_SPI_DIVISOR 4 + +#define ADC_RESOLUTION 12 +#define ADC_SATURATION ((1 << 12) - 1) +#define NUM_ADC_READS 32 +#define ADC_CURRENT_PIN GP26 +#define ADC_VOLTAGE_PIN GP27 diff --git a/keyboards/sweep/keymaps/jack/keymap.c b/keyboards/sweep/keymaps/jack/keymap.c @@ -3,8 +3,6 @@ #include "jack.h" #include "analog.h" -#define NUM_ADC_READS 32 - // clang-format off const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BASE] = LAYOUT_jack( @@ -28,6 +26,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; // clang-format on +static painter_device_t display; + +void keyboard_post_init_keymap() { + display = qp_st7789_make_spi_device(LCD_DISPLAY_WIDTH, LCD_DISPLAY_HEIGHT, + LCD_CS_PIN, LCD_DC_PIN, LCD_RST_PIN, + LCD_SPI_DIVISOR, 0); + qp_init(display, QP_ROTATION_0); +} + void housekeeping_task_keymap(void) { static uint32_t last_read = 0; static int16_t current_reads[NUM_ADC_READS] = {0}; @@ -63,8 +70,20 @@ void housekeeping_task_keymap(void) { total_current_ma += current_reads[i]; total_voltage_mv += voltage_reads[i]; } - // int16_t avg_current_ma = (int16_t)(total_current_ma / NUM_ADC_READS); - // int16_t avg_voltage_mv = (int16_t)(total_voltage_mv / NUM_ADC_READS); + int16_t avg_current_ma = (int16_t)(total_current_ma / NUM_ADC_READS); + int16_t avg_voltage_mv = (int16_t)(total_voltage_mv / NUM_ADC_READS); + char data[32] = {}; + sprintf(data, "Current: %dmA", avg_current_ma); + qp_drawtext(display, 0, LCD_DISPLAY_WIDTH - qp_font->line_height * 2, + qp_font, data); + sprintf(data, "Voltage: %dmV", avg_voltage_mv); + qp_drawtext(display, 0, LCD_DISPLAY_WIDTH - qp_font->line_height, qp_font, + data); + qp_flush(display); last_draw = timer_read32(); } } + +void suspend_power_down_user(void) { qp_power(display, false); } + +void suspend_wakeup_init_user(void) { qp_power(display, true); } diff --git a/keyboards/sweep/keymaps/jack/rules.mk b/keyboards/sweep/keymaps/jack/rules.mk @@ -0,0 +1 @@ +ANALOG_DRIVER_REQUIRED = yes diff --git a/keyboards/sweep/rules.mk b/keyboards/sweep/rules.mk @@ -1,2 +1 @@ -QUANTUM_PAINTER_DRIVERS += st7789_spi -ANALOG_DRIVER_REQUIRED = yes +QUANTUM_PAINTER_DRIVERS = st7789_spi diff --git a/keyboards/sweep/sweep.c b/keyboards/sweep/sweep.c @@ -1,27 +0,0 @@ -// Copyright 2025 jack@pngu.org -// SPDX-License-Identifier: GPL-2.0-or-later -#include "quantum.h" - -#ifdef QUANTUM_PAINTER_ENABLE -#include "qp.h" - -static painter_device_t display; - -void keyboard_post_init_kb(void) { - display = qp_st7789_make_spi_device(LCD_DISPLAY_WIDTH, LCD_DISPLAY_HEIGHT, - LCD_CS_PIN, LCD_DC_PIN, LCD_RST_PIN, - LCD_SPI_DIVISOR, 0); - qp_init(display, QP_ROTATION_0); - keyboard_post_init_user(); -} - -void suspend_power_down_kb(void) { - qp_power(display, false); - suspend_power_down_user(); -} - -void suspend_wakeup_init_kb(void) { - qp_power(display, true); - suspend_wakeup_init_user(); -} -#endif // QUANTUM_PAINTER_ENABLE diff --git a/users/jack/jack.c b/users/jack/jack.c @@ -20,6 +20,9 @@ void keyboard_post_init_user(void) { #ifdef RGB_MATRIX_ENABLE keyboard_post_init_rgb_matrix(); #endif +#ifdef QUANTUM_PAINTER_ENABLE + keyboard_post_init_qp(); +#endif #ifdef AUTOCORRECT_ENABLE if (!autocorrect_is_enabled()) autocorrect_enable(); diff --git a/users/jack/jack.h b/users/jack/jack.h @@ -42,15 +42,20 @@ void em_dash_mins(tap_dance_state_t *state, void *user_data); void ply_nxt_prv(tap_dance_state_t *state, void *user_data); #endif +#ifdef QUANTUM_PAINTER_ENABLE +void keyboard_post_init_qp(void); +extern painter_font_handle_t qp_font; +#endif + #ifdef OLED_ENABLE bool oled_task_keymap(void); void oled_timer_reset(void); -void render_wpm_graph(void); -void render_felix_dog(void); -void render_layer_anim(void); -void render_layer_status(void); -void render_mod_status(void); -void render_wpm(void); +void oled_wpm_graph(void); +void oled_felix_dog(void); +void oled_layer_anim(void); +void oled_layer_status(void); +void oled_mod_status(void); +void oled_wpm(void); #endif void keyboard_pre_init_keymap(void); diff --git a/users/jack/oled.c b/users/jack/oled.c @@ -26,7 +26,7 @@ void anim_frame(uint16_t size, char const action[][size]) { oled_write_raw(action[current_frame], size); } -void render_wpm_graph(void) { +void oled_wpm_graph(void) { static uint8_t height = OLED_DISPLAY_HEIGHT - 1, vert_count = 0, max_wpm = 160; extern uint8_t oled_buffer[OLED_MATRIX_SIZE]; @@ -59,7 +59,7 @@ void render_wpm_graph(void) { } } -void render_felix_dog(void) { +void oled_felix_dog(void) { static uint16_t felix_anim_timer = 0; if (timer_elapsed(felix_anim_timer) > 200) { felix_anim_timer = timer_read(); @@ -77,7 +77,7 @@ void render_felix_dog(void) { } } -void render_layer_anim(void) { +void oled_layer_anim(void) { static uint16_t layer_anim_timer = 0; if (timer_elapsed(layer_anim_timer) > 200) { layer_anim_timer = timer_read(); @@ -95,7 +95,7 @@ void render_layer_anim(void) { } } -void render_layer_status(void) { +void oled_layer_status(void) { static const char PROGMEM base[] = {0x20, 0x94, 0x95, 0x96, 0x20, 0x20, 0xb4, 0xb5, 0xb6, 0x20, 0x20, 0xd4, 0xd5, 0xd6, 0x20}; @@ -117,7 +117,7 @@ void render_layer_status(void) { } } -void render_mod_status(void) { +void oled_mod_status(void) { const uint8_t mods = get_mods(); static const char PROGMEM gui_off_1[] = {0x85, 0x86}, @@ -174,7 +174,7 @@ void render_mod_status(void) { oled_write(mods & MOD_MASK_SHIFT ? shift_on_2 : shift_off_2, false); } -void render_wpm(void) { +void oled_wpm(void) { oled_write(PSTR("WPM: "), false); oled_write_ln(get_u8_str(get_current_wpm(), ' '), false); } diff --git a/users/jack/painter.c b/users/jack/painter.c @@ -0,0 +1,10 @@ +// Copyright 2025 jack@pngu.org +// SPDX-License-Identifier: GPL-2.0-or-later +#include "jack.h" +#include "painter.h" + +painter_font_handle_t qp_font; + +void keyboard_post_init_qp(void) { + qp_font = qp_load_font_mem(font_JetBrainsMono_11); +} diff --git a/users/jack/painter.h b/users/jack/painter.h @@ -0,0 +1,6 @@ +// Copyright 2025 jack@pngu.org +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include "qp.h" +#include "fonts.qff.h" diff --git a/users/jack/rules.mk b/users/jack/rules.mk @@ -29,6 +29,10 @@ ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes) SRC += $(USER_PATH)/colour.c $(USER_PATH)/rgb_matrix.c endif +ifeq ($(strip $(QUANTUM_PAINTER_ENABLE)), yes) + SRC += $(USER_PATH)/painter.c $(USER_PATH)/fonts.qff.c +endif + ifeq ($(strip $(UNICODE_COMMON)), yes) UNICODE_ENABLE = no SRC += $(USER_PATH)/unicode.c