mirror of
https://github.com/Keychron/qmk_firmware.git
synced 2024-12-01 05:07:26 +06:00
e2d6187339
Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com>
98 lines
2.4 KiB
C
98 lines
2.4 KiB
C
// Copyright 2023 jpe230 (@jpe230)
|
|
// 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
|
|
|
|
bool lights_off = false;
|
|
|
|
__attribute__((weak)) void lights_wakeup_user(void) {};
|
|
__attribute__((weak)) void lights_suspend_user(void) {};
|
|
|
|
void backlight_wakeup(void) {
|
|
backlight_set(BACKLIGHT_DEFAULT_LEVEL);
|
|
}
|
|
|
|
void backlight_suspend(void) {
|
|
backlight_set(0);
|
|
}
|
|
|
|
void lights_wakeup(void) {
|
|
lights_off = false;
|
|
rgblight_wakeup();
|
|
backlight_wakeup();
|
|
lights_wakeup_user();
|
|
}
|
|
|
|
void lights_suspend(void) {
|
|
lights_off = true;
|
|
lights_suspend_user();
|
|
rgblight_suspend();
|
|
backlight_suspend();
|
|
}
|
|
|
|
void housekeeping_task_kb(void) {
|
|
if ( lights_off && last_input_activity_elapsed() <= LIGHTS_TIMEOUT)
|
|
{
|
|
lights_wakeup();
|
|
}
|
|
if (!lights_off && last_input_activity_elapsed() > 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();
|
|
}
|