commit 8999cef3e7c97bf6cc9881472f5bdff12d7314eb
parent 3d69064553d5e66b42226bf0e59d5360a3d4c38d
Author: Jack Sangdahl <jack@pngu.org>
Date: Sat, 20 Sep 2025 13:18:11 -0600
Initial quantum painter code
Diffstat:
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