Skip to content

Commit 4b3f9b8

Browse files
daskygitzvecr
andauthored
Add Reverb keyboard. (#22387)
Co-authored-by: Joel Challis <git@zvecr.com>
1 parent 0059393 commit 4b3f9b8

17 files changed

+3185
-0
lines changed

keyboards/dasky/reverb/config.h

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Copyright 2023 Dasky (@daskygit)
2+
// SPDX-License-Identifier: GPL-2.0-or-later
3+
4+
#pragma once
5+
6+
#define DEBUG_MATRIX_SCAN_RATE // only want api
7+
8+
#define SPI_DRIVER SPID0
9+
#define SPI_SCK_PIN GP18
10+
#define SPI_MOSI_PIN GP19
11+
#define SPI_MISO_PIN GP16
12+
13+
#define DISPLAY_RST GP15
14+
#define DISPLAY_CS GP21
15+
#define DISPLAY_DC GP20
16+
17+
#define QUANTUM_PAINTER_SUPPORTS_256_PALETTE true
+139
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
// Copyright 2023 Dasky (@daskygit)
2+
// SPDX-License-Identifier: GPL-2.0-or-later
3+
4+
#include "display.h"
5+
#include "graphics/splash.qgf.h"
6+
#include "graphics/reverb.qgf.h"
7+
#include "graphics/robotomono20.qff.h"
8+
#include <stdio.h>
9+
#include <math.h>
10+
11+
static painter_image_handle_t reverb_logo;
12+
static deferred_token display_task_token;
13+
static uint32_t key_pressed_count = 0;
14+
15+
static uint8_t reverb_surface_fb[SURFACE_REQUIRED_BUFFER_BYTE_SIZE(240, 240, 16)];
16+
17+
painter_device_t reverb_surface;
18+
painter_device_t reverb_display;
19+
painter_font_handle_t roboto_font;
20+
21+
uint32_t display_task_callback(uint32_t trigger_time, void *cb_arg) {
22+
display_task_kb();
23+
return 100;
24+
}
25+
26+
void display_init_kb(void) {
27+
reverb_display = qp_gc9a01_make_spi_device(240, 240, DISPLAY_CS, DISPLAY_DC, DISPLAY_RST, 2, 0); // always init display
28+
qp_init(reverb_display, QP_ROTATION_0);
29+
roboto_font = qp_load_font_mem(font_robotomono20);
30+
reverb_surface = qp_make_rgb565_surface(240, 240, reverb_surface_fb);
31+
qp_init(reverb_surface, QP_ROTATION_0);
32+
if (!display_init_user()) {
33+
return;
34+
}
35+
painter_image_handle_t splash_image;
36+
splash_image = qp_load_image_mem(gfx_splash);
37+
reverb_logo = qp_load_image_mem(gfx_reverb);
38+
qp_drawimage(reverb_display, 0, 0, splash_image);
39+
qp_flush(reverb_display);
40+
qp_close_image(splash_image);
41+
display_task_token = defer_exec(2000, display_task_callback, NULL);
42+
}
43+
44+
__attribute__((weak)) bool display_init_user(void) {
45+
return true;
46+
}
47+
48+
void display_task_kb(void) {
49+
if (!display_task_user()) {
50+
return;
51+
}
52+
static bool first_draw = true;
53+
static uint32_t last_timer = 0;
54+
static uint32_t last_wpm = UINT32_MAX;
55+
static uint32_t last_scan_rate = 0;
56+
static uint32_t last_key_pressed_count = UINT32_MAX;
57+
static uint8_t last_hue = 0;
58+
static uint8_t last_sat = 0;
59+
static uint8_t last_val = 0;
60+
bool rgb_redraw = false;
61+
62+
if (first_draw) {
63+
qp_rect(reverb_display, 0, 0, 239, 239, 0, 0, 0, true);
64+
first_draw = false;
65+
}
66+
67+
char buffer[64] = {0};
68+
69+
if (last_hue != rgb_matrix_get_hue() || last_sat != rgb_matrix_get_sat() || last_val != rgb_matrix_get_val()) {
70+
last_hue = rgb_matrix_get_hue();
71+
last_sat = rgb_matrix_get_sat();
72+
last_val = rgb_matrix_get_val();
73+
qp_drawimage_recolor(reverb_surface, 60, 40, reverb_logo, rgb_matrix_get_hue(), rgb_matrix_get_sat(), MAX(rgb_matrix_get_val(), 128), 0, 0, 0);
74+
rgb_redraw = true;
75+
}
76+
77+
if (rgb_redraw || last_scan_rate != get_matrix_scan_rate()) {
78+
snprintf(buffer, sizeof(buffer), "Scan Rate %ld", get_matrix_scan_rate());
79+
int16_t width = qp_textwidth(roboto_font, buffer);
80+
qp_line(reverb_surface, 17, 101, 220, 101, rgb_matrix_get_hue(), rgb_matrix_get_sat(), MAX(rgb_matrix_get_val(), 128));
81+
qp_rect(reverb_surface, 16, 125 - roboto_font->line_height, 221, 125, 0, 0, 0, true);
82+
qp_drawtext_recolor(reverb_surface, (120 - (width / 2)), (125 - roboto_font->line_height), roboto_font, buffer, rgb_matrix_get_hue(), rgb_matrix_get_sat(), MAX(rgb_matrix_get_val(), 128), 0, 0, 0);
83+
qp_line(reverb_surface, 16, 126, 221, 126, rgb_matrix_get_hue(), rgb_matrix_get_sat(), MAX(rgb_matrix_get_val(), 128));
84+
last_scan_rate = get_matrix_scan_rate();
85+
}
86+
if (rgb_redraw || last_key_pressed_count != key_pressed_count) {
87+
snprintf(buffer, sizeof(buffer), "Keys Pressed");
88+
int16_t width = qp_textwidth(roboto_font, buffer);
89+
qp_rect(reverb_surface, 30, 150 - roboto_font->line_height, 209, 150, 0, 0, 0, true);
90+
qp_drawtext_recolor(reverb_surface, (120 - (width / 2)), (150 - roboto_font->line_height), roboto_font, buffer, rgb_matrix_get_hue(), rgb_matrix_get_sat(), MAX(rgb_matrix_get_val(), 128), 0, 0, 0);
91+
snprintf(buffer, sizeof(buffer), "%ld", key_pressed_count);
92+
width = qp_textwidth(roboto_font, buffer);
93+
qp_rect(reverb_surface, 30, 172 - roboto_font->line_height, 173, 172, 0, 0, 0, true);
94+
qp_drawtext_recolor(reverb_surface, (120 - (width / 2)), (172 - roboto_font->line_height), roboto_font, buffer, rgb_matrix_get_hue(), rgb_matrix_get_sat(), MAX(rgb_matrix_get_val(), 128), 0, 0, 0);
95+
qp_line(reverb_surface, 30, 173, 209, 173, rgb_matrix_get_hue(), rgb_matrix_get_sat(), MAX(rgb_matrix_get_val(), 128));
96+
last_key_pressed_count = key_pressed_count;
97+
}
98+
if (rgb_redraw || last_wpm != get_current_wpm()) {
99+
snprintf(buffer, sizeof(buffer), "WPM %d", get_current_wpm());
100+
int16_t width = qp_textwidth(roboto_font, buffer);
101+
qp_rect(reverb_surface, 56, 200 - roboto_font->line_height, 184, 200, 0, 0, 0, true);
102+
qp_drawtext_recolor(reverb_surface, (120 - (width / 2)), (200 - roboto_font->line_height), roboto_font, buffer, rgb_matrix_get_hue(), rgb_matrix_get_sat(), MAX(rgb_matrix_get_val(), 128), 0, 0, 0);
103+
qp_line(reverb_surface, 56, 201, 184, 201, rgb_matrix_get_hue(), rgb_matrix_get_sat(), MAX(rgb_matrix_get_val(), 128));
104+
last_wpm = get_current_wpm();
105+
}
106+
107+
if (rgb_redraw || timer_elapsed(last_timer) >= 1000) {
108+
static uint8_t seconds = 0;
109+
static uint8_t x = 0;
110+
static uint8_t y = 0;
111+
if (x && y) {
112+
qp_circle(reverb_surface, x, y, 4, 0, 0, 0, true);
113+
}
114+
double radians = 0.10471975511966 * seconds;
115+
x = (110 * cos(radians)) + 119;
116+
y = (110 * sin(radians)) + 119;
117+
qp_circle(reverb_surface, x, y, 4, rgb_matrix_get_hue(), rgb_matrix_get_sat(), MAX(rgb_matrix_get_val(), 128), true);
118+
qp_circle(reverb_surface, 119, 119, 105, rgb_matrix_get_hue(), rgb_matrix_get_sat(), MAX(rgb_matrix_get_val(), 128), false);
119+
if (seconds == 59) {
120+
seconds = 0;
121+
} else if (timer_elapsed(last_timer) >= 1000) {
122+
last_timer = timer_read32();
123+
seconds++;
124+
}
125+
}
126+
127+
qp_surface_draw(reverb_surface, reverb_display, 0, 0, rgb_redraw);
128+
}
129+
130+
__attribute__((weak)) bool display_task_user(void) {
131+
return true;
132+
}
133+
134+
void display_key_counter(void) {
135+
if (key_pressed_count == UINT32_MAX) {
136+
key_pressed_count = 0;
137+
}
138+
key_pressed_count++;
139+
}
+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Copyright 2023 Dasky (@daskygit)
2+
// SPDX-License-Identifier: GPL-2.0-or-later
3+
4+
#pragma once
5+
6+
#include "qp.h"
7+
#include "qp_surface.h"
8+
9+
extern painter_device_t reverb_surface;
10+
extern painter_device_t reverb_display;
11+
extern painter_font_handle_t roboto_font;
12+
13+
void display_key_counter(void);
14+
void display_init_kb(void);
15+
bool display_init_user(void);
16+
void display_task_kb(void);
17+
bool display_task_user(void);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// Copyright 2023 QMK -- generated source code only, image retains original copyright
2+
// SPDX-License-Identifier: GPL-2.0-or-later
3+
4+
// This file was auto-generated by `qmk painter-convert-graphics -i reverb.png -f mono2`
5+
6+
#include <qp.h>
7+
8+
const uint32_t gfx_reverb_length = 736;
9+
10+
// clang-format off
11+
const uint8_t gfx_reverb[736] = {
12+
0x00, 0xFF, 0x12, 0x00, 0x00, 0x51, 0x47, 0x46, 0x01, 0xE0, 0x02, 0x00, 0x00, 0x1F, 0xFD, 0xFF,
13+
0xFF, 0x78, 0x00, 0x32, 0x00, 0x01, 0x00, 0x01, 0xFE, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
14+
0x02, 0xFD, 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xE8, 0x03, 0x05, 0xFA, 0xB0, 0x02, 0x00,
15+
0x3C, 0x00, 0x8F, 0xF8, 0xFF, 0xC7, 0xFF, 0x3F, 0x30, 0x80, 0x83, 0xFF, 0x0F, 0xFF, 0xCF, 0xFF,
16+
0x1F, 0x00, 0xF8, 0x03, 0xFF, 0x85, 0x7F, 0x70, 0x80, 0x83, 0xFF, 0x0F, 0x03, 0xFF, 0x8D, 0x7F,
17+
0x00, 0xF8, 0xFF, 0xBF, 0xFF, 0x7F, 0x70, 0x80, 0x83, 0xFF, 0x0F, 0xFF, 0xBF, 0x02, 0xFF, 0x8C,
18+
0x00, 0xF8, 0xFF, 0x3F, 0xFF, 0x7F, 0x70, 0x80, 0x83, 0xFF, 0x0F, 0xFF, 0x3F, 0x02, 0xFF, 0xB8,
19+
0x01, 0xF8, 0xFF, 0x3F, 0xFF, 0x7F, 0x70, 0x80, 0x83, 0xFF, 0x0F, 0xFF, 0x3F, 0xFE, 0xFF, 0x03,
20+
0xF8, 0xFF, 0x3F, 0xFE, 0x7F, 0x70, 0x80, 0x83, 0xFF, 0x0F, 0xFF, 0x3F, 0xFE, 0xFF, 0x07, 0xF8,
21+
0x0F, 0x3F, 0x3E, 0x00, 0x7F, 0x80, 0xC3, 0x07, 0xF0, 0x0F, 0x3F, 0x3C, 0xFE, 0x07, 0xF8, 0x07,
22+
0x3E, 0x3C, 0x00, 0x7F, 0xC0, 0xC3, 0x03, 0xF0, 0x0F, 0x02, 0x3C, 0x83, 0xF8, 0x07, 0xF8, 0x07,
23+
0x02, 0x3C, 0x86, 0x00, 0xFF, 0xC0, 0xC3, 0x03, 0xF0, 0x0F, 0x02, 0x3C, 0x83, 0xF8, 0x0F, 0xF8,
24+
0x07, 0x02, 0x3C, 0x8C, 0x00, 0xFF, 0xC0, 0xC3, 0x03, 0xF0, 0x0F, 0x3C, 0x38, 0xF0, 0x0F, 0xF8,
25+
0x07, 0x02, 0x3C, 0x86, 0x00, 0xFF, 0xC0, 0xC3, 0x03, 0xF0, 0x0F, 0x02, 0x38, 0x83, 0xF0, 0x0F,
26+
0xF8, 0x07, 0x02, 0x3C, 0x86, 0x00, 0xFF, 0xC0, 0xE3, 0x03, 0xF0, 0x0F, 0x02, 0x38, 0x83, 0xF0,
27+
0x0F, 0xF8, 0x07, 0x02, 0x3C, 0x86, 0x00, 0xFE, 0xC0, 0xE3, 0x03, 0xF0, 0x0F, 0x02, 0x38, 0x83,
28+
0xF0, 0x0F, 0xF8, 0x07, 0x02, 0x38, 0x86, 0x00, 0xFE, 0xC0, 0xE3, 0x03, 0xF0, 0x0F, 0x02, 0x38,
29+
0x83, 0xF0, 0x0F, 0xF8, 0x07, 0x02, 0x3C, 0x86, 0x00, 0xFE, 0xE0, 0xE3, 0x03, 0xF0, 0x0F, 0x02,
30+
0x38, 0x83, 0xF0, 0x0F, 0xF8, 0x07, 0x02, 0x3C, 0x86, 0x00, 0xFE, 0xE1, 0xE3, 0x03, 0xF0, 0x0F,
31+
0x02, 0x38, 0x83, 0xF8, 0x07, 0xF8, 0x07, 0x02, 0x3C, 0x86, 0x00, 0xFE, 0xE1, 0xF3, 0x03, 0xF0,
32+
0x0F, 0x02, 0x38, 0xCF, 0xFC, 0x07, 0xF8, 0x07, 0x3C, 0xFC, 0xFF, 0xFD, 0xE1, 0xF3, 0xFF, 0xEF,
33+
0x0F, 0x3C, 0xF8, 0xFF, 0x07, 0xF8, 0x07, 0x3E, 0xFC, 0xFF, 0xFD, 0xE1, 0xF3, 0xFF, 0xEF, 0x0F,
34+
0x3C, 0xFC, 0xFF, 0x03, 0xF8, 0x07, 0x3F, 0xFC, 0xFF, 0xFD, 0xE1, 0xF3, 0xFF, 0xEF, 0x0F, 0x3E,
35+
0xFC, 0xFF, 0x01, 0xF8, 0xFF, 0x3F, 0xFE, 0xFF, 0xFD, 0xE1, 0xF3, 0xFF, 0xEF, 0xFF, 0x3F, 0xFC,
36+
0xFF, 0x00, 0xF8, 0xFF, 0x3F, 0xFE, 0xFF, 0xFD, 0xE1, 0xF3, 0xFF, 0xEF, 0xFF, 0x3F, 0xFE, 0xFF,
37+
0x03, 0xF8, 0xFF, 0x3F, 0x02, 0xFF, 0x86, 0xF9, 0xF1, 0xFB, 0xFF, 0xEF, 0xFF, 0x3F, 0x02, 0xFF,
38+
0x83, 0x07, 0xF8, 0xFF, 0xBF, 0x02, 0xFF, 0x86, 0xF9, 0xF3, 0xFB, 0xFF, 0xEF, 0xFF, 0x3F, 0x02,
39+
0xFF, 0x81, 0x0F, 0xF8, 0x02, 0xFF, 0x86, 0x3F, 0x00, 0xF8, 0xF3, 0xFB, 0x03, 0xF0, 0x02, 0xFF,
40+
0xD3, 0x3F, 0xF8, 0x0F, 0xF8, 0xFF, 0xCF, 0x3F, 0x00, 0xF8, 0xF3, 0xFF, 0x03, 0xF0, 0xFF, 0xDF,
41+
0x3F, 0xF0, 0x1F, 0xF8, 0xFF, 0xCF, 0x3F, 0x00, 0xF8, 0xF3, 0xFF, 0x03, 0xF0, 0xFF, 0xDF, 0x3F,
42+
0xE0, 0x1F, 0xF8, 0xF7, 0xDF, 0x3F, 0x00, 0xF8, 0xF3, 0xFF, 0x03, 0xF0, 0xEF, 0xDF, 0x3F, 0xE0,
43+
0x1F, 0xF8, 0xE7, 0xDF, 0x3F, 0x00, 0xF0, 0xF3, 0xFF, 0x03, 0xF0, 0xEF, 0xFF, 0x3F, 0xE0, 0x1F,
44+
0xF8, 0xE7, 0xFF, 0x3F, 0x00, 0xF0, 0xFB, 0xFF, 0x03, 0xF0, 0xCF, 0xFF, 0x3F, 0xE0, 0x3F, 0xF8,
45+
0xC7, 0xFF, 0x3F, 0x00, 0xF0, 0x02, 0xFF, 0x8C, 0x03, 0xF0, 0xCF, 0xFF, 0x3F, 0xE0, 0x3F, 0xF8,
46+
0xC7, 0xFF, 0x3F, 0x00, 0xF0, 0x02, 0xFF, 0x8C, 0x03, 0xF0, 0x8F, 0xBF, 0x3F, 0xE0, 0x1F, 0xF8,
47+
0x87, 0xBF, 0x3F, 0x00, 0xF0, 0x02, 0xFF, 0x91, 0x03, 0xF0, 0x8F, 0xBF, 0x3F, 0xE0, 0x1F, 0xF8,
48+
0x87, 0xBF, 0x3F, 0x00, 0xE0, 0xFF, 0xFD, 0x03, 0xF0, 0x0F, 0x02, 0x3F, 0x83, 0xE0, 0x1F, 0xF8,
49+
0x07, 0x02, 0x3F, 0x86, 0x00, 0xE0, 0xFF, 0xFD, 0x03, 0xF0, 0x0F, 0x02, 0x3F, 0x83, 0xF0, 0x1F,
50+
0xF8, 0x07, 0x02, 0x3F, 0x93, 0x00, 0xE0, 0xFF, 0xFD, 0x03, 0xF0, 0x0F, 0x3F, 0x3E, 0xF8, 0x1F,
51+
0xF8, 0x07, 0x3E, 0xFE, 0xFF, 0xEF, 0xFF, 0xFD, 0xFF, 0x02, 0x0F, 0x8C, 0x3E, 0xFE, 0xFF, 0x0F,
52+
0xF8, 0x07, 0x3E, 0xFE, 0xFF, 0xEF, 0xFF, 0xFD, 0xFF, 0x02, 0x0F, 0x8C, 0x3E, 0xFC, 0xFF, 0x0F,
53+
0xF8, 0x07, 0x3E, 0xFC, 0xFF, 0xCF, 0xFF, 0xFC, 0xFF, 0x02, 0x0F, 0x8C, 0x3C, 0xFC, 0xFF, 0x07,
54+
0xF8, 0x07, 0x3C, 0xFC, 0xFF, 0xCF, 0xFF, 0xFC, 0xFF, 0x02, 0x0F, 0x8C, 0x3C, 0xF8, 0xFF, 0x03,
55+
0xF8, 0x07, 0x3C, 0xF8, 0xFF, 0xCF, 0xFF, 0xFC, 0xFF, 0x02, 0x0F, 0x8C, 0x38, 0xF8, 0xFF, 0x01,
56+
0xF8, 0x07, 0x38, 0xF8, 0xFF, 0xCF, 0xFF, 0xFC, 0xFF, 0x02, 0x0F, 0x91, 0x38, 0xF8, 0x7F, 0x00,
57+
0xF0, 0x07, 0x38, 0xF0, 0xFF, 0xCF, 0x7F, 0xFC, 0xFF, 0x0F, 0x0E, 0x30, 0xF0, 0x0F, 0x2E, 0x00,
58+
};
59+
// clang-format on
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// Copyright 2023 QMK -- generated source code only, image retains original copyright
2+
// SPDX-License-Identifier: GPL-2.0-or-later
3+
4+
// This file was auto-generated by `qmk painter-convert-graphics -i reverb.png -f mono2`
5+
6+
#pragma once
7+
8+
#include <qp.h>
9+
10+
extern const uint32_t gfx_reverb_length;
11+
extern const uint8_t gfx_reverb[736];

0 commit comments

Comments
 (0)