From d7c43dbd9d78ad0fa521692145a8b0dae318c940 Mon Sep 17 00:00:00 2001 From: Tom Parker-Shemilt Date: Fri, 7 Jul 2023 15:10:39 +0100 Subject: Lights Out keymap for winry25t (#20538) Co-authored-by: Drashna Jaelre --- keyboards/winry/winry25tc/config.h | 2 + .../winry/winry25tc/keymaps/lightsout/keymap.c | 136 +++++++++++++++++++++ .../winry/winry25tc/keymaps/lightsout/readme.md | 3 + 3 files changed, 141 insertions(+) create mode 100644 keyboards/winry/winry25tc/keymaps/lightsout/keymap.c create mode 100644 keyboards/winry/winry25tc/keymaps/lightsout/readme.md diff --git a/keyboards/winry/winry25tc/config.h b/keyboards/winry/winry25tc/config.h index 98c540c876..e668a85218 100644 --- a/keyboards/winry/winry25tc/config.h +++ b/keyboards/winry/winry25tc/config.h @@ -20,3 +20,5 @@ #define RGBLIGHT_HUE_STEP 8 #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 + +#define RGBLIGHT_EFFECT_RAINBOW_SWIRL diff --git a/keyboards/winry/winry25tc/keymaps/lightsout/keymap.c b/keyboards/winry/winry25tc/keymaps/lightsout/keymap.c new file mode 100644 index 0000000000..f175f36b91 --- /dev/null +++ b/keyboards/winry/winry25tc/keymaps/lightsout/keymap.c @@ -0,0 +1,136 @@ +/* Copyright 2023 Tom Parker-Shemilt + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include + +#include QMK_KEYBOARD_H + +// clang-format off + +// Exact keymap is irrelevant as we're using rows/cols +// but we need _something_ set so we're using no-ops +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO + )}; + +bool tiles[5][5] = { + {false, false, false, false, false}, + {false, false, false, false, false}, + {false, false, false, false, false}, + {false, false, false, false, false}, + {false, false, false, false, false}, +}; + +/* Because snake pattern of leds */ +const uint8_t remap[25] = { + 20,21,22,23,24, + 19,6,7,8,9, + 18,5,0,1,10, + 17,4,3,2,11, + 16,15,14,13,12, +}; + +// clang-format on + +bool is_blank(void) { + for (uint8_t y = 0; y < 5; y++) { + for (uint8_t x = 0; x < 5; x++) { + if (tiles[x][y]) { + return false; + } + } + } + return true; +} + +void do_move(uint8_t x, uint8_t y) { + tiles[x][y] ^= true; + if (x > 0) { + tiles[x - 1][y] ^= true; + } + if (y > 0) { + tiles[x][y - 1] ^= true; + } + if (x < 4) { + tiles[x + 1][y] ^= true; + } + if (y < 4) { + tiles[x][y + 1] ^= true; + } +} + +void refresh_leds(void) { + for (uint8_t y = 0; y < 5; y++) { + for (uint8_t x = 0; x < 5; x++) { + uint8_t tile = tiles[x][y]; + uint8_t index = (y * 5) + x; + if (tile) { + setrgb(RGB_RED, &led[remap[index]]); + } else { + setrgb(RGB_WHITE, &led[remap[index]]); + } + } + } + rgblight_set(); +} + +uint8_t initial_moves = 1; + +void start_game(void) { + rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT); + srand(timer_read32()); + while (true) { + for (uint8_t i = 0; i < initial_moves; i++) { + do_move(rand() % 5, rand() % 5); + } + if (!is_blank()) { + // Catch the "we picked the same location 2*N times" case + break; + } + } + refresh_leds(); +} + +void keyboard_post_init_user(void) { + rgblight_enable_noeeprom(); + start_game(); +} + +bool won = false; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (record->event.pressed) { + if (won) { + initial_moves++; + won = false; + start_game(); + } else { + uint8_t x = record->event.key.col; + uint8_t y = record->event.key.row; + do_move(x, y); + if (is_blank()) { + rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL); + won = true; + } + } + } + refresh_leds(); + return true; +} diff --git a/keyboards/winry/winry25tc/keymaps/lightsout/readme.md b/keyboards/winry/winry25tc/keymaps/lightsout/readme.md new file mode 100644 index 0000000000..4271bff43f --- /dev/null +++ b/keyboards/winry/winry25tc/keymaps/lightsout/readme.md @@ -0,0 +1,3 @@ +# Lights Out game + +Implements a "lights out" mode as per https://en.m.wikipedia.org/wiki/Lights_Out_(game) with a single move having been played on start. On completion of the game, the Rainbow Swirl pattern is displayed. If another key is then pressed, the game resets, with the initial number of moves incremented by one. -- cgit v1.2.3 From c6a3802051321d9ae3ba6b55541f18a76f724913 Mon Sep 17 00:00:00 2001 From: Evgenii Vilkov Date: Fri, 7 Jul 2023 16:11:22 +0200 Subject: [Keyboard] Add stront keyboard (#21035) --- keyboards/stront/config.h | 95 +++ keyboards/stront/display.c | 125 ++++ keyboards/stront/display.h | 20 + keyboards/stront/halconf.h | 9 + keyboards/stront/info.json | 147 ++++ keyboards/stront/keymaps/default/keymap.c | 107 +++ keyboards/stront/keymaps/hid/config.h | 7 + keyboards/stront/keymaps/hid/hid_display.c | 240 +++++++ keyboards/stront/keymaps/hid/hid_display.h | 29 + keyboards/stront/keymaps/hid/keymap.c | 187 +++++ keyboards/stront/keymaps/hid/lv_conf.h | 15 + keyboards/stront/keymaps/hid/rules.mk | 5 + keyboards/stront/keymaps/i2c/config.h | 8 + keyboards/stront/keymaps/i2c/halconf.h | 8 + keyboards/stront/keymaps/i2c/keymap.c | 107 +++ keyboards/stront/keymaps/i2c/mcuconf.h | 9 + keyboards/stront/keymaps/i2c/rules.mk | 1 + keyboards/stront/keymaps/zzeneg/config.h | 30 + .../keymaps/zzeneg/fonts/montserrat_20_en_ru.c | 782 +++++++++++++++++++++ .../keymaps/zzeneg/fonts/montserrat_48_digits.c | 189 +++++ keyboards/stront/keymaps/zzeneg/halconf.h | 8 + keyboards/stront/keymaps/zzeneg/icons/flag_pl.c | 42 ++ keyboards/stront/keymaps/zzeneg/icons/flag_ru.c | 42 ++ keyboards/stront/keymaps/zzeneg/icons/flag_uk.c | 46 ++ keyboards/stront/keymaps/zzeneg/keymap.c | 305 ++++++++ keyboards/stront/keymaps/zzeneg/lv_conf.h | 148 ++++ keyboards/stront/keymaps/zzeneg/mcuconf.h | 9 + keyboards/stront/keymaps/zzeneg/rules.mk | 17 + keyboards/stront/keymaps/zzeneg/zzeneg_display.c | 242 +++++++ keyboards/stront/keymaps/zzeneg/zzeneg_display.h | 27 + keyboards/stront/lv_conf.h | 18 + keyboards/stront/lvgl_helpers.c | 113 +++ keyboards/stront/lvgl_helpers.h | 13 + keyboards/stront/mcuconf.h | 12 + keyboards/stront/readme.md | 45 ++ keyboards/stront/rules.mk | 12 + keyboards/stront/stront.c | 61 ++ keyboards/stront/stront.h | 6 + 38 files changed, 3286 insertions(+) create mode 100644 keyboards/stront/config.h create mode 100644 keyboards/stront/display.c create mode 100644 keyboards/stront/display.h create mode 100644 keyboards/stront/halconf.h create mode 100644 keyboards/stront/info.json create mode 100644 keyboards/stront/keymaps/default/keymap.c create mode 100644 keyboards/stront/keymaps/hid/config.h create mode 100644 keyboards/stront/keymaps/hid/hid_display.c create mode 100644 keyboards/stront/keymaps/hid/hid_display.h create mode 100644 keyboards/stront/keymaps/hid/keymap.c create mode 100644 keyboards/stront/keymaps/hid/lv_conf.h create mode 100644 keyboards/stront/keymaps/hid/rules.mk create mode 100644 keyboards/stront/keymaps/i2c/config.h create mode 100644 keyboards/stront/keymaps/i2c/halconf.h create mode 100644 keyboards/stront/keymaps/i2c/keymap.c create mode 100644 keyboards/stront/keymaps/i2c/mcuconf.h create mode 100644 keyboards/stront/keymaps/i2c/rules.mk create mode 100644 keyboards/stront/keymaps/zzeneg/config.h create mode 100644 keyboards/stront/keymaps/zzeneg/fonts/montserrat_20_en_ru.c create mode 100644 keyboards/stront/keymaps/zzeneg/fonts/montserrat_48_digits.c create mode 100644 keyboards/stront/keymaps/zzeneg/halconf.h create mode 100644 keyboards/stront/keymaps/zzeneg/icons/flag_pl.c create mode 100644 keyboards/stront/keymaps/zzeneg/icons/flag_ru.c create mode 100644 keyboards/stront/keymaps/zzeneg/icons/flag_uk.c create mode 100644 keyboards/stront/keymaps/zzeneg/keymap.c create mode 100644 keyboards/stront/keymaps/zzeneg/lv_conf.h create mode 100644 keyboards/stront/keymaps/zzeneg/mcuconf.h create mode 100644 keyboards/stront/keymaps/zzeneg/rules.mk create mode 100644 keyboards/stront/keymaps/zzeneg/zzeneg_display.c create mode 100644 keyboards/stront/keymaps/zzeneg/zzeneg_display.h create mode 100644 keyboards/stront/lv_conf.h create mode 100644 keyboards/stront/lvgl_helpers.c create mode 100644 keyboards/stront/lvgl_helpers.h create mode 100644 keyboards/stront/mcuconf.h create mode 100644 keyboards/stront/readme.md create mode 100644 keyboards/stront/rules.mk create mode 100644 keyboards/stront/stront.c create mode 100644 keyboards/stront/stront.h diff --git a/keyboards/stront/config.h b/keyboards/stront/config.h new file mode 100644 index 0000000000..4c88e411ac --- /dev/null +++ b/keyboards/stront/config.h @@ -0,0 +1,95 @@ +// Copyright 2023 zzeneg (@zzeneg) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define SERIAL_USART_FULL_DUPLEX +#define SERIAL_USART_PIN_SWAP +#define SERIAL_USART_TX_PIN GP0 +#define SERIAL_USART_RX_PIN GP1 + +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U + +/* any side can be master by default, enable split sync to support it */ +#define EE_HANDS +#define SPLIT_LED_STATE_ENABLE +#define SPLIT_MODS_ENABLE +#define SPLIT_POINTING_ENABLE + +/* SPI config for display/touchpad */ +#define SPI_DRIVER SPID1 +#define SPI_SCK_PIN GP10 +#define SPI_MOSI_PIN GP11 +#define SPI_MISO_PIN GP12 + +/* touchpad config */ +#define POINTING_DEVICE_RIGHT +#define POINTING_DEVICE_CS_PIN GP9 +#define POINTING_DEVICE_ROTATION_180 +#define CIRQUE_PINNACLE_DIAMETER_MM 40 + +/* LCD config */ +#define LCD_DC_PIN GP12 +#define LCD_CS_PIN GP9 +#define LCD_RST_PIN GP13 +#define BACKLIGHT_PWM_DRIVER PWMD7 +#define BACKLIGHT_PWM_CHANNEL RP2040_PWM_CHANNEL_A +#define QUANTUM_PAINTER_LVGL_USE_CUSTOM_CONF + +/* RGB config */ +#ifdef RGB_MATRIX_ENABLE +# define SPLIT_TRANSPORT_MIRROR +# define RGB_MATRIX_LED_COUNT RGBLED_NUM +# define RGB_DISABLE_WHEN_USB_SUSPENDED +# define RGB_MATRIX_FRAMEBUFFER_EFFECTS +# define RGB_MATRIX_KEYPRESSES + +# define ENABLE_RGB_MATRIX_ALPHAS_MODS // Static dual hue, speed is hue for secondary hue +# define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN // Static gradient top to bottom, speed controls how much gradient changes +# define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT // Static gradient left to right, speed controls how much gradient changes +# define ENABLE_RGB_MATRIX_BREATHING // Single hue brightness cycling animation +# define ENABLE_RGB_MATRIX_BAND_SAT // Single hue band fading saturation scrolling left to right +# define ENABLE_RGB_MATRIX_BAND_VAL // Single hue band fading brightness scrolling left to right +# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT // Single hue 3 blade spinning pinwheel fades saturation +# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL // Single hue 3 blade spinning pinwheel fades brightness +# define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT // Single hue spinning spiral fades saturation +# define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL // Single hue spinning spiral fades brightness +# define ENABLE_RGB_MATRIX_CYCLE_ALL // Full keyboard solid hue cycling through full gradient +# define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT // Full gradient scrolling left to right +# define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN // Full gradient scrolling top to bottom +# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN // Full gradient scrolling out to in +# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL // Full dual gradients scrolling out to in +# define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON // Full gradient Chevron shaped scrolling left to right +# define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL // Full gradient spinning pinwheel around center of keyboard +# define ENABLE_RGB_MATRIX_CYCLE_SPIRAL // Full gradient spinning spiral around center of keyboard +# define ENABLE_RGB_MATRIX_DUAL_BEACON // Full gradient spinning around center of keyboard +# define ENABLE_RGB_MATRIX_RAINBOW_BEACON // Full tighter gradient spinning around center of keyboard +# define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS // Full dual gradients spinning two halfs of keyboard +# define ENABLE_RGB_MATRIX_RAINDROPS // Randomly changes a single key's hue +# define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS // Randomly changes a single key's hue and saturation +# define ENABLE_RGB_MATRIX_HUE_BREATHING // Hue shifts up a slight amount at the same time, then shifts back +# define ENABLE_RGB_MATRIX_HUE_PENDULUM // Hue shifts up a slight amount in a wave to the right, then back to the left +# define ENABLE_RGB_MATRIX_HUE_WAVE // Hue shifts up a slight amount and then back down in a wave to the right +# define ENABLE_RGB_MATRIX_PIXEL_FRACTAL // Single hue fractal filled keys pulsing horizontally out to edges +# define ENABLE_RGB_MATRIX_PIXEL_FLOW // Pulsing RGB flow along LED wiring with random hues +# define ENABLE_RGB_MATRIX_PIXEL_RAIN // Randomly light keys with random hues +# if defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS) +# define ENABLE_RGB_MATRIX_TYPING_HEATMAP // How hot is your WPM! +# define ENABLE_RGB_MATRIX_DIGITAL_RAIN // That famous computer simulation +# endif +# if defined(RGB_MATRIX_KEYPRESSES) || defined(RGB_MATRIX_KEYRELEASES) +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE // Pulses keys hit to hue & value then fades value out +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE // Static single hue, pulses keys hit to shifted hue then fades to current hue +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE // Hue & value pulse near a single key hit then fades value out +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE // Hue & value pulse near multiple key hits then fades value out +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS // Hue & value pulse the same column and row of a single key hit then fades value out +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS // Hue & value pulse the same column and row of multiple key hits then fades value out +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS // Hue & value pulse away on the same column and row of a single key hit then fades value out +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS // Hue & value pulse away on the same column and row of multiple key hits then fades value out +# define ENABLE_RGB_MATRIX_SPLASH // Full gradient & value pulse away from a single key hit then fades value out +# define ENABLE_RGB_MATRIX_MULTISPLASH // Full gradient & value pulse away from multiple key hits then fades value out +# define ENABLE_RGB_MATRIX_SOLID_SPLASH // Hue & value pulse away from a single key hit then fades value out +# define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH // Hue & value pulse away from multiple key hits then fades value out +# endif +#endif diff --git a/keyboards/stront/display.c b/keyboards/stront/display.c new file mode 100644 index 0000000000..f7b071d1a9 --- /dev/null +++ b/keyboards/stront/display.c @@ -0,0 +1,125 @@ +// Copyright 2023 zzeneg (@zzeneg) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "display.h" +#include "qp.h" +#include "lvgl_helpers.h" + +/* shared styles */ +lv_style_t style_screen; +lv_style_t style_container; +lv_style_t style_button; +lv_style_t style_button_active; + +/* screens */ +static lv_obj_t *screen_home; + +/* home screen content */ +static lv_obj_t *label_shift; +static lv_obj_t *label_ctrl; +static lv_obj_t *label_alt; +static lv_obj_t *label_gui; +static lv_obj_t *label_caps; + +void init_styles(void) { + lv_style_init(&style_screen); + lv_style_set_bg_color(&style_screen, lv_color_black()); + + lv_style_init(&style_container); + lv_style_set_pad_top(&style_container, 0); + lv_style_set_pad_bottom(&style_container, 0); + lv_style_set_pad_left(&style_container, 0); + lv_style_set_pad_right(&style_container, 0); + lv_style_set_bg_opa(&style_container, 0); + lv_style_set_border_width(&style_container, 0); + lv_style_set_width(&style_container, lv_pct(100)); + lv_style_set_height(&style_container, LV_SIZE_CONTENT); + + lv_style_init(&style_button); + lv_style_set_pad_top(&style_button, 4); + lv_style_set_pad_bottom(&style_button, 4); + lv_style_set_pad_left(&style_button, 4); + lv_style_set_pad_right(&style_button, 4); + lv_style_set_radius(&style_button, 6); + lv_style_set_text_color(&style_button, lv_palette_main(LV_PALETTE_AMBER)); + + lv_style_init(&style_button_active); + lv_style_set_bg_color(&style_button_active, lv_palette_main(LV_PALETTE_AMBER)); + lv_style_set_bg_opa(&style_button_active, LV_OPA_100); + lv_style_set_text_color(&style_button_active, lv_color_black()); +} + +void init_screen_home(void) { + screen_home = lv_scr_act(); + + lv_obj_add_style(screen_home, &style_screen, 0); + use_flex_column(screen_home); + + lv_obj_t *mods = lv_obj_create(screen_home); + lv_obj_add_style(mods, &style_container, 0); + use_flex_column(mods); + + lv_obj_t *mods_row1 = lv_obj_create(mods); + lv_obj_add_style(mods_row1, &style_container, 0); + use_flex_row(mods_row1); + label_gui = create_button(mods_row1, "GUI", &style_button, &style_button_active); + label_alt = create_button(mods_row1, "ALT", &style_button, &style_button_active); + + lv_obj_t *mods_row2 = lv_obj_create(mods); + lv_obj_add_style(mods_row2, &style_container, 0); + use_flex_row(mods_row2); + label_ctrl = create_button(mods_row2, "CTL", &style_button, &style_button_active); + label_shift = create_button(mods_row2, "SFT", &style_button, &style_button_active); + + lv_obj_t *label_stront = lv_label_create(screen_home); + lv_label_set_text(label_stront, "stront"); +#if LV_FONT_MONTSERRAT_48 + lv_obj_set_style_text_font(label_stront, &lv_font_montserrat_48, LV_PART_MAIN); +#endif + + label_caps = create_button(screen_home, "CAPS", &style_button, &style_button_active); +} + +bool display_init_kb(void) { + dprint("display_init_kb - start\n"); + + backlight_enable(); + + painter_device_t display = qp_st7789_make_spi_device(240, 300, LCD_CS_PIN, LCD_DC_PIN, LCD_RST_PIN, 16, 3); + qp_set_viewport_offsets(display, 0, 20); + + if (!qp_init(display, QP_ROTATION_180) || !qp_power(display, true) || !qp_lvgl_attach(display)) return false; + + dprint("display_init_kb - initialised\n"); + + lv_disp_t *lv_display = lv_disp_get_default(); + lv_theme_t *lv_theme = lv_theme_default_init(lv_display, lv_palette_main(LV_PALETTE_AMBER), lv_palette_main(LV_PALETTE_BLUE), true, LV_FONT_DEFAULT); + lv_disp_set_theme(lv_display, lv_theme); + init_styles(); + + bool res = display_init_user(); + if (res) { + dprint("display_init_kb - adding default home screen\n"); + init_screen_home(); + } + + return true; +} + +__attribute__((weak)) bool display_init_user(void) { + return true; +} + +__attribute__((weak)) void display_housekeeping_task(void) { + dprint("display_housekeeping_task_kb\n"); + + toggle_state(label_shift, LV_STATE_PRESSED, MODS_SHIFT); + toggle_state(label_ctrl, LV_STATE_PRESSED, MODS_CTRL); + toggle_state(label_alt, LV_STATE_PRESSED, MODS_ALT); + toggle_state(label_gui, LV_STATE_PRESSED, MODS_GUI); +} + +__attribute__((weak)) void display_process_caps(bool active) { + dprint("display_process_caps\n"); + toggle_state(label_caps, LV_STATE_PRESSED, active); +} diff --git a/keyboards/stront/display.h b/keyboards/stront/display.h new file mode 100644 index 0000000000..4249ff468e --- /dev/null +++ b/keyboards/stront/display.h @@ -0,0 +1,20 @@ +// Copyright 2023 zzeneg (@zzeneg) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "qp_lvgl.h" + +#define MODS_SHIFT ((get_mods() | get_oneshot_mods()) & MOD_MASK_SHIFT) +#define MODS_CTRL ((get_mods() | get_oneshot_mods()) & MOD_MASK_CTRL) +#define MODS_ALT ((get_mods() | get_oneshot_mods()) & MOD_MASK_ALT) +#define MODS_GUI ((get_mods() | get_oneshot_mods()) & MOD_MASK_GUI) + +/* shared styles */ +extern lv_style_t style_screen; +extern lv_style_t style_container; +extern lv_style_t style_button; +extern lv_style_t style_button_active; + +bool display_init_kb(void); +bool display_init_user(void); +void display_housekeeping_task(void); +void display_process_caps(bool active); diff --git a/keyboards/stront/halconf.h b/keyboards/stront/halconf.h new file mode 100644 index 0000000000..0aa1ff58d8 --- /dev/null +++ b/keyboards/stront/halconf.h @@ -0,0 +1,9 @@ +// Copyright 2023 zzeneg (@zzeneg) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define HAL_USE_SPI TRUE +#define HAL_USE_PWM TRUE + +#include_next diff --git a/keyboards/stront/info.json b/keyboards/stront/info.json new file mode 100644 index 0000000000..97df3477af --- /dev/null +++ b/keyboards/stront/info.json @@ -0,0 +1,147 @@ +{ + "keyboard_name": "stront", + "manufacturer": "zzeneg", + "url": "https://github.com/zzeneg/stront", + "maintainer": "zzeneg", + "layouts": { + "LAYOUT": { + "layout": [ + { "matrix": [0, 1], "x": 2, "y": 0 }, + { "matrix": [0, 2], "x": 3, "y": 0 }, + { "matrix": [0, 3], "x": 4, "y": 0 }, + { "matrix": [0, 4], "x": 5, "y": 0 }, + + { "matrix": [4, 4], "x": 8, "y": 0 }, + { "matrix": [4, 3], "x": 9, "y": 0 }, + { "matrix": [4, 2], "x": 10, "y": 0 }, + { "matrix": [4, 1], "x": 11, "y": 0 }, + + { "matrix": [0, 0], "x": 0, "y": 1 }, + { "matrix": [1, 0], "x": 1, "y": 1 }, + { "matrix": [1, 1], "x": 2, "y": 1 }, + { "matrix": [1, 2], "x": 3, "y": 1 }, + { "matrix": [1, 3], "x": 4, "y": 1 }, + { "matrix": [1, 4], "x": 5, "y": 1 }, + + { "matrix": [5, 4], "x": 8, "y": 1 }, + { "matrix": [5, 3], "x": 9, "y": 1 }, + { "matrix": [5, 2], "x": 10, "y": 1 }, + { "matrix": [5, 1], "x": 11, "y": 1 }, + { "matrix": [5, 0], "x": 12, "y": 1 }, + { "matrix": [4, 0], "x": 13, "y": 1 }, + + { "matrix": [3, 0], "x": 0, "y": 2 }, + { "matrix": [2, 0], "x": 1, "y": 2 }, + { "matrix": [2, 1], "x": 2, "y": 2 }, + { "matrix": [2, 2], "x": 3, "y": 2 }, + { "matrix": [2, 3], "x": 4, "y": 2 }, + { "matrix": [2, 4], "x": 5, "y": 2 }, + + { "matrix": [6, 4], "x": 8, "y": 2 }, + { "matrix": [6, 3], "x": 9, "y": 2 }, + { "matrix": [6, 2], "x": 10, "y": 2 }, + { "matrix": [6, 1], "x": 11, "y": 2 }, + { "matrix": [6, 0], "x": 12, "y": 2 }, + { "matrix": [7, 0], "x": 13, "y": 2 }, + + { "matrix": [3, 2], "x": 4, "y": 3 }, + { "matrix": [3, 3], "x": 5, "y": 3 }, + { "matrix": [3, 4], "x": 6, "y": 3 }, + { "matrix": [7, 4], "x": 7, "y": 3 }, + { "matrix": [7, 3], "x": 8, "y": 3 }, + { "matrix": [7, 2], "x": 9, "y": 3 } + ] + } + }, + "processor": "RP2040", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "matrix_pins": { + "cols": ["GP2", "GP3", "GP4", "GP5", "GP6"], + "rows": ["GP28", "GP27", "GP26", "GP15"] + }, + "split": { + "enabled": true + }, + "encoder": { + "rotary": [ + { + "pin_a": "GP7", + "pin_b": "GP8", + "resolution": 4 + } + ] + }, + "features": { + "bootmagic": true, + "console": false, + "encoder": true, + "backlight": true, + "extrakey": true, + "rgblight": false, + "rgb_matrix": true, + "nkro": false + }, + "backlight": { + "pin": "GP14" + }, + "ws2812": { + "pin": "GP29" + }, + "rgblight": { + "led_count": 38, + "split": true, + "split_count": [19, 19] + }, + "rgb_matrix": { + "driver": "WS2812", + "led_count": 38, + "split_count": [19, 19], + "layout": [ + { "flags": 4, "matrix": [0, 4], "x": 71, "y": 7 }, + { "flags": 4, "matrix": [0, 3], "x": 57, "y": 5 }, + { "flags": 4, "matrix": [0, 2], "x": 44, "y": 0 }, + { "flags": 4, "matrix": [0, 1], "x": 27, "y": 5 }, + { "flags": 4, "matrix": [1, 1], "x": 29, "y": 22 }, + { "flags": 4, "matrix": [1, 0], "x": 14, "y": 26 }, + { "flags": 4, "matrix": [0, 0], "x": 0, "y": 26 }, + { "flags": 4, "matrix": [3, 0], "x": 2, "y": 43 }, + { "flags": 4, "matrix": [2, 0], "x": 16, "y": 43 }, + { "flags": 4, "matrix": [2, 1], "x": 30, "y": 38 }, + { "flags": 4, "matrix": [2, 2], "x": 44, "y": 33 }, + { "flags": 4, "matrix": [1, 2], "x": 44, "y": 17 }, + { "flags": 4, "matrix": [1, 3], "x": 57, "y": 22 }, + { "flags": 4, "matrix": [1, 4], "x": 71, "y": 24 }, + { "flags": 4, "matrix": [2, 4], "x": 71, "y": 40 }, + { "flags": 4, "matrix": [2, 3], "x": 57, "y": 38 }, + { "flags": 4, "matrix": [3, 2], "x": 56, "y": 57 }, + { "flags": 4, "matrix": [3, 3], "x": 71, "y": 59 }, + { "flags": 4, "matrix": [3, 4], "x": 85, "y": 64 }, + + { "flags": 4, "matrix": [7, 4], "x": 139, "y": 64 }, + { "flags": 4, "matrix": [7, 3], "x": 153, "y": 59 }, + { "flags": 4, "matrix": [7, 2], "x": 168, "y": 57 }, + { "flags": 4, "matrix": [6, 3], "x": 167, "y": 38 }, + { "flags": 4, "matrix": [6, 4], "x": 153, "y": 40 }, + { "flags": 4, "matrix": [5, 4], "x": 153, "y": 24 }, + { "flags": 4, "matrix": [5, 3], "x": 167, "y": 22 }, + { "flags": 4, "matrix": [5, 2], "x": 180, "y": 17 }, + { "flags": 4, "matrix": [6, 2], "x": 180, "y": 33 }, + { "flags": 4, "matrix": [6, 1], "x": 194, "y": 38 }, + { "flags": 4, "matrix": [6, 0], "x": 208, "y": 43 }, + { "flags": 4, "matrix": [7, 0], "x": 222, "y": 43 }, + { "flags": 4, "matrix": [4, 0], "x": 224, "y": 26 }, + { "flags": 4, "matrix": [5, 0], "x": 210, "y": 26 }, + { "flags": 4, "matrix": [5, 1], "x": 195, "y": 22 }, + { "flags": 4, "matrix": [4, 1], "x": 197, "y": 5 }, + { "flags": 4, "matrix": [4, 2], "x": 180, "y": 0 }, + { "flags": 4, "matrix": [4, 3], "x": 167, "y": 5 }, + { "flags": 4, "matrix": [4, 4], "x": 153, "y": 7 } + ] + }, + "usb": { + "device_version": "1.0.0", + "pid": "0x0844", + "vid": "0xFEED" + } +} diff --git a/keyboards/stront/keymaps/default/keymap.c b/keyboards/stront/keymaps/default/keymap.c new file mode 100644 index 0000000000..793a2495c7 --- /dev/null +++ b/keyboards/stront/keymaps/default/keymap.c @@ -0,0 +1,107 @@ +// Copyright 2023 zzeneg (@zzeneg) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +enum layer_number { + // clang-format off + _QWERTY = 0, + _GAME, + _NAV, + _NUMBER, + _SYMBOL, + _FUNC, + _SYS + // clang-format on +}; + +// Left-hand home row mods +#define HOME_A LGUI_T(KC_A) +#define HOME_S LALT_T(KC_S) +#define HOME_D LCTL_T(KC_D) +#define HOME_F LSFT_T(KC_F) + +// Right-hand home row mods +#define HOME_J RSFT_T(KC_J) +#define HOME_K RCTL_T(KC_K) +#define HOME_L LALT_T(KC_L) +#define HOME_SCLN RGUI_T(KC_SCLN) + +// bottom mods +#define SYM_SPC LT(_SYMBOL, KC_SPC) +#define NUM_TAB LT(_NUMBER, KC_TAB) +#define FUNC_ESC LT(_FUNC, KC_ESC) +#define FUNC_ENT LT(_FUNC, KC_ENT) +#define NAV_BSPC LT(_NAV, KC_BSPC) +#define RALT_DEL LALT_T(KC_DEL) + +// game layer mods +#define LALT_Q LALT_T(KC_Q) +#define LSFT_MINS LSFT_T(KC_MINS) +#define LCTL_ESC LCTL_T(KC_ESC) +#define LGUI_QUOT LGUI_T(KC_QUOT) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* QWERTY + * .---------------------------. .---------------------------. + * | W | E | R | T | | Y | U | I | O | + * .------+------+------+------+------+------| |------+------+------+------+------+------. + * | Q | A | S | D | F | G | | H | J | K | L | P | ; | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | - | Z | X | C | V | B |--------. .--------| N | M | , | . | / | ' | + * '-----------------------------------------/ / \ \-----------------------------------------' + * | Esc | Tab | / Space / \ Enter \ | Bsps | Del | + * |_FUNC | _NUM | /_SYMBOL/ \ _FUNC \ | _NAV | RAlt | + * `-------------''-------' '-------''-------------' + */ + // clang-format off + [_QWERTY] = LAYOUT( + KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, + KC_Q, HOME_A, HOME_S, HOME_D, HOME_F, KC_G, KC_H, HOME_J, HOME_K, HOME_L, HOME_SCLN, KC_P, + KC_MINS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT, + FUNC_ESC, NUM_TAB, SYM_SPC, FUNC_ENT, NAV_BSPC, RALT_DEL + ), + + [_GAME] = LAYOUT( + KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, + LALT_Q, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_P, + LSFT_MINS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, LGUI_QUOT, + LCTL_ESC, NUM_TAB, SYM_SPC, FUNC_ENT, NAV_BSPC, RALT_DEL + ), + + [_NAV] = LAYOUT( + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PGDN, KC_PGUP, + XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_PAUS, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_HOME, KC_END, KC_INS, KC_APP, XXXXXXX, + FUNC_ESC, NUM_TAB, SYM_SPC, XXXXXXX, _______, RALT_DEL + ), + + [_NUMBER] = LAYOUT( + KC_7, KC_8, KC_9, KC_GRV, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_EQL, KC_0, KC_4, KC_5, KC_6, KC_LBRC, XXXXXXX, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI, XXXXXXX, + KC_MINS, KC_BSLS, KC_1, KC_2, KC_3, KC_RBRC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_ENT, _______, TG(_GAME), FUNC_ENT, NAV_BSPC, RALT_DEL + ), + + [_SYMBOL] = LAYOUT( + LSFT(KC_7), LSFT(KC_8), LSFT(KC_9), LSFT(KC_GRV), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + LSFT(KC_EQL), LSFT(KC_0), LSFT(KC_4), LSFT(KC_5), LSFT(KC_6), LSFT(KC_LBRC), XXXXXXX, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI, XXXXXXX, + LSFT(KC_MINS), LSFT(KC_BSLS), LSFT(KC_1), LSFT(KC_2), LSFT(KC_3), LSFT(KC_RBRC), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + MO(_SYS), KC_BSPC, _______, FUNC_ENT, NAV_BSPC, RALT_DEL + ), + + [_FUNC] = LAYOUT( + KC_F7, KC_F8, KC_F9, KC_CAPS, XXXXXXX, KC_PSCR, KC_SCRL, KC_NUM, + KC_F12, KC_F11, KC_F4, KC_F5, KC_F6, KC_F12, XXXXXXX, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI, XXXXXXX, + XXXXXXX, KC_F10, KC_F1, KC_F2, KC_F3, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, KC_MNXT, KC_MPLY, _______, XXXXXXX, MO(_SYS) + ), + + [_SYS] = LAYOUT( + BL_DOWN, BL_UP, BL_TOGG, XXXXXXX, XXXXXXX, RGB_TOG, RGB_MOD, RGB_RMOD, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, RGB_M_P, + EH_LEFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, EH_RGHT, EH_RGHT, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, EH_LEFT, + _______, QK_BOOT, _______, _______, QK_BOOT, _______ + ) + // clang-format on +}; diff --git a/keyboards/stront/keymaps/hid/config.h b/keyboards/stront/keymaps/hid/config.h new file mode 100644 index 0000000000..e96512f93f --- /dev/null +++ b/keyboards/stront/keymaps/hid/config.h @@ -0,0 +1,7 @@ +// Copyright 2022 zzeneg (@zzeneg) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define SPLIT_TRANSACTION_IDS_USER RPC_ID_USER_HID_SYNC, RPC_ID_USER_CAPS_WORD_SYNC, RPC_ID_USER_LAYER_SYNC +#define QUANTUM_PAINTER_DISPLAY_TIMEOUT 0 diff --git a/keyboards/stront/keymaps/hid/hid_display.c b/keyboards/stront/keymaps/hid/hid_display.c new file mode 100644 index 0000000000..a1e1311713 --- /dev/null +++ b/keyboards/stront/keymaps/hid/hid_display.c @@ -0,0 +1,240 @@ +// Copyright 2023 zzeneg (@zzeneg) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "hid_display.h" +#include "display.h" +#include "raw_hid.h" +#include "lvgl_helpers.h" + +uint16_t home_screen_timer = 0; + +/* screens */ +static lv_obj_t *screen_home; +static lv_obj_t *screen_volume; +static lv_obj_t *screen_media; + +/* home screen content */ +static lv_obj_t *label_time; +static lv_obj_t *label_volume_home; +static lv_obj_t *label_shift; +static lv_obj_t *label_ctrl; +static lv_obj_t *label_alt; +static lv_obj_t *label_gui; +static lv_obj_t *label_layer; +static lv_obj_t *label_caps; +#ifdef CAPS_WORD_ENABLE +static lv_obj_t *label_caps_word; +#endif +static lv_obj_t *label_layout; + +/* volume screen content */ +static lv_obj_t *arc_volume; +static lv_obj_t *label_volume_arc; + +/* media screen content */ +static lv_obj_t *label_media_artist; +static lv_obj_t *label_media_title; + +enum layout { _EN = 0, _RU }; +void set_layout_label(uint8_t layout) { + switch (layout) { + case _EN: + lv_label_set_text(label_layout, "EN"); + break; + + case _RU: + lv_label_set_text(label_layout, "RU"); + break; + } +} + +void read_string(uint8_t *data, char *string_data) { + uint8_t data_length = data[1]; + memcpy(string_data, data + 2, data_length); + string_data[data_length] = '\0'; +} + +void start_home_screen_timer(void) { + dprint("start_home_screen_timer\n"); + home_screen_timer = timer_read(); +} + +void init_screen_home_custom(void) { + screen_home = lv_scr_act(); + lv_obj_add_style(screen_home, &style_screen, 0); + use_flex_column(screen_home); + + label_volume_home = lv_label_create(screen_home); + lv_label_set_text(label_volume_home, ""); + + lv_obj_t *mods = lv_obj_create(screen_home); + lv_obj_add_style(mods, &style_container, 0); + use_flex_row(mods); + + label_gui = create_button(mods, "GUI", &style_button, &style_button_active); + label_alt = create_button(mods, "ALT", &style_button, &style_button_active); + label_ctrl = create_button(mods, "CTL", &style_button, &style_button_active); + label_shift = create_button(mods, "SFT", &style_button, &style_button_active); + + label_time = lv_label_create(screen_home); + lv_label_set_text(label_time, "00:00"); + lv_obj_set_style_text_font(label_time, &lv_font_montserrat_48, LV_PART_MAIN); + + lv_obj_t *caps = lv_obj_create(screen_home); + lv_obj_add_style(caps, &style_container, 0); + use_flex_row(caps); + + label_caps = create_button(caps, "CAPS", &style_button, &style_button_active); +#ifdef CAPS_WORD_ENABLE + label_caps_word = create_button(caps, "CAPS WORD", &style_button, &style_button_active); +#endif + + lv_obj_t *bottom_row = lv_obj_create(screen_home); + lv_obj_add_style(bottom_row, &style_container, 0); + + label_layer = lv_label_create(bottom_row); + lv_label_set_text(label_layer, ""); + lv_obj_align(label_layer, LV_ALIGN_LEFT_MID, 10, 0); + display_process_layer_state(0); + + label_layout = lv_label_create(bottom_row); + lv_label_set_text(label_layout, ""); + lv_obj_align(label_layout, LV_ALIGN_RIGHT_MID, -10, 0); + set_layout_label(0); +} + +void init_screen_volume(void) { + screen_volume = lv_obj_create(NULL); + lv_obj_add_style(screen_volume, &style_screen, 0); + + arc_volume = lv_arc_create(screen_volume); + lv_obj_set_size(arc_volume, 200, 200); + lv_obj_center(arc_volume); + + label_volume_arc = lv_label_create(screen_volume); + lv_label_set_text(label_volume_arc, "00"); + lv_obj_set_style_text_font(label_volume_arc, &lv_font_montserrat_48, LV_PART_MAIN); + lv_obj_center(label_volume_arc); + + lv_obj_t *volume_text_label = lv_label_create(screen_volume); + lv_label_set_text(volume_text_label, "Volume"); + lv_obj_align(volume_text_label, LV_ALIGN_BOTTOM_MID, 0, -10); +} + +void init_screen_media(void) { + screen_media = lv_obj_create(NULL); + lv_obj_add_style(screen_media, &style_screen, 0); + use_flex_column(screen_media); + lv_obj_set_flex_align(screen_media, LV_FLEX_ALIGN_SPACE_EVENLY, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + + label_media_artist = lv_label_create(screen_media); + lv_label_set_text(label_media_artist, "N/A"); + lv_label_set_long_mode(label_media_artist, LV_LABEL_LONG_WRAP); + lv_obj_set_width(label_media_artist, lv_pct(90)); + lv_obj_set_style_text_align(label_media_artist, LV_TEXT_ALIGN_CENTER, 0); + + label_media_title = lv_label_create(screen_media); + lv_label_set_text(label_media_title, "N/A"); + lv_label_set_long_mode(label_media_title, LV_LABEL_LONG_WRAP); + lv_obj_set_width(label_media_title, lv_pct(90)); + lv_obj_set_style_text_align(label_media_title, LV_TEXT_ALIGN_CENTER, 0); +} + +bool display_init_user(void) { + init_screen_home_custom(); + init_screen_volume(); + init_screen_media(); + + return false; +} + +void display_process_raw_hid_data(uint8_t *data, uint8_t length) { + uint8_t data_type = data[0]; + char string_data[length - 2]; + dprintf("display_process_raw_hid_data - received data_type %u \n", data_type); + switch (data_type) { + case _TIME: + dprintf("time %02d:%02d\n", data[1], data[2]); + lv_label_set_text_fmt(label_time, "%02d:%02d", data[1], data[2]); + break; + + case _VOLUME: + dprintf("volume %d\n", data[1]); + lv_label_set_text_fmt(label_volume_home, "Volume: %02d%%", data[1]); + lv_label_set_text_fmt(label_volume_arc, "%02d", data[1]); + lv_arc_set_value(arc_volume, data[1]); + lv_scr_load(screen_volume); + start_home_screen_timer(); + break; + + case _LAYOUT: + dprintf("layout %d\n", data[1]); + set_layout_label(data[1]); + break; + + case _MEDIA_ARTIST: + read_string(data, string_data); + dprintf("media artist %s\n", string_data); + lv_label_set_text(label_media_artist, string_data); + lv_scr_load(screen_media); + start_home_screen_timer(); + break; + + case _MEDIA_TITLE: + read_string(data, string_data); + dprintf("media title %s\n", string_data); + lv_label_set_text(label_media_title, string_data); + lv_scr_load(screen_media); + start_home_screen_timer(); + break; + } +} + +void display_process_layer_state(uint8_t layer) { + switch (layer) { + case _QWERTY: + lv_label_set_text(label_layer, "QWERTY"); + break; + case _GAME: + lv_label_set_text(label_layer, "GAME"); + break; + case _NAV: + lv_label_set_text(label_layer, "NAV"); + break; + case _NUMBER: + lv_label_set_text(label_layer, "NUMBER"); + break; + case _SYMBOL: + lv_label_set_text(label_layer, "SYMBOL"); + break; + case _FUNC: + lv_label_set_text(label_layer, "FUNC"); + break; + case _SYS: + lv_label_set_text(label_layer, "SYSTEM"); + break; + } +} + +void display_housekeeping_task(void) { + if (home_screen_timer && timer_elapsed(home_screen_timer) > 5000) { + home_screen_timer = 0; + lv_scr_load(screen_home); + } + + toggle_state(label_shift, LV_STATE_PRESSED, MODS_SHIFT); + toggle_state(label_ctrl, LV_STATE_PRESSED, MODS_CTRL); + toggle_state(label_alt, LV_STATE_PRESSED, MODS_ALT); + toggle_state(label_gui, LV_STATE_PRESSED, MODS_GUI); +} + +void display_process_caps(bool active) { + toggle_state(label_caps, LV_STATE_PRESSED, active); +} + +#ifdef CAPS_WORD_ENABLE +void display_process_caps_word(bool active) { + dprint("display_process_caps_word\n"); + toggle_state(label_caps_word, LV_STATE_PRESSED, active); +} +#endif diff --git a/keyboards/stront/keymaps/hid/hid_display.h b/keyboards/stront/keymaps/hid/hid_display.h new file mode 100644 index 0000000000..b93bf64716 --- /dev/null +++ b/keyboards/stront/keymaps/hid/hid_display.h @@ -0,0 +1,29 @@ +// Copyright 2023 zzeneg (@zzeneg) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" + +typedef enum { + _QWERTY = 0, + _GAME, + _EU, + _NAV, + _NUMBER, + _SYMBOL, + _FUNC, + _SYS, +} layer_number; + +typedef enum { + _TIME = 0, + _VOLUME, + _LAYOUT, + _MEDIA_ARTIST, + _MEDIA_TITLE, +} hid_data_type; + +void display_process_raw_hid_data(uint8_t *data, uint8_t length); +void display_process_layer_state(uint8_t layer); +#ifdef CAPS_WORD_ENABLE +void display_process_caps_word(bool active); +#endif diff --git a/keyboards/stront/keymaps/hid/keymap.c b/keyboards/stront/keymaps/hid/keymap.c new file mode 100644 index 0000000000..11cb89c48e --- /dev/null +++ b/keyboards/stront/keymaps/hid/keymap.c @@ -0,0 +1,187 @@ +// Copyright 2022 zzeneg (@zzeneg) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +#include "hid_display.h" +#include "raw_hid.h" +#include "transactions.h" + +// Left-hand home row mods +#define HOME_A LGUI_T(KC_A) +#define HOME_S LALT_T(KC_S) +#define HOME_D LCTL_T(KC_D) +#define HOME_F LSFT_T(KC_F) + +// Right-hand home row mods +#define HOME_J RSFT_T(KC_J) +#define HOME_K RCTL_T(KC_K) +#define HOME_L LALT_T(KC_L) +#define HOME_SCLN RGUI_T(KC_SCLN) + +// bottom mods +#define SYM_SPC LT(_SYMBOL, KC_SPC) +#define NUM_TAB LT(_NUMBER, KC_TAB) +#define FUNC_ESC LT(_FUNC, KC_ESC) +#define FUNC_ENT LT(_FUNC, KC_ENT) +#define NAV_BSPC LT(_NAV, KC_BSPC) +#define RALT_DEL LALT_T(KC_DEL) + +// game layer mods +#define LALT_Q LALT_T(KC_Q) +#define LSFT_MINS LSFT_T(KC_MINS) +#define LCTL_ESC LCTL_T(KC_ESC) +#define LGUI_QUOT LGUI_T(KC_QUOT) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* QWERTY + * .---------------------------. .---------------------------. + * | W | E | R | T | | Y | U | I | O | + * .------+------+------+------+------+------| |------+------+------+------+------+------. + * | Q | A | S | D | F | G | | H | J | K | L | P | ; | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | - | Z | X | C | V | B |--------. .--------| N | M | , | . | / | ' | + * '-----------------------------------------/ / \ \-----------------------------------------' + * | Esc | Tab | / Space / \ Enter \ | Bsps | Del | + * |_FUNC | _NUM | /_SYMBOL/ \ _FUNC \ | _NAV | RAlt | + * `-------------''-------' '-------''-------------' + */ + // clang-format off + [_QWERTY] = LAYOUT( + KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, + KC_Q, HOME_A, HOME_S, HOME_D, HOME_F, KC_G, KC_H, HOME_J, HOME_K, HOME_L, HOME_SCLN, KC_P, + KC_MINS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT, + FUNC_ESC, NUM_TAB, SYM_SPC, FUNC_ENT, NAV_BSPC, RALT_DEL + ), + + [_GAME] = LAYOUT( + KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, + LALT_Q, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_P, + LSFT_MINS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, LGUI_QUOT, + LCTL_ESC, NUM_TAB, SYM_SPC, FUNC_ENT, NAV_BSPC, RALT_DEL + ), + + [_NAV] = LAYOUT( + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PGDN, KC_PGUP, + XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_PAUS, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_HOME, KC_END, KC_INS, KC_APP, XXXXXXX, + FUNC_ESC, NUM_TAB, SYM_SPC, XXXXXXX, _______, RALT_DEL + ), + + [_NUMBER] = LAYOUT( + KC_7, KC_8, KC_9, KC_GRV, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_EQL, KC_0, KC_4, KC_5, KC_6, KC_LBRC, XXXXXXX, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI, XXXXXXX, + KC_MINS, KC_BSLS, KC_1, KC_2, KC_3, KC_RBRC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_ENT, _______, TG(_GAME), FUNC_ENT, NAV_BSPC, RALT_DEL + ), + + [_SYMBOL] = LAYOUT( + LSFT(KC_7), LSFT(KC_8), LSFT(KC_9), LSFT(KC_GRV), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + LSFT(KC_EQL), LSFT(KC_0), LSFT(KC_4), LSFT(KC_5), LSFT(KC_6), LSFT(KC_LBRC), XXXXXXX, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI, XXXXXXX, + LSFT(KC_MINS), LSFT(KC_BSLS), LSFT(KC_1), LSFT(KC_2), LSFT(KC_3), LSFT(KC_RBRC), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + MO(_SYS), KC_BSPC, _______, FUNC_ENT, NAV_BSPC, RALT_DEL + ), + + [_FUNC] = LAYOUT( + KC_F7, KC_F8, KC_F9, KC_CAPS, XXXXXXX, KC_PSCR, KC_SCRL, KC_NUM, + KC_F12, KC_F11, KC_F4, KC_F5, KC_F6, KC_F12, XXXXXXX, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI, XXXXXXX, + XXXXXXX, KC_F10, KC_F1, KC_F2, KC_F3, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, KC_MNXT, KC_MPLY, _______, XXXXXXX, MO(_SYS) + ), + + [_SYS] = LAYOUT( + BL_DOWN, BL_UP, BL_TOGG, XXXXXXX, XXXXXXX, RGB_TOG, RGB_MOD, RGB_RMOD, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, RGB_M_P, + EH_LEFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, EH_RGHT, EH_RGHT, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, EH_LEFT, + _______, QK_BOOT, _______, _______, QK_BOOT, _______ + ) + // clang-format on +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + dprintf("process_record_user %u %s %s %d\n", keycode, record->event.pressed ? "pressed" : "depressed", record->tap.interrupted ? "interrupted" : "not interrupted", record->tap.count); + + if (record->event.pressed) { + uint8_t data[32]; + data[0] = 0; + + switch (keycode) { + // send hid commands + case KC_VOLU: + case KC_VOLD: + data[0] = _VOLUME; + break; + } + + if (data[0]) { + dprintf("raw_hid_send %u\n", data[0]); + raw_hid_send(data, sizeof(data)); + } + } + + return true; +} + +/* Caps Word processing */ +#ifdef CAPS_WORD_ENABLE +void caps_word_set_user(bool active) { + if (is_display_enabled()) { + display_process_caps_word(active); + } else if (is_keyboard_master() && !is_keyboard_left()) { + dprintf("RPC_ID_USER_CAPS_WORD_SYNC: %s\n", active ? "active" : "inactive"); + transaction_rpc_send(RPC_ID_USER_CAPS_WORD_SYNC, 1, &active); + } +} +#endif + +/* Active Layer processing */ +layer_state_t layer_state_set_user(layer_state_t state) { + if (is_display_enabled()) { + display_process_layer_state(get_highest_layer(state)); + } else if (is_keyboard_master() && !is_keyboard_left()) { + uint8_t layer = get_highest_layer(state); + dprintf("RPC_ID_USER_LAYER_SYNC: %u\n", layer); + transaction_rpc_send(RPC_ID_USER_LAYER_SYNC, 1, &layer); + } + + return state; +} + +/* Raw HID processing*/ +void raw_hid_receive(uint8_t *data, uint8_t length) { + dprintf("raw_hid_receive - received %u bytes \n", length); + + if (is_display_enabled()) { + display_process_raw_hid_data(data, length); + } else if (is_keyboard_master() && !is_keyboard_left()) { + dprint("RPC_ID_USER_HID_SYNC \n"); + transaction_rpc_send(RPC_ID_USER_HID_SYNC, length, data); + } +} + +void hid_sync(uint8_t initiator2target_buffer_size, const void *initiator2target_buffer, uint8_t target2initiator_buffer_size, void *target2initiator_buffer) { + if (is_display_enabled()) { + display_process_raw_hid_data((uint8_t *)initiator2target_buffer, initiator2target_buffer_size); + } +} + +void layer_sync(uint8_t initiator2target_buffer_size, const void *initiator2target_buffer, uint8_t target2initiator_buffer_size, void *target2initiator_buffer) { + if (is_display_enabled()) { + display_process_layer_state(*(uint8_t *)initiator2target_buffer); + } +} + +void caps_word_sync(uint8_t initiator2target_buffer_size, const void *initiator2target_buffer, uint8_t target2initiator_buffer_size, void *target2initiator_buffer) { + if (is_display_enabled()) { + display_process_caps_word(*(bool *)initiator2target_buffer); + } +} + +void keyboard_post_init_user() { + // sync received hid data + transaction_register_rpc(RPC_ID_USER_HID_SYNC, hid_sync); + // sync highest layer (a bit more performant than standard SPLIT_LAYER_STATE_ENABLE) + transaction_register_rpc(RPC_ID_USER_LAYER_SYNC, layer_sync); + // sync caps word state + transaction_register_rpc(RPC_ID_USER_CAPS_WORD_SYNC, caps_word_sync); +} diff --git a/keyboards/stront/keymaps/hid/lv_conf.h b/keyboards/stront/keymaps/hid/lv_conf.h new file mode 100644 index 0000000000..f8f93b7c9e --- /dev/null +++ b/keyboards/stront/keymaps/hid/lv_conf.h @@ -0,0 +1,15 @@ +// Copyright 2023 zzeneg (@zzeneg) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +#undef LV_FONT_DEFAULT +#define LV_FONT_DEFAULT &lv_font_montserrat_20 + +#undef LV_FONT_MONTSERRAT_20 +#define LV_FONT_MONTSERRAT_20 1 + +#undef LV_FONT_MONTSERRAT_28 +#define LV_FONT_MONTSERRAT_28 0 diff --git a/keyboards/stront/keymaps/hid/rules.mk b/keyboards/stront/keymaps/hid/rules.mk new file mode 100644 index 0000000000..beaf344b66 --- /dev/null +++ b/keyboards/stront/keymaps/hid/rules.mk @@ -0,0 +1,5 @@ +CAPS_WORD_ENABLE = yes + +RAW_ENABLE = yes + +SRC += hid_display.c diff --git a/keyboards/stront/keymaps/i2c/config.h b/keyboards/stront/keymaps/i2c/config.h new file mode 100644 index 0000000000..8c71dad835 --- /dev/null +++ b/keyboards/stront/keymaps/i2c/config.h @@ -0,0 +1,8 @@ +// Copyright 2023 zzeneg (@zzeneg) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define I2C_DRIVER I2CD1 +#define I2C1_SDA_PIN GP10 +#define I2C1_SCL_PIN GP11 diff --git a/keyboards/stront/keymaps/i2c/halconf.h b/keyboards/stront/keymaps/i2c/halconf.h new file mode 100644 index 0000000000..46c5a48c9a --- /dev/null +++ b/keyboards/stront/keymaps/i2c/halconf.h @@ -0,0 +1,8 @@ +// Copyright 2023 zzeneg (@zzeneg) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define HAL_USE_I2C TRUE + +#include_next diff --git a/keyboards/stront/keymaps/i2c/keymap.c b/keyboards/stront/keymaps/i2c/keymap.c new file mode 100644 index 0000000000..793a2495c7 --- /dev/null +++ b/keyboards/stront/keymaps/i2c/keymap.c @@ -0,0 +1,107 @@ +// Copyright 2023 zzeneg (@zzeneg) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +enum layer_number { + // clang-format off + _QWERTY = 0, + _GAME, + _NAV, + _NUMBER, + _SYMBOL, + _FUNC, + _SYS + // clang-format on +}; + +// Left-hand home row mods +#define HOME_A LGUI_T(KC_A) +#define HOME_S LALT_T(KC_S) +#define HOME_D LCTL_T(KC_D) +#define HOME_F LSFT_T(KC_F) + +// Right-hand home row mods +#define HOME_J RSFT_T(KC_J) +#define HOME_K RCTL_T(KC_K) +#define HOME_L LALT_T(KC_L) +#define HOME_SCLN RGUI_T(KC_SCLN) + +// bottom mods +#define SYM_SPC LT(_SYMBOL, KC_SPC) +#define NUM_TAB LT(_NUMBER, KC_TAB) +#define FUNC_ESC LT(_FUNC, KC_ESC) +#define FUNC_ENT LT(_FUNC, KC_ENT) +#define NAV_BSPC LT(_NAV, KC_BSPC) +#define RALT_DEL LALT_T(KC_DEL) + +// game layer mods +#define LALT_Q LALT_T(KC_Q) +#define LSFT_MINS LSFT_T(KC_MINS) +#define LCTL_ESC LCTL_T(KC_ESC) +#define LGUI_QUOT LGUI_T(KC_QUOT) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* QWERTY + * .---------------------------. .---------------------------. + * | W | E | R | T | | Y | U | I | O | + * .------+------+------+------+------+------| |------+------+------+------+------+------. + * | Q | A | S | D | F | G | | H | J | K | L | P | ; | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | - | Z | X | C | V | B |--------. .--------| N | M | , | . | / | ' | + * '-----------------------------------------/ / \ \-----------------------------------------' + * | Esc | Tab | / Space / \ Enter \ | Bsps | Del | + * |_FUNC | _NUM | /_SYMBOL/ \ _FUNC \ | _NAV | RAlt | + * `-------------''-------' '-------''-------------' + */ + // clang-format off + [_QWERTY] = LAYOUT( + KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, + KC_Q, HOME_A, HOME_S, HOME_D, HOME_F, KC_G, KC_H, HOME_J, HOME_K, HOME_L, HOME_SCLN, KC_P, + KC_MINS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT, + FUNC_ESC, NUM_TAB, SYM_SPC, FUNC_ENT, NAV_BSPC, RALT_DEL + ), + + [_GAME] = LAYOUT( + KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, + LALT_Q, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_P, + LSFT_MINS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, LGUI_QUOT, + LCTL_ESC, NUM_TAB, SYM_SPC, FUNC_ENT, NAV_BSPC, RALT_DEL + ), + + [_NAV] = LAYOUT( + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PGDN, KC_PGUP, + XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_PAUS, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_HOME, KC_END, KC_INS, KC_APP, XXXXXXX, + FUNC_ESC, NUM_TAB, SYM_SPC, XXXXXXX, _______, RALT_DEL + ), + + [_NUMBER] = LAYOUT( + KC_7, KC_8, KC_9, KC_GRV, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_EQL, KC_0, KC_4, KC_5, KC_6, KC_LBRC, XXXXXXX, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI, XXXXXXX, + KC_MINS, KC_BSLS, KC_1, KC_2, KC_3, KC_RBRC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_ENT, _______, TG(_GAME), FUNC_ENT, NAV_BSPC, RALT_DEL + ), + + [_SYMBOL] = LAYOUT( + LSFT(KC_7), LSFT(KC_8), LSFT(KC_9), LSFT(KC_GRV), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + LSFT(KC_EQL), LSFT(KC_0), LSFT(KC_4), LSFT(KC_5), LSFT(KC_6), LSFT(KC_LBRC), XXXXXXX, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI, XXXXXXX, + LSFT(KC_MINS), LSFT(KC_BSLS), LSFT(KC_1), LSFT(KC_2), LSFT(KC_3), LSFT(KC_RBRC), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + MO(_SYS), KC_BSPC, _______, FUNC_ENT, NAV_BSPC, RALT_DEL + ), + + [_FUNC] = LAYOUT( + KC_F7, KC_F8, KC_F9, KC_CAPS, XXXXXXX, KC_PSCR, KC_SCRL, KC_NUM, + KC_F12, KC_F11, KC_F4, KC_F5, KC_F6, KC_F12, XXXXXXX, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI, XXXXXXX, + XXXXXXX, KC_F10, KC_F1, KC_F2, KC_F3, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, KC_MNXT, KC_MPLY, _______, XXXXXXX, MO(_SYS) + ), + + [_SYS] = LAYOUT( + BL_DOWN, BL_UP, BL_TOGG, XXXXXXX, XXXXXXX, RGB_TOG, RGB_MOD, RGB_RMOD, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, RGB_M_P, + EH_LEFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, EH_RGHT, EH_RGHT, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, EH_LEFT, + _______, QK_BOOT, _______, _______, QK_BOOT, _______ + ) + // clang-format on +}; diff --git a/keyboards/stront/keymaps/i2c/mcuconf.h b/keyboards/stront/keymaps/i2c/mcuconf.h new file mode 100644 index 0000000000..47ee67119d --- /dev/null +++ b/keyboards/stront/keymaps/i2c/mcuconf.h @@ -0,0 +1,9 @@ +// Copyright 2023 zzeneg (@zzeneg) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +#undef RP_I2C_USE_I2C1 +#define RP_I2C_USE_I2C1 TRUE diff --git a/keyboards/stront/keymaps/i2c/rules.mk b/keyboards/stront/keymaps/i2c/rules.mk new file mode 100644 index 0000000000..fedac72e2e --- /dev/null +++ b/keyboards/stront/keymaps/i2c/rules.mk @@ -0,0 +1 @@ +POINTING_DEVICE_DRIVER = cirque_pinnacle_i2c diff --git a/keyboards/stront/keymaps/zzeneg/config.h b/keyboards/stront/keymaps/zzeneg/config.h new file mode 100644 index 0000000000..38fad1c0fd --- /dev/null +++ b/keyboards/stront/keymaps/zzeneg/config.h @@ -0,0 +1,30 @@ +// Copyright 2022 zzeneg (@zzeneg) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +// #define DEBUG_MATRIX_SCAN_RATE + +#define SPLIT_TRANSACTION_IDS_USER RPC_ID_USER_HID_SYNC, RPC_ID_USER_CAPS_WORD_SYNC, RPC_ID_USER_LAYER_SYNC +#define QUANTUM_PAINTER_DISPLAY_TIMEOUT 0 + +#define I2C_DRIVER I2CD1 +#define I2C1_SDA_PIN GP10 +#define I2C1_SCL_PIN GP11 + +#define CIRQUE_PINNACLE_TAP_ENABLE +#define POINTING_DEVICE_GESTURES_SCROLL_ENABLE +#define POINTING_DEVICE_GESTURES_CURSOR_GLIDE_ENABLE +#define MOUSE_EXTENDED_REPORT + +#define TAPPING_TERM 150 +#define TAPPING_TERM_PER_KEY +#define QUICK_TAP_TERM 0 + +#define CAPS_WORD_IDLE_TIMEOUT 2500 +#define BOTH_SHIFTS_TURNS_ON_CAPS_WORD + +#ifdef RGB_MATRIX_ENABLE +# define RGB_MATRIX_TIMEOUT 300000 +# define RGB_TRIGGER_ON_KEYDOWN +#endif diff --git a/keyboards/stront/keymaps/zzeneg/fonts/montserrat_20_en_ru.c b/keyboards/stront/keymaps/zzeneg/fonts/montserrat_20_en_ru.c new file mode 100644 index 0000000000..f03a7835a6 --- /dev/null +++ b/keyboards/stront/keymaps/zzeneg/fonts/montserrat_20_en_ru.c @@ -0,0 +1,782 @@ +// Copyright 2022 zzeneg (@zzeneg) +// SPDX-License-Identifier: GPL-2.0-or-later + +/******************************************************************************* + * Size: 20 px + * Bpp: 4 + * Opts: + ******************************************************************************/ + +#ifdef __has_include +# if __has_include("lvgl.h") +# ifndef LV_LVGL_H_INCLUDE_SIMPLE +# define LV_LVGL_H_INCLUDE_SIMPLE +# endif +# endif +#endif + +#if defined(LV_LVGL_H_INCLUDE_SIMPLE) +# include "lvgl.h" +#else +# include "lvgl/lvgl.h" +#endif + +#ifndef MONTSERRAT_20_EN_RU +# define MONTSERRAT_20_EN_RU 1 +#endif + +#if MONTSERRAT_20_EN_RU + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x3f, 0x63, 0xf6, 0x2f, 0x52, 0xf5, 0x1f, 0x41, 0xf4, 0xf, 0x40, 0xf3, 0xf, 0x30, 0xf2, 0x2, 0x0, 0x0, 0x1, 0x5, 0xf8, 0x3f, 0x60, + + /* U+0022 "\"" */ + 0x9a, 0x3, 0xf0, 0x99, 0x2, 0xf0, 0x99, 0x2, 0xf0, 0x89, 0x2, 0xf0, 0x89, 0x1, 0xf0, 0x44, 0x0, 0x70, + + /* U+0023 "#" */ + 0x0, 0x0, 0x6b, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x0, 0x79, 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, 0x97, 0x0, 0x6, 0xa0, 0x0, 0x0, 0x0, 0xb6, 0x0, 0x8, 0x80, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x1, 0x22, 0xf4, 0x22, 0x2c, 0x62, 0x20, 0x0, 0x1, 0xf0, 0x0, 0xd, 0x30, 0x0, 0x0, 0x2, 0xe0, 0x0, 0xf, 0x10, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x1f, 0x0, 0x0, 0x0, 0x6, 0xa0, 0x0, 0x3d, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x12, 0x2b, 0x82, 0x22, 0x8b, 0x22, 0x10, 0x0, 0xc, 0x50