Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Big Knob board #22292

Merged
merged 8 commits into from
Dec 12, 2023
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
118 changes: 118 additions & 0 deletions keyboards/jpe230/big_knob/big_knob.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
// Copyright 2023 jpe230 (@jpe230)
Jpe230 marked this conversation as resolved.
Show resolved Hide resolved
// SPDX-License-Identifier: GPL-2.0-or-later

#include "qp.h"
#include "qp_comms.h"
#include "qp_st77xx_opcodes.h"
#include "gfx/logo.qgf.h"

painter_device_t lcd;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Init board:
// - Draw logo

void keyboard_post_init_kb(void) {
backlight_set(BACKLIGHT_DEFAULT_LEVEL);

wait_ms(LCD_WAIT_TIME);

// Initialise the LCD
lcd = qp_st7735_make_spi_device(LCD_HEIGHT, LCD_WIDTH, LCD_CS_PIN, LCD_DC_PIN, LCD_RST_PIN, LCD_SPI_DIVISOR, 0);
qp_init(lcd, LCD_ROTATION);

// Invert Colour
#ifdef LCD_INVERT_COLOUR
qp_comms_start(lcd);
qp_comms_command(lcd, ST77XX_CMD_INVERT_ON);
qp_comms_stop(lcd);
#endif

// Apply Offset
qp_set_viewport_offsets(lcd, LCD_OFFSET_X, LCD_OFFSET_Y);

// Turn on the LCD and clear the display
qp_power(lcd, true);
qp_rect(lcd, 0, 0, LCD_WIDTH, LCD_HEIGHT, HSV_BLACK, true);

// Show logo
painter_image_handle_t logo_image = qp_load_image_mem(gfx_logo);
qp_drawimage(lcd, 0, 0, logo_image);

keyboard_post_init_user();
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Lights handling:
// - Turn off backlight (screen) after timeout or suspend
// - Turn off rgblight after timeout or suspend

static uint16_t key_timer;
bool lights_off = false;

void backlight_wakeup(void) {
backlight_enable();
backlight_set(BACKLIGHT_DEFAULT_LEVEL);
}

void backlight_suspend(void) {
backlight_set(0);
backlight_disable();
}

void lights_wakeup(void) {
key_timer = timer_read();
if (!lights_off) {
return;
}
lights_off = false;
rgblight_wakeup();
backlight_wakeup();
}

void lights_suspend(void) {
lights_off = true;
rgblight_suspend();
backlight_suspend();
}

void post_process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed){
lights_wakeup();
}
post_process_record_user(keycode, record);
}

bool encoder_update_kb(uint8_t index, bool clockwise) {
lights_wakeup();
if (!encoder_update_user(index, clockwise)) {
return false;
}

if (index == 0) {
if (clockwise) {
tap_code(KC_VOLU);
} else {
tap_code(KC_VOLD);
}
}
return true;
}
Jpe230 marked this conversation as resolved.
Show resolved Hide resolved

void housekeeping_task_kb(void) {
if (!lights_off && timer_elapsed(key_timer) > LIGHTS_TIMEOUT) {
lights_suspend();
}
}

void suspend_power_down_kb(void) {
lights_suspend();
qp_power(lcd, false);
suspend_power_down_user();
}

void suspend_wakeup_init_kb(void) {
qp_power(lcd, true);
lights_wakeup();
suspend_wakeup_init_user();
}
37 changes: 37 additions & 0 deletions keyboards/jpe230/big_knob/config.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// Copyright 2023 jpe230 (@jpe230)
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once

// SPI pins
#define SPI_DRIVER SPID0
#define SPI_SCK_PIN GP22
#define SPI_MOSI_PIN GP23
#define SPI_MISO_PIN GP20 // Unused
Jpe230 marked this conversation as resolved.
Show resolved Hide resolved

// LCD Configuration
#define LCD_RST_PIN GP21
#define LCD_CS_PIN GP8
#define LCD_DC_PIN GP9
#define LCD_BLK_PIN GP7
#define LCD_SPI_DIVISOR 4
#define LCD_WAIT_TIME 150
#define LCD_WIDTH 160
#define LCD_HEIGHT 80
#define LCD_ROTATION QP_ROTATION_270
#define LCD_OFFSET_X 1
#define LCD_OFFSET_Y 26
#define LCD_INVERT_COLOUR

// QP Configuration
#define QUANTUM_PAINTER_SUPPORTS_NATIVE_COLORS TRUE
#define ST7735_NO_AUTOMATIC_VIEWPORT_OFFSETS

// Backlight configuration
#define BACKLIGHT_PWM_DRIVER PWMD3
#define BACKLIGHT_PWM_CHANNEL 2
#define BACKLIGHT_DEFAULT_LEVEL 6

// Timeout configuration
#define QUANTUM_PAINTER_DISPLAY_TIMEOUT 10000
#define LIGHTS_TIMEOUT QUANTUM_PAINTER_DISPLAY_TIMEOUT
1,562 changes: 1,562 additions & 0 deletions keyboards/jpe230/big_knob/gfx/logo.qgf.c

Large diffs are not rendered by default.

11 changes: 11 additions & 0 deletions keyboards/jpe230/big_knob/gfx/logo.qgf.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// Copyright 2023 jpe230 (@jpe230)
// SPDX-License-Identifier: GPL-2.0-or-later

// This file was auto-generated by `qmk painter-convert-graphics -i logo.png -f rgb565`

#pragma once

#include <qp.h>

extern const uint32_t gfx_logo_length;
extern const uint8_t gfx_logo[24769];
12 changes: 12 additions & 0 deletions keyboards/jpe230/big_knob/halconf.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Copyright 2023 jpe230 (@jpe230)
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once

#include_next <halconf.h>

#undef HAL_USE_SPI
#define HAL_USE_SPI TRUE

#undef HAL_USE_PWM
#define HAL_USE_PWM TRUE
66 changes: 66 additions & 0 deletions keyboards/jpe230/big_knob/info.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
{
"manufacturer": "jpe230",
"keyboard_name": "big_knob",
"maintainer": "jpe230",
"bootloader": "rp2040",
"processor": "RP2040",
"url": "https://github.com/Jpe230/big_knob",
"usb": {
"device_version": "1.0.0",
"vid": "0xE230",
"pid": "0x1337"
},
"features": {
"rgblight": true,
"bootmagic": true,
"extrakey": true,
"mousekey": true,
"encoder": true,
"backlight": true
},
"matrix_pins": {
"direct": [
["GP1"]
]
},
"encoder": {
"rotary": [
{"pin_a": "GP2", "pin_b": "GP3"}
]
},
"backlight": {
"pin": "GP7",
"levels": 7,
"breathing": false
},
"rgblight": {
"driver": "ws2812",
"led_count": 10,
"max_brightness": 200,
"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
}
},
"ws2812": {
"pin": "GP0",
"driver": "vendor"
},
Jpe230 marked this conversation as resolved.
Show resolved Hide resolved
"community_layouts": ["ortho_1x1"],
"layouts": {
"LAYOUT_ortho_1x1": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0}
]
}
}
}
16 changes: 16 additions & 0 deletions keyboards/jpe230/big_knob/keymaps/default/keymap.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// Copyright 2023 jpe230 (@jpe230)
// SPDX-License-Identifier: GPL-2.0-or-later

#include QMK_KEYBOARD_H

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_ortho_1x1(
KC_MUTE
)
};

#ifdef ENCODER_MAP_ENABLE
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
[0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
};
#endif
1 change: 1 addition & 0 deletions keyboards/jpe230/big_knob/keymaps/default/rules.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ENCODER_MAP_ENABLE = yes
16 changes: 16 additions & 0 deletions keyboards/jpe230/big_knob/keymaps/via/keymap.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// Copyright 2023 jpe230 (@jpe230)
// SPDX-License-Identifier: GPL-2.0-or-later

#include QMK_KEYBOARD_H

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_ortho_1x1(
KC_MUTE
)
};

#ifdef ENCODER_MAP_ENABLE
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
[0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
};
#endif
2 changes: 2 additions & 0 deletions keyboards/jpe230/big_knob/keymaps/via/rules.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
ENCODER_MAP_ENABLE = yes
VIA_ENABLE = yes
12 changes: 12 additions & 0 deletions keyboards/jpe230/big_knob/mcuconf.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Copyright 2023 jpe230 (@jpe230)
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once

#include_next <mcuconf.h>

#undef RP_SPI_USE_SPI0
#define RP_SPI_USE_SPI0 TRUE

#undef RP_PWM_USE_PWM3
#define RP_PWM_USE_PWM3 TRUE
43 changes: 43 additions & 0 deletions keyboards/jpe230/big_knob/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Big Knob

![big_knob](https://i.imgur.com/KLS0O7Zh.png)

A 3D printed single encoder volume knob with a SPI Screen.

* Keyboard Maintainer: [jpe230](https://github.com/jpe230)
* Hardware Supported: Big Knob PCB, Sparkfun ProMicro RP2040 (*See notes*)
* Hardware Availability: <https://github.com/Jpe230/big_knob>
## Features

The Big Knob was designed to be easy to assemble:
* Designed to be used with a RP2040 board (*See notes*)
* ST7735 0.96 inch color display
* RGBLight
* Easy to 3D print

### Notes
You can use any compatible RP2040 board (I.E.: KB2040, Elite Pi, etc), but you will need to modify the pin definition to match you board

## Flashing

Make example for this keyboard (after setting up your build environment):

qmk compile -kb jpe230/big_knob -km default

Flashing example for this keyboard:

qmk flash -kb jpe230/big_knob -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).

## Building Instructions

You can find the required materials and the instructions to build your own Big Knob in the [project repo](https://github.com/Jpe230/big_knob)

## Bootloader

Enter the bootloader in 3 ways:

* **Bootmagic reset**: Hold down the encoder buitton and plug in the keyboard
* **Physical reset button**: Briefly press the reset button on the front of the RP2040 board
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
3 changes: 3 additions & 0 deletions keyboards/jpe230/big_knob/rules.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
QUANTUM_PAINTER_ENABLE = yes
QUANTUM_PAINTER_DRIVERS += st7735_spi
SRC += gfx/logo.qgf.c